summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/gil
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 18:45:59 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 18:45:59 +0000
commit19fcec84d8d7d21e796c7624e521b60d28ee21ed (patch)
tree42d26aa27d1e3f7c0b8bd3fd14e7d7082f5008dc /src/boost/libs/gil
parentInitial commit. (diff)
downloadceph-19fcec84d8d7d21e796c7624e521b60d28ee21ed.tar.xz
ceph-19fcec84d8d7d21e796c7624e521b60d28ee21ed.zip
Adding upstream version 16.2.11+ds.upstream/16.2.11+dsupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/boost/libs/gil')
-rw-r--r--src/boost/libs/gil/CMakeLists.txt252
-rw-r--r--src/boost/libs/gil/CONTRIBUTING.md604
-rw-r--r--src/boost/libs/gil/Jamfile10
-rw-r--r--src/boost/libs/gil/LICENSE.txt23
-rw-r--r--src/boost/libs/gil/README.md115
-rw-r--r--src/boost/libs/gil/RELEASES.md363
-rw-r--r--src/boost/libs/gil/conanfile.txt14
-rw-r--r--src/boost/libs/gil/example/CMakeLists.txt45
-rw-r--r--src/boost/libs/gil/example/Jamfile50
-rw-r--r--src/boost/libs/gil/example/README.md45
-rw-r--r--src/boost/libs/gil/example/adaptive_threshold.cpp33
-rw-r--r--src/boost/libs/gil/example/affine.cpp34
-rw-r--r--src/boost/libs/gil/example/b2/README.md40
-rw-r--r--src/boost/libs/gil/example/b2/user-config-windows-vcpkg.jam53
-rw-r--r--src/boost/libs/gil/example/clang-format/README.md18
-rw-r--r--src/boost/libs/gil/example/cmake/CMakeSettings.json433
-rw-r--r--src/boost/libs/gil/example/cmake/README.md39
-rw-r--r--src/boost/libs/gil/example/cmake/cmake-variants.yaml67
-rw-r--r--src/boost/libs/gil/example/convolution.cpp69
-rw-r--r--src/boost/libs/gil/example/convolve2d.cpp41
-rw-r--r--src/boost/libs/gil/example/dynamic_image.cpp23
-rw-r--r--src/boost/libs/gil/example/harris.cpp207
-rw-r--r--src/boost/libs/gil/example/hessian.cpp208
-rw-r--r--src/boost/libs/gil/example/histogram.cpp49
-rw-r--r--src/boost/libs/gil/example/interleaved_ptr.cpp69
-rw-r--r--src/boost/libs/gil/example/interleaved_ptr.hpp201
-rw-r--r--src/boost/libs/gil/example/interleaved_ref.hpp158
-rw-r--r--src/boost/libs/gil/example/mandelbrot.cpp75
-rw-r--r--src/boost/libs/gil/example/packed_pixel.cpp59
-rw-r--r--src/boost/libs/gil/example/resize.cpp29
-rw-r--r--src/boost/libs/gil/example/sobel_scharr.cpp45
-rw-r--r--src/boost/libs/gil/example/test.jpgbin0 -> 2081 bytes
-rw-r--r--src/boost/libs/gil/example/test_adaptive.pngbin0 -> 150964 bytes
-rw-r--r--src/boost/libs/gil/example/threshold.cpp29
-rw-r--r--src/boost/libs/gil/example/x_gradient.cpp59
-rw-r--r--src/boost/libs/gil/index.html9
-rw-r--r--src/boost/libs/gil/meta/libraries.json21
-rw-r--r--src/boost/libs/gil/sublibs1
-rw-r--r--src/boost/libs/gil/test/CMakeLists.txt38
-rw-r--r--src/boost/libs/gil/test/Jamfile134
-rw-r--r--src/boost/libs/gil/test/core/CMakeLists.txt41
-rw-r--r--src/boost/libs/gil/test/core/Jamfile34
-rw-r--r--src/boost/libs/gil/test/core/algorithm/CMakeLists.txt27
-rw-r--r--src/boost/libs/gil/test/core/algorithm/Jamfile13
-rw-r--r--src/boost/libs/gil/test/core/algorithm/for_each_pixel.cpp34
-rw-r--r--src/boost/libs/gil/test/core/algorithm/std_fill.cpp55
-rw-r--r--src/boost/libs/gil/test/core/algorithm/std_uninitialized_fill.cpp223
-rw-r--r--src/boost/libs/gil/test/core/channel/CMakeLists.txt35
-rw-r--r--src/boost/libs/gil/test/core/channel/Jamfile23
-rw-r--r--src/boost/libs/gil/test/core/channel/TODO.md10
-rw-r--r--src/boost/libs/gil/test/core/channel/algorithm_channel_arithmetic.cpp170
-rw-r--r--src/boost/libs/gil/test/core/channel/algorithm_channel_convert.cpp261
-rw-r--r--src/boost/libs/gil/test/core/channel/algorithm_channel_invert.cpp118
-rw-r--r--src/boost/libs/gil/test/core/channel/algorithm_channel_multiply.cpp119
-rw-r--r--src/boost/libs/gil/test/core/channel/algorithm_channel_relation.cpp127
-rw-r--r--src/boost/libs/gil/test/core/channel/channel_traits.cpp65
-rw-r--r--src/boost/libs/gil/test/core/channel/concepts.cpp100
-rw-r--r--src/boost/libs/gil/test/core/channel/is_channel_integral.cpp74
-rw-r--r--src/boost/libs/gil/test/core/channel/packed_channel_value.cpp137
-rw-r--r--src/boost/libs/gil/test/core/channel/scoped_channel_value.cpp110
-rw-r--r--src/boost/libs/gil/test/core/channel/test_fixture.cpp134
-rw-r--r--src/boost/libs/gil/test/core/channel/test_fixture.hpp252
-rw-r--r--src/boost/libs/gil/test/core/color/CMakeLists.txt28
-rw-r--r--src/boost/libs/gil/test/core/color/Jamfile15
-rw-r--r--src/boost/libs/gil/test/core/color/color_spaces_are_compatible.cpp46
-rw-r--r--src/boost/libs/gil/test/core/color/concepts.cpp50
-rw-r--r--src/boost/libs/gil/test/core/color/default_color_converter_impl.cpp112
-rw-r--r--src/boost/libs/gil/test/core/color/default_color_converter_impl_fail.cpp33
-rw-r--r--src/boost/libs/gil/test/core/color_base/CMakeLists.txt28
-rw-r--r--src/boost/libs/gil/test/core/color_base/Jamfile16
-rw-r--r--src/boost/libs/gil/test/core/color_base/concepts.cpp54
-rw-r--r--src/boost/libs/gil/test/core/color_base/homogeneous_color_base.cpp141
-rw-r--r--src/boost/libs/gil/test/core/color_base/static_transform.cpp72
-rw-r--r--src/boost/libs/gil/test/core/color_base/static_transform_gray_to_rgb_fail.cpp40
-rw-r--r--src/boost/libs/gil/test/core/color_base/static_transform_rgb_to_cmyk_fail.cpp42
-rw-r--r--src/boost/libs/gil/test/core/image/CMakeLists.txt27
-rw-r--r--src/boost/libs/gil/test/core/image/Jamfile13
-rw-r--r--src/boost/libs/gil/test/core/image/concepts.cpp30
-rw-r--r--src/boost/libs/gil/test/core/image/image.cpp91
-rw-r--r--src/boost/libs/gil/test/core/image/test_fixture.hpp71
-rw-r--r--src/boost/libs/gil/test/core/image_processing/CMakeLists.txt53
-rw-r--r--src/boost/libs/gil/test/core/image_processing/Jamfile21
-rw-r--r--src/boost/libs/gil/test/core/image_processing/box_filter.cpp65
-rw-r--r--src/boost/libs/gil/test/core/image_processing/harris.cpp73
-rw-r--r--src/boost/libs/gil/test/core/image_processing/hessian.cpp72
-rwxr-xr-xsrc/boost/libs/gil/test/core/image_processing/lanczos_scaling.cpp67
-rw-r--r--src/boost/libs/gil/test/core/image_processing/median_filter.cpp65
-rw-r--r--src/boost/libs/gil/test/core/image_processing/simple_kernels.cpp68
-rw-r--r--src/boost/libs/gil/test/core/image_processing/sobel_scharr.cpp50
-rw-r--r--src/boost/libs/gil/test/core/image_processing/threshold_binary.cpp137
-rw-r--r--src/boost/libs/gil/test/core/image_processing/threshold_color_spaces_not_compatible_fail.cpp25
-rw-r--r--src/boost/libs/gil/test/core/image_processing/threshold_otsu.cpp118
-rw-r--r--src/boost/libs/gil/test/core/image_processing/threshold_truncate.cpp233
-rw-r--r--src/boost/libs/gil/test/core/image_view/CMakeLists.txt43
-rw-r--r--src/boost/libs/gil/test/core/image_view/Jamfile29
-rw-r--r--src/boost/libs/gil/test/core/image_view/axis_iterator.cpp91
-rw-r--r--src/boost/libs/gil/test/core/image_view/collection.cpp119
-rw-r--r--src/boost/libs/gil/test/core/image_view/concepts.cpp96
-rw-r--r--src/boost/libs/gil/test/core/image_view/derived_view_type.cpp45
-rw-r--r--src/boost/libs/gil/test/core/image_view/dynamic_step.cpp133
-rw-r--r--src/boost/libs/gil/test/core/image_view/is_planar.cpp77
-rw-r--r--src/boost/libs/gil/test/core/image_view/iterator.cpp95
-rw-r--r--src/boost/libs/gil/test/core/image_view/planar_rgba_view.cpp71
-rw-r--r--src/boost/libs/gil/test/core/image_view/reverse_iterator.cpp54
-rw-r--r--src/boost/libs/gil/test/core/image_view/subimage_view.cpp91
-rw-r--r--src/boost/libs/gil/test/core/image_view/test_fixture.hpp37
-rw-r--r--src/boost/libs/gil/test/core/image_view/view_is_basic.cpp76
-rw-r--r--src/boost/libs/gil/test/core/image_view/view_is_mutable.cpp76
-rw-r--r--src/boost/libs/gil/test/core/image_view/view_is_step.cpp57
-rw-r--r--src/boost/libs/gil/test/core/image_view/view_type.cpp114
-rw-r--r--src/boost/libs/gil/test/core/image_view/view_type_from_pixel.cpp119
-rw-r--r--src/boost/libs/gil/test/core/image_view/x_iterator.cpp98
-rw-r--r--src/boost/libs/gil/test/core/image_view/xy_locator.cpp122
-rw-r--r--src/boost/libs/gil/test/core/image_view/y_iterator.cpp118
-rw-r--r--src/boost/libs/gil/test/core/iterator/CMakeLists.txt28
-rw-r--r--src/boost/libs/gil/test/core/iterator/Jamfile13
-rw-r--r--src/boost/libs/gil/test/core/iterator/concepts.cpp172
-rw-r--r--src/boost/libs/gil/test/core/iterator/dynamic_step.cpp160
-rw-r--r--src/boost/libs/gil/test/core/iterator/is_planar.cpp72
-rw-r--r--src/boost/libs/gil/test/core/locator/CMakeLists.txt27
-rw-r--r--src/boost/libs/gil/test/core/locator/Jamfile12
-rw-r--r--src/boost/libs/gil/test/core/locator/concepts.cpp202
-rw-r--r--src/boost/libs/gil/test/core/locator/dynamic_step.cpp92
-rw-r--r--src/boost/libs/gil/test/core/pixel/CMakeLists.txt34
-rw-r--r--src/boost/libs/gil/test/core/pixel/Jamfile20
-rw-r--r--src/boost/libs/gil/test/core/pixel/bit_aligned_pixel_reference.cpp46
-rw-r--r--src/boost/libs/gil/test/core/pixel/concepts.cpp67
-rw-r--r--src/boost/libs/gil/test/core/pixel/is_pixel.cpp77
-rw-r--r--src/boost/libs/gil/test/core/pixel/is_planar.cpp137
-rw-r--r--src/boost/libs/gil/test/core/pixel/num_channels.cpp154
-rw-r--r--src/boost/libs/gil/test/core/pixel/packed_pixel.cpp336
-rw-r--r--src/boost/libs/gil/test/core/pixel/pixel_reference_is_mutable.cpp35
-rw-r--r--src/boost/libs/gil/test/core/pixel/pixels_are_compatible.cpp132
-rw-r--r--src/boost/libs/gil/test/core/pixel/test_fixture.cpp113
-rw-r--r--src/boost/libs/gil/test/core/pixel/test_fixture.hpp346
-rw-r--r--src/boost/libs/gil/test/core/point/CMakeLists.txt27
-rw-r--r--src/boost/libs/gil/test/core/point/Jamfile14
-rw-r--r--src/boost/libs/gil/test/core/point/concepts.cpp51
-rw-r--r--src/boost/libs/gil/test/core/point/multiply_by_non_arithmetic_fail.cpp23
-rw-r--r--src/boost/libs/gil/test/core/point/point.cpp235
-rw-r--r--src/boost/libs/gil/test/core/promote_integral.cpp370
-rw-r--r--src/boost/libs/gil/test/core/test_fixture.cpp71
-rw-r--r--src/boost/libs/gil/test/core/test_fixture.hpp82
-rw-r--r--src/boost/libs/gil/test/extension/CMakeLists.txt22
-rw-r--r--src/boost/libs/gil/test/extension/Jamfile12
-rw-r--r--src/boost/libs/gil/test/extension/dynamic_image/CMakeLists.txt27
-rw-r--r--src/boost/libs/gil/test/extension/dynamic_image/Jamfile13
-rw-r--r--src/boost/libs/gil/test/extension/dynamic_image/subimage_view.cpp96
-rw-r--r--src/boost/libs/gil/test/extension/dynamic_image/test_fixture.hpp61
-rw-r--r--src/boost/libs/gil/test/extension/io/CMakeLists.txt19
-rw-r--r--src/boost/libs/gil/test/extension/io/Jamfile49
-rw-r--r--src/boost/libs/gil/test/extension/io/bmp/Jamfile26
-rw-r--r--src/boost/libs/gil/test/extension/io/bmp/bmp_make.cpp289
-rw-r--r--src/boost/libs/gil/test/extension/io/bmp/bmp_old_test.cpp97
-rw-r--r--src/boost/libs/gil/test/extension/io/bmp/bmp_read_test.cpp463
-rw-r--r--src/boost/libs/gil/test/extension/io/bmp/bmp_test.cpp284
-rw-r--r--src/boost/libs/gil/test/extension/io/bmp/bmp_write_test.cpp53
-rw-r--r--src/boost/libs/gil/test/extension/io/cmp_view.hpp37
-rw-r--r--src/boost/libs/gil/test/extension/io/color_space_write_test.hpp52
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g01bg.bmpbin0 -> 1086 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g01bw.bmpbin0 -> 1086 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g01p1.bmpbin0 -> 1082 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g01wb.bmpbin0 -> 1086 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g04.bmpbin0 -> 4214 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g04p4.bmpbin0 -> 4166 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g04rle.bmpbin0 -> 922 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08.bmpbin0 -> 9270 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08offs.bmpbin0 -> 9370 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08os2.bmpbin0 -> 8986 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08p256.bmpbin0 -> 9270 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08p64.bmpbin0 -> 8502 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08pi256.bmpbin0 -> 9270 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08pi64.bmpbin0 -> 9270 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08res11.bmpbin0 -> 9270 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08res21.bmpbin0 -> 9270 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08res22.bmpbin0 -> 9270 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08rle.bmpbin0 -> 1820 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08s0.bmpbin0 -> 9270 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08w124.bmpbin0 -> 8642 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08w125.bmpbin0 -> 9014 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g08w126.bmpbin0 -> 9142 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g16bf555.bmpbin0 -> 16450 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g16bf565.bmpbin0 -> 16450 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g16def555.bmpbin0 -> 16438 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g24.bmpbin0 -> 24630 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g32bf.bmpbin0 -> 32578 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/g32def.bmpbin0 -> 32566 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/readme.txt5
-rw-r--r--src/boost/libs/gil/test/extension/io/images/bmp/test.bmpbin0 -> 1800054 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/jpeg/EddDawson/36dpi.jpgbin0 -> 5878 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/jpeg/test.jpgbin0 -> 19577 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/png/EddDawson/36dpi.pngbin0 -> 7406 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/png/PngSuite/readme.txt7
-rw-r--r--src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbbn0g04.pngbin0 -> 429 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbbn2c16.pngbin0 -> 2041 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbbn3p08.pngbin0 -> 1499 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbgn2c16.pngbin0 -> 2041 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbgn3p08.pngbin0 -> 1499 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbrn2c08.pngbin0 -> 1633 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbwn0g16.pngbin0 -> 1313 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/png/PngSuite/tm3n3p02.pngbin0 -> 116 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/png/PngSuite/tp1n3p08.pngbin0 -> 1483 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/png/grayalpha-with-tRNS-chunk.pngbin0 -> 1190 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/png/grayscale-with-tRNS-chunk.pngbin0 -> 11864 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/png/test.pngbin0 -> 52753 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/pnm/p1.pnm1203
-rw-r--r--src/boost/libs/gil/test/extension/io/images/pnm/p2.pnm3004
-rw-r--r--src/boost/libs/gil/test/extension/io/images/pnm/p3.pnm16388
-rw-r--r--src/boost/libs/gil/test/extension/io/images/pnm/p4.pnmbin0 -> 5016 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/pnm/p5.pnmbin0 -> 40024 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/pnm/p6.pnmbin0 -> 196623 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/pnm/readme.txt5
-rw-r--r--src/boost/libs/gil/test/extension/io/images/pnm/rgb.pnmbin0 -> 196623 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/raw/RAW_CANON_D30_SRGB.CRWbin0 -> 3120810 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/raw/readme.txt5
-rw-r--r--src/boost/libs/gil/test/extension/io/images/readme.md3
-rw-r--r--src/boost/libs/gil/test/extension/io/images/targa/24BPP_compressed.tgabin0 -> 4185 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/targa/24BPP_compressed_ul_origin.tgabin0 -> 4211 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/targa/24BPP_uncompressed.tgabin0 -> 46146 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/targa/24BPP_uncompressed_ul_origin.tgabin0 -> 46172 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/targa/32BPP_compressed.tgabin0 -> 4894 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/targa/32BPP_compressed_ul_origin.tgabin0 -> 4920 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/targa/32BPP_uncompressed.tgabin0 -> 61522 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/targa/32BPP_uncompressed_ul_origin.tgabin0 -> 61548 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/images/targa/fileformat_info/readme.txt5
-rw-r--r--src/boost/libs/gil/test/extension/io/images/tiff/graphicmagick/readme.txt7
-rw-r--r--src/boost/libs/gil/test/extension/io/images/tiff/libtiffpic/readme.txt7
-rw-r--r--src/boost/libs/gil/test/extension/io/images/tiff/test.tifbin0 -> 78434 bytes
-rw-r--r--src/boost/libs/gil/test/extension/io/jpeg/Jamfile29
-rw-r--r--src/boost/libs/gil/test/extension/io/jpeg/jpeg_old_test.cpp101
-rw-r--r--src/boost/libs/gil/test/extension/io/jpeg/jpeg_read_test.cpp106
-rw-r--r--src/boost/libs/gil/test/extension/io/jpeg/jpeg_test.cpp274
-rw-r--r--src/boost/libs/gil/test/extension/io/jpeg/jpeg_write_test.cpp81
-rw-r--r--src/boost/libs/gil/test/extension/io/mandel_view.hpp103
-rw-r--r--src/boost/libs/gil/test/extension/io/paths.hpp69
-rw-r--r--src/boost/libs/gil/test/extension/io/png/Jamfile32
-rw-r--r--src/boost/libs/gil/test/extension/io/png/png_file_format_test.cpp71
-rw-r--r--src/boost/libs/gil/test/extension/io/png/png_old_test.cpp101
-rw-r--r--src/boost/libs/gil/test/extension/io/png/png_read_test.cpp764
-rw-r--r--src/boost/libs/gil/test/extension/io/png/png_test.cpp302
-rw-r--r--src/boost/libs/gil/test/extension/io/png/png_write_test.cpp33
-rw-r--r--src/boost/libs/gil/test/extension/io/pnm/Jamfile26
-rw-r--r--src/boost/libs/gil/test/extension/io/pnm/pnm_old_test.cpp96
-rw-r--r--src/boost/libs/gil/test/extension/io/pnm/pnm_read_test.cpp124
-rw-r--r--src/boost/libs/gil/test/extension/io/pnm/pnm_test.cpp240
-rw-r--r--src/boost/libs/gil/test/extension/io/pnm/pnm_write_test.cpp60
-rw-r--r--src/boost/libs/gil/test/extension/io/raw/Jamfile24
-rw-r--r--src/boost/libs/gil/test/extension/io/raw/raw_test.cpp127
-rw-r--r--src/boost/libs/gil/test/extension/io/scanline_read_test.hpp61
-rw-r--r--src/boost/libs/gil/test/extension/io/simple_all_formats.cpp94
-rw-r--r--src/boost/libs/gil/test/extension/io/subimage_test.hpp30
-rw-r--r--src/boost/libs/gil/test/extension/io/targa/Jamfile22
-rw-r--r--src/boost/libs/gil/test/extension/io/targa/targa_old_test.cpp92
-rw-r--r--src/boost/libs/gil/test/extension/io/targa/targa_read_test.cpp213
-rw-r--r--src/boost/libs/gil/test/extension/io/targa/targa_test.cpp283
-rw-r--r--src/boost/libs/gil/test/extension/io/targa/targa_write_test.cpp50
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/Jamfile54
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_file_format_test.cpp637
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_old_test.cpp93
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_subimage_test.cpp128
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_test.cpp306
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_float_test.cpp111
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_test_1-10.cpp47
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_test_11-20.cpp48
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_test_21-31_32-64.cpp64
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_write_test_1-10.cpp56
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_write_test_11-20.cpp54
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_write_test_21-31_32-64.cpp79
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_test_1-8.cpp31
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_test_8-16.cpp31
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_write_test_1-8.cpp31
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_write_test_8-16.cpp31
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_read_macros.hpp114
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_test_1-10.cpp48
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_test_11-20.cpp49
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_test_21-31_32_64.cpp65
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_write_test_1-10.cpp59
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_write_test_11-20.cpp59
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_write_test_21-31_32_64.cpp86
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_planar_test_1-10.cpp49
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_planar_test_11-20.cpp48
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_planar_test_21-31_32_64.cpp65
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_test.cpp84
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_write_macros.hpp177
-rw-r--r--src/boost/libs/gil/test/extension/io/tiff/tiff_write_test.cpp31
-rw-r--r--src/boost/libs/gil/test/extension/numeric/CMakeLists.txt39
-rw-r--r--src/boost/libs/gil/test/extension/numeric/Jamfile28
-rw-r--r--src/boost/libs/gil/test/extension/numeric/channel_numeric_operations.cpp484
-rw-r--r--src/boost/libs/gil/test/extension/numeric/convolve.cpp121
-rw-r--r--src/boost/libs/gil/test/extension/numeric/convolve_2d.cpp68
-rw-r--r--src/boost/libs/gil/test/extension/numeric/convolve_cols.cpp73
-rw-r--r--src/boost/libs/gil/test/extension/numeric/convolve_rows.cpp73
-rw-r--r--src/boost/libs/gil/test/extension/numeric/extend_boundary.cpp252
-rw-r--r--src/boost/libs/gil/test/extension/numeric/kernel.cpp174
-rw-r--r--src/boost/libs/gil/test/extension/numeric/kernel_1d_fixed_even_size_fail.cpp16
-rw-r--r--src/boost/libs/gil/test/extension/numeric/kernel_fixed.cpp183
-rw-r--r--src/boost/libs/gil/test/extension/numeric/matrix3x2.cpp191
-rw-r--r--src/boost/libs/gil/test/extension/numeric/pixel_numeric_operations.cpp343
-rw-r--r--src/boost/libs/gil/test/extension/numeric/pixel_numeric_operations_float.cpp97
-rw-r--r--src/boost/libs/gil/test/extension/numeric/resample.cpp103
-rw-r--r--src/boost/libs/gil/test/extension/numeric/test_fixture.hpp30
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/CMakeLists.txt64
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/Jamfile33
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/channel_type.cpp42
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/channel_view.cpp44
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/color_convert_cmyka.cpp32
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/color_convert_gray.cpp30
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/color_convert_gray_alpha.cpp49
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/color_convert_hsl.cpp87
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/color_convert_hsv.cpp95
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/color_convert_lab.cpp140
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/color_convert_luminance.cpp38
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/color_convert_xyz.cpp219
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/get_num_bits.cpp41
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/get_pixel_type.cpp39
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/indexed_image.cpp154
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/is_bit_aligned.cpp24
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/is_homogeneous.cpp26
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/pixel_bit_size.cpp26
-rw-r--r--src/boost/libs/gil/test/extension/toolbox/subchroma_image.cpp106
-rw-r--r--src/boost/libs/gil/test/header/CMakeLists.txt106
-rw-r--r--src/boost/libs/gil/test/header/main.cpp19
-rw-r--r--src/boost/libs/gil/test/legacy/CMakeLists.txt64
-rw-r--r--src/boost/libs/gil/test/legacy/Jamfile26
-rw-r--r--src/boost/libs/gil/test/legacy/README.md16
-rw-r--r--src/boost/libs/gil/test/legacy/channel.cpp408
-rw-r--r--src/boost/libs/gil/test/legacy/error_if.cpp13
-rw-r--r--src/boost/libs/gil/test/legacy/gil_reference_checksums.txt125
-rw-r--r--src/boost/libs/gil/test/legacy/image.cpp612
-rw-r--r--src/boost/libs/gil/test/legacy/performance.cpp520
-rw-r--r--src/boost/libs/gil/test/legacy/pixel.cpp322
-rw-r--r--src/boost/libs/gil/test/legacy/pixel_iterator.cpp355
-rw-r--r--src/boost/libs/gil/test/legacy/recreate_image.cpp108
-rw-r--r--src/boost/libs/gil/test/legacy/sample_image.cpp159
-rw-r--r--src/boost/libs/gil/test/test_utility_output_stream.cpp68
-rw-r--r--src/boost/libs/gil/test/test_utility_output_stream.hpp133
336 files changed, 47989 insertions, 0 deletions
diff --git a/src/boost/libs/gil/CMakeLists.txt b/src/boost/libs/gil/CMakeLists.txt
new file mode 100644
index 000000000..52327b933
--- /dev/null
+++ b/src/boost/libs/gil/CMakeLists.txt
@@ -0,0 +1,252 @@
+#
+# Copyright (c) 2017-2019 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+# **WARNING:**
+# The CMake configuration is only provided for convenience
+# of contributors. It does not export or install any targets,
+# deploy config files or support subproject workflow.
+#
+cmake_minimum_required(VERSION 3.10)
+
+#-----------------------------------------------------------------------------
+# Options
+#-----------------------------------------------------------------------------
+option(BOOST_GIL_BUILD_EXAMPLES "Build examples" ON)
+option(BOOST_GIL_BUILD_HEADER_TESTS "Enable self-contained header tests" ON)
+option(BOOST_GIL_ENABLE_EXT_DYNAMIC_IMAGE "Enable Dynamic Image extension, tests and examples" ON)
+option(BOOST_GIL_ENABLE_EXT_IO "Enable IO extension, tests and examples (require libjpeg, libpng, libtiff)" ON)
+option(BOOST_GIL_ENABLE_EXT_NUMERIC "Enable Numeric extension, tests and examples" ON)
+option(BOOST_GIL_ENABLE_EXT_TOOLBOX "Enable Toolbox extension, tests and examples" ON)
+option(BOOST_GIL_USE_CONAN "Use Conan to install dependencies" OFF)
+option(BOOST_GIL_USE_CLANG_TIDY "Set CMAKE_CXX_CLANG_TIDY property on targets to enable clang-tidy linting" OFF)
+set(CMAKE_CXX_STANDARD 11 CACHE STRING "C++ standard version to use (default is 11)")
+
+#-----------------------------------------------------------------------------
+# Project
+#-----------------------------------------------------------------------------
+project(Boost.GIL
+ LANGUAGES CXX
+ DESCRIPTION "Boost.GIL - Generic Image Library | Requires C++11 since Boost 1.68")
+
+list(INSERT CMAKE_MODULE_PATH 0 ${CMAKE_BINARY_DIR}/cmake)
+
+#-----------------------------------------------------------------------------
+# C++ language version and compilation flags
+#-----------------------------------------------------------------------------
+message(STATUS "Boost.GIL: Require C++${CMAKE_CXX_STANDARD}")
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+set(CMAKE_CXX_EXTENSIONS OFF)
+
+# Avoid warnings flood on Travis CI, AppVeyor, CircleCI, Azure Pipelines
+if(DEFINED ENV{CI} OR DEFINED ENV{AGENT_JOBSTATUS} OR DEFINED ENV{GITHUB_ACTIONS})
+ set(BOOST_GIL_BUILD_CI ON)
+ message(STATUS "Boost.GIL: Turning off detailed compiler warnings for CI build short log")
+else()
+ set(BOOST_GIL_BUILD_CI OFF)
+ message(STATUS "Boost.GIL: Turning on detailed compiler warnings")
+endif()
+
+add_library(gil_compile_options INTERFACE)
+
+# See https://cmake.org/pipermail/cmake/2018-December/068716.html
+if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
+ string(REGEX REPLACE "/W3" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
+ string(REGEX REPLACE "-W3" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
+endif()
+
+# See https://svn.boost.org/trac10/wiki/Guidelines/WarningsGuidelines
+target_compile_options(gil_compile_options
+ INTERFACE
+ $<$<AND:$<CXX_COMPILER_ID:MSVC>,$<BOOL:${BOOST_GIL_BUILD_CI}>>:-W1>
+ $<$<AND:$<CXX_COMPILER_ID:MSVC>,$<NOT:$<BOOL:${BOOST_GIL_BUILD_CI}>>>:-W4>
+ $<$<CXX_COMPILER_ID:MSVC>:-bigobj>
+ $<$<CXX_COMPILER_ID:MSVC>:-FC> # Need absolute path for __FILE__ used in tests
+ $<$<OR:$<CXX_COMPILER_ID:GNU>,$<CXX_COMPILER_ID:Clang>>:-fstrict-aliasing>
+ $<$<AND:$<OR:$<CXX_COMPILER_ID:GNU>,$<CXX_COMPILER_ID:Clang>>,$<NOT:$<BOOL:${BOOST_GIL_BUILD_CI}>>>:-Wall -Wconversion -Wextra -Wfloat-equal -Wshadow -Wsign-promo -Wstrict-aliasing -Wunused-parameter -pedantic>)
+
+target_compile_definitions(gil_compile_options
+ INTERFACE
+ $<$<CXX_COMPILER_ID:MSVC>:_CRT_NONSTDC_NO_DEPRECATE>
+ $<$<CXX_COMPILER_ID:MSVC>:_SCL_SECURE_NO_DEPRECATE>
+ $<$<CXX_COMPILER_ID:MSVC>:_CRT_SECURE_NO_WARNINGS>
+ $<$<CXX_COMPILER_ID:MSVC>:NOMINMAX>
+ $<$<CXX_COMPILER_ID:MSVC>:BOOST_CONFIG_SUPPRESS_OUTDATED_MESSAGE>)
+
+#-----------------------------------------------------------------------------
+# Dependency target
+#-----------------------------------------------------------------------------
+add_library(gil_dependencies INTERFACE)
+
+#-----------------------------------------------------------------------------
+# Dependency: Boost
+# - look for stage Build
+# - look for default installation location
+# - look for location specified with BOOST_ROOT
+#-----------------------------------------------------------------------------
+if(NOT DEFINED BOOST_ROOT AND NOT DEFINED ENV{BOOST_ROOT})
+ message(STATUS "Boost.GIL: Looking for Boost from current source tree and libraries from stage.")
+ message(STATUS "Boost.GIL: Disable stage look-up with passing -DBOOST_ROOT=/path/to/your/boost.")
+ get_filename_component(_boost_root ../../ ABSOLUTE)
+ if(EXISTS ${_boost_root}/boost-build.jam)
+ set(BOOST_ROOT ${_boost_root})
+ message(STATUS "Boost.GIL: Using Boost libraries from stage directory in BOOST_ROOT=${BOOST_ROOT}")
+ endif()
+endif()
+
+set(Boost_DETAILED_FAILURE_MSG ON)
+if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
+ set(Boost_USE_STATIC_LIBS ON)
+ set(Boost_USE_STATIC_RUNTIME OFF)
+endif()
+
+find_package(Boost 1.72.0 REQUIRED COMPONENTS filesystem)
+message(STATUS "Boost.GIL: Using Boost_INCLUDE_DIRS=${Boost_INCLUDE_DIRS}")
+message(STATUS "Boost.GIL: Using Boost_LIBRARY_DIRS=${Boost_LIBRARY_DIRS}")
+
+target_link_libraries(gil_dependencies INTERFACE Boost::filesystem)
+
+if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
+ target_link_libraries(gil_dependencies INTERFACE Boost::disable_autolinking)
+endif()
+
+target_compile_definitions(gil_dependencies
+ INTERFACE
+ $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:BOOST_TEST_DYN_LINK>)
+
+#-----------------------------------------------------------------------------
+# Dependency: libpng, libjpeg, libtiff, libraw via Vcpkg or Conan
+#-----------------------------------------------------------------------------
+if(BOOST_GIL_USE_CONAN)
+ # Download automatically, you can also just copy the conan.cmake file
+ if(NOT EXISTS "${CMAKE_BINARY_DIR}/conan.cmake")
+ message(STATUS "Boost.GIL: Downloading conan.cmake from https://github.com/conan-io/cmake-conan")
+ file(DOWNLOAD "https://raw.githubusercontent.com/conan-io/cmake-conan/v0.15/conan.cmake"
+ "${CMAKE_BINARY_DIR}/conan.cmake")
+ endif()
+
+ # NOTE: See RelWithDebInfo for Release builds, http://docs.conan.io/en/latest/howtos/vs2017_cmake.html
+ set(_build_type_saved ${CMAKE_BUILD_TYPE})
+ if(CMAKE_BUILD_TYPE STREQUAL "MinSizeRel" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
+ set(CMAKE_BUILD_TYPE "Release")
+ endif()
+
+ include(${CMAKE_BINARY_DIR}/conan.cmake)
+ conan_cmake_run(CONANFILE conanfile.txt BASIC_SETUP CMAKE_TARGETS BUILD missing)
+
+ set(CMAKE_BUILD_TYPE ${_build_type_saved})
+ unset(_build_type_saved)
+endif()
+
+if(BOOST_GIL_ENABLE_EXT_IO)
+ if (BOOST_GIL_USE_CONAN)
+ target_link_libraries(gil_dependencies
+ INTERFACE
+ CONAN_PKG::libjpeg
+ CONAN_PKG::libpng
+ CONAN_PKG::libtiff)
+ else()
+ find_package(JPEG REQUIRED)
+ find_package(PNG REQUIRED)
+ find_package(TIFF REQUIRED)
+ target_include_directories(gil_dependencies
+ INTERFACE
+ ${JPEG_INCLUDE_DIR})
+
+ target_link_libraries(gil_dependencies
+ INTERFACE
+ ${JPEG_LIBRARIES}
+ PNG::PNG
+ TIFF::TIFF)
+
+ if (TIFF_LIBRARY)
+ set(TIFFXX_NAMES tiffxx)
+ foreach(name ${TIFFXX_NAMES})
+ list(APPEND TIFFXX_NAMES_DEBUG "${name}d")
+ endforeach()
+ find_library(TIFFXX_LIBRARY_RELEASE NAMES ${TIFFXX_NAMES})
+ find_library(TIFFXX_LIBRARY_DEBUG NAMES ${TIFFXX_NAMES_DEBUG})
+ find_path(TIFFXX_INCLUDE_DIR NAMES tiffio.hxx)
+ include(SelectLibraryConfigurations)
+ select_library_configurations(TIFFXX)
+ mark_as_advanced(TIFFXX_LIBRARY_RELEASE TIFFXX_LIBRARY_DEBUG)
+ include(FindPackageHandleStandardArgs)
+ find_package_handle_standard_args(TIFFXX REQUIRED_VARS TIFFXX_LIBRARY TIFFXX_INCLUDE_DIR)
+ target_include_directories(gil_dependencies INTERFACE ${TIFFXX_INCLUDE_DIR})
+ target_link_libraries(gil_dependencies INTERFACE ${TIFFXX_LIBRARY})
+ endif()
+
+ # LibRaw is optional, because it is not easy to install pre-built libraw on Windows and Mac OSX
+ if(NOT EXISTS "${CMAKE_BINARY_DIR}/cmake/FindLibRaw.cmake")
+ message(STATUS "Boost.GIL: Downloading FindLibRaw.cmake from https://github.com/LibRaw/LibRaw-cmake")
+ file(DOWNLOAD
+ "https://raw.githubusercontent.com/LibRaw/LibRaw-cmake/master/cmake/modules/FindLibRaw.cmake"
+ "${CMAKE_BINARY_DIR}/cmake/FindLibRaw.cmake")
+ endif()
+ find_package(LibRaw)
+ set(BOOST_GIL_ENABLE_EXT_IO_RAW ${LibRaw_FOUND} CACHE BOOL "Enable IO RAW extension (requires libraw)" FORCE)
+ if(BOOST_GIL_ENABLE_EXT_IO_RAW)
+ target_include_directories(gil_dependencies INTERFACE ${LibRaw_INCLUDE_DIR})
+ target_link_libraries(gil_dependencies INTERFACE ${LibRaw_LIBRARIES})
+ target_compile_definitions(gil_dependencies INTERFACE ${LibRaw_DEFINITIONS})
+ endif()
+ endif()
+endif()
+
+#-----------------------------------------------------------------------------
+# clang-tidy
+# - default checks specified in .clang-tidy configuration file
+#-----------------------------------------------------------------------------
+if(BOOST_GIL_USE_CLANG_TIDY AND CMAKE_VERSION VERSION_GREATER_EQUAL 3.6)
+ find_program(_clang_tidy
+ NAMES clang-tidy-7 clang-tidy-6.0 clang-tidy-5.0 clang-tidy-4.0 clang-tidy
+ DOC "Path to clang-tidy executable")
+
+ if(_clang_tidy)
+ message(STATUS "Boost.GIL: Configuring ${_clang_tidy} to run linting analysis for targets")
+ set(CMAKE_CXX_CLANG_TIDY ${_clang_tidy})
+ endif()
+ unset(_clang_tidy)
+endif()
+
+#-----------------------------------------------------------------------------
+# Common include directories
+#
+# The boostorg/gil repository includes must come first,
+# before Boost includes from cloned Boost superproject or installed distribution.
+# Otherwise IDEs may see the wrong file (ie. due to boost/ symlinks or
+# GIL headers from installed Boost instead of this clone of boostog/gil).
+#-----------------------------------------------------------------------------
+add_library(gil_include_directories INTERFACE)
+target_include_directories(gil_include_directories
+ BEFORE
+ INTERFACE
+ ${CMAKE_CURRENT_SOURCE_DIR}/include
+ ${CMAKE_CURRENT_SOURCE_DIR}/test)
+
+#-----------------------------------------------------------------------------
+# Tests
+#-----------------------------------------------------------------------------
+include(CTest)
+
+if(BUILD_TESTING)
+ # On CI services, test the self-contained headers on-demand only to avoid build timeouts.
+ # CI environment is common for Travis CI, AppVeyor, CircleCI, etc.
+ # On Boost regression builds, CMake does not run, but Boost.Build,
+ # so the header tests are not enabled there either.
+ if(DEFINED ENV{CI})
+ set(BOOST_GIL_BUILD_HEADER_TESTS OFF)
+ endif()
+
+ add_subdirectory(test)
+endif()
+
+#-----------------------------------------------------------------------------
+# Examples
+#-----------------------------------------------------------------------------
+if(BOOST_GIL_BUILD_EXAMPLES AND BOOST_GIL_ENABLE_EXT_IO)
+ add_subdirectory(example)
+endif()
diff --git a/src/boost/libs/gil/CONTRIBUTING.md b/src/boost/libs/gil/CONTRIBUTING.md
new file mode 100644
index 000000000..248d4471a
--- /dev/null
+++ b/src/boost/libs/gil/CONTRIBUTING.md
@@ -0,0 +1,604 @@
+# Contributing to Boost.GIL
+
+Boost.GIL is a member of [Boost](https://www.boost.org) libraries.
+
+If you wish to contribute a new feature or a bug fix,
+please follow the workflow explained in this document.
+
+## Table of Content
+
+- [Prerequisites](#prerequisites)
+- [Pull Requests](#pull-requests)
+- [Getting started with Git workflow](#getting-started-with-git-workflow)
+ - [1. Clone Boost super-project](#1-clone-boost-super-project)
+ - [2. Checkout Boost.GIL development branch](#2-checkout-boostgil-development-branch)
+ - [3. Fork Boost.GIL repository on GitHub](#3-fork-boostgil-repository-on-github)
+ - [4. Submit a pull request](#4-submit-a-pull-request)
+ - [5. Update your pull request](#5-update-your-pull-request)
+- [Development](#development)
+ - [Install dependencies](#install-dependencies)
+ - [Using Boost.Build](#using-boostbuild)
+ - [Using CMake](#using-cmake)
+ - [Running clang-tidy](#running-clang-tidy)
+- [Guidelines](#guidelines)
+
+## Prerequisites
+
+- C++11 compiler
+- Build and run-time dependencies for tests and examples:
+ - Boost.Filesystem
+ - Boost.Test
+ - Headers and libraries of libjpeg, libpng, libtiff, libraw for the I/O extension.
+- Experience with `git` command line basics.
+- Familiarity with build toolset and development environment of your choice.
+- Although this document tries to present all commands with necessary options,
+ it may be a good idea to skim through the
+ [Boost Getting Started](https://www.boost.org/more/getting_started/index.html)
+ chapters, especially if you are going to use
+ [Boost.Build](https://boostorg.github.io/build/) for the first time.
+
+## Pull Requests
+
+- **DO** base your work against the `develop` branch, not the `master`.
+- **DO** submit all major changes to code via pull requests (PRs) rather than through
+ a direct commit. PRs will be CI-checked first, then reviewed and potentially merged
+ by the repo maintainers after a peer review that includes at least one maintainer.
+ Contributors with commit access may submit trivial patches or changes to the project
+ infrastructure configuration via direct commits (CAUTION!)
+- **DO NOT** mix independent, unrelated changes in one PR.
+ Separate unrelated fixes into separate PRs, especially if they are in different components
+ (e.g. core headers versus extensions).
+ Separate real product/test code changes from larger code formatting/dead code removal changes,
+ unless the former are extensive enough to justify such refactoring, then also mention it.
+- **DO** start PR subject with "WIP:" tag if you submit it as "work in progress".
+ A PR should preferably be submitted when it is considered ready for review and subsequent
+ merging by the contributor. Otherwise, clearly indicate it is not yet ready.
+ The "WIP:" tag will also help maintainers to label your PR with [status/work-in-progress].
+- **DO** give PRs short-but-descriptive names (e.g. "Add test for algorithm XXX", not "Fix #1234").
+- **DO** [refer] to any relevant issues, and include the [keywords] that automatically
+ close issues when the PR is merged.
+- **DO** [mention] any users that should know about and/or review the change.
+- **DO** ensure each commit successfully builds. The entire PR must pass all tests in
+ the Continuous Integration (CI) system before it'll be merged.
+- **DO** ensure any new features or changes to existing behaviours are covered with test cases.
+- **DO** address PR feedback in an additional commit(s) rather than amending the existing
+ commits, and only rebase/squash them when necessary. This makes it easier for reviewers
+ to track changes.
+- **DO** assume that the [Squash and Merge] will be used to merge your commit unless you
+ request otherwise in the PR.
+- **DO** NOT fix merge conflicts using a merge commit. Prefer git rebase.
+- **DO** NOT submit changes to the original legacy tests, see
+ [test/legacy/README.md](test/legacy/README.md).
+
+### Merging Pull Requests (for maintainers with write access)
+
+- **DO** use [Squash and Merge] by default for individual contributions unless requested
+ by the PR author. Do so, even if the PR contains only one commit. It creates a simpler
+ history than [Create a Merge Commit]. Reasons that PR authors may request the true
+ merge recording a merge commit may include (but are not limited to):
+ - The change is easier to understand as a series of focused commits.
+ Each commit in the series must be buildable so as not to break git bisect.
+ - Contributor is using an e-mail address other than the primary GitHub address
+ and wants that preserved in the history.
+ Contributor must be willing to squash the commits manually before acceptance.
+
+## Getting started with Git workflow
+
+First, you need learn some minimal basics of the
+[modular Boost](https://svn.boost.org/trac/boost/wiki/ModularBoost)
+super-project workflow.
+
+The following steps are based on the official Boost
+[Getting Started](https://github.com/boostorg/boost/wiki/Getting-Started).
+
+**NOTE:** For brevity, commands below use notation for POSIX-like operating
+systems and you may need to tweak them for Windows systems.
+
+### 1. Clone Boost super-project
+
+The preparation involves the following steps:
+
+1. Clone the Boost super-project
+
+ ```shell
+ git clone --recurse-submodules --jobs 8 https://github.com/boostorg/boost.git
+ ```
+
+2. Switch the Boost super-project to desired branch, `master` or `develop`
+
+ ```shell
+ cd boost
+ git checkout master
+ ```
+
+ **TIP:** [Modular Boost Library Maintenance](https://svn.boost.org/trac10/wiki/StartModMaint)
+ guide, for more realistic test environment, recommends to develop and test
+ individual Boost library against other Boost libraries as defined by
+ the Boost super-project `master` branch:
+
+ ```shell
+ cd boost
+ git checkout master
+ git pull
+ git submodule update --init --recursive --jobs 8
+ ```
+
+3. Build the `b2` driver program for Boost.Build engine.
+
+ ```shell
+ ./bootstrap.sh
+ ./b2 --version
+ ```
+
+ **TIP:** For more convenient path-less invocation, you can copy the `b2`
+ program to a location in your `PATH`.
+
+4. Create full content of `/boost` virtual directory with
+all Boost headers linked from the individual modular Boost libraries.
+If you skip this step, executing `b2` to run tests will automatically
+create the directory with all headers required by Boost.GIL and tests.
+
+ ```shell
+ ./b2 headers
+ ```
+
+**TIP:** If something goes wrong, you end up with incomplete or accidentally
+modified files in your clone of the super-project repository, or you simply
+wish to start fresh, then you can clean and reset the whole repository and
+its modules:
+
+```shell
+git clean -xfd
+git submodule foreach --recursive git clean -xfd
+git reset --hard
+git submodule foreach --recursive git reset --hard
+git submodule update --init --recursive --jobs 8
+```
+
+### 2. Checkout Boost.GIL development branch
+
+Regardless if you decide to develop again `master` (recommended) or `develop`
+branch of the Boost super-project, you should *always* base your contributions
+(i.e. topic branches) on Boost.GIL `develop` branch.
+
+1. Go to the Boost.GIL library submodule.
+
+ ```shell
+ cd libs/gil
+ ```
+
+2. Checkout the `develop` branch and bring it up to date
+
+ ```shell
+ git checkout develop
+ git branch -vv
+ git pull origin develop
+ ```
+
+### 3. Fork Boost.GIL repository on GitHub
+
+Follow [Forking Projects](https://guides.github.com/activities/forking/) guide
+to get personal copy of [boostorg/gil](https://github.com/boostorg/gil)
+repository from where you will be able to submit new contributions as
+[pull requests](https://help.github.com/articles/about-pull-requests/).
+
+Add your fork as git remote to the Boost.GIL submodule:
+
+```shell
+cd libs/gil
+git remote add <username> https://github.com/<username>/gil.git
+```
+
+or, if you cloned from your fork already, add the upstream as `origin` remote:
+
+```shell
+git remote add upstream https://github.com/boostorg/gil.git
+# or
+git remote rename origin <username>
+git remote add origin https://github.com/boostorg/gil.git
+```
+
+### 4. Submit a pull request
+
+All Boost.GIL contributions should be developed inside a topic branch created by
+branching off the `develop` branch of [boostorg/gil](https://github.com/boostorg/gil).
+
+**IMPORTANT:** Pull Requests *must* come from a branch based on `develop`,
+and *never* on `master`.
+
+**NOTE:** The branching workflow model
+[Boost recommends](https://svn.boost.org/trac10/wiki/StartModWorkflow)
+is called Git Flow.
+
+For example:
+
+```shell
+cd libs/gil
+git checkout develop
+git checkout -b feature/foo
+```
+
+Now, you are set to to develop a new feature for Boost.GIL,
+then [git add](https://git-scm.com/docs/git-add) and
+[git commit](https://git-scm.com/docs/git-commit) your changes.
+
+Once it's finished, you can submit it as pull request for review:
+
+```shell
+cd libs/gil
+git checkout feature/foo
+git push <username> feature/foo
+```
+
+Finally, sign in to your GitHub account and
+[create a pull request](https://help.github.com/articles/creating-a-pull-request/).
+
+Your pull request will be automatically built and tests will run on Travis CI
+and AppVeyor (see [README](README.md) for builds status). Please, keep an eye
+on those CI builds and correct any problems detected in your contribution
+by updating your pull request.
+
+### 5. Update your pull request
+
+Depending on actual purpose of the update, you can follow a different
+strategy to update your pull request:
+
+- Use `git commit --amend`, `git rebase` and `git push --force` when your
+ pull request is still *work-in-progress* and not ready for review yet.
+- Use `git commit`, `git merge` and `git push` to update your pull request
+ during review, in response to requests from reviewers.
+
+**NOTE:** Once review of your work has started, you should not rebase your work.
+You should create new commits and update your topic branch. This helps with
+traceability in the pull request and prevents the accidental history breakage.
+Those who review your work may be fetching it into their fork for local review.
+
+#### Synchronise pull request branch
+
+Keep your topic branch up to date and synchronized with the upstream `develop` branch:
+
+```shell
+cd libs/gil
+git checkout develop
+git pull origin develop
+git checkout feature/foo
+```
+
+If review of your work has not started, *prefer* to merge:
+
+```shell
+git merge develop
+git push <username> feature/foo
+```
+
+If your PR is still *work-in-progress*, you may rebase if you like:
+
+```shell
+git rebase develop
+git push --force <username> feature/foo
+```
+
+#### Amend last commit of pull request
+
+If your pull request is a *work-in-progress* and has not been reviewed yet,
+you may amend your commit or rebase onto the `develop` branch:
+
+```shell
+cd libs/gil
+git checkout feature/foo
+git add -A
+git commit --amend
+git push --force <username> feature/foo
+```
+
+#### Add new commits to pull request
+
+In order to update your pull request, for example in response to a change
+request from reviewer, just add new commits:
+
+```shell
+cd libs/gil
+git checkout feature/foo
+git add -A
+git commit -m "Fix build Travis CI failures"
+git push <username> feature/foo
+```
+
+## Development
+
+Boost.GIL is a [header-only library](https://en.wikipedia.org/wiki/Header-only)
+which does not require sources compilation. Only test runners and
+[example](example/README.md) programs have to be compiled.
+
+By default, Boost.GIL uses Boost.Build to build all the executables.
+
+We also provide configuration for two alternative build systems:
+
+- [CMake](https://cmake.org)
+
+**NOTE:** The CMake is optional and the corresponding build configurations
+for Boost.GIL do not offer equivalents for all Boost.Build features.
+Most important difference to recognise is that Boost.Build will automatically
+build any other Boost libraries required by Boost.GIL as dependencies.
+
+### Install dependencies
+
+Boost.GIL tests and examples use the GIL I/O extension which depends on
+third-party libraries for read and write support of specific image formats:
+
+```shell
+sudo apt-get install libjpeg-dev libpng-dev libtiff5-dev libraw-dev
+```
+
+**TIP:** On Windows, use vcpkg with `user-config.jam` configuration provided in [example/b2/user-config-windows-vcpkg.jam](example/b2/).
+
+### Using Boost.Build
+
+The [b2 invocation](https://boostorg.github.io/build/manual/develop/index.html#bbv2.overview.invocation)
+explains available options like `toolset`, `variant` and others.
+
+Simply, just execute `b2` to run all tests built using default
+`variant=debug` and default `toolset` determined for your
+development environment.
+
+**TIP:** Pass `b2` option `-d 2` to output complete action text and commands,
+as they are executed. It is useful to inspect compilation flags.
+
+If no target or directory is specified, everything in the current directory
+is built. For example, all Boost.GIL tests can be built and run using:
+
+```shell
+cd libs/gil
+../../b2
+```
+
+Run core tests only specifying location of directory with tests:
+
+```shell
+cd libs/gil
+../../b2 cxxstd=11 test/core
+```
+
+Run all tests for selected extension (from Boost root directory, as alternative):
+
+```shell
+./b2 cxxstd=11 libs/gil/test/io
+./b2 cxxstd=11 libs/gil/test/numeric
+./b2 cxxstd=11 libs/gil/test/toolbox
+```
+
+Run I/O extension tests bundled in target called `simple`:
+
+```shell
+./b2 cxxstd=11 libs/gil/test/io//simple
+```
+
+**TIP:** Pass `b2` feature `cxxstd=11,14,17,2a` to request compilation for
+multiple C++ standard versions in single build run.
+
+### Using CMake
+
+Maintainer: [@mloskot](https://github.com/mloskot)
+
+**WARNING:** The CMake configuration is only provided for convenience
+of contributors. It does not export or install any targets, deploy
+config files or support subproject workflow.
+
+**NOTE:** CMake configuration does not build any dependencies required by
+Boost.GIL like Boost.Test and Boost.Filesystem libraries or any
+third-party image format libraries used by the I/O extension.
+
+The provided CMake configuration allows a couple of ways to develop Boost.GIL:
+
+1. Using Boost installed from binary packages in default system-wide location.
+2. Using Boost installed from sources in arbitrary location (CMake may need
+ `-DBOOST_ROOT=/path/to/boost/root`, see
+ [FindBoost](https://cmake.org/cmake/help/latest/module/FindBoost.html)
+ documentation for details).
+3. Using [cloned Boost super-project](#cloned-boost-super-project), inside modular
+ `libs/gil`. This mode requires prior deployment of `boost` virtual directory
+ with headers and stage build of required libraries, for example:
+
+For CMake, you only need to build Boost libraries required by Boost.Test library
+which is used to run GIL tests. Since the `CMAKE_CXX_STANDARD` option in the current
+[CMakeLists.txt](CMakeLists.txt) defaults to C++11, pass the default `cxxstd=11` to `b2`:
+
+ ```shell
+ ./b2 headers
+ ./b2 variant=debug,release cxxstd=11 --with-filesystem stage
+ ```
+
+ or, depending on specific requirements, more complete build:
+
+ ```shell
+ ./b2 variant=debug,release address-model=32,64 cxxstd=11 --layout=versioned --with-filesystem stage
+ ```
+
+If you wish to build tests using different C++ standard version, then adjust the `cxxstd` accordingly.
+
+Using the installed Boost enables a lightweight mode for the library development,
+inside a stand-alone clone Boost.GIL repository and without any need to clone the
+whole Boost super-project.
+
+**TIP:** For the lightweight setup, prefer latest release of Boost.
+
+For available custom CMake options, open the top-level `CMakeLists.txt` and search for `option`.
+
+Here is an example of such lightweight workflow in Linux environment (Debian-based):
+
+- Install required Boost libraries
+
+ ```shell
+ sudo apt-get update
+ sudo apt-get install libboost-dev libboost-test-dev libboost-filesystem-dev
+ ```
+
+- Clone Boost.GIL repository
+
+ ```shell
+ git clone https://github.com/boostorg/gil.git
+ cd gil
+ ```
+
+- Configure build with CMake
+
+ ```shell
+ mkdir _build
+ cd _build/
+ cmake ..
+ ```
+
+ **TIP:** By default, tests and [examples](example/README.md) are compiled using
+ the minimum required C++11.
+ Specify `-DCMAKE_CXX_STANDARD=14|17|20` to use newer version.
+ For more CMake options available for GIL, check `option`-s defined
+ in the top-level `CMakeLists.txt`.
+
+ **TIP:** If CMake is failing to find Boost libraries, especially built
+ with `--layout=versioned`, you can try a few hacks:
+ - option `-DBoost_ARCHITECTURE=-x64` to help CMake find Boost 1.66 and above
+ add an architecture tag to the library file names in versioned build
+ The option added in CMake 3.13.0.
+ - option `-DBoost_COMPILER=-gcc5` or `-DBoost_COMPILER=-vc141` to help CMake earlier
+ than 3.13 match your compiler with toolset used in the Boost library file names
+ (i.e. `libboost_filesystem-gcc5-mt-x64-1_69` and not `-gcc55-`).
+ Fixed in CMake 3.13.0.
+ - if CMake is still failing to find Boost, you may try `-DBoost_DEBUG=ON` to
+ get detailed diagnostics output from `FindBoost.cmake` module.
+
+- List available CMake targets
+
+ ```shell
+ cmake --build . --target help
+ ```
+
+- Build selected target with CMake
+
+ ```shell
+ cmake --build . --target gil_test_pixel
+ ```
+
+- List available CTest targets
+
+ ```shell
+ ctest --show-only | grep Test
+ ```
+
+- Run selected test with CTest
+
+ ```shell
+ ctest -R gil.tests.core.pixel
+ ```
+
+#### CMake configuration for Visual Studio
+
+We provide [example/cmake/CMakeSettings.json](https://github.com/boostorg/gil/blob/develop/example/cmake/CMakeSettings.json)
+with reasonable default settings for the [CMake support in Visual Studio](https://go.microsoft.com//fwlink//?linkid=834763).
+See [example/cmake/README.md](example/cmake/README.md) for more details.
+
+#### CMake configuration for Visual Studio Code
+
+We provide [example/cmake/cmake-variants.yaml](https://github.com/boostorg/gil/blob/develop/example/cmake/cmake-variants.yaml)
+with reasonable default settings for the [CMake Tools](https://github.com/vector-of-bool/vscode-cmake-tools) extension.
+See [example/cmake/README.md](example/cmake/README.md) for more details.
+
+### Running clang-tidy
+
+[clang-tidy](http://clang.llvm.org/extra/clang-tidy/) can be run on demand to
+diagnose or diagnose and fix or refactor source code issues.
+
+Since the CMake configuration is provided for building tests and [examples](example/README.md),
+it is easy to run `clang-tidy` using either the integration built-in CMake 3.6+
+as target property `CXX_CLANG_TIDY` or the compile command database which
+can be easily generated.
+
+#### Linting
+
+This mode uses the CMake built-in integration and runs `clang-tidy` checks configured
+in [.clang-tidy](https://github.com/boostorg/gil/blob/develop/.clang-tidy).
+All custom compilation warning levels (e.g. `-Wall`) are disabled and
+compiler defaults are used.
+
+```shell
+cd libs/gil
+cmake -S . -B _build -DGIL_USE_CLANG_TIDY=ON
+
+# all targets
+cmake --build _build
+
+# selected target
+cmake --build _build --target test_headers_all_in_one
+```
+
+#### Refactoring
+
+**WARNING:** This is advanced processing and depending on checks, it may fail to deliver
+expected results, especially if run against all configured translation units at ones.
+
+1. Generate `compile_commands.json` database
+
+ ```shell
+ cd libs/gil
+ cmake -S . -B _build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
+ ```
+
+2. Edit `compile_commands.json` and remove entries of commands for all but the `.cpp`
+ files you wish to refactor. For example, keep `test_headers_all_in_one.cpp` only
+ to refactor all headers.
+
+3. Run the parallel `clang-tidy` runner script to apply the desired checks (and fixes)
+ across the library source code:
+
+ ```shell
+ run-clang-tidy.py -p=_build -header-filter='boost\/gil\/.*' -checks='-*,modernize-use-using' -fix > cl.log 2>&1
+ ```
+
+## Guidelines
+
+Boost.GIL is a more than a decade old mature library maintained by several
+developers with help from a couple of dozens contributors.
+It is important to maintain consistent design, look and feel.
+Thus, below a few basic guidelines are listed.
+
+First and foremost, make sure you are familiar with the official
+[Boost Library Requirements and Guidelines](https://www.boost.org/development/requirements.html).
+
+Second, strive for writing idiomatic C++11, clean and elegant code.
+
+**NOTE:** *The Boost.GIL source code does not necessary represent clean and elegant
+code to look up to. The library has recently entered the transition to C++11.
+Major refactoring overhaul is ongoing.*
+
+Maintain structure your source code files according to the following guidelines:
+
+- Name files in meaningful way.
+- Put copyright and license information in every file
+- If your changes [meet a certain threshold of originality](https://www.boost.org/users/license.html),
+ add yourself to the copyright notice. Do not put any additional authorship or
+ file comments (eg. no `\file` for Doxygen), revision information, etc.
+- In header, put `#include` guard based on header path and file name
+
+ ```cpp
+ #ifndef BOOST_GIL_<DIR1>_<DIR2>_<FILE>_HPP
+ #define BOOST_GIL_<DIR1>_<DIR2>_<FILE>_HPP
+ ...
+ #endif
+ ```
+
+- Make sure each [header is self-contained](https://github.com/boostorg/gil/wiki/Include-Directives-Order), i.e. that they include all headers they need.
+- All public headers should be placed in `boost/gil/` or `boost/gil/<component>/`.
+- All non-public headers should be placed `boost/gil/detail` or `boost/gil/<component>/detail`.
+- All public definitions should reside in scope of `namespace boost { namespace gil {...}}`.
+- All non-public definitions should reside in scope of `namespace boost { namespace gil { namespace detail {...}}}`.
+- Write your code to fit within **100** columns of text.
+- Use [EditorConfig](https://editorconfig.org) for your editor and enable [.editorconfig](https://github.com/boostorg/gil/blob/develop/.editorconfig) to:
+ - Indent with **4 spaces** and no tabs.
+ - Trim any trailing whitespaces.
+- Do not increases the indentation level within namespace.
+
+[status/work-in-progress]: https://github.com/boostorg/gil/labels/status%2Fwork-in-progress
+[refer]: https://help.github.com/articles/autolinked-references-and-urls/
+[keywords]: https://help.github.com/articles/closing-issues-using-keywords/
+[mention]: https://help.github.com/articles/basic-writing-and-formatting-syntax/#mentioning-people-and-teams
+[squash and merge]: https://help.github.com/articles/merging-a-pull-request/
+[create a merge commit]: https://help.github.com/articles/merging-a-pull-request/
diff --git a/src/boost/libs/gil/Jamfile b/src/boost/libs/gil/Jamfile
new file mode 100644
index 000000000..739260ce9
--- /dev/null
+++ b/src/boost/libs/gil/Jamfile
@@ -0,0 +1,10 @@
+# Boost.GIL Library Jamfile
+#
+# Copyright (c) 2018 James E. King III
+#
+# Use, modification, and distribution are subject to the
+# Boost Software License, Version 1.0. (See accompanying file
+# LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+# please order by name to ease maintenance
+build-project test ;
diff --git a/src/boost/libs/gil/LICENSE.txt b/src/boost/libs/gil/LICENSE.txt
new file mode 100644
index 000000000..36b7cd93c
--- /dev/null
+++ b/src/boost/libs/gil/LICENSE.txt
@@ -0,0 +1,23 @@
+Boost Software License - Version 1.0 - August 17th, 2003
+
+Permission is hereby granted, free of charge, to any person or organization
+obtaining a copy of the software and accompanying documentation covered by
+this license (the "Software") to use, reproduce, display, distribute,
+execute, and transmit the Software, and to prepare derivative works of the
+Software, and to permit third-parties to whom the Software is furnished to
+do so, all subject to the following:
+
+The copyright notices in the Software and this entire statement, including
+the above license grant, this restriction and the following disclaimer,
+must be included in all copies of the Software, in whole or in part, and
+all derivative works of the Software, unless such copies or derivative
+works are solely in the form of machine-executable object code generated by
+a source language processor.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/src/boost/libs/gil/README.md b/src/boost/libs/gil/README.md
new file mode 100644
index 000000000..dc78e1c55
--- /dev/null
+++ b/src/boost/libs/gil/README.md
@@ -0,0 +1,115 @@
+![Boost Generic Image Library (GIL)](https://raw.githubusercontent.com/boostorg/gil/develop/doc/_static/gil.png)
+
+[![Language](https://img.shields.io/badge/C%2B%2B-11-blue.svg)](https://en.wikipedia.org/wiki/C%2B%2B#Standardization)
+[![License](https://img.shields.io/badge/license-BSL-blue.svg)](https://opensource.org/licenses/BSL-1.0)
+[![Documentation](https://img.shields.io/badge/gil-documentation-blue.svg)](http://boostorg.github.com/gil/)
+[![Wiki](https://img.shields.io/badge/gil-wiki-blue.svg)](https://github.com/boostorg/gil/wiki)
+[![Mailing List](https://img.shields.io/badge/gil-mailing%20list-4eb899.svg)](https://lists.boost.org/mailman/listinfo.cgi/boost-gil)
+[![Gitter](https://img.shields.io/badge/gil-chat%20on%20gitter-4eb899.svg)](https://gitter.im/boostorg/gil)
+[![Try it online](https://img.shields.io/badge/on-wandbox-blue.svg)](https://wandbox.org/permlink/isNgnMuqWcqTqzy7)
+[![Conan](https://img.shields.io/badge/on-conan-blue.svg)](https://bintray.com/bincrafters/public-conan/boost_gil%3Abincrafters)
+[![Vcpkg](https://img.shields.io/badge/on-vcpkg-blue.svg)](https://github.com/Microsoft/vcpkg/tree/master/ports/boost-gil)
+
+Documentation | AppVeyor | Azure Pipelines | Travis CI | CircleCI | Regression
+--------------|-----------------|-----------------|-----------------|-----------------|------------
+[![develop](https://img.shields.io/badge/doc-develop-blue.svg)](https://boostorg.github.io/gil/develop/) | [![AppVeyor](https://ci.appveyor.com/api/projects/status/w4k19d8io2af168h/branch/develop?svg=true)](https://ci.appveyor.com/project/stefanseefeld/gil/branch/develop) | [![Azure](https://dev.azure.com/boostorg/gil/_apis/build/status/boostorg.gil?branchName=develop)](https://dev.azure.com/boostorg/gil/_build/latest?definitionId=4?branchName=develop) | [![Travis](https://travis-ci.org/boostorg/gil.svg?branch=develop)](https://travis-ci.org/boostorg/gil) | [![CircleCI](https://circleci.com/gh/boostorg/gil/tree/develop.svg?style=shield)](https://circleci.com/gh/boostorg/workflows/gil/tree/develop) | [![gil](https://img.shields.io/badge/gil-develop-blue.svg)](http://www.boost.org/development/tests/develop/developer/gil.html)
+[![master](https://img.shields.io/badge/doc-master-blue.svg)](https://boostorg.github.io/gil/) | [![AppVeyor](https://ci.appveyor.com/api/projects/status/w4k19d8io2af168h?svg=true)](https://ci.appveyor.com/project/stefanseefeld/gil/branch/master) | [![Azure](https://dev.azure.com/boostorg/gil/_apis/build/status/boostorg.gil?branchName=master)](https://dev.azure.com/boostorg/gil/_build/latest?definitionId=4?branchName=master) | [![Travis](https://travis-ci.org/boostorg/gil.svg?branch=master)](https://travis-ci.org/boostorg/gil) | [![CircleCI](https://circleci.com/gh/boostorg/gil/tree/master.svg?style=shield)](https://circleci.com/gh/boostorg/workflows/gil/tree/master) | [![gil](https://img.shields.io/badge/gil-master-blue.svg)](http://www.boost.org/development/tests/master/developer/gil.html)
+
+# Boost.GIL
+
+- [Introduction](#introduction)
+- [Documentation](#documentation)
+- [Requirements](#requirements)
+- [Branches](#branches)
+- [Community](#community)
+- [Contributing](#contributing-we-need-your-help)
+- [License](#license)
+
+## Introduction
+
+Boost.GIL is a part of the [Boost C++ Libraries](http://github.com/boostorg).
+
+The Boost Generic Image Library (GIL) is a **C++11** library that abstracts image
+representations from algorithms and allows writing code that can work on a
+variety of images with performance similar to hand-writing for a specific image type.
+
+## Documentation
+
+- [Latest release](https://boost.org/libs/gil)
+- [Branch master](http://boostorg.github.io/gil/) (latest release with minor changes)
+- [Branch develop](http://boostorg.github.io/gil/develop/)
+
+See [RELEASES.md](RELEASES.md) for release notes.
+
+See [CONTRIBUTING.md](CONTRIBUTING.md) for instructions about how to build and
+run tests and examples using Boost.Build or CMake.
+
+See [example/README.md](example/README.md) for GIL usage examples.
+
+See [example/b2/README.md](example/b2/README.md) for Boost.Build configuration examples.
+
+See [example/cmake/README.md](example/cmake/README.md) for CMake configuration examples.
+
+## Requirements
+
+**NOTE:** The library source code is currently being modernized for C++11.
+
+The Boost Generic Image Library (GIL) requires:
+
+- C++11 compiler (GCC 4.9, clang 3.3, MSVC++ 14.0 (1900) or any later version)
+- Boost header-only libraries
+
+Optionally, in order to build and run tests and examples:
+
+- Boost.Filesystem
+- Boost.Test
+- Headers and libraries of libjpeg, libpng, libtiff, libraw for the I/O extension and some of examples.
+
+## Branches
+
+The official repository contains the following branches:
+
+- [**master**](https://github.com/boostorg/gil/tree/master) This
+ holds the most recent snapshot with code that is known to be stable.
+
+- [**develop**](https://github.com/boostorg/gil/tree/develop) This
+ holds the most recent snapshot. It may contain unstable code.
+
+## Community
+
+There is number of communication channels to ask questions and discuss Boost.GIL issues:
+
+- Mailing lists ([Boost discussion policy](https://www.boost.org/more/discussion_policy.html))
+ - [boost-gil](https://lists.boost.org/mailman/listinfo.cgi/boost-gil) (*recommended*) official Boost.GIL mailing list ([archive](https://lists.boost.org/boost-gil/))
+ - [boost-users](https://lists.boost.org/mailman/listinfo.cgi/boost-users) for all Boost users
+ - [boost](https://lists.boost.org/mailman/listinfo.cgi/boost) for all Boost developers
+- Slack at [cpplang.slack.com](https://cppalliance.org/slack/) with Boost channels:
+ - [\#boost-gil](https://cpplang.slack.com/archives/CSVT0STV2) (*recommended*) official Boost.GIL channel
+ - [\#boost-user](https://cpplang.slack.com/messages/CEWTCFDN0/) for all Boost users
+ - [\#boost](https://cpplang.slack.com/messages/C27KZLB0X/) for all Boost developers
+- Gitter room [boostorg/gil](https://gitter.im/boostorg/gil) (old real-time chat space)
+- You can also ask questions via GitHub issue.
+
+## Contributing (We Need Your Help!)
+
+If you would like to contribute to Boost.GIL, help us improve the library
+and maintain high quality, there is number of ways to do it.
+
+If you would like to test the library, contribute new feature or a bug fix,
+see the [CONTRIBUTING.md](CONTRIBUTING.md) where the whole development
+infrastructure and the contributing workflow is explained in details.
+
+You may consider performing code reviews on active
+[pull requests](https://github.com/boostorg/gil/pulls) or help
+with solving reported issues, especially those labelled with:
+
+- [status/need-help](https://github.com/boostorg/gil/labels/status%2Fneed-help)
+- [status/need-feedback](https://github.com/boostorg/gil/labels/status%2Fneed-feedback)
+- [need-minimal-example](https://github.com/boostorg/gil/labels/status%2Fneed-minimal-example)
+
+Any feedback from users and developers, even simple questions about how things work
+or why they were done a certain way, carries value and can be used to improve the library.
+
+## License
+
+Distributed under the [Boost Software License, Version 1.0](http://www.boost.org/LICENSE_1_0.txt).
diff --git a/src/boost/libs/gil/RELEASES.md b/src/boost/libs/gil/RELEASES.md
new file mode 100644
index 000000000..e45846df1
--- /dev/null
+++ b/src/boost/libs/gil/RELEASES.md
@@ -0,0 +1,363 @@
+# Release Notes
+
+All notable changes to [Boost.GIL](https://github.com/boostorg/gil/) project will be documented in this file.
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
+
+## [1.73.0] - 2020-04-22 (beta)
+
+### Added
+- Added move constructor and move assignment operator to `image` class ([PR #457](https://github.com/boostorg/gil/pull/457)).
+- New member function `size()` in `any_image_view` class ([PR #456](https://github.com/boostorg/gil/pull/456)).
+- Numerous new test cases for existing features.
+
+### Changed
+- Replace Boost.Test with Boost.LightweightTest as the only test framework used in GIL ([PR #459](https://github.com/boostorg/gil/pull/459) and [PR #464](https://github.com/boostorg/gil/pull/464)). This also restructured the `test/extension/io/` sub-tree and targets in related `Jamfile`-s.
+- Removed remaining uses of Boost.MPL ([PR #441](https://github.com/boostorg/gil/pull/441).
+- Renamed all macros using `BOOST_GIL_` prefix ([PR #411](https://github.com/boostorg/gil/pull/411)).
+- Renamed all CMake configuration options using `BOOST_GIL_` prefix ([PR #419](https://github.com/boostorg/gil/pull/419)).
+
+### Removed
+- Removed `extension/dynamic_image/reduce.hpp` as unused and possibly unfinished ([PR #466](https://github.com/boostorg/gil/pull/466)). An implementation attempt of techniques described in the paper [Efficient Run-Time Dispatching in Generic Programming with Minimal Code Bloat](http://lubomir.org/academic/MinimizingCodeBloat.pdf) by Lubomir Bourdev, Jaakko Jarvi.
+- Removed direct dependency on Boost.MPL, Boost.System and Boost.Test.
+- Started removing public macros for compile-time configuration of I/O extension tests, i.e. `BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES` and `BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES`. Instead, if a test target is built, it builds all its test cases unconditionally.
+
+### Fixed
+- Avoid `longjmp` interaction during destruction of I/O extension objects ([PR #433](https://github.com/boostorg/gil/pull/433)).
+- Fixed missing alignment default value in constructor of `image` class ([PR #429](https://github.com/boostorg/gil/pull/429)).
+- Fixed segmentation fault when reading corrupted PNG file ([PR #414](https://github.com/boostorg/gil/pull/414)).
+- Fixed illegal initialization of return values in the old IOv1 interface of I/O extension ([PR #409](https://github.com/boostorg/gil/pull/409)).
+
+### Acknowledgements
+
+Samuel Debionne, Thiago Henrique Hüpner, Pranam Lashkari, Mateusz Loskot, Debabrata Mandal, Olzhas Zhumabek
+
+## [1.72.0] - 2019-12-11
+
+### Added
+- GSoC 2019: Lanczos resampling for image down scaling ([PR #309](https://github.com/boostorg/gil/pull/309)).
+- GSoC 2019: Methods for binary thresholding, inverted binary thresholding and truncation thresholding ([PR #313](https://github.com/boostorg/gil/pull/313)).
+- GSoC 2019: Otsu thresholding method ([PR #314](https://github.com/boostorg/gil/pull/314)).
+- GSoC 2019: Adaptive thresholding using mean of the neighbourhood area ([PR #341](https://github.com/boostorg/gil/pull/341)).
+- GSoC 2019: Adaptive thresholding using gaussian-weighted sum of the neighbourhood area ([PR #379](https://github.com/boostorg/gil/pull/379)).
+- GSoC 2019: Harris response calculation (corner detector without non-maximum filtering) ([PR #350](https://github.com/boostorg/gil/pull/350)).
+- GSoC 2019: Hessian corner detector ([PR #364](https://github.com/boostorg/gil/pull/364)).
+- GSoC 2019: Types for defining 2D kernel, `kernel_2d` and `kernel_2d_fixed`, in Numeric extension ([PR #361](https://github.com/boostorg/gil/pull/361)).
+- GSoC 2019: Implementation of 2D convolution as new function `convolve_2d` ([PR #367](https://github.com/boostorg/gil/pull/367)).
+- GSoC 2019: Box filtering using the average filter ([PR #383](https://github.com/boostorg/gil/pull/383)).
+- GSoC 2019: Blur function based on normalized mean filter ([PR #383](https://github.com/boostorg/gil/pull/383)).
+- GSoC 2019: Sobel and Scharr operators ([PR #392](https://github.com/boostorg/gil/pull/392)).
+- GSoC 2019: Median filter to remove noise from image ([PR #393](https://github.com/boostorg/gil/pull/393)).
+- Continued adding new test cases and significantly improved overall test coverage.
+- Documented purpose of `cached_location_t` ([PR #287](https://github.com/boostorg/gil/pull/287)).
+- Function `convolve_1d` in Numeric extension for convenient use of `convolve_rows` and `convolve_cols` ([PR #347](https://github.com/boostorg/gil/pull/347) and [PR #367](https://github.com/boostorg/gil/pull/367)).
+- Function `extend_boundary` in Numeric extension to perform image boundary extension ([PR #386](https://github.com/boostorg/gil/pull/386)).
+- Project release notes maintained in Markdown file `RELEASES.md` ([PR #404](https://github.com/boostorg/gil/pull/404)).
+
+### Changed
+- Move all tests, core features and extensions, inside `test/` directory ([PR #302](https://github.com/boostorg/gil/pull/302)).
+
+### Removed
+- Replace Boost.MPL with Boost.MP11 ([PR #274](https://github.com/boostorg/gil/pull/274)).
+- Removed use of Boost.TypeTraits ([PR #274](https://github.com/boostorg/gil/pull/274)).
+- Dropped support for GCC <= 4.8 ([PR #296](https://github.com/boostorg/gil/pull/296)).
+- Remove `include/boost/gil/version.hpp` file as unused ([PR #403](https://github.com/boostorg/gil/pull/403)).
+
+### Fixed
+- Undetermined value of default-initialized channel and pixel objects ([PR #273](https://github.com/boostorg/gil/pull/273)).
+- Undefined behaviour due to `std::is_trivially_default_constructible` specializations ([PR #284](https://github.com/boostorg/gil/pull/284)).
+- Crash when reading PNG files with an invalid header ([PR #385](https://github.com/boostorg/gil/pull/385)).
+- Applied the [Rule of Three](https://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)) for numerous types.
+- Removed uses of deprecated implicit definition of defaulted copy assignment operator or copy constructor.
+
+### Acknowledgements
+
+Samuel Debionne, Tyler Deuty, Jean-David Gadina, Jan Houska, Pranam Lashkari, Mateusz Loskot, Stefan Seefeld, Miral Shah, Olzhas Zhumabek
+
+## [1.70.0] - 2019-04-12
+
+### Added
+- Numerous new test cases for existing features.
+- C++11 requirements checks to Boost.Build Jamfiles ([PR #260](https://github.com/boostorg/gil/pull/260)).
+
+### Changed
+- Split single `boost/gil/concepts.hpp` into multiple `boost/gil/concepts/*.hpp` headers ([PR #169](https://github.com/boostorg/gil/pull/169)).
+- Removed uses of `boost::enable_if` with `std::enable_if` ([PR #215](https://github.com/boostorg/gil/pull/215)).
+- Replaced own implementation of variant type used for `any_image` with Boost.Variant ([PR #231](https://github.com/boostorg/gil/pull/231)).
+- Moved original all-in-one test suite to `test/legacy/` ([PR #239](https://github.com/boostorg/gil/pull/239)).
+- Continued C++ modernization of the library source code.
+
+### Removed
+- Remove uses of deprecated `std::unary_function` and `std::binary_function` ([PR #191](https://github.com/boostorg/gil/pull/191)).
+- Removed uses of Boost.StaticAssert ([PR #207](https://github.com/boostorg/gil/pull/207)).
+- Removed uses of `BOOST_STATIC_CONSTANT` ([PR #211](https://github.com/boostorg/gil/pull/211)).
+- Removed uses of Boost.Function ([PR #213](https://github.com/boostorg/gil/pull/213)), Boost.Bind and Boost.Lambda ([PR #212](https://github.com/boostorg/gil/pull/212)).
+
+### Fixed
+- Fixed access to non-type results of metafunctions calls using `::value` convention ([PR #262](https://github.com/boostorg/gil/pull/262)).
+
+### Acknowledgements
+
+Samuel Debionne, Mateusz Loskot, Nikita Kniazev, Stefan Seefeld
+
+## [1.69.0] - 2018-12-12
+
+### Changed
+- Refactored library includes to `#include <boost/gil/...>` structure ([PR #145](https://github.com/boostorg/gil/pull/145)).
+
+### Removed
+- Header `include/boost/gil_all.hpp` file as deprecated ([PR #145](https://github.com/boostorg/gil/pull/145)).
+- Header `include/boost/gil_concepts.hpp` file as deprecated ([PR #145](https://github.com/boostorg/gil/pull/145)).
+- Header `include/boost/gil_config.hpp` file as unnecessary ([PR #144](https://github.com/boostorg/gil/pull/144)).
+
+### Fixed
+- Fixed `point<T>` divide and multiply to not to hardcode result as `point<double>` ([PR #157](https://github.com/boostorg/gil/pull/157)).
+- Fixed conflict between `std::fill_n` and `boost::range::fill_n` ([PR #152](https://github.com/boostorg/gil/pull/152)).
+- Fixed issue with re-assignment of functor from `for_each_pixel` ([PR #139](https://github.com/boostorg/gil/pull/139)).
+- Fixed missing template keyword prior to dependent name `axis_iterator` ([PR #129](https://github.com/boostorg/gil/pull/129)).
+- Fixed loading of grayscale PNG with alpha channel (tRNS chunks) ([PR #118](https://github.com/boostorg/gil/pull/118)).
+
+### Acknowledgements
+
+Mateusz Loskot, Marcel Metz, Stefan Seefeld
+
+## [1.68.0] - 2018-08-09
+
+### Added
+- The library now requires a C++11-compliant compiler.
+- New top-level all-in-one `include/boost/gil.hpp` header.
+- Added Toolbox extension following the [review and acceptance into Boost](https://lists.boost.org/boost-announce/2011/01/0281.php).
+
+### Changed
+- The I/O extensions have been entirely rewritten as I/O v2, [reviewed and accepted into Boost](https://lists.boost.org/boost-announce/2011/01/0281.php).
+- Documentation has been reformatted and updated.
+
+### Removed
+- The existing I/O v1 extension has been replaced with I/O v2.
+
+### Acknowledgements
+
+Niklas Angare, Jan Beich, Edward Diener, Peter Dimov, Daniela Engert, Bill Gallafent, Christian Henning, Daniel James, Nikita Kniazev, Mateusz Loskot, Marcel Metz, Martin Osborne, Antony Polukhin, Stefan Seefeld
+
+## [1.53.0] - 2013-02-04
+
+### Fixed
+- Fixed self-assignment warnings (Trac [#4919](https://svn.boost.org/trac10/ticket/4919)).
+
+### Acknowledgements
+
+Lubomir Bourdev, Marshall Clow, Beman Dawes, Daniela Engert, Bill Gallafent, Doug Gregor, Boris Gubenko, Christian Henning, Michael Jackson, Daniel James, Hailin Jin, Nikita Kniazev, Mateusz Loskot, John Maddock, Marcel Metz, Antony Polukhin, Stefan Seefeld
+
+## [1.35.0] - 2008-03-29
+
+### Added
+- First Boost release of Generic Image Library developed by Lubomir Bourdev and Hailin Jin following the [review and acceptance into Boost](https://lists.boost.org/Archives/boost/2006/11/112896.php).
+
+### Acknowledgements
+
+Lubomir Bourdev, Beman Dawes, Hailin Jin, John Maddock and all the reviewers of the library.
+
+---------------------------------------------------------------------
+
+## Pre-Boost History of the Generic Image Library (GIL) by Adobe
+
+The log of changes prior the first release of GIL as part of Boost
+was collected from https://stlab.adobe.com/gil/news.html site and
+linked PDF documents with detailed changes.
+
+---------------------------------------------------------------------
+
+## [2.1.1] - 2007-09-15
+
+### Changed
+- Swapped template arguments for `color_element_type`, `color_element_reference_type` and `color_element_const_reference_type` to take `ColorBase` first for consistency with the other similar metafunctions.
+
+### Fixed
+- Minor bugs fixed.
+
+## [2.1.0] - 2007-06-17
+
+### Added
+- Added support for accessing raw memory from image views by getting raw pointer to the beginning of the memory
+ associated with a homogeneous image view using new functions `interleaved_view_get_raw_data` or `planar_view_get_raw_data`.
+- Support for non-byte-aligned images (e.g. 6-bit RGB222, or 1-bit grayscale).
+ To support bit distance, we are using the same classes that were providing byte distance (`byte_addressible_step_iterator`, `byte_addressible_2d_locator`, etc.)
+ except that now they operate on memory units instead of bytes.
+ A memory unit can currently be either a byte or a bit.
+- New `byte_to_memunit` function required by the `MemoryBasedIteratorConcept`, which specifies the number of bits per memory unit (either 1 or 8).
+- New classes for references and iterators over bit-aligned pixels: `bit_aligned_pixel_reference`, `bit_aligned_pixel_iterator`.
+ The memory unit of bit aligned pixel iterators is a bit, i.e. `byte_to_unit<bit_aligned_pixel_iterator<T> >::value == 8`.
+- The `value_type` of a bit-aligned image is a `packed_pixel` (new name, see below).
+ A packed pixel is a pixel that is byte-aligned but whose channels may not be byte aligned.
+ There is a strong analogy with the way interleaved and planar images are implemented, with `packed_pixel` corresponding
+ to `pixel`, `bit_aligned_pixel_reference` corresponding to `planar_pixel_reference`
+ and `bit_aligned_pixel_iterator` corresponding to `planar_pixel_iterator`.
+- New metafunction `bit_aligned_image_type` for constructing bit-aligned images.
+ A bit-aligned image is an image whose pixels may not be byte-aligned (such as an RGB222 image).
+- New metafunction `pixel_value_type` for constructing homogenous pixel value from elements.
+- New metafunction `packed_pixel_type` for constructing homogenous packed pixel from elements.
+- New metafunction `packed_image_type` for constructing packed images with packed pixel as its `value_type`.
+
+### Changed
+- Renamed `heterogeneous_packed_pixel` to `packed_pixel`.
+- Renamed `ByteAdvancableIteratorConcept` to `MemoryBasedIteratorConcept`.
+- Renamed `byte_addressable_{step_iterator,2d_locator}` to `memory_based_{step_iterator,2d_locator}`.
+- Renamed `byte_{advance,advanced,distance,step}` to `memunit_{advance,advanced,distance,step}`,
+- Renamed `locator::row_bytes()` to `locator::row_size()` and `locator::pix_bytestep()` to `locator::pixel_size()`.
+- Simplified `packed_channel_reference` and `packed_dynamic_channel_reference` by removing the `BitField` parameter (it is now computed automatically).
+- Improved `channel_convert` - it is faster by switching to floating-point math only if necessary.
+
+### Fixed
+- Fixed a roundoff bug in the conversion (related to floating-point math switching).
+- Fixed histogram regression tests.
+
+## [2.0.x] - 2007-03-27
+
+### Changed
+- Minor bug fixes.
+- Regression test improvements.
+
+### Removed
+- Removed any external dependencies from the regression tests.
+
+## [2.0.0] - 2007-03-08
+
+### Added
+- Further Boost integration:
+ - Directories follow the Boost convention.
+ - Different models are usually now split in separate files.
+ - Renamed some files for better consistency.
+ - Renamed classes, functions and template arguments with longer but clearer and more consistent names.
+- New `deprecated.hpp` - a file that maps many of the deprecated names to current ones.
+ Including it will help porting your code to GIL 2.0. After porting to GIL 2.0, however,
+ make sure that your code works when this file is not included.
+- New `swap` function required for reference proxies, since the `std::swap` default does not do the right thing.
+- Metafunctions `iterator_type_from_pixel` and `view_type_from_pixel` to allow creating standard iterators and views associated with a pixel type.
+- New `scoped_channel_value`, a channel adaptor that changes the operational range of a channel. `bits32f` is defined as a `float` with range `0.0` to `1.0`.
+- New `packed_channel_value`, `packed_channel_reference` and `packed_dynamic_channel_reference` which model channels operating on bit ranges.
+- New `heterogeneous_packed_pixel`, a model of a pixel whose channels are bit ranges (e.g. 16-bit RGB pixel in the 565 format).
+- Metafunctions to get the k-th element of a color base (or its reference): `kth_semantic_element_type`, `kth_semantic_element_reference_type`, `kth_semantic_element_const_reference_type`.
+- Metafunctions to operate on pixel iterator: `const_iterator_type`, `iterator_is_mutable`, `is_iterator_adaptor`.
+- New image view algorithms `uninitialized_fill_pixels`, `uninitialized_copy_pixels` and method `is_1d_traversable`.
+- Added support for creating images with a new value to fill.
+
+### Changed
+- Updated the design guide and tutorial, updated syntax of concepts to the latest concepts proposal.
+- In `image`, `image_view`, `any_image`, `any_image_view`:
+ There are no longer global functions `get_width()`, `get_height()`, `get_dimensions()`, `num_channels()`.
+ Use methods `width()`, `height()`, `dimensions()` instead.
+- In models of pixel, pixel iterator, pixel locator, image view and image:
+ There used to be different ways of getting to a pixel, channel, color space, etc. of an image view,
+ pixel, locator, iterator and image (e.g. traits, member typedefs).
+ Now all pixel-based GIL constructs (pixels, pixel iterators, locators, image views and images) model
+ `PixelBasedConcept`, which means they provide the following metafunctions: `color_space_type`, `channel_mapping_type`, `is_planar`, `num_channels`
+ and for homogeneous constructs we also have: `channel_type`.
+ To get the pixel type or pixel reference/const reference type of an image, image view, locator
+ and pixel, use member typedefs `value_type`, `reference` and `const_reference`.
+- In `locator`, `image`, `image_view`, `any_image` and `any_image_view`:
+ Removed `dynamic_x_step_t`, `dynamic_y_step_t`, `dynamic_xy_step_t` and `dynamic_xy_step_transposed_t`
+ as member typedefs of locators and image views.
+ Instead, there are separate concepts `HasDynamicXStepTypeConcept`, `HasDynamicYStepTypeConcept`,
+ `HasTransposedTypeConcept` which all GIL-provided locators, views and images model.
+ Those concepts require a metafunction to get the corresponding type.
+ Analogously, all GIL pixel iterators model `HasDynamicXStepTypeConcept`.
+- In channel, the min and max value is now part of the channel traits.
+ For all built-in types the channel range equals the physical range (as determined by `std::numeric_traits<T>::max()`).
+- Provide `channel_convert` support to convert between any of the GIL-provided channel types.
+ The operation is also consistent - conversion is done as a linear mapping that maps the min/max to the min/max.
+- In pixel, major redesign of pixel-level constructs.
+ Renamed `color_base` to `homogeneous_color_base` and defined it once, not for each color space.
+ The color base is a first-class concept and allows to model any bundle of color elements.
+ Work needed to define a new color space has been simplified a lot.
+ All former pixel-level algorithms and accessors now operate on color bases.
+ The elements of a color base can be accessed by physical or semantic index or by name (channel names
+ can no longer be accessed as members of the pixel e.g. `my_pixel.gray = 0`), use `get_color` instead).
+- In color base, algorithms now can take heterogeneous pixels (i.e. pixels each channel of which may have a different type).
+ The `color_convert` can operate on heterogeneous pixels with the exception of to/from RGBA.
+- In image, the class `image` is no longer templated over the image view. It is now templated over pixel value.
+- In dynamic image, instead of removed `cross_vector_image_types` and `cross_vector_image_view_types`, create MPL vector to enumerate types.
+- Renamed algorithms `{copy,equal,fill,for_each,generate,max,min,transform}_channels` to `static_{copy,equal,fill,for_each,generate,max,min,transform}`.
+- Rename metafunctions `channel` to `at_c`, `semantic_channel` to `semantic_at_c`, `get_nth_channel` to `dynamic_at_c`.
+- Renamed `planar_{ptr,ref}` to `planar_pixel_{iterator,reference}`.
+- Renamed `PixelConcept` to `HomogeneousPixelConcept`.
+- Renamed `HeterogeneousPixelConcept` to `PixelConcept`.
+- Renamed `pixel_image_iterator` to `iterator_from_2d`.
+- Renamed `is_contiguous` to `is_1d_traversable`.
+- Renamed `membased_2d_locator` to `byte_addressable_2d_locator`.
+- Renamed `resize_clobber_image` to `image::recreate`.
+
+### Fixed
+- Now compiles with GCC 4.1.1.
+- Fixed some bugs in defining reference proxies.
+
+### Removed
+- Flattened the `core` directory as part of Boost integration.
+- Got rid of channel accessors from pixel types.
+- Got rid of `pixel_traits`. Use nested typedefs `value_type`, `reference` and `const_reference` or metafunctions implementing `PixelBasedConcept`.
+- Got rid of `pixel_iterator_traits`. Use `std::iterator_traits`, `PixelBasedConcept` metafunctions or the new metafunctions for pixel iterators.
+- Got rid of the ability to directly access pixels through image, only through views. The image no longer models STL's random access container concept.
+- No more LAB and HSB color space, because there is no color conversion support implemented for these. New color spaces can be added with just a few lines of code.
+
+## [1.x] - 2007-01-03
+
+### Added
+- Restored back the ability to assign a channel to a grayscale pixel.
+
+### Changed
+- Fixed some minor issues with color converted views of dynamic images.
+
+## [1.x] - 2006-11-07
+
+GIL accepted to Boost.
+
+GIL's Boost review was successful and GIL will be part of the Boost libraries.
+It will most likely first appear in the 1.35 version of Boost.
+In the future our web page will continue to provide you with the latest
+improvements to GIL, as we have the flexibility to release more frequently than Boost.
+
+## [1.x] - 2006-10-20
+
+### Added
+- New regression tests.
+- Source code of usage examples is available to download from the website.
+
+### Changed
+- Minor changes to GIL core.
+
+## [1.x] - 2006-10-02
+
+### Added
+- First version of the Numeric extension.
+ The extension provides some basic image processing algorithms, such as convolution and resampling.
+- Introduction of pixel traits.
+
+### Changed
+- Improved consistent use of MPL predicates and standardized template parameter names.
+
+## [1.x] - 2006-09-20
+
+### Added
+- GIL now allows users to overload the default color conversion with one of their own.
+- Section in the design guide describes how to overload default color conversion.
+
+### Changed
+- Color conversion improvements.
+
+## [1.0] - 2006-08-29
+
+### Added
+- Pixel dereference adaptors are introduced.
+- Locator concepts/models are made more generic.
+- Example of creating the Mandelbrot set is described in the tutorial.
+
+### Changed
+- It is now easier to construct virtual image views.
+
+## [] - 2006-06-27
+
+### Added
+- A GIL Flash presentation is posted (aka video lecture).
+
+## [] - 2006-06-14
+
+### Added
+- GIL homepage goes live
diff --git a/src/boost/libs/gil/conanfile.txt b/src/boost/libs/gil/conanfile.txt
new file mode 100644
index 000000000..f3f7c6304
--- /dev/null
+++ b/src/boost/libs/gil/conanfile.txt
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2018-2019 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+[requires]
+libpng/1.6.37@bincrafters/stable
+libjpeg/9c@bincrafters/stable
+libtiff/4.0.9@bincrafters/stable
+
+[generators]
+cmake
diff --git a/src/boost/libs/gil/example/CMakeLists.txt b/src/boost/libs/gil/example/CMakeLists.txt
new file mode 100644
index 000000000..c16faf662
--- /dev/null
+++ b/src/boost/libs/gil/example/CMakeLists.txt
@@ -0,0 +1,45 @@
+#
+# Copyright (c) 2017 Mateusz Loskot <mateusz at loskot dot net>
+# All rights reserved.
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+message(STATUS "Boost.GIL: Configuring examples")
+
+if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.12.0)
+ file(GLOB_RECURSE _examples ${CMAKE_CURRENT_LIST_DIR}/*.cpp CONFIGURE_DEPEND)
+else()
+ file(GLOB_RECURSE _examples ${CMAKE_CURRENT_LIST_DIR}/*.cpp)
+endif()
+
+foreach(_example ${_examples})
+ get_filename_component(_name ${_example} NAME_WE)
+ add_executable(example_${_name} ${_name}.cpp)
+ target_compile_definitions(example_${_name} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK=1)
+ # Unfortunately, ALIAS of imported target is not supported
+ # see https://github.com/conan-io/conan/issues/2125
+ if(BOOST_GIL_USE_CONAN)
+ target_link_libraries(example_${_name}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ Boost::disable_autolinking
+ Boost::filesystem
+ CONAN_PKG::libjpeg
+ CONAN_PKG::libpng
+ CONAN_PKG::libtiff)
+ else()
+ target_link_libraries(example_${_name}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ endif()
+
+ unset(_name)
+endforeach()
+
+unset(_example)
+unset(_examples)
diff --git a/src/boost/libs/gil/example/Jamfile b/src/boost/libs/gil/example/Jamfile
new file mode 100644
index 000000000..fc33ce319
--- /dev/null
+++ b/src/boost/libs/gil/example/Jamfile
@@ -0,0 +1,50 @@
+# Boost.GIL (Generic Image Library) - examples
+#
+# Copyright (c) 2018 Mateusz Loskot <mateusz@loskot.net>
+#
+# Use, modification and distribution is subject to the Boost Software License,
+# Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+
+import ac ;
+import regex ;
+import testing ;
+
+using libjpeg : : : : true ; # work around bug on master
+
+project
+ : # requirements
+ ;
+
+# TODO: Add missing examples
+
+local sources =
+ adaptive_threshold.cpp
+ affine.cpp
+ convolution.cpp
+ convolve2d.cpp
+ dynamic_image.cpp
+ harris.cpp
+ hessian.cpp
+ histogram.cpp
+ interleaved_ptr.cpp
+ mandelbrot.cpp
+ packed_pixel.cpp
+ resize.cpp
+ sobel_scharr.cpp
+ threshold.cpp
+ x_gradient.cpp
+ ;
+
+local targets ;
+
+for local s in $(sources)
+{
+ targets +=
+ [ compile $(s) :
+ [ ac.check-library /libjpeg//libjpeg : <library>/libjpeg//libjpeg : <build>no ]
+ ]
+ ;
+}
+
+alias examples : $(targets) ;
diff --git a/src/boost/libs/gil/example/README.md b/src/boost/libs/gil/example/README.md
new file mode 100644
index 000000000..cee177088
--- /dev/null
+++ b/src/boost/libs/gil/example/README.md
@@ -0,0 +1,45 @@
+# Boost.GIL Examples
+
+This directory contains
+
+- examples of C++ programs using GIL
+- configuration files for Boost.Build command line and CMake integration for popular IDEs.
+
+We provide Boost.Build (`Jamfile`) and CMake (`CMakeLists.txt`)
+configurations to build the examples.
+See the [CONTRIBUTING.md](../CONTRIBUTING.md)
+for details on how to run `b2` and `cmake` for Boost.GIL.
+
+Each example is build as a separate executable.
+Each executable generates its output as `out-<example_name>.jpg`.
+For example, the `resize.cpp` example generates the image `out-resize.jpg`.
+
+The following C++ examples are included:
+
+1. `resize.cpp`
+ Scales an image using bilinear or nearest-neighbour resampling.
+
+2. `affine.cpp`
+ Performs an arbitrary affine transformation on the image.
+
+3. `convolution.cpp`
+ Convolves the image with a Gaussian kernel.
+
+4. `mandelbrot.cpp`
+ Creates a synthetic image defining the Mandelbrot set.
+
+5. `interleaved_ptr.cpp`
+ Illustrates how to create a custom pixel reference and iterator.
+ Creates a GIL image view over user-supplied data without the need to cast to GIL pixel type.
+
+6. `x_gradient.cpp`
+ Horizontal gradient, from the tutorial
+
+7. `histogram.cpp`
+ Algorithm to compute the histogram of an image
+
+8. `packed_pixel.cpp`
+ Illustrates how to create a custom pixel model - a pixel whose channel size is not divisible by bytes.
+
+9. `dynamic_image.cpp`
+ Example of using images whose type is instantiated at run time.
diff --git a/src/boost/libs/gil/example/adaptive_threshold.cpp b/src/boost/libs/gil/example/adaptive_threshold.cpp
new file mode 100644
index 000000000..65f0f9ac1
--- /dev/null
+++ b/src/boost/libs/gil/example/adaptive_threshold.cpp
@@ -0,0 +1,33 @@
+//
+// Copyright 2019 Miral Shah <miralshah2211@gmail.com>
+//
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/png.hpp>
+#include <iostream>
+
+using namespace boost::gil;
+
+int main()
+{
+ gray8_image_t img;
+ read_image("test_adaptive.png", img, png_tag{});
+ gray8_image_t img_out(img.dimensions());
+
+ boost::gil::threshold_adaptive(const_view(img), view(img_out), 11, threshold_adaptive_method::mean, threshold_direction::regular, 2);
+ write_view("out-threshold-adaptive-mean.png", view(img_out), png_tag{});
+
+ boost::gil::threshold_adaptive(const_view(img), view(img_out), 11, threshold_adaptive_method::mean, threshold_direction::inverse, 2);
+ write_view("out-threshold-adaptive-mean-inv.png", view(img_out), png_tag{});
+
+ boost::gil::threshold_adaptive(const_view(img), view(img_out), 7, threshold_adaptive_method::gaussian, threshold_direction::regular, 2);
+ write_view("out-threshold-adaptive-gaussian.png", view(img_out), png_tag{});
+
+ boost::gil::threshold_adaptive(const_view(img), view(img_out), 11, threshold_adaptive_method::gaussian, threshold_direction::inverse, 2);
+ write_view("out-threshold-adaptive-gaussian-inv.png", view(img_out), png_tag{});
+
+ return 0;
+}
diff --git a/src/boost/libs/gil/example/affine.cpp b/src/boost/libs/gil/example/affine.cpp
new file mode 100644
index 000000000..a54cfaa1d
--- /dev/null
+++ b/src/boost/libs/gil/example/affine.cpp
@@ -0,0 +1,34 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/jpeg.hpp>
+#include <boost/gil/extension/numeric/sampler.hpp>
+#include <boost/gil/extension/numeric/resample.hpp>
+
+// Example for resample_pixels() in the numeric extension
+
+int main()
+{
+ namespace gil = boost::gil;
+
+ gil::rgb8_image_t img;
+ gil::read_image("test.jpg", img, gil::jpeg_tag());
+
+ // test resample_pixels
+ // Transform the image by an arbitrary affine transformation using nearest-neighbor resampling
+ gil::rgb8_image_t transf(gil::rgb8_image_t::point_t(gil::view(img).dimensions() * 2));
+ gil::fill_pixels(gil::view(transf), gil::rgb8_pixel_t(255, 0, 0)); // the background is red
+
+ gil::matrix3x2<double> mat =
+ gil::matrix3x2<double>::get_translate(-gil::point<double>(200,250)) *
+ gil::matrix3x2<double>::get_rotate(-15*3.14/180.0);
+ gil::resample_pixels(const_view(img), gil::view(transf), mat, gil::nearest_neighbor_sampler());
+ gil::write_view("out-affine.jpg", gil::view(transf), gil::jpeg_tag());
+
+ return 0;
+}
diff --git a/src/boost/libs/gil/example/b2/README.md b/src/boost/libs/gil/example/b2/README.md
new file mode 100644
index 000000000..e4f56aaf8
--- /dev/null
+++ b/src/boost/libs/gil/example/b2/README.md
@@ -0,0 +1,40 @@
+# Boost.Build Configuration Examples
+
+Examples of `user-config.jam` for convenience of contributors and
+users who wish to run complete build of Boost.GIL tests and examples.
+
+## Usage
+
+Copy any of the provided user configuration files to `%HOME%\user-config.jam`
+on Windows or `$HOME/user-config.jam` on Linux.
+
+Refer to [Boost.Build User Manual](https://boostorg.github.io/build/)
+for more details about use of configuration files.
+
+## Examples
+
+### `user-config-windows-vcpkg.jam`
+
+For Windows, provides minimal configuration to consume GIL dependencies
+installed using [vcpkg](https://github.com/Microsoft/vcpkg) in `C:\vcpkg`:
+
+```console
+C:\vcpkg --triplet x86-windows install libjpeg-turbo libpng tiff
+C:\vcpkg --triplet x64-windows install libjpeg-turbo libpng tiff
+```
+
+The configuration recognises the two [vcpkg triplets](https://github.com/microsoft/vcpkg/blob/master/docs/users/triplets.md)
+corresponding to Boost.Build `address-model` variants, `32` and `64`.
+
+
+```console
+C:\boost-root> b2.exe toolset=msvc-14.2 address-model=64 libs/gil/test/extension/io//simple
+Performing configuration checks
+...
+ - libjpeg : yes
+ - zlib : yes
+ - libpng : yes
+ - libtiff : yes
+```
+
+Similarly, use `address-model=32` to request 32-bit build target.
diff --git a/src/boost/libs/gil/example/b2/user-config-windows-vcpkg.jam b/src/boost/libs/gil/example/b2/user-config-windows-vcpkg.jam
new file mode 100644
index 000000000..2844538cc
--- /dev/null
+++ b/src/boost/libs/gil/example/b2/user-config-windows-vcpkg.jam
@@ -0,0 +1,53 @@
+project
+ : requirements
+ <address-model>32:<dll-path>C:/vcpkg/installed/x86-windows/bin
+ <address-model>64:<dll-path>C:/vcpkg/installed/x64-windows/bin
+ ;
+
+using libjpeg
+ :
+ : <include>C:/vcpkg/installed/x86-windows/include <search>C:/vcpkg/installed/x86-windows/lib
+ : <address-model>32
+ ;
+
+using libjpeg
+ :
+ : <include>C:/vcpkg/installed/x64-windows/include <search>C:/vcpkg/installed/x64-windows/lib
+ : <address-model>64
+ ;
+
+using libpng
+ :
+ : <include>C:/vcpkg/installed/x86-windows/include <search>C:/vcpkg/installed/x86-windows/lib
+ : <address-model>32
+ ;
+
+using libpng
+ :
+ : <include>C:/vcpkg/installed/x64-windows/include <search>C:/vcpkg/installed/x64-windows/lib
+ : <address-model>64
+ ;
+
+using libtiff
+ :
+ : <include>C:/vcpkg/installed/x86-windows/include <search>C:/vcpkg/installed/x86-windows/lib
+ : <address-model>32
+ ;
+
+using libtiff
+ :
+ : <include>C:/vcpkg/installed/x64-windows/include <search>C:/vcpkg/installed/x64-windows/lib
+ : <address-model>64
+ ;
+
+using zlib
+ :
+ : <include>C:/vcpkg/installed/x86-windows/include <search>C:/vcpkg/installed/x86-windows/lib
+ : <address-model>32
+ ;
+
+using zlib
+ :
+ : <include>C:/vcpkg/installed/x64-windows/include <search>C:/vcpkg/installed/x64-windows/lib
+ : <address-model>64
+ ;
diff --git a/src/boost/libs/gil/example/clang-format/README.md b/src/boost/libs/gil/example/clang-format/README.md
new file mode 100644
index 000000000..c7c68507b
--- /dev/null
+++ b/src/boost/libs/gil/example/clang-format/README.md
@@ -0,0 +1,18 @@
+# Boost.GIL Clang-Format
+
+This is an _example_ of `.clang-format` file which offers _good enough_
+configuration and may be _useful_ when writing code for GIL, not required though.
+
+This is **not** a complete configuration!
+
+It does not cover all the recommended or preferred ways of formatting the code for GIL.
+It may be necessary to manually tweak the formatting generated by this `.clang-format` file.
+For example, there is a bug in clang-format that does not allow spacing and breaking
+trailing return types properly ([here](http://lists.llvm.org/pipermail/cfe-users/2018-November/001421.html)
+and [here](https://stackoverflow.com/a/57279663/151641)).
+More in details can be found in the [brainstorm of .clang-format proposal](https://github.com/boostorg/gil/pull/87).
+
+It has been successfully used with clang-format 8 or later.
+
+If you wish to use this file with `clang-format`, copy it to the root directory of GIL
+sources, to `libs/gil/.clang-format`.
diff --git a/src/boost/libs/gil/example/cmake/CMakeSettings.json b/src/boost/libs/gil/example/cmake/CMakeSettings.json
new file mode 100644
index 000000000..98947f9fe
--- /dev/null
+++ b/src/boost/libs/gil/example/cmake/CMakeSettings.json
@@ -0,0 +1,433 @@
+{
+ "_comment": {
+ "description": "Sample CMakeSettings.json for building Boost.GIL tests and examples. See https://go.microsoft.com//fwlink//?linkid=834763 for more information about CMake integration with Visual Studio 2017 and this file.",
+ "usage": "Copy to ${BOOST_ROOT}/libs/gil, then Visual Studio 2017 > File > Open > CMake > select ${BOOST_ROOT}/libs/gil/CMakeLists.txt"
+ },
+ "environments": [
+ { "BuildDir": "${workspaceRoot}\\_build" },
+ { "InstallDir": "${workspaceRoot}\\_install" },
+ { "DEFAULT_BUILD_TESTING": "OFF" },
+ { "DEFAULT_Boost_ADDITIONAL_VERSIONS": "1.73;1.72;1.71" },
+ { "DEFAULT_Boost_COMPILER": "-vc142;-vc141" },
+ { "DEFAULT_Boost_DEBUG": "ON" },
+ { "DEFAULT_GIL_BUILD_EXAMPLES": "ON" },
+ { "DEFAULT_GIL_BUILD_HEADER_TESTS": "OFF" },
+ { "DEFAULT_GIL_ENABLE_EXT_DYNAMIC_IMAGE": "ON" },
+ { "DEFAULT_GIL_ENABLE_EXT_IO": "ON" },
+ { "DEFAULT_GIL_ENABLE_EXT_NUMERIC": "ON" },
+ { "DEFAULT_GIL_ENABLE_EXT_TOOLBOX": "ON" },
+ { "DEFAULT_GIL_USE_CONAN": "ON" },
+ { "DEFAULT_GIL_USE_CLANG_TIDY": "OFF" }
+ ],
+ "configurations": [
+ {
+ "name": "x64-Debug-Ninja",
+ "generator": "Ninja",
+ "configurationType": "Debug",
+ "inheritEnvironments": [ "msvc_x64_x64" ],
+ "buildRoot": "${env.BuildDir}\\${name}",
+ "installRoot": "${env.InstallDir}\\${name}",
+ "cmakeCommandArgs": "",
+ "buildCommandArgs": "-v",
+ "ctestCommandArgs": "",
+ "variables": [
+ { "name": "BUILD_TESTING", "value": "${env.DEFAULT_BUILD_TESTING}"},
+ { "name": "Boost_ADDITIONAL_VERSIONS", "value": "${env.DEFAULT_Boost_ADDITIONAL_VERSIONS}" },
+ { "name": "Boost_ARCHITECTURE", "value": "-x64" },
+ { "name": "Boost_COMPILER", "value": "${env.DEFAULT_Boost_COMPILER}" },
+ { "name": "Boost_DEBUG", "value": "${env.DEFAULT_Boost_DEBUG}" },
+ { "name": "BOOST_GIL_BUILD_EXAMPLES", "value": "${env.DEFAULT_GIL_BUILD_EXAMPLES}" },
+ { "name": "BOOST_GIL_BUILD_HEADER_TESTS", "value": "${env.DEFAULT_GIL_BUILD_HEADER_TESTS}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_DYNAMIC_IMAGE", "value": "${env.DEFAULT_GIL_ENABLE_EXT_DYNAMIC_IMAGE}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_IO", "value": "${env.DEFAULT_GIL_ENABLE_EXT_IO}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_NUMERIC", "value": "${env.DEFAULT_GIL_ENABLE_EXT_NUMERIC}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_TOOLBOX", "value": "${env.DEFAULT_GIL_ENABLE_EXT_TOOLBOX}" },
+ { "name": "BOOST_GIL_USE_CONAN", "value": "${env.DEFAULT_GIL_USE_CONAN}" },
+ { "name": "BOOST_GIL_USE_CLANG_TIDY", "value": "${env.DEFAULT_GIL_USE_CLANG_TIDY}" }
+ ]
+ },
+ {
+ "name": "x64-Release-Ninja",
+ "generator": "Ninja",
+ "configurationType": "RelWithDebInfo",
+ "inheritEnvironments": [ "msvc_x64_x64" ],
+ "buildRoot": "${env.BuildDir}\\${name}",
+ "installRoot": "${env.InstallDir}\\${name}",
+ "cmakeCommandArgs": "",
+ "buildCommandArgs": "-v",
+ "ctestCommandArgs": "",
+ "variables": [
+ { "name": "BUILD_TESTING", "value": "${env.DEFAULT_BUILD_TESTING}"},
+ { "name": "Boost_ADDITIONAL_VERSIONS", "value": "${env.DEFAULT_Boost_ADDITIONAL_VERSIONS}" },
+ { "name": "Boost_ARCHITECTURE", "value": "-x64" },
+ { "name": "Boost_COMPILER", "value": "${env.DEFAULT_Boost_COMPILER}" },
+ { "name": "Boost_DEBUG", "value": "${env.DEFAULT_Boost_DEBUG}" },
+ { "name": "BOOST_GIL_BUILD_EXAMPLES", "value": "${env.DEFAULT_GIL_BUILD_EXAMPLES}" },
+ { "name": "BOOST_GIL_BUILD_HEADER_TESTS", "value": "${env.DEFAULT_GIL_BUILD_HEADER_TESTS}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_DYNAMIC_IMAGE", "value": "${env.DEFAULT_GIL_ENABLE_EXT_DYNAMIC_IMAGE}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_IO", "value": "${env.DEFAULT_GIL_ENABLE_EXT_IO}" },
+ { "name": "BOOST_BOOST_GIL_ENABLE_EXT_NUMERIC", "value": "${env.DEFAULT_GIL_ENABLE_EXT_NUMERIC}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_TOOLBOX", "value": "${env.DEFAULT_GIL_ENABLE_EXT_TOOLBOX}" },
+ { "name": "BOOST_GIL_USE_CONAN", "value": "${env.DEFAULT_GIL_USE_CONAN}" },
+ { "name": "BOOST_GIL_USE_CLANG_TIDY", "value": "${env.DEFAULT_GIL_USE_CLANG_TIDY}" }
+ ]
+ },
+ {
+ "name": "x86-Debug-Ninja",
+ "generator": "Ninja",
+ "configurationType": "Debug",
+ "inheritEnvironments": [ "msvc_x86" ],
+ "buildRoot": "${env.BuildDir}\\${name}",
+ "installRoot": "${env.InstallDir}\\${name}",
+ "cmakeCommandArgs": "",
+ "buildCommandArgs": "-v",
+ "ctestCommandArgs": "",
+ "variables": [
+ { "name": "BUILD_TESTING", "value": "${env.DEFAULT_BUILD_TESTING}"},
+ { "name": "Boost_DEBUG", "value": "${env.DEFAULT_Boost_DEBUG}" },
+ { "name": "Boost_ADDITIONAL_VERSIONS", "value": "${env.DEFAULT_Boost_ADDITIONAL_VERSIONS}" },
+ { "name": "Boost_ARCHITECTURE", "value": "-x32" },
+ { "name": "Boost_COMPILER", "value": "-vc142;-vc141" },
+ { "name": "BOOST_GIL_BUILD_EXAMPLES", "value": "ON" },
+ { "name": "BOOST_GIL_BUILD_HEADER_TESTS", "value": "ON" },
+ { "name": "BOOST_GIL_ENABLE_EXT_DYNAMIC_IMAGE", "value": "ON" },
+ { "name": "BOOST_GIL_ENABLE_EXT_IO", "value": "ON" },
+ { "name": "BOOST_GIL_ENABLE_EXT_NUMERIC", "value": "ON" },
+ { "name": "BOOST_GIL_ENABLE_EXT_TOOLBOX", "value": "ON" },
+ { "name": "BOOST_GIL_USE_CONAN", "value": "ON" },
+ { "name": "BOOST_GIL_USE_CLANG_TIDY", "value": "OFF" }
+ ]
+ },
+ {
+ "name": "x86-Release-Ninja",
+ "generator": "Ninja",
+ "configurationType": "RelWithDebInfo",
+ "inheritEnvironments": [ "msvc_x86" ],
+ "buildRoot": "${env.BuildDir}\\${name}",
+ "installRoot": "${env.InstallDir}\\${name}",
+ "cmakeCommandArgs": "",
+ "buildCommandArgs": "-v",
+ "ctestCommandArgs": "",
+ "variables": [
+ { "name": "BUILD_TESTING", "value": "${env.DEFAULT_BUILD_TESTING}"},
+ { "name": "Boost_ADDITIONAL_VERSIONS", "value": "${env.DEFAULT_Boost_ADDITIONAL_VERSIONS}" },
+ { "name": "Boost_ARCHITECTURE", "value": "-x32" },
+ { "name": "Boost_COMPILER", "value": "${env.DEFAULT_Boost_COMPILER}" },
+ { "name": "Boost_DEBUG", "value": "${env.DEFAULT_Boost_DEBUG}" },
+ { "name": "BOOST_GIL_BUILD_EXAMPLES", "value": "${env.DEFAULT_GIL_BUILD_EXAMPLES}" },
+ { "name": "BOOST_GIL_BUILD_HEADER_TESTS", "value": "${env.DEFAULT_GIL_BUILD_HEADER_TESTS}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_DYNAMIC_IMAGE", "value": "${env.DEFAULT_GIL_ENABLE_EXT_DYNAMIC_IMAGE}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_IO", "value": "${env.DEFAULT_GIL_ENABLE_EXT_IO}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_NUMERIC", "value": "${env.DEFAULT_GIL_ENABLE_EXT_NUMERIC}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_TOOLBOX", "value": "${env.DEFAULT_GIL_ENABLE_EXT_TOOLBOX}" },
+ { "name": "BOOST_GIL_USE_CONAN", "value": "${env.DEFAULT_GIL_USE_CONAN}" },
+ { "name": "BOOST_GIL_USE_CLANG_TIDY", "value": "${env.DEFAULT_GIL_USE_CLANG_TIDY}" }
+ ]
+ },
+ {
+ "name": "x64-Debug-VS2019",
+ "generator": "Visual Studio 16 2019 Win64",
+ "configurationType": "Debug",
+ "buildRoot": "${env.BuildDir}\\${name}",
+ "installRoot": "${env.InstallDir}\\${name}",
+ "buildCommandArgs": "-m",
+ "cmakeCommandArgs": "",
+ "ctestCommandArgs": "",
+ "variables": [
+ { "name": "BUILD_TESTING", "value": "${env.DEFAULT_BUILD_TESTING}"},
+ { "name": "Boost_ADDITIONAL_VERSIONS", "value": "${env.DEFAULT_Boost_ADDITIONAL_VERSIONS}" },
+ { "name": "Boost_ARCHITECTURE", "value": "-x64" },
+ { "name": "Boost_COMPILER", "value": "${env.DEFAULT_Boost_COMPILER}" },
+ { "name": "Boost_DEBUG", "value": "${env.DEFAULT_Boost_DEBUG}" },
+ { "name": "BOOST_GIL_BUILD_EXAMPLES", "value": "${env.DEFAULT_GIL_BUILD_EXAMPLES}" },
+ { "name": "BOOST_GIL_BUILD_HEADER_TESTS", "value": "${env.DEFAULT_GIL_BUILD_HEADER_TESTS}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_DYNAMIC_IMAGE", "value": "${env.DEFAULT_GIL_ENABLE_EXT_DYNAMIC_IMAGE}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_IO", "value": "${env.DEFAULT_GIL_ENABLE_EXT_IO}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_NUMERIC", "value": "${env.DEFAULT_GIL_ENABLE_EXT_NUMERIC}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_TOOLBOX", "value": "${env.DEFAULT_GIL_ENABLE_EXT_TOOLBOX}" },
+ { "name": "BOOST_GIL_USE_CONAN", "value": "${env.DEFAULT_GIL_USE_CONAN}" },
+ { "name": "BOOST_GIL_USE_CLANG_TIDY", "value": "${env.DEFAULT_GIL_USE_CLANG_TIDY}" }
+ ]
+ },
+ {
+ "name": "x64-Release-VS2019",
+ "generator": "Visual Studio 16 2019 Win64",
+ "configurationType": "Release",
+ "buildRoot": "${env.BuildDir}\\${name}",
+ "installRoot": "${env.InstallDir}\\${name}",
+ "buildCommandArgs": "-m",
+ "cmakeCommandArgs": "",
+ "ctestCommandArgs": "",
+ "variables": [
+ { "name": "BUILD_TESTING", "value": "${env.DEFAULT_BUILD_TESTING}"},
+ { "name": "Boost_ADDITIONAL_VERSIONS", "value": "${env.DEFAULT_Boost_ADDITIONAL_VERSIONS}" },
+ { "name": "Boost_ARCHITECTURE", "value": "-x64" },
+ { "name": "Boost_COMPILER", "value": "-vc142" },
+ { "name": "Boost_DEBUG", "value": "${env.DEFAULT_Boost_DEBUG}" },
+ { "name": "BOOST_GIL_BUILD_EXAMPLES", "value": "${env.DEFAULT_GIL_BUILD_EXAMPLES}" },
+ { "name": "BOOST_GIL_BUILD_HEADER_TESTS", "value": "${env.DEFAULT_GIL_BUILD_HEADER_TESTS}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_DYNAMIC_IMAGE", "value": "${env.DEFAULT_GIL_ENABLE_EXT_DYNAMIC_IMAGE}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_IO", "value": "${env.DEFAULT_GIL_ENABLE_EXT_IO}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_NUMERIC", "value": "${env.DEFAULT_GIL_ENABLE_EXT_NUMERIC}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_TOOLBOX", "value": "${env.DEFAULT_GIL_ENABLE_EXT_TOOLBOX}" },
+ { "name": "BOOST_GIL_USE_CONAN", "value": "${env.DEFAULT_GIL_USE_CONAN}" },
+ { "name": "BOOST_GIL_USE_CLANG_TIDY", "value": "${env.DEFAULT_GIL_USE_CLANG_TIDY}" }
+ ]
+ },
+ {
+ "name": "x86-Debug-VS2019",
+ "generator": "Visual Studio 16 2019",
+ "configurationType": "Debug",
+ "buildRoot": "${env.BuildDir}\\${name}",
+ "installRoot": "${env.InstallDir}\\${name}",
+ "buildCommandArgs": "-m",
+ "cmakeCommandArgs": "",
+ "ctestCommandArgs": "",
+ "variables": [
+ { "name": "BUILD_TESTING", "value": "${env.DEFAULT_BUILD_TESTING}"},
+ { "name": "Boost_ADDITIONAL_VERSIONS", "value": "${env.DEFAULT_Boost_ADDITIONAL_VERSIONS}" },
+ { "name": "Boost_ARCHITECTURE", "value": "-x32" },
+ { "name": "Boost_COMPILER", "value": "-vc142" },
+ { "name": "Boost_DEBUG", "value": "${env.DEFAULT_Boost_DEBUG}" },
+ { "name": "BOOST_GIL_BUILD_EXAMPLES", "value": "${env.DEFAULT_GIL_BUILD_EXAMPLES}" },
+ { "name": "BOOST_GIL_BUILD_HEADER_TESTS", "value": "${env.DEFAULT_GIL_BUILD_HEADER_TESTS}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_DYNAMIC_IMAGE", "value": "${env.DEFAULT_GIL_ENABLE_EXT_DYNAMIC_IMAGE}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_IO", "value": "${env.DEFAULT_GIL_ENABLE_EXT_IO}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_NUMERIC", "value": "${env.DEFAULT_GIL_ENABLE_EXT_NUMERIC}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_TOOLBOX", "value": "${env.DEFAULT_GIL_ENABLE_EXT_TOOLBOX}" },
+ { "name": "BOOST_GIL_USE_CONAN", "value": "${env.DEFAULT_GIL_USE_CONAN}" },
+ { "name": "BOOST_GIL_USE_CLANG_TIDY", "value": "${env.DEFAULT_GIL_USE_CLANG_TIDY}" }
+ ]
+ },
+ {
+ "name": "x86-Release-VS2019",
+ "generator": "Visual Studio 16 2019",
+ "configurationType": "Release",
+ "buildRoot": "${env.BuildDir}\\${name}",
+ "installRoot": "${env.InstallDir}\\${name}",
+ "buildCommandArgs": "-m",
+ "cmakeCommandArgs": "",
+ "ctestCommandArgs": "",
+ "variables": [
+ { "name": "BUILD_TESTING", "value": "${env.DEFAULT_BUILD_TESTING}"},
+ { "name": "Boost_ADDITIONAL_VERSIONS", "value": "${env.DEFAULT_Boost_ADDITIONAL_VERSIONS}" },
+ { "name": "Boost_ARCHITECTURE", "value": "-x32" },
+ { "name": "Boost_COMPILER", "value": "-vc142" },
+ { "name": "Boost_DEBUG", "value": "${env.DEFAULT_Boost_DEBUG}" },
+ { "name": "BOOST_GIL_BUILD_EXAMPLES", "value": "${env.DEFAULT_GIL_BUILD_EXAMPLES}" },
+ { "name": "BOOST_GIL_BUILD_HEADER_TESTS", "value": "${env.DEFAULT_GIL_BUILD_HEADER_TESTS}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_DYNAMIC_IMAGE", "value": "${env.DEFAULT_GIL_ENABLE_EXT_DYNAMIC_IMAGE}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_IO", "value": "${env.DEFAULT_GIL_ENABLE_EXT_IO}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_NUMERIC", "value": "${env.DEFAULT_GIL_ENABLE_EXT_NUMERIC}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_TOOLBOX", "value": "${env.DEFAULT_GIL_ENABLE_EXT_TOOLBOX}" },
+ { "name": "BOOST_GIL_USE_CONAN", "value": "${env.DEFAULT_GIL_USE_CONAN}" },
+ { "name": "BOOST_GIL_USE_CLANG_TIDY", "value": "${env.DEFAULT_GIL_USE_CLANG_TIDY}" }
+ ]
+ },
+ {
+ "name": "x64-Debug-VS2017",
+ "generator": "Visual Studio 15 2017 Win64",
+ "configurationType": "Debug",
+ "buildRoot": "${env.BuildDir}\\${name}",
+ "installRoot": "${env.InstallDir}\\${name}",
+ "buildCommandArgs": "-m",
+ "cmakeCommandArgs": "",
+ "ctestCommandArgs": "",
+ "variables": [
+ { "name": "BUILD_TESTING", "value": "${env.DEFAULT_BUILD_TESTING}"},
+ { "name": "Boost_ADDITIONAL_VERSIONS", "value": "${env.DEFAULT_Boost_ADDITIONAL_VERSIONS}" },
+ { "name": "Boost_ARCHITECTURE", "value": "-x64" },
+ { "name": "Boost_COMPILER", "value": "-vc141" },
+ { "name": "Boost_DEBUG", "value": "${env.DEFAULT_Boost_DEBUG}" },
+ { "name": "BOOST_GIL_BUILD_EXAMPLES", "value": "${env.DEFAULT_GIL_BUILD_EXAMPLES}" },
+ { "name": "BOOST_GIL_BUILD_HEADER_TESTS", "value": "${env.DEFAULT_GIL_BUILD_HEADER_TESTS}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_DYNAMIC_IMAGE", "value": "${env.DEFAULT_GIL_ENABLE_EXT_DYNAMIC_IMAGE}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_IO", "value": "${env.DEFAULT_GIL_ENABLE_EXT_IO}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_NUMERIC", "value": "${env.DEFAULT_GIL_ENABLE_EXT_NUMERIC}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_TOOLBOX", "value": "${env.DEFAULT_GIL_ENABLE_EXT_TOOLBOX}" },
+ { "name": "BOOST_GIL_USE_CONAN", "value": "${env.DEFAULT_GIL_USE_CONAN}" },
+ { "name": "BOOST_GIL_USE_CLANG_TIDY", "value": "${env.DEFAULT_GIL_USE_CLANG_TIDY}" }
+ ]
+ },
+ {
+ "name": "x64-Release-VS2017",
+ "generator": "Visual Studio 15 2017 Win64",
+ "configurationType": "Release",
+ "buildRoot": "${env.BuildDir}\\${name}",
+ "installRoot": "${env.InstallDir}\\${name}",
+ "buildCommandArgs": "-m",
+ "cmakeCommandArgs": "",
+ "ctestCommandArgs": "",
+ "variables": [
+ { "name": "BUILD_TESTING", "value": "${env.DEFAULT_BUILD_TESTING}"},
+ { "name": "CMAKE_TOOLCHAIN_FILE", "value": "C:\\vcpkg\\scripts\\buildsystems\\vcpkg.cmake" },
+ { "name": "BOOST_GIL_BUILD_EXAMPLES", "value": "${env.DEFAULT_GIL_BUILD_EXAMPLES}" },
+ { "name": "BOOST_GIL_BUILD_HEADER_TESTS", "value": "${env.DEFAULT_GIL_BUILD_HEADER_TESTS}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_DYNAMIC_IMAGE", "value": "${env.DEFAULT_GIL_ENABLE_EXT_DYNAMIC_IMAGE}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_IO", "value": "${env.DEFAULT_GIL_ENABLE_EXT_IO}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_NUMERIC", "value": "${env.DEFAULT_GIL_ENABLE_EXT_NUMERIC}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_TOOLBOX", "value": "${env.DEFAULT_GIL_ENABLE_EXT_TOOLBOX}" },
+ { "name": "BOOST_GIL_USE_CONAN", "value": "OFF" },
+ { "name": "BOOST_GIL_USE_CLANG_TIDY", "value": "${env.DEFAULT_GIL_USE_CLANG_TIDY}" }
+ ]
+ },
+ {
+ "name": "x86-Debug-VS2017",
+ "generator": "Visual Studio 15 2017",
+ "configurationType": "Debug",
+ "buildRoot": "${env.BuildDir}\\${name}",
+ "installRoot": "${env.InstallDir}\\${name}",
+ "buildCommandArgs": "-m",
+ "cmakeCommandArgs": "",
+ "ctestCommandArgs": "",
+ "variables": [
+ { "name": "BUILD_TESTING", "value": "${env.DEFAULT_BUILD_TESTING}"},
+ { "name": "CMAKE_TOOLCHAIN_FILE", "value": "C:\\vcpkg\\scripts\\buildsystems\\vcpkg.cmake" },
+ { "name": "BOOST_GIL_BUILD_EXAMPLES", "value": "${env.DEFAULT_GIL_BUILD_EXAMPLES}" },
+ { "name": "BOOST_GIL_BUILD_HEADER_TESTS", "value": "${env.DEFAULT_GIL_BUILD_HEADER_TESTS}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_DYNAMIC_IMAGE", "value": "${env.DEFAULT_GIL_ENABLE_EXT_DYNAMIC_IMAGE}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_IO", "value": "${env.DEFAULT_GIL_ENABLE_EXT_IO}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_NUMERIC", "value": "${env.DEFAULT_GIL_ENABLE_EXT_NUMERIC}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_TOOLBOX", "value": "${env.DEFAULT_GIL_ENABLE_EXT_TOOLBOX}" },
+ { "name": "BOOST_GIL_USE_CONAN", "value": "OFF" },
+ { "name": "BOOST_GIL_USE_CLANG_TIDY", "value": "${env.DEFAULT_GIL_USE_CLANG_TIDY}" }
+ ]
+ },
+ {
+ "name": "x86-Release-VS2017",
+ "generator": "Visual Studio 15 2017",
+ "configurationType": "Release",
+ "buildRoot": "${env.BuildDir}\\${name}",
+ "installRoot": "${env.InstallDir}\\${name}",
+ "buildCommandArgs": "-m",
+ "cmakeCommandArgs": "",
+ "ctestCommandArgs": "",
+ "variables": [
+ { "name": "BUILD_TESTING", "value": "${env.DEFAULT_BUILD_TESTING}"},
+ { "name": "CMAKE_TOOLCHAIN_FILE", "value": "C:\\vcpkg\\scripts\\buildsystems\\vcpkg.cmake" },
+ { "name": "BOOST_GIL_BUILD_EXAMPLES", "value": "${env.DEFAULT_GIL_BUILD_EXAMPLES}" },
+ { "name": "BOOST_GIL_BUILD_HEADER_TESTS", "value": "${env.DEFAULT_GIL_BUILD_HEADER_TESTS}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_DYNAMIC_IMAGE", "value": "${env.DEFAULT_GIL_ENABLE_EXT_DYNAMIC_IMAGE}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_IO", "value": "${env.DEFAULT_GIL_ENABLE_EXT_IO}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_NUMERIC", "value": "${env.DEFAULT_GIL_ENABLE_EXT_NUMERIC}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_TOOLBOX", "value": "${env.DEFAULT_GIL_ENABLE_EXT_TOOLBOX}" },
+ { "name": "BOOST_GIL_USE_CONAN", "value": "OFF" },
+ { "name": "BOOST_GIL_USE_CLANG_TIDY", "value": "${env.DEFAULT_GIL_USE_CLANG_TIDY}" }
+ ]
+ },
+ {
+ "name": "WSL-Debug-GCC",
+ "generator": "Unix Makefiles",
+ "configurationType": "Debug",
+ "buildRoot": "${env.BuildDir}\\${name}",
+ "installRoot": "${env.InstallDir}\\${name}",
+ "cmakeExecutable": "/usr/bin/cmake",
+ "cmakeCommandArgs": "",
+ "buildCommandArgs": "",
+ "ctestCommandArgs": "",
+ "inheritEnvironments": [ "linux_x64" ],
+ "intelliSenseMode": "linux-gcc-x64",
+ "wslPath": "${defaultWSLPath}",
+ "addressSanitizerRuntimeFlags": "detect_leaks=0",
+ "variables": [
+ { "name": "BUILD_TESTING", "value": "${env.DEFAULT_BUILD_TESTING}"},
+ { "name": "Boost_ADDITIONAL_VERSIONS", "value": "${env.DEFAULT_Boost_ADDITIONAL_VERSIONS}" },
+ { "name": "Boost_ARCHITECTURE", "value": "-x64" },
+ { "name": "Boost_DEBUG", "value": "${env.DEFAULT_Boost_DEBUG}" },
+ { "name": "BOOST_GIL_BUILD_EXAMPLES", "value": "${env.DEFAULT_GIL_BUILD_EXAMPLES}" },
+ { "name": "BOOST_GIL_BUILD_HEADER_TESTS", "value": "${env.DEFAULT_GIL_BUILD_HEADER_TESTS}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_DYNAMIC_IMAGE", "value": "${env.DEFAULT_GIL_ENABLE_EXT_DYNAMIC_IMAGE}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_IO", "value": "${env.DEFAULT_GIL_ENABLE_EXT_IO}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_NUMERIC", "value": "${env.DEFAULT_GIL_ENABLE_EXT_NUMERIC}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_TOOLBOX", "value": "${env.DEFAULT_GIL_ENABLE_EXT_TOOLBOX}" },
+ { "name": "BOOST_GIL_USE_CONAN", "value": "OFF" },
+ { "name": "BOOST_GIL_USE_CLANG_TIDY", "value": "${env.DEFAULT_GIL_USE_CLANG_TIDY}" }
+ ]
+ },
+ {
+ "name": "WSL-Release-GCC",
+ "generator": "Unix Makefiles",
+ "configurationType": "RelWithDebInfo",
+ "buildRoot": "${env.BuildDir}\\${name}",
+ "installRoot": "${env.InstallDir}\\${name}",
+ "cmakeExecutable": "/usr/bin/cmake",
+ "cmakeCommandArgs": "",
+ "buildCommandArgs": "",
+ "ctestCommandArgs": "",
+ "inheritEnvironments": [ "linux_x64" ],
+ "intelliSenseMode": "linux-gcc-x64",
+ "wslPath": "${defaultWSLPath}",
+ "addressSanitizerRuntimeFlags": "detect_leaks=0",
+ "variables": [
+ { "name": "BUILD_TESTING", "value": "${env.DEFAULT_BUILD_TESTING}"},
+ { "name": "Boost_ADDITIONAL_VERSIONS", "value": "${env.DEFAULT_Boost_ADDITIONAL_VERSIONS}" },
+ { "name": "Boost_ARCHITECTURE", "value": "-x64" },
+ { "name": "Boost_DEBUG", "value": "${env.DEFAULT_Boost_DEBUG}" },
+ { "name": "BOOST_GIL_BUILD_EXAMPLES", "value": "${env.DEFAULT_GIL_BUILD_EXAMPLES}" },
+ { "name": "BOOST_GIL_BUILD_HEADER_TESTS", "value": "${env.DEFAULT_GIL_BUILD_HEADER_TESTS}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_DYNAMIC_IMAGE", "value": "${env.DEFAULT_GIL_ENABLE_EXT_DYNAMIC_IMAGE}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_IO", "value": "${env.DEFAULT_GIL_ENABLE_EXT_IO}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_NUMERIC", "value": "${env.DEFAULT_GIL_ENABLE_EXT_NUMERIC}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_TOOLBOX", "value": "${env.DEFAULT_GIL_ENABLE_EXT_TOOLBOX}" },
+ { "name": "BOOST_GIL_USE_CONAN", "value": "OFF" },
+ { "name": "BOOST_GIL_USE_CLANG_TIDY", "value": "${env.DEFAULT_GIL_USE_CLANG_TIDY}" }
+ ]
+ },
+ {
+ "name": "WSL-Debug-clang",
+ "generator": "Unix Makefiles",
+ "configurationType": "Debug",
+ "buildRoot": "${env.BuildDir}\\${name}",
+ "installRoot": "${env.InstallDir}\\${name}",
+ "cmakeExecutable": "/usr/bin/cmake",
+ "cmakeCommandArgs": "",
+ "buildCommandArgs": "",
+ "ctestCommandArgs": "",
+ "inheritEnvironments": [ "linux_clang_x64" ],
+ "wslPath": "${defaultWSLPath}",
+ "addressSanitizerRuntimeFlags": "detect_leaks=0",
+ "variables": [
+ { "name": "BUILD_TESTING", "value": "${env.DEFAULT_BUILD_TESTING}"},
+ { "name": "Boost_ADDITIONAL_VERSIONS", "value": "${env.DEFAULT_Boost_ADDITIONAL_VERSIONS}" },
+ { "name": "Boost_ARCHITECTURE", "value": "-x64" },
+ { "name": "Boost_DEBUG", "value": "${env.DEFAULT_Boost_DEBUG}" },
+ { "name": "BOOST_GIL_BUILD_EXAMPLES", "value": "${env.DEFAULT_GIL_BUILD_EXAMPLES}" },
+ { "name": "BOOST_GIL_BUILD_HEADER_TESTS", "value": "${env.DEFAULT_GIL_BUILD_HEADER_TESTS}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_DYNAMIC_IMAGE", "value": "${env.DEFAULT_GIL_ENABLE_EXT_DYNAMIC_IMAGE}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_IO", "value": "${env.DEFAULT_GIL_ENABLE_EXT_IO}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_NUMERIC", "value": "${env.DEFAULT_GIL_ENABLE_EXT_NUMERIC}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_TOOLBOX", "value": "${env.DEFAULT_GIL_ENABLE_EXT_TOOLBOX}" },
+ { "name": "BOOST_GIL_USE_CONAN", "value": "OFF" },
+ { "name": "BOOST_GIL_USE_CLANG_TIDY", "value": "${env.DEFAULT_GIL_USE_CLANG_TIDY}" }
+ ]
+ },
+ {
+ "name": "WSL-Release-clang",
+ "generator": "Unix Makefiles",
+ "configurationType": "RelWithDebInfo",
+ "buildRoot": "${env.BuildDir}\\${name}",
+ "installRoot": "${env.InstallDir}\\${name}",
+ "cmakeExecutable": "/usr/bin/cmake",
+ "cmakeCommandArgs": "",
+ "buildCommandArgs": "",
+ "ctestCommandArgs": "",
+ "inheritEnvironments": [ "linux_clang_x64" ],
+ "wslPath": "${defaultWSLPath}",
+ "addressSanitizerRuntimeFlags": "detect_leaks=0",
+ "variables": [
+ { "name": "BUILD_TESTING", "value": "${env.DEFAULT_BUILD_TESTING}"},
+ { "name": "Boost_ADDITIONAL_VERSIONS", "value": "${env.DEFAULT_Boost_ADDITIONAL_VERSIONS}" },
+ { "name": "Boost_ARCHITECTURE", "value": "-x64" },
+ { "name": "Boost_DEBUG", "value": "${env.DEFAULT_Boost_DEBUG}" },
+ { "name": "BOOST_GIL_BUILD_EXAMPLES", "value": "${env.DEFAULT_GIL_BUILD_EXAMPLES}" },
+ { "name": "BOOST_GIL_BUILD_HEADER_TESTS", "value": "${env.DEFAULT_GIL_BUILD_HEADER_TESTS}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_DYNAMIC_IMAGE", "value": "${env.DEFAULT_GIL_ENABLE_EXT_DYNAMIC_IMAGE}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_IO", "value": "${env.DEFAULT_GIL_ENABLE_EXT_IO}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_NUMERIC", "value": "${env.DEFAULT_GIL_ENABLE_EXT_NUMERIC}" },
+ { "name": "BOOST_GIL_ENABLE_EXT_TOOLBOX", "value": "${env.DEFAULT_GIL_ENABLE_EXT_TOOLBOX}" },
+ { "name": "BOOST_GIL_USE_CONAN", "value": "OFF" },
+ { "name": "BOOST_GIL_USE_CLANG_TIDY", "value": "${env.DEFAULT_GIL_USE_CLANG_TIDY}" }
+ ]
+ }
+ ]
+}
diff --git a/src/boost/libs/gil/example/cmake/README.md b/src/boost/libs/gil/example/cmake/README.md
new file mode 100644
index 000000000..d66758073
--- /dev/null
+++ b/src/boost/libs/gil/example/cmake/README.md
@@ -0,0 +1,39 @@
+# CMake Configuration Examples
+
+Examples of configuration files for CMake integrations in popular IDEs are provided
+for convenience of users and contributors who wish to build, run and debug
+Boost.GIL tests and examples in the IDEs of their choice.
+
+## Visual Studio
+
+Example [CMakeSettings.json](CMakeSettings.json) file is provided for
+the [CMake support in Visual Studio](https://go.microsoft.com//fwlink//?linkid=834763).
+
+Currently, the `CMakeSettings.json` provides configurations for the following
+CMake generators:
+- Ninja (default)
+- Visual Studio 2017 and 2019
+- `Unix Makefiles` targeting Windows Subsystem for Linux (WSL) - requires Visual Studio 2019 IDE.
+
+Usage:
+
+1. Copy [CMakeSettings.json](CMakeSettings.json) to `${BOOST_ROOT}/libs/gil`.
+2. In Visual Studio > File > Open > Folder... and select `${BOOST_ROOT}/libs/gil`.
+3. Follow the [CMake support in Visual Studio](https://go.microsoft.com//fwlink//?linkid=834763) documentation.
+4. [CMakeSettings.json schema reference](https://docs.microsoft.com/en-us/cpp/build/cmakesettings-reference?view=vs-2017)
+ to learn more about the configuration file itself.
+
+Optionally, edit [CMakeSettings.json](CMakeSettings.json) and tweak any options you require.
+
+## Visual Studio Code
+
+Example of [cmake-variants.yaml](cmake-variants.yaml) file is provided for
+the [CMake Tools](https://github.com/vector-of-bool/vscode-cmake-tools) extension.
+
+Usage:
+
+1. Copy [cmake-variants.yaml](cmake-variants.yaml) to `${BOOST_ROOT}/libs/gil`.
+2. Run `code ${BOOST_ROOT}/libs/gil` and the set of variants will be loaded.
+3. Follow the [CMake Tools documentation](https://vector-of-bool.github.io/docs/vscode-cmake-tools/index.html).
+
+Optionally, edit [cmake-variants.yaml](cmake-variants.yaml)and tweak any options you require.
diff --git a/src/boost/libs/gil/example/cmake/cmake-variants.yaml b/src/boost/libs/gil/example/cmake/cmake-variants.yaml
new file mode 100644
index 000000000..c0638accc
--- /dev/null
+++ b/src/boost/libs/gil/example/cmake/cmake-variants.yaml
@@ -0,0 +1,67 @@
+buildType:
+ default: debug
+ choices:
+ debug:
+ short: Debug
+ long: Emit debug information
+ buildType: Debug
+ release:
+ short: Release
+ long: Optimize generated code
+ buildType: RelWithDebInfo
+
+io:
+ default: 'no'
+ choices:
+ 'no':
+ short: No IO
+ long: Disable IO extension
+ settings:
+ BOOST_GIL_ENABLE_EXT_IO: no
+ 'yes':
+ short: IO
+ long: Enable IO extension
+ settings:
+ BOOST_GIL_ENABLE_EXT_IO: yes
+
+numeric:
+ default: 'no'
+ choices:
+ 'no':
+ short: No Numeric
+ long: Disable Numeric extension
+ settings:
+ BOOST_GIL_ENABLE_EXT_NUMERIC: no
+ 'yes':
+ short: Numeric
+ long: Enable Numeric extension
+ settings:
+ BOOST_GIL_ENABLE_EXT_NUMERIC: yes
+
+toolbox:
+ default: 'no'
+ choices:
+ 'no':
+ short: No Toolbox
+ long: Disable Toolbox extension
+ settings:
+ BOOST_GIL_ENABLE_EXT_TOOLBOX: no
+ 'yes':
+ short: Toolbox
+ long: Enable Toolbox extension
+ settings:
+ BOOST_GIL_ENABLE_EXT_TOOLBOX: yes
+
+headers:
+ default: 'no'
+ choices:
+ 'no':
+ short: No Header Tests
+ long: Disable header tests extension
+ settings:
+ BOOST_GIL_BUILD_HEADER_TESTS: no
+ 'yes':
+ short: Header Tests
+ long: Enable header tests extension
+ settings:
+ BOOST_GIL_BUILD_HEADER_TESTS: yes
diff --git a/src/boost/libs/gil/example/convolution.cpp b/src/boost/libs/gil/example/convolution.cpp
new file mode 100644
index 000000000..4844f35aa
--- /dev/null
+++ b/src/boost/libs/gil/example/convolution.cpp
@@ -0,0 +1,69 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/jpeg.hpp>
+#include <boost/gil/extension/numeric/kernel.hpp>
+#include <boost/gil/extension/numeric/convolve.hpp>
+
+// Example for convolve_rows() and convolve_cols() in the numeric extension
+
+int main() {
+ using namespace boost::gil;
+
+ rgb8_image_t img;
+ read_image("test.jpg", img, jpeg_tag{});
+
+ // Convolve the rows and the columns of the image with a fixed kernel
+ rgb8_image_t convolved(img);
+
+ // radius-1 Gaussian kernel, size 9
+ float gaussian_1[]={0.00022923296f,0.0059770769f,0.060597949f,0.24173197f,0.38292751f,
+ 0.24173197f,0.060597949f,0.0059770769f,0.00022923296f};
+ /*
+ // radius-2 Gaussian kernel, size 15
+ float gaussian_2[]={
+ 0.00048869418f,0.0024031631f,0.0092463447f,
+ 0.027839607f,0.065602221f,0.12099898f,0.17469721f,
+ 0.19744757f,
+ 0.17469721f,0.12099898f,0.065602221f,0.027839607f,
+ 0.0092463447f,0.0024031631f,0.00048869418f
+ };
+ //radius-3 Gaussian kernel, size 23
+ float gaussian_3[]={
+ 0.00016944126f,0.00053842377f,0.0015324751f,0.0039068931f,
+ 0.0089216027f,0.018248675f,0.033434924f,0.054872241f,
+ 0.080666073f,0.10622258f,0.12529446f,
+ 0.13238440f,
+ 0.12529446f,0.10622258f,0.080666073f,
+ 0.054872241f,0.033434924f,0.018248675f,0.0089216027f,
+ 0.0039068931f,0.0015324751f,0.00053842377f,0.00016944126f
+ };
+ //radius-4 Gaussian kernel, size 29
+ float gaussian_4[]={
+ 0.00022466264f,0.00052009715f,0.0011314391f,0.0023129794f,
+ 0.0044433107f,0.0080211498f,0.013606987f,0.021691186f,
+ 0.032493830f,0.045742013f,0.060509924f,0.075220309f,
+ 0.087870099f,0.096459411f,0.099505201f,0.096459411f,0.087870099f,
+ 0.075220309f,0.060509924f,0.045742013f,0.032493830f,
+ 0.021691186f,0.013606987f,0.0080211498f,0.0044433107f,
+ 0.0023129794f,0.0011314391f,0.00052009715f,0.00022466264f,
+ };
+ */
+
+ kernel_1d_fixed<float,9> kernel(gaussian_1,4);
+ convolve_rows_fixed<rgb32f_pixel_t>(const_view(convolved),kernel,view(convolved));
+ convolve_cols_fixed<rgb32f_pixel_t>(const_view(convolved),kernel,view(convolved));
+ write_view("out-convolution.jpg", view(convolved), jpeg_tag{});
+
+ // This is how to use a resizable kernel
+ kernel_1d<float> kernel2(gaussian_1,9,4);
+ convolve_rows<rgb32f_pixel_t>(const_view(img),kernel2,view(img));
+ convolve_cols<rgb32f_pixel_t>(const_view(img),kernel2,view(img));
+ write_view("out-convolution2.jpg", view(img), jpeg_tag{});
+
+ return 0;
+}
diff --git a/src/boost/libs/gil/example/convolve2d.cpp b/src/boost/libs/gil/example/convolve2d.cpp
new file mode 100644
index 000000000..338f49a3a
--- /dev/null
+++ b/src/boost/libs/gil/example/convolve2d.cpp
@@ -0,0 +1,41 @@
+#include <vector>
+#include <iostream>
+#include <boost/gil/extension/numeric/kernel.hpp>
+#include <boost/gil/extension/numeric/convolve.hpp>
+#include <boost/gil/extension/io/png.hpp>
+
+#include <boost/gil/extension/io/jpeg.hpp>
+using namespace boost::gil;
+using namespace std;
+int main()
+{
+ //gray8_image_t img;
+ //read_image("test_adaptive.png", img, png_tag{});
+ //gray8_image_t img_out(img.dimensions());
+
+ gray8_image_t img;
+ read_image("src_view.png", img, png_tag{});
+ gray8_image_t img_out(img.dimensions()), img_out1(img.dimensions());
+
+ std::vector<float> v(9, 1.0f / 9.0f);
+ detail::kernel_2d<float> kernel(v.begin(), v.size(), 1, 1);
+ detail::convolve_2d(view(img), kernel, view(img_out1));
+
+ //write_view("out-convolve2d.png", view(img_out), png_tag{});
+ write_view("out-convolve2d.png", view(img_out1), jpeg_tag{});
+
+
+ //------------------------------------//
+ std::vector<float> v1(3, 1.0f / 3.0f);
+ kernel_1d<float> kernel1(v1.begin(), v1.size(), 1);
+
+ detail::convolve_1d<gray32f_pixel_t>(const_view(img), kernel1, view(img_out), boundary_option::extend_zero);
+ write_view("out-convolve_option_extend_zero.png", view(img_out), png_tag{});
+
+ if (equal_pixels(view(img_out1), view(img_out)))cout << "convolve_option_extend_zero" << endl;
+
+ cout << "done\n";
+ cin.get();
+
+ return 0;
+}
diff --git a/src/boost/libs/gil/example/dynamic_image.cpp b/src/boost/libs/gil/example/dynamic_image.cpp
new file mode 100644
index 000000000..0b3c5da45
--- /dev/null
+++ b/src/boost/libs/gil/example/dynamic_image.cpp
@@ -0,0 +1,23 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/dynamic_image/any_image.hpp>
+#include <boost/gil/extension/io/jpeg.hpp>
+#include <boost/mp11.hpp>
+
+int main()
+{
+ namespace gil = boost::gil;
+
+ using my_images_t = boost::mp11::mp_list<gil::gray8_image_t, gil::rgb8_image_t, gil::gray16_image_t, gil::rgb16_image_t>;
+ gil::any_image<my_images_t> dynamic_image;
+ gil::read_image("test.jpg", dynamic_image, gil::jpeg_tag());
+ // Save the image upside down, preserving its native color space and channel depth
+ auto view = gil::flipped_up_down_view(gil::const_view(dynamic_image));
+ gil::write_view("out-dynamic_image.jpg", view, gil::jpeg_tag());
+}
diff --git a/src/boost/libs/gil/example/harris.cpp b/src/boost/libs/gil/example/harris.cpp
new file mode 100644
index 000000000..f860105d2
--- /dev/null
+++ b/src/boost/libs/gil/example/harris.cpp
@@ -0,0 +1,207 @@
+//
+// Copyright 2019 Olzhas Zhumabek <anonymous.from.applecity@gmail.com>
+//
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+#include <boost/gil/image.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/extension/io/png.hpp>
+#include <boost/gil/image_processing/numeric.hpp>
+#include <boost/gil/image_processing/harris.hpp>
+#include <boost/gil/extension/numeric/convolve.hpp>
+#include <vector>
+#include <functional>
+#include <set>
+#include <iostream>
+#include <fstream>
+
+namespace gil = boost::gil;
+
+// some images might produce artifacts
+// when converted to grayscale,
+// which was previously observed on
+// canny edge detector for test input
+// used for this example
+gil::gray8_image_t to_grayscale(gil::rgb8_view_t original)
+{
+ gil::gray8_image_t output_image(original.dimensions());
+ auto output = gil::view(output_image);
+ constexpr double max_channel_intensity = (std::numeric_limits<std::uint8_t>::max)();
+ for (long int y = 0; y < original.height(); ++y) {
+ for (long int x = 0; x < original.width(); ++x) {
+ // scale the values into range [0, 1] and calculate linear intensity
+ double red_intensity = original(x, y).at(std::integral_constant<int, 0>{})
+ / max_channel_intensity;
+ double green_intensity = original(x, y).at(std::integral_constant<int, 1>{})
+ / max_channel_intensity;
+ double blue_intensity = original(x, y).at(std::integral_constant<int, 2>{})
+ / max_channel_intensity;
+ auto linear_luminosity = 0.2126 * red_intensity
+ + 0.7152 * green_intensity
+ + 0.0722 * blue_intensity;
+
+ // perform gamma adjustment
+ double gamma_compressed_luminosity = 0;
+ if (linear_luminosity < 0.0031308) {
+ gamma_compressed_luminosity = linear_luminosity * 12.92;
+ } else {
+ gamma_compressed_luminosity = 1.055 * std::pow(linear_luminosity, 1 / 2.4) - 0.055;
+ }
+
+ // since now it is scaled, descale it back
+ output(x, y) = gamma_compressed_luminosity * max_channel_intensity;
+ }
+ }
+
+ return output_image;
+}
+
+void apply_gaussian_blur(gil::gray8_view_t input_view, gil::gray8_view_t output_view)
+{
+ constexpr static auto filterHeight = 5ull;
+ constexpr static auto filterWidth = 5ull;
+ constexpr static double filter[filterHeight][filterWidth] =
+ {
+ 2, 4, 6, 4, 2,
+ 4, 9, 12, 9, 4,
+ 5, 12, 15, 12, 5,
+ 4, 9, 12, 9, 4,
+ 2, 4, 5, 4, 2,
+ };
+ constexpr double factor = 1.0 / 159;
+ constexpr double bias = 0.0;
+
+ const auto height = input_view.height();
+ const auto width = input_view.width();
+ for (long x = 0; x < width; ++x) {
+ for (long y = 0; y < height; ++y) {
+ double intensity = 0.0;
+ for (size_t filter_y = 0; filter_y < filterHeight; ++filter_y) {
+ for (size_t filter_x = 0; filter_x < filterWidth; ++filter_x) {
+ int image_x = x - filterWidth / 2 + filter_x;
+ int image_y = y - filterHeight / 2 + filter_y;
+ if (image_x >= input_view.width() || image_x < 0
+ || image_y >= input_view.height() || image_y < 0) {
+ continue;
+ }
+ auto& pixel = input_view(image_x, image_y);
+ intensity += pixel.at(std::integral_constant<int, 0>{})
+ * filter[filter_y][filter_x];
+ }
+ }
+ auto& pixel = output_view(gil::point_t(x, y));
+ pixel = (std::min)((std::max)(int(factor * intensity + bias), 0), 255);
+ }
+
+ }
+}
+
+std::vector<gil::point_t> suppress(
+ gil::gray32f_view_t harris_response,
+ double harris_response_threshold)
+{
+ std::vector<gil::point_t> corner_points;
+ for (gil::gray32f_view_t::coord_t y = 1; y < harris_response.height() - 1; ++y)
+ {
+ for (gil::gray32f_view_t::coord_t x = 1; x < harris_response.width() - 1; ++x)
+ {
+ auto value = [](gil::gray32f_pixel_t pixel) {
+ return pixel.at(std::integral_constant<int, 0>{});
+ };
+ double values[9] = {
+ value(harris_response(x - 1, y - 1)),
+ value(harris_response(x, y - 1)),
+ value(harris_response(x + 1, y - 1)),
+ value(harris_response(x - 1, y)),
+ value(harris_response(x, y)),
+ value(harris_response(x + 1, y)),
+ value(harris_response(x - 1, y + 1)),
+ value(harris_response(x, y + 1)),
+ value(harris_response(x + 1, y + 1))
+ };
+
+ auto maxima = *std::max_element(
+ values,
+ values + 9,
+ [](double lhs, double rhs)
+ {
+ return lhs < rhs;
+ }
+ );
+
+ if (maxima == value(harris_response(x, y))
+ && std::count(values, values + 9, maxima) == 1
+ && maxima >= harris_response_threshold)
+ {
+ corner_points.emplace_back(x, y);
+ }
+ }
+ }
+
+ return corner_points;
+}
+
+int main(int argc, char* argv[])
+{
+ if (argc != 6)
+ {
+ std::cout << "usage: " << argv[0] << " <input.png> <odd-window-size>"
+ " <discrimination-constant> <harris-response-threshold> <output.png>\n";
+ return -1;
+ }
+
+ std::size_t window_size = std::stoul(argv[2]);
+ double discrimnation_constant = std::stof(argv[3]);
+ long harris_response_threshold = std::stol(argv[4]);
+
+ gil::rgb8_image_t input_image;
+
+ gil::read_image(argv[1], input_image, gil::png_tag{});
+
+ auto input_view = gil::view(input_image);
+ auto grayscaled = to_grayscale(input_view);
+ gil::gray8_image_t smoothed_image(grayscaled.dimensions());
+ auto smoothed = gil::view(smoothed_image);
+ apply_gaussian_blur(gil::view(grayscaled), smoothed);
+ gil::gray16s_image_t x_gradient_image(grayscaled.dimensions());
+ gil::gray16s_image_t y_gradient_image(grayscaled.dimensions());
+
+ auto x_gradient = gil::view(x_gradient_image);
+ auto y_gradient = gil::view(y_gradient_image);
+ auto scharr_x = gil::generate_dx_scharr();
+ gil::detail::convolve_2d(smoothed, scharr_x, x_gradient);
+ auto scharr_y = gil::generate_dy_scharr();
+ gil::detail::convolve_2d(smoothed, scharr_y, y_gradient);
+
+ gil::gray32f_image_t m11(x_gradient.dimensions());
+ gil::gray32f_image_t m12_21(x_gradient.dimensions());
+ gil::gray32f_image_t m22(x_gradient.dimensions());
+ gil::compute_tensor_entries(
+ x_gradient,
+ y_gradient,
+ gil::view(m11),
+ gil::view(m12_21),
+ gil::view(m22)
+ );
+
+ gil::gray32f_image_t harris_response(x_gradient.dimensions());
+ auto gaussian_kernel = gil::generate_gaussian_kernel(window_size, 0.84089642);
+ gil::compute_harris_responses(
+ gil::view(m11),
+ gil::view(m12_21),
+ gil::view(m22),
+ gaussian_kernel,
+ discrimnation_constant,
+ gil::view(harris_response)
+ );
+
+ auto corner_points = suppress(gil::view(harris_response), harris_response_threshold);
+ for (auto point: corner_points)
+ {
+ input_view(point) = gil::rgb8_pixel_t(0, 0, 0);
+ input_view(point).at(std::integral_constant<int, 1>{}) = 255;
+ }
+ gil::write_view(argv[5], input_view, gil::png_tag{});
+}
diff --git a/src/boost/libs/gil/example/hessian.cpp b/src/boost/libs/gil/example/hessian.cpp
new file mode 100644
index 000000000..d12f51ddb
--- /dev/null
+++ b/src/boost/libs/gil/example/hessian.cpp
@@ -0,0 +1,208 @@
+#include <boost/gil/image.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/image_processing/numeric.hpp>
+#include <boost/gil/image_processing/hessian.hpp>
+#include <boost/gil/extension/io/png.hpp>
+#include <vector>
+#include <functional>
+#include <set>
+#include <iostream>
+#include <fstream>
+
+namespace gil = boost::gil;
+
+// some images might produce artifacts
+// when converted to grayscale,
+// which was previously observed on
+// canny edge detector for test input
+// used for this example.
+// the algorithm here follows sRGB gamma definition
+// taken from here (luminance calculation):
+// https://en.wikipedia.org/wiki/Grayscale
+gil::gray8_image_t to_grayscale(gil::rgb8_view_t original)
+{
+ gil::gray8_image_t output_image(original.dimensions());
+ auto output = gil::view(output_image);
+ constexpr double max_channel_intensity = (std::numeric_limits<std::uint8_t>::max)();
+ for (long int y = 0; y < original.height(); ++y)
+ {
+ for (long int x = 0; x < original.width(); ++x)
+ {
+ // scale the values into range [0, 1] and calculate linear intensity
+ auto& p = original(x, y);
+ double red_intensity = p.at(std::integral_constant<int, 0>{})
+ / max_channel_intensity;
+ double green_intensity = p.at(std::integral_constant<int, 1>{})
+ / max_channel_intensity;
+ double blue_intensity = p.at(std::integral_constant<int, 2>{})
+ / max_channel_intensity;
+ auto linear_luminosity = 0.2126 * red_intensity
+ + 0.7152 * green_intensity
+ + 0.0722 * blue_intensity;
+
+ // perform gamma adjustment
+ double gamma_compressed_luminosity = 0;
+ if (linear_luminosity < 0.0031308)
+ {
+ gamma_compressed_luminosity = linear_luminosity * 12.92;
+ } else
+ {
+ gamma_compressed_luminosity = 1.055 * std::pow(linear_luminosity, 1 / 2.4) - 0.055;
+ }
+
+ // since now it is scaled, descale it back
+ output(x, y) = gamma_compressed_luminosity * max_channel_intensity;
+ }
+ }
+
+ return output_image;
+}
+
+void apply_gaussian_blur(gil::gray8_view_t input_view, gil::gray8_view_t output_view)
+{
+ constexpr static auto filter_height = 5ull;
+ constexpr static auto filter_width = 5ull;
+ constexpr static double filter[filter_height][filter_width] =
+ {
+ 2, 4, 6, 4, 2,
+ 4, 9, 12, 9, 4,
+ 5, 12, 15, 12, 5,
+ 4, 9, 12, 9, 4,
+ 2, 4, 5, 4, 2,
+ };
+ constexpr double factor = 1.0 / 159;
+ constexpr double bias = 0.0;
+
+ const auto height = input_view.height();
+ const auto width = input_view.width();
+ for (std::ptrdiff_t x = 0; x < width; ++x)
+ {
+ for (std::ptrdiff_t y = 0; y < height; ++y)
+ {
+ double intensity = 0.0;
+ for (std::ptrdiff_t filter_y = 0; filter_y < filter_height; ++filter_y)
+ {
+ for (std::ptrdiff_t filter_x = 0; filter_x < filter_width; ++filter_x)
+ {
+ int image_x = x - filter_width / 2 + filter_x;
+ int image_y = y - filter_height / 2 + filter_y;
+ if (image_x >= input_view.width() || image_x < 0 ||
+ image_y >= input_view.height() || image_y < 0)
+ {
+ continue;
+ }
+ const auto& pixel = input_view(image_x, image_y);
+ intensity += pixel.at(std::integral_constant<int, 0>{})
+ * filter[filter_y][filter_x];
+ }
+ }
+ auto& pixel = output_view(gil::point_t(x, y));
+ pixel = (std::min)((std::max)(int(factor * intensity + bias), 0), 255);
+ }
+
+ }
+}
+
+std::vector<gil::point_t> suppress(
+ gil::gray32f_view_t harris_response,
+ double harris_response_threshold)
+{
+ std::vector<gil::point_t> corner_points;
+ for (gil::gray32f_view_t::coord_t y = 1; y < harris_response.height() - 1; ++y)
+ {
+ for (gil::gray32f_view_t::coord_t x = 1; x < harris_response.width() - 1; ++x)
+ {
+ auto value = [](gil::gray32f_pixel_t pixel) {
+ return pixel.at(std::integral_constant<int, 0>{});
+ };
+ double values[9] = {
+ value(harris_response(x - 1, y - 1)),
+ value(harris_response(x, y - 1)),
+ value(harris_response(x + 1, y - 1)),
+ value(harris_response(x - 1, y)),
+ value(harris_response(x, y)),
+ value(harris_response(x + 1, y)),
+ value(harris_response(x - 1, y + 1)),
+ value(harris_response(x, y + 1)),
+ value(harris_response(x + 1, y + 1))
+ };
+
+ auto maxima = *std::max_element(
+ values,
+ values + 9,
+ [](double lhs, double rhs)
+ {
+ return lhs < rhs;
+ }
+ );
+
+ if (maxima == value(harris_response(x, y))
+ && std::count(values, values + 9, maxima) == 1
+ && maxima >= harris_response_threshold)
+ {
+ corner_points.emplace_back(x, y);
+ }
+ }
+ }
+
+ return corner_points;
+}
+
+int main(int argc, char* argv[]) {
+ if (argc != 5)
+ {
+ std::cout << "usage: " << argv[0] << " <input.png> <odd-window-size>"
+ " <hessian-response-threshold> <output.png>\n";
+ return -1;
+ }
+
+ std::size_t window_size = std::stoul(argv[2]);
+ long hessian_determinant_threshold = std::stol(argv[3]);
+
+ gil::rgb8_image_t input_image;
+
+ gil::read_image(argv[1], input_image, gil::png_tag{});
+
+ auto input_view = gil::view(input_image);
+ auto grayscaled = to_grayscale(input_view);
+ gil::gray8_image_t smoothed_image(grayscaled.dimensions());
+ auto smoothed = gil::view(smoothed_image);
+ apply_gaussian_blur(gil::view(grayscaled), smoothed);
+ gil::gray16s_image_t x_gradient_image(grayscaled.dimensions());
+ gil::gray16s_image_t y_gradient_image(grayscaled.dimensions());
+
+ auto x_gradient = gil::view(x_gradient_image);
+ auto y_gradient = gil::view(y_gradient_image);
+ auto scharr_x = gil::generate_dx_scharr();
+ gil::detail::convolve_2d(smoothed, scharr_x, x_gradient);
+ auto scharr_y = gil::generate_dy_scharr();
+ gil::detail::convolve_2d(smoothed, scharr_y, y_gradient);
+
+ gil::gray32f_image_t m11(x_gradient.dimensions());
+ gil::gray32f_image_t m12_21(x_gradient.dimensions());
+ gil::gray32f_image_t m22(x_gradient.dimensions());
+ gil::compute_hessian_entries(
+ x_gradient,
+ y_gradient,
+ gil::view(m11),
+ gil::view(m12_21),
+ gil::view(m22)
+ );
+
+ gil::gray32f_image_t hessian_response(x_gradient.dimensions());
+ auto gaussian_kernel = gil::generate_gaussian_kernel(window_size, 0.84089642);
+ gil::compute_hessian_responses(
+ gil::view(m11),
+ gil::view(m12_21),
+ gil::view(m22),
+ gaussian_kernel,
+ gil::view(hessian_response)
+ );
+
+ auto corner_points = suppress(gil::view(hessian_response), hessian_determinant_threshold);
+ for (auto point: corner_points) {
+ input_view(point) = gil::rgb8_pixel_t(0, 0, 0);
+ input_view(point).at(std::integral_constant<int, 1>{}) = 255;
+ }
+ gil::write_view(argv[4], input_view, gil::png_tag{});
+}
diff --git a/src/boost/libs/gil/example/histogram.cpp b/src/boost/libs/gil/example/histogram.cpp
new file mode 100644
index 000000000..b1b489642
--- /dev/null
+++ b/src/boost/libs/gil/example/histogram.cpp
@@ -0,0 +1,49 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/jpeg.hpp>
+
+#include <algorithm>
+#include <fstream>
+
+// Example file to demonstrate a way to compute histogram
+
+using namespace boost::gil;
+
+template <typename GrayView, typename R>
+void gray_image_hist(GrayView const& img_view, R& hist)
+{
+ for (auto it = img_view.begin(); it != img_view.end(); ++it)
+ ++hist[*it];
+
+ // Alternatively, prefer the algorithm with lambda
+ // for_each_pixel(img_view, [&hist](gray8_pixel_t const& pixel) {
+ // ++hist[pixel];
+ // });
+}
+
+template <typename V, typename R>
+void get_hist(const V& img_view, R& hist) {
+ gray_image_hist(color_converted_view<gray8_pixel_t>(img_view), hist);
+}
+
+int main() {
+ rgb8_image_t img;
+ read_image("test.jpg", img, jpeg_tag());
+
+ int histogram[256];
+ std::fill(histogram,histogram + 256, 0);
+ get_hist(const_view(img), histogram);
+
+ std::fstream histo_file("out-histogram.txt", std::ios::out);
+ for(std::size_t ii = 0; ii < 256; ++ii)
+ histo_file << histogram[ii] << std::endl;
+ histo_file.close();
+
+ return 0;
+}
diff --git a/src/boost/libs/gil/example/interleaved_ptr.cpp b/src/boost/libs/gil/example/interleaved_ptr.cpp
new file mode 100644
index 000000000..df80003b8
--- /dev/null
+++ b/src/boost/libs/gil/example/interleaved_ptr.cpp
@@ -0,0 +1,69 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifdef WIN32
+#define _CRT_SECURE_NO_DEPRECATE 1
+#pragma warning(disable : 4244) //
+#pragma warning(disable : 4996) // MSFT declared it deprecated
+#endif
+
+// Example file to demonstrate how to create a model of a pixel iterator
+
+// FIXME: Review and remove if possible: gcc doesn't compile unless we forward-declare at_c before we include gil...
+namespace boost { namespace gil {
+ template <typename ChannelReference, typename Layout> struct interleaved_ref;
+ template <typename ColorBase> struct element_reference_type;
+
+ template <int K, typename ChannelReference, typename Layout>
+ typename element_reference_type<interleaved_ref<ChannelReference,Layout>>::type
+ at_c(const interleaved_ref<ChannelReference,Layout>& p);
+} }
+
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/jpeg.hpp>
+
+#include <iostream>
+
+#include "interleaved_ptr.hpp"
+
+int main(int argc, char* argv[])
+{
+ using namespace boost::gil;
+
+ using rgb8_interleaved_ptr = interleaved_ptr<unsigned char*, rgb_layout_t>;
+ using rgb8c_interleaved_ptr = interleaved_ptr<unsigned char const*, rgb_layout_t>;
+
+ boost::function_requires<MutablePixelIteratorConcept<rgb8_interleaved_ptr>>();
+ boost::function_requires<PixelIteratorConcept<rgb8c_interleaved_ptr>>();
+ boost::function_requires<MemoryBasedIteratorConcept<memory_based_step_iterator<rgb8_interleaved_ptr>> >();
+
+ boost::function_requires<MutablePixelConcept<rgb8_interleaved_ptr::value_type>>();
+ boost::function_requires<PixelConcept<rgb8c_interleaved_ptr::value_type>>();
+
+ using rgb8_interleaved_view_t = type_from_x_iterator<rgb8_interleaved_ptr >::view_t;
+ using rgb8c_interleaved_view_t = type_from_x_iterator<rgb8c_interleaved_ptr>::view_t;
+
+ boost::function_requires<MutableImageViewConcept<rgb8_interleaved_view_t>>();
+ boost::function_requires<ImageViewConcept<rgb8c_interleaved_view_t>>();
+
+ rgb8_image_t img;
+ read_image("test.jpg", img, jpeg_tag{});
+
+ // Get a raw pointer to the RGB buffer
+ unsigned char* raw_ptr=&view(img)[0][0];
+
+ // Construct a view from it, without casting it to rgb8_pixel_t*
+ rgb8_interleaved_view_t src_view=interleaved_view(img.width(),img.height(),rgb8_interleaved_ptr(raw_ptr),
+ view(img).pixels().row_size());
+
+ // Apply view transformations and algorithms on it
+ write_view("out-interleaved_ptr.jpg",nth_channel_view(flipped_up_down_view(src_view),1), jpeg_tag{});
+
+ return 0;
+}
+
+
diff --git a/src/boost/libs/gil/example/interleaved_ptr.hpp b/src/boost/libs/gil/example/interleaved_ptr.hpp
new file mode 100644
index 000000000..a60fc9d43
--- /dev/null
+++ b/src/boost/libs/gil/example/interleaved_ptr.hpp
@@ -0,0 +1,201 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifndef BOOST_GIL_EXAMPLE_INTERLEAVED_PTR_HPP
+#define BOOST_GIL_EXAMPLE_INTERLEAVED_PTR_HPP
+
+#include <boost/gil.hpp>
+#include <boost/mp11.hpp>
+
+#include <type_traits>
+
+#include "interleaved_ref.hpp"
+
+// Example on how to create a pixel iterator
+
+namespace boost { namespace gil {
+
+// A model of an interleaved pixel iterator. Contains an iterator to the first channel of the current pixel
+//
+// Models:
+// MutablePixelIteratorConcept
+// PixelIteratorConcept
+// boost_concepts::RandomAccessTraversalConcept
+// PixelBasedConcept
+// HomogeneousPixelBasedConcept
+// PixelBasedConcept
+// ByteAdvanceableConcept
+// HasDynamicXStepTypeConcept
+
+template <typename ChannelPtr, // Models Channel Iterator (examples: unsigned char* or const unsigned char*)
+ typename Layout> // A layout (includes the color space and channel ordering)
+struct interleaved_ptr : boost::iterator_facade
+ <
+ interleaved_ptr<ChannelPtr, Layout>,
+ pixel<typename std::iterator_traits<ChannelPtr>::value_type, Layout>,
+ boost::random_access_traversal_tag,
+ interleaved_ref<typename std::iterator_traits<ChannelPtr>::reference, Layout> const
+ >
+{
+private:
+ using parent_t = boost::iterator_facade
+ <
+ interleaved_ptr<ChannelPtr, Layout>,
+ pixel<typename std::iterator_traits<ChannelPtr>::value_type, Layout>,
+ boost::random_access_traversal_tag,
+ interleaved_ref
+ <
+ typename std::iterator_traits<ChannelPtr>::reference,
+ Layout
+ > const
+ >;
+
+ using channel_t = typename std::iterator_traits<ChannelPtr>::value_type;
+
+public:
+ using reference = typename parent_t::reference;
+ using difference_type = typename parent_t::difference_type;
+
+ interleaved_ptr() {}
+ interleaved_ptr(const interleaved_ptr& ptr) : _channels(ptr._channels) {}
+ template <typename CP> interleaved_ptr(const interleaved_ptr<CP,Layout>& ptr) : _channels(ptr._channels) {}
+
+ interleaved_ptr(const ChannelPtr& channels) : _channels(channels) {}
+
+ // Construct from a pointer to the reference type. Not required by concepts but important
+ interleaved_ptr(reference* pix) : _channels(&((*pix)[0])) {}
+ interleaved_ptr& operator=(reference* pix) { _channels=&((*pix)[0]); return *this; }
+
+ /// For some reason operator[] provided by boost::iterator_facade returns a custom class that is convertible to reference
+ /// We require our own reference because it is registered in iterator_traits
+ reference operator[](difference_type d) const { return memunit_advanced_ref(*this,d*sizeof(channel_t));}
+
+ // Put this for every iterator whose reference is a proxy type
+ reference operator->() const { return **this; }
+
+ // Channels accessor (not required by any concept)
+ const ChannelPtr& channels() const { return _channels; }
+ ChannelPtr& channels() { return _channels; }
+
+ // Not required by concepts but useful
+ static const std::size_t num_channels = mp11::mp_size<typename Layout::color_space_t>::value;
+private:
+ ChannelPtr _channels;
+ friend class boost::iterator_core_access;
+ template <typename CP, typename L> friend struct interleaved_ptr;
+
+ void increment() { _channels+=num_channels; }
+ void decrement() { _channels-=num_channels; }
+ void advance(std::ptrdiff_t d) { _channels+=num_channels*d; }
+
+ std::ptrdiff_t distance_to(const interleaved_ptr& it) const { return (it._channels-_channels)/num_channels; }
+ bool equal(const interleaved_ptr& it) const { return _channels==it._channels; }
+
+ reference dereference() const { return reference(_channels); }
+};
+
+/////////////////////////////
+// PixelIteratorConcept
+/////////////////////////////
+
+// To get from the channel pointer a channel pointer to const, we have to go through the channel traits, which take a model of channel
+// So we can get a model of channel from the channel pointer via iterator_traits. Notice that we take the iterator_traits::reference and not
+// iterator_traits::value_type. This is because sometimes multiple reference and pointer types share the same value type. An example of this is
+// GIL's planar reference and iterator ("planar_pixel_reference" and "planar_pixel_iterator") which share the class "pixel" as the value_type. The
+// class "pixel" is also the value type for interleaved pixel references. Here we are dealing with channels, not pixels, but the principles still apply.
+template <typename ChannelPtr, typename Layout>
+struct const_iterator_type<interleaved_ptr<ChannelPtr,Layout>> {
+private:
+ using channel_ref_t = typename std::iterator_traits<ChannelPtr>::reference;
+ using channel_const_ptr_t = typename channel_traits<channel_ref_t>::const_pointer;
+public:
+ using type = interleaved_ptr<channel_const_ptr_t, Layout>;
+};
+
+template <typename ChannelPtr, typename Layout>
+struct iterator_is_mutable<interleaved_ptr<ChannelPtr,Layout>> : std::true_type {};
+template <typename Channel, typename Layout>
+struct iterator_is_mutable<interleaved_ptr<const Channel*,Layout>> : std::false_type {};
+
+template <typename ChannelPtr, typename Layout>
+struct is_iterator_adaptor<interleaved_ptr<ChannelPtr,Layout>> : std::false_type {};
+
+/////////////////////////////
+// PixelBasedConcept
+/////////////////////////////
+
+template <typename ChannelPtr, typename Layout>
+struct color_space_type<interleaved_ptr<ChannelPtr,Layout>>
+{
+ using type = typename Layout::color_space_t;
+};
+
+template <typename ChannelPtr, typename Layout>
+struct channel_mapping_type<interleaved_ptr<ChannelPtr,Layout>>
+{
+ using type = typename Layout::channel_mapping_t;
+};
+
+template <typename ChannelPtr, typename Layout>
+struct is_planar<interleaved_ptr<ChannelPtr,Layout>> : std::false_type {};
+
+/////////////////////////////
+// HomogeneousPixelBasedConcept
+/////////////////////////////
+
+template <typename ChannelPtr, typename Layout>
+struct channel_type<interleaved_ptr<ChannelPtr, Layout>>
+{
+ using type = typename std::iterator_traits<ChannelPtr>::value_type;
+};
+
+/////////////////////////////
+// ByteAdvanceableConcept
+/////////////////////////////
+
+template <typename ChannelPtr, typename Layout>
+inline std::ptrdiff_t memunit_step(const interleaved_ptr<ChannelPtr,Layout>&) {
+ return sizeof(typename std::iterator_traits<ChannelPtr>::value_type)* // size of each channel in bytes
+ interleaved_ptr<ChannelPtr,Layout>::num_channels; // times the number of channels
+}
+
+template <typename ChannelPtr, typename Layout>
+inline std::ptrdiff_t memunit_distance(const interleaved_ptr<ChannelPtr,Layout>& p1, const interleaved_ptr<ChannelPtr,Layout>& p2) {
+ return memunit_distance(p1.channels(),p2.channels());
+}
+
+template <typename ChannelPtr, typename Layout>
+inline void memunit_advance(interleaved_ptr<ChannelPtr,Layout>& p, std::ptrdiff_t diff) {
+ memunit_advance(p.channels(), diff);
+}
+
+template <typename ChannelPtr, typename Layout>
+inline interleaved_ptr<ChannelPtr,Layout> memunit_advanced(const interleaved_ptr<ChannelPtr,Layout>& p, std::ptrdiff_t diff) {
+ interleaved_ptr<ChannelPtr,Layout> ret=p;
+ memunit_advance(ret, diff);
+ return ret;
+}
+
+template <typename ChannelPtr, typename Layout>
+inline typename interleaved_ptr<ChannelPtr,Layout>::reference memunit_advanced_ref(const interleaved_ptr<ChannelPtr,Layout>& p, std::ptrdiff_t diff) {
+ interleaved_ptr<ChannelPtr,Layout> ret=p;
+ memunit_advance(ret, diff);
+ return *ret;
+}
+
+/////////////////////////////
+// HasDynamicXStepTypeConcept
+/////////////////////////////
+
+template <typename ChannelPtr, typename Layout>
+struct dynamic_x_step_type<interleaved_ptr<ChannelPtr, Layout>>
+{
+ using type = memory_based_step_iterator<interleaved_ptr<ChannelPtr, Layout>>;
+};
+} } // namespace boost::gil
+
+#endif
diff --git a/src/boost/libs/gil/example/interleaved_ref.hpp b/src/boost/libs/gil/example/interleaved_ref.hpp
new file mode 100644
index 000000000..837e7f222
--- /dev/null
+++ b/src/boost/libs/gil/example/interleaved_ref.hpp
@@ -0,0 +1,158 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifndef BOOST_GIL_EXAMPLE_INTERLEAVED_REF_HPP
+#define BOOST_GIL_EXAMPLE_INTERLEAVED_REF_HPP
+
+#include <boost/gil.hpp>
+#include <boost/gil/extension/dynamic_image/dynamic_image_all.hpp>
+
+#include <type_traits>
+
+// Example on how to create a new model of a pixel reference
+
+namespace boost { namespace gil {
+
+// A model of an interleaved pixel reference. Holds a pointer to the first channel
+// MODELS:
+// MutableHomogeneousPixelConcept
+// MutableHomogeneousColorBaseConcept
+// MutableColorBaseConcept
+// HomogeneousColorBaseConcept
+// ColorBaseConcept
+// HomogeneousPixelBasedConcept
+// PixelBasedConcept
+//
+// For planar reference proxies to work properly, all of their methods must be const-qualified
+// and their iterator's reference type must be const-qualified.
+// Mutability of the reference proxy is part of its type (in this case, depends on the mutability of ChannelReference)
+
+/// \tparam ChannelReference - Models ChannelConcept.
+/// A channel reference, unsigned char& or const unsigned char&
+/// \tparam Layout - A layout (includes the color space and channel ordering)
+template <typename ChannelReference, typename Layout>
+struct interleaved_ref
+{
+private:
+ using channel_t = typename channel_traits<ChannelReference>::value_type;
+ using channel_pointer_t = typename channel_traits<ChannelReference>::pointer;
+ using channel_reference_t = typename channel_traits<ChannelReference>::reference;
+ using channel_const_reference_t = typename channel_traits<ChannelReference>::const_reference;
+
+public:
+ using layout_t = Layout; // Required by ColorBaseConcept
+
+ // Copy construction from a compatible type. The copy constructor of references is shallow. The channels themselves are not copied.
+ interleaved_ref(const interleaved_ref& p) : _channels(p._channels) {}
+ template <typename P> interleaved_ref(const P& p) : _channels(p._channels) { check_compatible<P>(); }
+
+ template <typename P> bool operator==(const P& p) const { check_compatible<P>(); return static_equal(*this,p); }
+ template <typename P> bool operator!=(const P& p) const { return !(*this==p); }
+
+// Required by MutableColorBaseConcept
+
+ // Assignment from a compatible type
+ const interleaved_ref& operator=(const interleaved_ref& p) const { static_copy(p,*this); return *this; }
+ template <typename P> const interleaved_ref& operator=(const P& p) const { check_compatible<P>(); static_copy(p,*this); return *this; }
+
+// Required by PixelConcept
+ using value_type = pixel<channel_t, layout_t>;
+ using reference = interleaved_ref;
+ using const_reference = interleaved_ref<channel_const_reference_t, layout_t>;
+ static const bool is_mutable = channel_traits<ChannelReference>::is_mutable;
+
+// Required by HomogeneousPixelConcept
+ ChannelReference operator[](std::size_t i) const { return _channels[i]; }
+
+// Custom constructor (not part of any concept)
+ explicit interleaved_ref(channel_pointer_t channels) : _channels(channels) {}
+// This is needed for the reference proxy to work properly
+ const interleaved_ref* operator->() const { return this; }
+private:
+ channel_pointer_t _channels;
+
+ template <typename Pixel> static void check_compatible() { gil_function_requires<PixelsCompatibleConcept<Pixel,interleaved_ref>>(); }
+};
+
+// Required by ColorBaseConcept
+template <typename ChannelReference, typename Layout, int K>
+struct kth_element_type<interleaved_ref<ChannelReference, Layout>, K>
+{
+ using type = ChannelReference;
+};
+
+template <typename ChannelReference, typename Layout, int K>
+struct kth_element_reference_type<interleaved_ref<ChannelReference, Layout>, K>
+{
+ using type = ChannelReference;
+};
+
+template <typename ChannelReference, typename Layout, int K>
+struct kth_element_const_reference_type<interleaved_ref<ChannelReference, Layout>, K>
+{
+ using type = ChannelReference;
+ // XXX: using type = typename channel_traits<ChannelReference>::const_reference;
+};
+
+// Required by ColorBaseConcept
+template <int K, typename ChannelReference, typename Layout>
+typename element_reference_type<interleaved_ref<ChannelReference,Layout>>::type
+at_c(const interleaved_ref<ChannelReference,Layout>& p) { return p[K]; };
+
+// Required by HomogeneousColorBaseConcept
+template <typename ChannelReference, typename Layout>
+typename element_reference_type<interleaved_ref<ChannelReference,Layout>>::type
+dynamic_at_c(const interleaved_ref<ChannelReference,Layout>& p, std::size_t n) { return p[n]; };
+
+namespace detail {
+ struct swap_fn_t {
+ template <typename T> void operator()(T& x, T& y) const {
+ using std::swap;
+ swap(x,y);
+ }
+ };
+}
+
+// Required by MutableColorBaseConcept. The default std::swap does not do the right thing for proxy references - it swaps the references, not the values
+template <typename ChannelReference, typename Layout>
+void swap(const interleaved_ref<ChannelReference,Layout>& x, const interleaved_ref<ChannelReference,Layout>& y) {
+ static_for_each(x,y,detail::swap_fn_t());
+};
+
+// Required by PixelConcept
+template <typename ChannelReference, typename Layout>
+struct is_pixel<interleaved_ref<ChannelReference,Layout>> : public std::true_type {};
+
+
+// Required by PixelBasedConcept
+template <typename ChannelReference, typename Layout>
+struct color_space_type<interleaved_ref<ChannelReference, Layout>>
+{
+ using type = typename Layout::color_space_t;
+};
+
+// Required by PixelBasedConcept
+template <typename ChannelReference, typename Layout>
+struct channel_mapping_type<interleaved_ref<ChannelReference, Layout>>
+{
+ using type = typename Layout::channel_mapping_t;
+};
+
+// Required by PixelBasedConcept
+template <typename ChannelReference, typename Layout>
+struct is_planar<interleaved_ref<ChannelReference,Layout>> : std::false_type {};
+
+// Required by HomogeneousPixelBasedConcept
+template <typename ChannelReference, typename Layout>
+struct channel_type<interleaved_ref<ChannelReference, Layout>>
+{
+ using type = typename channel_traits<ChannelReference>::value_type;
+};
+
+} } // namespace boost::gil
+
+#endif
diff --git a/src/boost/libs/gil/example/mandelbrot.cpp b/src/boost/libs/gil/example/mandelbrot.cpp
new file mode 100644
index 000000000..0bcfc2ea1
--- /dev/null
+++ b/src/boost/libs/gil/example/mandelbrot.cpp
@@ -0,0 +1,75 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/image.hpp>
+#include <boost/gil/typedefs.hpp>
+#include <boost/gil/extension/io/jpeg.hpp>
+
+// Example for convolve_rows() and convolve_cols() in the numeric extension
+
+using namespace boost::gil;
+
+// Models a Unary Function
+template <typename P> // Models PixelValueConcept
+struct mandelbrot_fn
+{
+ using point_t = boost::gil::point_t;
+ using const_t = mandelbrot_fn;
+ using value_type = P;
+ using reference = value_type;
+ using const_reference = value_type;
+ using argument_type = point_t;
+ using result_type = reference;
+ static constexpr bool is_mutable =false;
+
+ value_type _in_color,_out_color;
+ point_t _img_size;
+ static const int MAX_ITER=100; // max number of iterations
+
+ mandelbrot_fn() {}
+ mandelbrot_fn(const point_t& sz, const value_type& in_color, const value_type& out_color) : _in_color(in_color), _out_color(out_color), _img_size(sz) {}
+
+ result_type operator()(const point_t& p) const {
+ // normalize the coords to (-2..1, -1.5..1.5)
+ // (actually make y -1.0..2 so it is asymmetric, so we can verify some view factory methods)
+ double t=get_num_iter(point<double>(p.x/(double)_img_size.x*3-2, p.y/(double)_img_size.y*3-1.0f));//1.5f));
+ t=pow(t,0.2);
+
+ value_type ret;
+ for (int k=0; k<num_channels<P>::value; ++k)
+ ret[k]=(typename channel_type<P>::type)(_in_color[k]*t + _out_color[k]*(1-t));
+ return ret;
+ }
+
+private:
+ double get_num_iter(const point<double>& p) const {
+ point<double> Z(0,0);
+ for (int i=0; i<MAX_ITER; ++i) {
+ Z = point<double>(Z.x*Z.x - Z.y*Z.y + p.x, 2*Z.x*Z.y + p.y);
+ if (Z.x*Z.x + Z.y*Z.y > 4)
+ return i/(double)MAX_ITER;
+ }
+ return 0;
+ }
+};
+
+int main()
+{
+ using deref_t = mandelbrot_fn<rgb8_pixel_t>;
+ using point_t = deref_t::point_t;
+ using locator_t = virtual_2d_locator<deref_t,false>;
+ using my_virt_view_t = image_view<locator_t>;
+
+ boost::function_requires<PixelLocatorConcept<locator_t>>();
+ gil_function_requires<StepIteratorConcept<locator_t::x_iterator>>();
+
+ point_t dims(200,200);
+ my_virt_view_t mandel(dims, locator_t(point_t(0,0), point_t(1,1), deref_t(dims, rgb8_pixel_t(255,0,255), rgb8_pixel_t(0,255,0))));
+ write_view("out-mandelbrot.jpg",mandel, jpeg_tag{});
+
+ return 0;
+}
diff --git a/src/boost/libs/gil/example/packed_pixel.cpp b/src/boost/libs/gil/example/packed_pixel.cpp
new file mode 100644
index 000000000..573b66850
--- /dev/null
+++ b/src/boost/libs/gil/example/packed_pixel.cpp
@@ -0,0 +1,59 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/extension/io/jpeg.hpp>
+
+#include <algorithm>
+
+// This test file demonstrates how to use packed pixel formats in GIL.
+// A "packed" pixel is a pixel whose channels are bit ranges.
+// Here we create an RGB image whose pixel has 16-bits, such as:
+// bits [0..6] are the blue channel
+// bits [7..13] are the green channel
+// bits [14..15] are the red channel
+// We read a regular 8-bit RGB image, convert it to packed BGR772, convert it back to 8-bit RGB and save it to a file.
+// Since the red channel is only two bits the color loss should be observable in the result
+//
+// This test file also demonstrates how to use bit-aligned images - these are images whose pixels themselves are not byte aligned.
+// For example, an rgb222 image has a pixel whose size is 6 bits. Bit-aligned images are more complicated than packed images. They
+// require a special proxy class to represent pixel reference and pixel iterator (packed images use C++ reference and C pointer respectively).
+// The alignment parameter in the constructor of bit-aligned images is in bit units. For example, if you want your bit-aligned image to have 4-byte
+// alignment of its rows use alignment of 32, not 4.
+//
+// To demonstrate that image view transformations work on packed images, we save the result transposed.
+
+using namespace boost;
+using namespace boost::gil;
+
+int main() {
+ bgr8_image_t img;
+ read_image("test.jpg",img, jpeg_tag{});
+
+ ////////////////////////////////
+ // define a bgr772 image. It is a "packed" image - its channels are not byte-aligned, but its pixels are.
+ ////////////////////////////////
+
+ using bgr772_image_t = packed_image3_type<uint16_t, 7,7,2, bgr_layout_t>::type;
+ bgr772_image_t bgr772_img(img.dimensions());
+ copy_and_convert_pixels(const_view(img),view(bgr772_img));
+
+ // Save the result. JPEG I/O does not support the packed pixel format, so convert it back to 8-bit RGB
+ write_view("out-packed_pixel_bgr772.jpg",color_converted_view<bgr8_pixel_t>(transposed_view(const_view(bgr772_img))), jpeg_tag{});
+
+ ////////////////////////////////
+ // define a gray1 image (one-bit per pixel). It is a "bit-aligned" image - its pixels are not byte aligned.
+ ////////////////////////////////
+
+ using gray1_image_t = bit_aligned_image1_type<1, gray_layout_t>::type;
+ gray1_image_t gray1_img(img.dimensions());
+ copy_and_convert_pixels(const_view(img),view(gray1_img));
+
+ // Save the result. JPEG I/O does not support the packed pixel format, so convert it back to 8-bit RGB
+ write_view("out-packed_pixel_gray1.jpg",color_converted_view<gray8_pixel_t>(transposed_view(const_view(gray1_img))), jpeg_tag{});
+
+ return 0;
+}
diff --git a/src/boost/libs/gil/example/resize.cpp b/src/boost/libs/gil/example/resize.cpp
new file mode 100644
index 000000000..2dc0bf199
--- /dev/null
+++ b/src/boost/libs/gil/example/resize.cpp
@@ -0,0 +1,29 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/jpeg.hpp>
+#include <boost/gil/extension/numeric/sampler.hpp>
+#include <boost/gil/extension/numeric/resample.hpp>
+
+// Example for resize_view() in the numeric extension
+
+int main()
+{
+ namespace bg = boost::gil;
+
+ bg::rgb8_image_t img;
+ bg::read_image("test.jpg", img, bg::jpeg_tag{});
+
+ // test resize_view
+ // Scale the image to 100x100 pixels using bilinear resampling
+ bg::rgb8_image_t square100x100(100, 100);
+ bg::resize_view(bg::const_view(img), bg::view(square100x100), bg::bilinear_sampler{});
+ bg::write_view("out-resize.jpg", bg::const_view(square100x100), bg::jpeg_tag{});
+
+ return 0;
+}
diff --git a/src/boost/libs/gil/example/sobel_scharr.cpp b/src/boost/libs/gil/example/sobel_scharr.cpp
new file mode 100644
index 000000000..10e15c223
--- /dev/null
+++ b/src/boost/libs/gil/example/sobel_scharr.cpp
@@ -0,0 +1,45 @@
+#include <boost/gil/typedefs.hpp>
+#include <boost/gil/image_processing/numeric.hpp>
+#include <boost/gil/extension/io/png.hpp>
+#include <boost/gil/extension/numeric/convolve.hpp>
+#include <string>
+#include <iostream>
+
+namespace gil = boost::gil;
+
+int main(int argc, char* argv[])
+{
+ if (argc != 5)
+ {
+ std::cerr << "usage: " << argv[0] << ": <input.png> <sobel|scharr> <output-x.png> <output-y.png>\n";
+ return -1;
+ }
+
+ gil::gray8_image_t input_image;
+ gil::read_image(argv[1], input_image, gil::png_tag{});
+ auto input = gil::view(input_image);
+ auto filter_type = std::string(argv[2]);
+
+ gil::gray16_image_t dx_image(input_image.dimensions());
+ auto dx = gil::view(dx_image);
+ gil::gray16_image_t dy_image(input_image.dimensions());
+ auto dy = gil::view(dy_image);
+ if (filter_type == "sobel")
+ {
+ gil::detail::convolve_2d(input, gil::generate_dx_sobel(1), dx);
+ gil::detail::convolve_2d(input, gil::generate_dy_sobel(1), dy);
+ }
+ else if (filter_type == "scharr")
+ {
+ gil::detail::convolve_2d(input, gil::generate_dx_scharr(1), dx);
+ gil::detail::convolve_2d(input, gil::generate_dy_scharr(1), dy);
+ }
+ else
+ {
+ std::cerr << "unrecognized gradient filter type. Must be either sobel or scharr\n";
+ return -1;
+ }
+
+ gil::write_view(argv[3], dx, gil::png_tag{});
+ gil::write_view(argv[4], dy, gil::png_tag{});
+}
diff --git a/src/boost/libs/gil/example/test.jpg b/src/boost/libs/gil/example/test.jpg
new file mode 100644
index 000000000..d7e4490c4
--- /dev/null
+++ b/src/boost/libs/gil/example/test.jpg
Binary files differ
diff --git a/src/boost/libs/gil/example/test_adaptive.png b/src/boost/libs/gil/example/test_adaptive.png
new file mode 100644
index 000000000..d72dd68f7
--- /dev/null
+++ b/src/boost/libs/gil/example/test_adaptive.png
Binary files differ
diff --git a/src/boost/libs/gil/example/threshold.cpp b/src/boost/libs/gil/example/threshold.cpp
new file mode 100644
index 000000000..565ff1ca1
--- /dev/null
+++ b/src/boost/libs/gil/example/threshold.cpp
@@ -0,0 +1,29 @@
+//
+// Copyright 2019 Miral Shah <miralshah2211@gmail.com>
+//
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+#include <boost/gil/extension/io/jpeg.hpp>
+#include <boost/gil/image_processing/threshold.hpp>
+
+using namespace boost::gil;
+
+int main()
+{
+ rgb8_image_t img;
+ read_image("test.jpg",img, jpeg_tag{});
+ rgb8_image_t img_out(img.dimensions());
+
+// performing binary threshold on each channel of the image
+// if the pixel value is more than 150 than it will be set to 255 else to 0
+ boost::gil::threshold_binary(const_view(img), view(img_out), 150, 255);
+ write_view("out-threshold-binary.jpg", view(img_out), jpeg_tag{});
+
+// if the pixel value is more than 150 than it will be set to 150 else no change
+ boost::gil::threshold_truncate(const_view(img), view(img_out), 150, threshold_truncate_mode::threshold);
+ write_view("out-threshold-binary_inv.jpg", view(img_out), jpeg_tag{});
+
+ return 0;
+}
diff --git a/src/boost/libs/gil/example/x_gradient.cpp b/src/boost/libs/gil/example/x_gradient.cpp
new file mode 100644
index 000000000..111d40b9e
--- /dev/null
+++ b/src/boost/libs/gil/example/x_gradient.cpp
@@ -0,0 +1,59 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/extension/io/jpeg.hpp>
+
+// Example to demonstrate a way to compute gradients along x-axis
+
+using namespace boost::gil;
+
+template <typename Out>
+struct halfdiff_cast_channels {
+ template <typename T> Out operator()(const T& in1, const T& in2) const {
+ return Out((in2-in1)/2);
+ }
+};
+
+
+template <typename SrcView, typename DstView>
+void x_gradient(SrcView const& src, DstView const& dst)
+{
+ using dst_channel_t = typename channel_type<DstView>::type;
+
+ for (int y = 0; y < src.height(); ++y)
+ {
+ typename SrcView::x_iterator src_it = src.row_begin(y);
+ typename DstView::x_iterator dst_it = dst.row_begin(y);
+
+ for (int x = 1; x < src.width() - 1; ++x)
+ {
+ static_transform(src_it[x - 1], src_it[x + 1], dst_it[x],
+ halfdiff_cast_channels<dst_channel_t>());
+ }
+ }
+}
+
+template <typename SrcView, typename DstView>
+void x_luminosity_gradient(SrcView const& src, DstView const& dst)
+{
+ using gray_pixel_t = pixel<typename channel_type<SrcView>::type, gray_layout_t>;
+ x_gradient(color_converted_view<gray_pixel_t>(src), dst);
+}
+
+int main()
+{
+ rgb8_image_t img;
+ read_image("test.jpg",img, jpeg_tag{});
+
+ gray8s_image_t img_out(img.dimensions());
+ fill_pixels(view(img_out),int8_t(0));
+
+ x_luminosity_gradient(const_view(img), view(img_out));
+ write_view("out-x_gradient.jpg",color_converted_view<gray8_pixel_t>(const_view(img_out)), jpeg_tag{});
+
+ return 0;
+}
diff --git a/src/boost/libs/gil/index.html b/src/boost/libs/gil/index.html
new file mode 100644
index 000000000..d4ecb1ad8
--- /dev/null
+++ b/src/boost/libs/gil/index.html
@@ -0,0 +1,9 @@
+<html>
+ <head>
+ <meta http-equiv="refresh" content="0; URL=doc/index.html"/>
+ </head>
+ <body>
+ Automatic redirection failed, please go to
+ <a href="doc/index.html">doc/index.html</a>
+ </body>
+</html>
diff --git a/src/boost/libs/gil/meta/libraries.json b/src/boost/libs/gil/meta/libraries.json
new file mode 100644
index 000000000..b8ca8b635
--- /dev/null
+++ b/src/boost/libs/gil/meta/libraries.json
@@ -0,0 +1,21 @@
+{
+ "key": "gil",
+ "name": "GIL",
+ "authors": [
+ "Lubomir Bourdev",
+ "Hailin Jin",
+ "Christian Henning"
+ ],
+ "description": "(C++11) Generic Image Library",
+ "category": [
+ "Algorithms",
+ "Containers",
+ "Generic",
+ "Image-processing",
+ "Iterators"
+ ],
+ "maintainers": [
+ "Stefan Seefeld <stefan -at- seefeld.name>",
+ "Mateusz Loskot <mateusz -at- loskot.net>"
+ ]
+}
diff --git a/src/boost/libs/gil/sublibs b/src/boost/libs/gil/sublibs
new file mode 100644
index 000000000..90933e5cf
--- /dev/null
+++ b/src/boost/libs/gil/sublibs
@@ -0,0 +1 @@
+The existance of this file tells the regression reporting programs that the directory contains sub-directories which are libraries.
diff --git a/src/boost/libs/gil/test/CMakeLists.txt b/src/boost/libs/gil/test/CMakeLists.txt
new file mode 100644
index 000000000..acdf1e82b
--- /dev/null
+++ b/src/boost/libs/gil/test/CMakeLists.txt
@@ -0,0 +1,38 @@
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+
+foreach(_name
+ test_utility_output_stream)
+ set(_test t_utility_${_name})
+ set(_target test_utility_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
+
+add_subdirectory(core)
+
+add_subdirectory(legacy)
+
+add_subdirectory(extension)
+
+# TODO: Split headers tests into core and extensions, see Jamfile-s
+# if(BOOST_GIL_BUILD_HEADERS_TESTS)
+# add_subdirectory(headers)
+# endif()
diff --git a/src/boost/libs/gil/test/Jamfile b/src/boost/libs/gil/test/Jamfile
new file mode 100644
index 000000000..cfca2f443
--- /dev/null
+++ b/src/boost/libs/gil/test/Jamfile
@@ -0,0 +1,134 @@
+# Boost.GIL (Generic Image Library) - tests
+#
+# Copyright (c) 2013-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
+# Copyright (c) 2018-2019 Mateusz Loskot <mateusz@loskot.net>
+# Copyright (c) 2018 Dmitry Arkhipov
+# Copyright (c) 2007-2015 Andrey Semashev
+#
+# Use, modification and distribution is subject to the Boost Software License,
+# Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+
+import ../../config/checks/config : requires ;
+import os ;
+import path ;
+import regex ;
+import sequence ;
+import testing ;
+
+# Avoid warnings flood on Travis CI, AppVeyor, CircleCI, Azure Pipelines, GitHub Actions
+if ! [ os.environ CI ] && ! [ os.environ AGENT_JOBSTATUS ] && ! [ os.environ GITHUB_ACTIONS ]
+{
+ DEVELOPMENT_EXTRA_WARNINGS =
+ <toolset>msvc:<cxxflags>"-W4"
+ <toolset>gcc:<cxxflags>"-pedantic -Wextra -Wcast-align -Wconversion -Wfloat-equal -Wshadow -Wsign-promo -Wstrict-aliasing -Wunused-parameter"
+ <toolset>clang,<variant>debug:<cxxflags>"-pedantic -Wextra -Wcast-align -Wconversion -Wfloat-equal -Wshadow -Wsign-promo -Wstrict-aliasing -Wunused-parameter -Wsign-conversion"
+ <toolset>clang,<variant>release:<cxxflags>"-pedantic -Wextra -Wcast-align -Wconversion -Wfloat-equal -Wshadow -Wsign-promo -Wstrict-aliasing -Wunused-parameter -Wsign-conversion"
+ <toolset>darwin:<cxxflags>"-pedantic -Wextra -Wcast-align -Wconversion -Wfloat-equal -Wshadow -Wsign-promo -Wstrict-aliasing -Wunused-parameter"
+ ;
+}
+else
+{
+ DEVELOPMENT_EXTRA_WARNINGS =
+ <toolset>msvc:<cxxflags>"-W1"
+ ;
+}
+
+project
+ :
+ requirements
+ <include>.
+ # TODO: Enable concepts check for all, not just test/core
+ #<define>BOOST_GIL_USE_CONCEPT_CHECK=1
+ <toolset>msvc:<cxxflags>"-bigobj"
+ <toolset>msvc:<asynch-exceptions>on
+ <toolset>msvc:<define>_SCL_SECURE_NO_DEPRECATE
+ <toolset>msvc:<define>_CRT_SECURE_NO_WARNINGS
+ <toolset>msvc:<define>_CRT_NONSTDC_NO_DEPRECATE
+ <toolset>msvc:<define>NOMINMAX
+ <toolset>intel:<debug-symbols>off
+ <toolset>gcc:<cxxflags>"-fstrict-aliasing"
+ <toolset>darwin:<cxxflags>"-fstrict-aliasing"
+ # variant filter for clang is necessary to allow ubsan_*
+ # custom variants declare distinct set of <cxxflags>
+ <toolset>clang,<variant>debug:<cxxflags>"-fstrict-aliasing"
+ <toolset>clang,<variant>release:<cxxflags>"-fstrict-aliasing"
+ $(DEVELOPMENT_EXTRA_WARNINGS)
+ [ requires
+ cxx11_constexpr
+ cxx11_defaulted_functions
+ cxx11_template_aliases
+ cxx11_trailing_result_types # implies decltype and auto
+ cxx11_variadic_templates
+ ]
+ ;
+
+variant gil_ubsan_integer
+ : release
+ :
+ <cxxflags>"-Wno-unused -fstrict-aliasing -fno-omit-frame-pointer -fsanitize=integer -fno-sanitize-recover=integer -fsanitize-blacklist=libs/gil/.ci/blacklist.supp"
+ <linkflags>"-fsanitize=integer"
+ <debug-symbols>on
+ <define>BOOST_USE_ASAN=1
+ ;
+
+variant gil_ubsan_nullability
+ : release
+ :
+ <cxxflags>"-Wno-unused -fstrict-aliasing -fno-omit-frame-pointer -fsanitize=nullability -fno-sanitize-recover=nullability -fsanitize-blacklist=libs/gil/.ci/blacklist.supp"
+ <linkflags>"-fsanitize=nullability"
+ <debug-symbols>on
+ <define>BOOST_USE_ASAN=1
+ ;
+
+variant gil_ubsan_undefined
+ : release
+ :
+ <cxxflags>"-Wno-unused -fstrict-aliasing -fno-omit-frame-pointer -fsanitize=undefined -fno-sanitize-recover=undefined -fsanitize-blacklist=libs/gil/.ci/blacklist.supp"
+ <linkflags>"-fsanitize=undefined"
+ <debug-symbols>on
+ <define>BOOST_USE_ASAN=1
+ ;
+
+rule generate_self_contained_headers ( headers_subpath * : exclude_subpaths * )
+{
+ # On CI services, test the self-contained headers on-demand only to avoid build timeouts
+ # CI environment is common for Travis CI, AppVeyor, CircleCI, etc.
+ # For example:
+ # if ! [ os.environ CI ] || [ os.environ TEST_HEADERS ] {
+ # alias self_contained_headers : [ generate_self_contained_headers ] ;
+ # }
+
+ local targets ;
+
+ # NOTE: All '/' in test names are replaced with '-' because apparently
+ # test scripts have a problem with test names containing slashes.
+
+ local top_headers_path = [ path.make $(BOOST_ROOT)/libs/gil/include/boost/gil ] ;
+ local headers_path = $(top_headers_path) ;
+ if $(headers_subpath)
+ {
+ headers_path = $(top_headers_path)/$(headers_subpath) ;
+ }
+
+ for local file in [ path.glob-tree $(headers_path) : *.hpp : $(exclude_subpaths) ]
+ {
+ local target_no = [ sequence.length $(targets) ] ;
+ local rel_file = [ path.relative-to $(top_headers_path) $(file) ] ;
+ local target_name = [ regex.replace h/$(target_no)/$(rel_file) "/" "-" ] ;
+ local target_name = [ regex.replace $(target_name) "\.hpp" "" ] ;
+ targets += [
+ compile $(BOOST_ROOT)/libs/gil/test/header/main.cpp
+ : <define>"BOOST_GIL_TEST_HEADER=$(rel_file)" <dependency>$(file)
+ : $(target_name)
+ ] ;
+ }
+
+ return $(targets) ;
+}
+
+run test_utility_output_stream.cpp ;
+
+build-project core ;
+build-project legacy ;
+build-project extension ;
diff --git a/src/boost/libs/gil/test/core/CMakeLists.txt b/src/boost/libs/gil/test/core/CMakeLists.txt
new file mode 100644
index 000000000..ed3b36f49
--- /dev/null
+++ b/src/boost/libs/gil/test/core/CMakeLists.txt
@@ -0,0 +1,41 @@
+#
+# Copyright (c) 2017-2019 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+message(STATUS "Boost.GIL: Configuring tests in test/core")
+
+foreach(_name
+ promote_integral
+ test_fixture)
+ set(_test t_utility_${_name})
+ set(_target test_utility_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
+
+add_subdirectory(point)
+add_subdirectory(channel)
+add_subdirectory(color)
+add_subdirectory(color_base)
+add_subdirectory(pixel)
+add_subdirectory(iterator)
+add_subdirectory(locator)
+add_subdirectory(image)
+add_subdirectory(image_view)
+add_subdirectory(algorithm)
+add_subdirectory(image_processing)
diff --git a/src/boost/libs/gil/test/core/Jamfile b/src/boost/libs/gil/test/core/Jamfile
new file mode 100644
index 000000000..7ced83833
--- /dev/null
+++ b/src/boost/libs/gil/test/core/Jamfile
@@ -0,0 +1,34 @@
+# Boost.GIL (Generic Image Library) - core tests
+#
+# Copyright (c) 2008 Lubomir Bourdev, Hailin Jin
+# Copyright (c) 2018-2019 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+project
+ :
+ requirements
+ <define>BOOST_GIL_USE_CONCEPT_CHECK=1
+ ;
+
+alias headers_concepts : [ generate_self_contained_headers concepts ] ;
+alias headers : [ generate_self_contained_headers : concepts extension io ] ;
+
+run promote_integral.cpp ;
+run test_fixture.cpp ;
+
+build-project point ;
+build-project channel ;
+build-project color ;
+build-project color_base ;
+build-project pixel ;
+build-project iterator ;
+build-project locator ;
+build-project image ;
+build-project image_view ;
+build-project algorithm ;
+build-project image_processing ;
diff --git a/src/boost/libs/gil/test/core/algorithm/CMakeLists.txt b/src/boost/libs/gil/test/core/algorithm/CMakeLists.txt
new file mode 100644
index 000000000..688bd93e1
--- /dev/null
+++ b/src/boost/libs/gil/test/core/algorithm/CMakeLists.txt
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2018 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+foreach(_name
+ for_each_pixel
+ std_fill
+ std_uninitialized_fill)
+ set(_test t_core_algorithm_${_name})
+ set(_target test_core_algorithm_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
diff --git a/src/boost/libs/gil/test/core/algorithm/Jamfile b/src/boost/libs/gil/test/core/algorithm/Jamfile
new file mode 100644
index 000000000..8510c8009
--- /dev/null
+++ b/src/boost/libs/gil/test/core/algorithm/Jamfile
@@ -0,0 +1,13 @@
+# Boost.GIL (Generic Image Library) - tests
+#
+# Copyright (c) 2018-2019 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+run for_each_pixel.cpp ;
+run std_fill.cpp ;
+run std_uninitialized_fill.cpp ;
diff --git a/src/boost/libs/gil/test/core/algorithm/for_each_pixel.cpp b/src/boost/libs/gil/test/core/algorithm/for_each_pixel.cpp
new file mode 100644
index 000000000..5490b27f3
--- /dev/null
+++ b/src/boost/libs/gil/test/core/algorithm/for_each_pixel.cpp
@@ -0,0 +1,34 @@
+//
+// Copyright 2018-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/algorithm.hpp>
+#include <boost/gil/image.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+
+void test_lambda_expression()
+{
+ gil::gray8_pixel_t const gray128(128);
+ gil::gray8_image_t image(2, 2, gray128);
+
+ int sum{0};
+ gil::for_each_pixel(gil::view(image), [&sum](gil::gray8_pixel_t& p) {
+ sum += gil::at_c<0>(p);
+ });
+ BOOST_TEST_EQ(sum, 2 * 2 * 128);
+}
+
+int main()
+{
+ test_lambda_expression();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/algorithm/std_fill.cpp b/src/boost/libs/gil/test/core/algorithm/std_fill.cpp
new file mode 100644
index 000000000..067b6babd
--- /dev/null
+++ b/src/boost/libs/gil/test/core/algorithm/std_fill.cpp
@@ -0,0 +1,55 @@
+//
+// Copyright 2018-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifdef BOOST_GIL_USE_CONCEPT_CHECK
+// FIXME: Range as pixel does not seem to fulfill pixel concepts due to no specializations required:
+// pixel.hpp(50) : error C2039 : 'type' : is not a member of 'boost::gil::color_space_type<P>
+#undef BOOST_GIL_USE_CONCEPT_CHECK
+#endif
+#include <boost/gil/algorithm.hpp>
+#include <boost/gil/image.hpp>
+#include <boost/gil/image_view.hpp>
+
+#include <boost/array.hpp>
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include <array>
+#include <cstdint>
+
+namespace gil = boost::gil;
+
+using array_pixel_types = ::boost::mp11::mp_list
+<
+ boost::array<int, 2>,
+ std::array<int, 2>
+>;
+
+struct test_array_as_pixel
+{
+ template <typename Pixel>
+ void operator()(Pixel const&)
+ {
+ using pixel_t = Pixel;
+ gil::image<pixel_t> img(1, 1);
+ std::fill(gil::view(img).begin(), gil::view(img).end(), pixel_t{0, 1});
+ auto a = *gil::view(img).at(0, 0);
+ auto e = pixel_t{0, 1};
+ BOOST_TEST(a == e);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<array_pixel_types>(test_array_as_pixel{});
+ }
+};
+
+int main()
+{
+ test_array_as_pixel::run();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/algorithm/std_uninitialized_fill.cpp b/src/boost/libs/gil/test/core/algorithm/std_uninitialized_fill.cpp
new file mode 100644
index 000000000..c308f4775
--- /dev/null
+++ b/src/boost/libs/gil/test/core/algorithm/std_uninitialized_fill.cpp
@@ -0,0 +1,223 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include <memory>
+#include <random>
+#include <type_traits>
+#include <vector>
+
+#include "test_utility_output_stream.hpp"
+#include "core/channel/test_fixture.hpp"
+#include "core/image/test_fixture.hpp"
+#include "core/pixel/test_fixture.hpp"
+
+namespace boost { namespace gil { namespace test { namespace fixture {
+
+template <typename Pixel>
+struct pixel_array
+{
+ using iterator = Pixel*;
+#ifdef NDEBUG
+ constexpr static std::size_t default_x_size = 256;
+ constexpr static std::size_t default_y_size = 128;
+#else
+ constexpr static std::size_t default_x_size = 16;
+ constexpr static std::size_t default_y_size = 8;
+#endif
+
+ pixel_array(std::size_t x_size = default_x_size, std::size_t y_size = default_y_size)
+ : pixels_(new Pixel[x_size * y_size])
+ , x_size_(x_size)
+ , y_size_(y_size)
+ {}
+
+ auto begin() -> iterator { return pixels_.get(); }
+ auto end() -> iterator { return pixels_.get() + x_size_ * y_size_; }
+
+private:
+ std::unique_ptr<Pixel[]> pixels_;
+ std::size_t x_size_;
+ std::size_t y_size_;
+};
+
+}}}}
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+struct fill_with_pixel_integer_types
+{
+ template <typename Pixel>
+ void operator()(Pixel const &)
+ {
+ using pixel_t = Pixel;
+ auto min_pixel = fixture::pixel_generator<pixel_t>::min();
+ auto max_pixel = fixture::pixel_generator<pixel_t>::max();
+ auto rnd_pixel = fixture::pixel_generator<pixel_t>::random();
+
+ for (auto const &fill_pixel : {min_pixel, max_pixel, rnd_pixel})
+ {
+ fixture::pixel_array<pixel_t> pixels;
+ std::uninitialized_fill(pixels.begin(), pixels.end(), fill_pixel);
+
+ for (pixel_t const &p : pixels)
+ BOOST_TEST_EQ(p, fill_pixel);
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_integer_types>(fill_with_pixel_integer_types{});
+ }
+};
+
+struct fill_with_pixel_float_types
+{
+ template <typename Pixel>
+ void operator()(Pixel const &)
+ {
+ using pixel_t = Pixel;
+ auto min_pixel = fixture::pixel_generator<pixel_t>::min();
+ auto max_pixel = fixture::pixel_generator<pixel_t>::max();
+
+ for (auto const &fill_pixel : {min_pixel, max_pixel})
+ {
+ fixture::pixel_array<Pixel> pixels;
+ std::uninitialized_fill(pixels.begin(), pixels.end(), fill_pixel);
+
+ for (Pixel const &p : pixels)
+ BOOST_TEST_EQ(p, fill_pixel);
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_float_types>(fill_with_pixel_float_types{});
+ }
+};
+
+void
+test_fill_with_packed_pixel_gray3()
+{
+ auto min_pixel = fixture::packed_pixel_gray3{0};
+ auto mid_pixel = fixture::packed_pixel_gray3{3};
+ auto max_pixel = fixture::packed_pixel_gray3{7};
+
+ for (auto const& fill_pixel : {min_pixel, max_pixel, mid_pixel} )
+ {
+ fixture::pixel_array<fixture::packed_pixel_gray3> pixels;
+ std::uninitialized_fill(pixels.begin(), pixels.end(), fill_pixel);
+
+ for (fixture::packed_pixel_gray3 const& p : pixels)
+ {
+ BOOST_TEST_EQ(p, fill_pixel);
+ BOOST_TEST_EQ((int)get_color(p, gil::gray_color_t()), (int)get_color(fill_pixel, gil::gray_color_t()));
+ }
+ }
+}
+
+void test_fill_with_packed_pixel_bgr121()
+{
+ auto min_pixel = fixture::packed_pixel_bgr121{0};
+ auto mid_pixel = fixture::packed_pixel_bgr121{8};
+ auto max_pixel = fixture::packed_pixel_bgr121{17};
+
+ for (auto const& fill_pixel : {min_pixel, max_pixel, mid_pixel} )
+ {
+ fixture::pixel_array<fixture::packed_pixel_bgr121> pixels;
+ std::uninitialized_fill(pixels.begin(), pixels.end(), fill_pixel);
+
+ for (fixture::packed_pixel_bgr121 const& p : pixels)
+ {
+ BOOST_TEST_EQ(p, fill_pixel);
+ BOOST_TEST_EQ((int)get_color(p, gil::red_t()), (int)get_color(fill_pixel, gil::red_t()));
+ BOOST_TEST_EQ((int)get_color(p, gil::green_t()), (int)get_color(fill_pixel, gil::green_t()));
+ BOOST_TEST_EQ((int)get_color(p, gil::blue_t()), (int)get_color(fill_pixel, gil::blue_t()));
+ }
+ }
+}
+
+void test_fill_with_packed_pixel_rgb535()
+{
+ fixture::packed_pixel_rgb535 min_pixel(0, 0, 0);
+ fixture::packed_pixel_rgb535 mid_pixel(15, 3, 15);
+ fixture::packed_pixel_rgb535 max_pixel(31, 7, 31);
+
+ for (auto const& fill_pixel : {min_pixel, max_pixel, mid_pixel} )
+ {
+ fixture::pixel_array<fixture::packed_pixel_rgb535> pixels;
+ std::uninitialized_fill(pixels.begin(), pixels.end(), fill_pixel);
+
+ for (fixture::packed_pixel_rgb535 const& p : pixels)
+ {
+ BOOST_TEST_EQ(p, fill_pixel);
+ BOOST_TEST_EQ((int)get_color(p, gil::red_t()), (int)get_color(fill_pixel, gil::red_t()));
+ BOOST_TEST_EQ((int)get_color(p, gil::green_t()), (int)get_color(fill_pixel, gil::green_t()));
+ BOOST_TEST_EQ((int)get_color(p, gil::blue_t()), (int)get_color(fill_pixel, gil::blue_t()));
+ }
+ }
+}
+
+void test_bit_aligned_pixel_bgr232()
+{
+ fixture::bit_aligned_pixel_bgr232 min_pixel(0, 0, 0);
+ fixture::bit_aligned_pixel_bgr232 mid_pixel(1, 4, 2);
+ fixture::bit_aligned_pixel_bgr232 max_pixel(3, 7, 3);
+
+ for (auto const& fill_pixel : {min_pixel, max_pixel, mid_pixel} )
+ {
+ fixture::pixel_array<fixture::bit_aligned_pixel_bgr232> pixels;
+ std::uninitialized_fill(pixels.begin(), pixels.end(), fill_pixel);
+
+ for (fixture::bit_aligned_pixel_bgr232 const& p : pixels)
+ {
+ BOOST_TEST_EQ(p, fill_pixel);
+ BOOST_TEST_EQ((int)get_color(p, gil::red_t()), (int)get_color(fill_pixel, gil::red_t()));
+ BOOST_TEST_EQ((int)get_color(p, gil::green_t()), (int)get_color(fill_pixel, gil::green_t()));
+ BOOST_TEST_EQ((int)get_color(p, gil::blue_t()), (int)get_color(fill_pixel, gil::blue_t()));
+ }
+ }
+}
+
+void test_bit_aligned_pixel_rgb567()
+{
+ fixture::bit_aligned_pixel_rgb567 min_pixel(0, 0, 0);
+ fixture::bit_aligned_pixel_rgb567 mid_pixel(15, 31, 63);
+ fixture::bit_aligned_pixel_rgb567 max_pixel(31, 63, 127);
+
+ for (auto const& fill_pixel : {min_pixel, max_pixel, mid_pixel} )
+ {
+ fixture::pixel_array<fixture::bit_aligned_pixel_rgb567> pixels;
+ std::uninitialized_fill(pixels.begin(), pixels.end(), fill_pixel);
+
+ for (fixture::bit_aligned_pixel_rgb567 const& p : pixels)
+ {
+ BOOST_TEST_EQ(p, fill_pixel);
+ BOOST_TEST_EQ((int)get_color(p, gil::red_t()), (int)get_color(fill_pixel, gil::red_t()));
+ BOOST_TEST_EQ((int)get_color(p, gil::green_t()), (int)get_color(fill_pixel, gil::green_t()));
+ BOOST_TEST_EQ((int)get_color(p, gil::blue_t()), (int)get_color(fill_pixel, gil::blue_t()));
+ }
+ }
+}
+
+int main()
+{
+ fill_with_pixel_integer_types::run();
+ fill_with_pixel_float_types::run();
+
+ test_fill_with_packed_pixel_gray3();
+ test_fill_with_packed_pixel_bgr121();
+ test_fill_with_packed_pixel_rgb535();
+
+ test_bit_aligned_pixel_bgr232();
+ test_bit_aligned_pixel_rgb567();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/channel/CMakeLists.txt b/src/boost/libs/gil/test/core/channel/CMakeLists.txt
new file mode 100644
index 000000000..365a8274f
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/CMakeLists.txt
@@ -0,0 +1,35 @@
+#
+# Copyright (c) 2018 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+foreach(_name
+ algorithm_channel_arithmetic
+ algorithm_channel_convert
+ algorithm_channel_invert
+ algorithm_channel_multiply
+ algorithm_channel_relation
+ channel_traits
+ concepts
+ is_channel_integral
+ packed_channel_value
+ scoped_channel_value
+ test_fixture)
+ set(_test t_core_channel_${_name})
+ set(_target test_core_channel_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+endforeach()
diff --git a/src/boost/libs/gil/test/core/channel/Jamfile b/src/boost/libs/gil/test/core/channel/Jamfile
new file mode 100644
index 000000000..9e6b65027
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/Jamfile
@@ -0,0 +1,23 @@
+# Boost.GIL (Generic Image Library) - tests
+#
+# Copyright (c) 2018-2020 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+compile is_channel_integral.cpp ;
+
+run concepts.cpp ;
+run channel_traits.cpp ;
+run test_fixture.cpp ;
+run packed_channel_value.cpp ;
+run scoped_channel_value.cpp ;
+
+run algorithm_channel_arithmetic.cpp ;
+run algorithm_channel_convert.cpp ;
+run algorithm_channel_invert.cpp ;
+run algorithm_channel_multiply.cpp ;
+run algorithm_channel_relation.cpp ;
diff --git a/src/boost/libs/gil/test/core/channel/TODO.md b/src/boost/libs/gil/test/core/channel/TODO.md
new file mode 100644
index 000000000..7a2604052
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/TODO.md
@@ -0,0 +1,10 @@
+# Channel TODO
+
+Issues and questions related to implementation, testing, etc. of channel:
+
+- Provide algorithm performance overloads for scoped channel and packed channels
+- Update concepts and documentation
+- What to do about pointer types?!
+- Performance!!
+- Is channel_convert the same as native?
+- Is operator++ on float32_t the same as native? How about if operator++ is defined in scoped_channel to do _value++?
diff --git a/src/boost/libs/gil/test/core/channel/algorithm_channel_arithmetic.cpp b/src/boost/libs/gil/test/core/channel/algorithm_channel_arithmetic.cpp
new file mode 100644
index 000000000..ef8ec658c
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/algorithm_channel_arithmetic.cpp
@@ -0,0 +1,170 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+// Copyright 2018-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/channel_algorithm.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <type_traits>
+#include <utility>
+
+#include "test_fixture.hpp"
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+template <typename ChannelFixtureBase>
+void test_channel_arithmetic_mutable(std::false_type) {}
+
+template <typename ChannelFixtureBase>
+void test_channel_arithmetic_mutable(std::true_type)
+{
+ using fixture_t = fixture::channel<ChannelFixtureBase>;
+ using channel_value_t = typename fixture_t::channel_value_t;
+ fixture_t f;
+ channel_value_t const v = f.min_v_;
+ channel_value_t const one = 1;
+
+ ++f.min_v_;
+ f.min_v_++;
+ --f.min_v_;
+ f.min_v_--;
+ BOOST_TEST_EQ(v, f.min_v_);
+
+ f.min_v_ += one;
+ f.min_v_ -= one;
+ BOOST_TEST_EQ(v, f.min_v_);
+
+ f.min_v_ *= one;
+ f.min_v_ /= one;
+ BOOST_TEST_EQ(v, f.min_v_);
+
+ f.min_v_ = one; // assignable to scalar
+ BOOST_TEST_EQ(f.min_v_, one);
+ f.min_v_ = v; // and to value type
+ BOOST_TEST_EQ(f.min_v_, v);
+
+ // test swap
+ channel_value_t v1 = f.min_v_;
+ channel_value_t v2 = f.max_v_;
+ std::swap(f.min_v_, f.max_v_);
+ BOOST_TEST_GT(f.min_v_, f.max_v_);
+ channel_value_t v3 = f.min_v_;
+ channel_value_t v4 = f.max_v_;
+ BOOST_TEST_EQ(v1, v4);
+ BOOST_TEST_EQ(v2, v3);
+}
+
+template <typename ChannelFixtureBase>
+void test_channel_arithmetic()
+{
+ using fixture_t = fixture::channel<ChannelFixtureBase>;
+ fixture_t f;
+ BOOST_TEST_EQ(f.min_v_ * 1, f.min_v_);
+ BOOST_TEST_EQ(f.min_v_ / 1, f.min_v_);
+ BOOST_TEST_EQ((f.min_v_ + 1) + 1, f.min_v_ + 2);
+ BOOST_TEST_EQ((f.max_v_ - 1) - 1, f.max_v_ - 2);
+
+ using is_mutable_t = std::integral_constant
+ <
+ bool,
+ gil::channel_traits<typename fixture_t::channel_t>::is_mutable
+ >;
+ test_channel_arithmetic_mutable<ChannelFixtureBase>(is_mutable_t{});
+}
+
+struct test_channel_value
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ using fixture_t = fixture::channel_value<channel_t>;
+ test_channel_arithmetic<fixture_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_value{});
+ }
+};
+
+struct test_channel_reference
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ using fixture_t = fixture::channel_reference<channel_t &>;
+ test_channel_arithmetic<fixture_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_reference{});
+ }
+};
+
+struct test_channel_reference_const
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ using fixture_t = fixture::channel_reference<channel_t const &>;
+ test_channel_arithmetic<fixture_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_reference_const{});
+ }
+};
+
+struct test_packed_channel_reference
+{
+ template <typename BitField>
+ void operator()(BitField const &)
+ {
+ using bitfield_t = BitField;
+ using channels565_t = fixture::packed_channels565<bitfield_t>;
+ test_channel_arithmetic<typename channels565_t::fixture_0_5_t>();
+ test_channel_arithmetic<typename channels565_t::fixture_5_6_t>();
+ test_channel_arithmetic<typename channels565_t::fixture_11_5_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_bitfield_types>(test_packed_channel_reference{});
+ }
+};
+
+struct test_packed_dynamic_channel_reference
+{
+
+ template <typename BitField>
+ void operator()(BitField const &)
+ {
+ using bitfield_t = BitField;
+ using channels565_t = fixture::packed_dynamic_channels565<bitfield_t>;
+ test_channel_arithmetic<typename channels565_t::fixture_5_t>();
+ test_channel_arithmetic<typename channels565_t::fixture_6_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_bitfield_types>(test_packed_dynamic_channel_reference{});
+ }
+};
+
+int main()
+{
+ test_channel_value::run();
+ test_channel_reference::run();
+ test_channel_reference_const::run();
+ test_packed_channel_reference::run();
+ test_packed_dynamic_channel_reference::run();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/channel/algorithm_channel_convert.cpp b/src/boost/libs/gil/test/core/channel/algorithm_channel_convert.cpp
new file mode 100644
index 000000000..e39555b65
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/algorithm_channel_convert.cpp
@@ -0,0 +1,261 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+// Copyright 2018-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/channel_algorithm.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+
+#include "test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+template <typename ChannelFixtureBase>
+struct test_convert_to
+{
+ using channel_t = typename fixture::channel<ChannelFixtureBase>::channel_t;
+ using channel_value_t = typename fixture::channel<ChannelFixtureBase>::channel_value_t;
+
+ template <typename Channel>
+ static void from(Channel src_min_v, Channel src_max_v)
+ {
+ channel_value_t min_v = gil::channel_convert<channel_t>(src_min_v);
+ channel_value_t max_v = gil::channel_convert<channel_t>(src_max_v);
+ fixture::channel_minmax_value<channel_value_t> expect;
+ BOOST_TEST_EQ(min_v, expect.min_v_);
+ BOOST_TEST_EQ(max_v, expect.max_v_);
+ }
+};
+
+//--- Test gil::channel_convert from integral channels to all byte channels -------------
+template <typename SourceChannel, typename TargetChannel>
+void test_channel_value_convert_from_integral()
+{
+ fixture::channel_minmax_value<SourceChannel> f;
+
+ using channel_t = TargetChannel;
+ // byte channel
+ test_convert_to<fixture::channel_value<channel_t>>::from(f.min_v_, f.max_v_);
+ test_convert_to<fixture::channel_reference<channel_t&>>::from(f.min_v_, f.max_v_);
+ test_convert_to<fixture::channel_reference<channel_t const&>>::from(f.min_v_, f.max_v_);
+
+ // packed_channel_reference
+ {
+ using channels565_t = fixture::packed_channels565<std::uint16_t>;
+ test_convert_to<typename channels565_t::fixture_0_5_t>::from(f.min_v_, f.max_v_);
+ test_convert_to<typename channels565_t::fixture_5_6_t>::from(f.min_v_, f.max_v_);
+ test_convert_to<typename channels565_t::fixture_11_5_t>::from(f.min_v_, f.max_v_);
+ }
+ // packed_dynamic_channel_reference
+ {
+ using channels565_t = fixture::packed_dynamic_channels565<std::uint16_t>;
+ test_convert_to<typename channels565_t::fixture_5_t>::from(f.min_v_, f.max_v_);
+ test_convert_to<typename channels565_t::fixture_6_t>::from(f.min_v_, f.max_v_);
+ }
+}
+
+struct test_channel_value_convert_from_uint8_t
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ test_channel_value_convert_from_integral<std::uint8_t, channel_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_value_convert_from_uint8_t{});
+ }
+};
+
+struct test_channel_value_convert_from_int8_t
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ test_channel_value_convert_from_integral<std::int8_t, channel_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_value_convert_from_int8_t{});
+ }
+};
+
+struct test_channel_value_convert_from_uint16_t
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ test_channel_value_convert_from_integral<std::uint16_t, channel_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_value_convert_from_uint16_t{});
+ }
+};
+
+struct test_channel_value_convert_from_int16_t
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ test_channel_value_convert_from_integral<std::int16_t, channel_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_value_convert_from_int16_t{});
+ }
+};
+
+struct test_channel_value_convert_from_uint32_t
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ test_channel_value_convert_from_integral<std::uint32_t, channel_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_value_convert_from_uint32_t{});
+ }
+};
+
+struct test_channel_value_convert_from_int32_t
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ test_channel_value_convert_from_integral<std::int32_t, channel_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_value_convert_from_int32_t{});
+ }
+};
+
+// FIXME: gil::float32_t <-> gil::float64_t seems not supported
+
+//--- Test gil::channel_convert from gil::float32_t to all integer channels -------------
+struct test_channel_value_convert_from_float32_t
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ fixture::channel_minmax_value<gil::float32_t> f;
+ test_convert_to<fixture::channel_value<channel_t>>::from(f.min_v_, f.max_v_);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_channel_value_convert_from_float32_t{});
+ }
+};
+
+struct test_channel_reference_convert_from_float32_t
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ fixture::channel_minmax_value<gil::float32_t> f;
+ test_convert_to<fixture::channel_reference<channel_t&>>::from(f.min_v_, f.max_v_);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_channel_reference_convert_from_float32_t{});
+ }
+};
+
+struct test_channel_reference_const_from_float32_t
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ fixture::channel_minmax_value<gil::float32_t> f;
+ test_convert_to<fixture::channel_reference<channel_t const &>>::from(f.min_v_, f.max_v_);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_channel_reference_const_from_float32_t{});
+ }
+};
+
+//--- Test gil::channel_convert from gil::float64_t to all integer channels -------------
+
+struct test_channel_value_convert_from_float64_t
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ fixture::channel_minmax_value<gil::float64_t> f;
+ test_convert_to<fixture::channel_value<channel_t>>::from(f.min_v_, f.max_v_);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_channel_value_convert_from_float64_t{});
+ }
+};
+
+struct test_channel_reference_convert_from_float64_t
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ fixture::channel_minmax_value<gil::float64_t> f;
+ test_convert_to<fixture::channel_reference<channel_t &>>::from(f.min_v_, f.max_v_);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_channel_reference_convert_from_float64_t{});
+ }
+};
+
+struct test_channel_reference_const_convert_from_float64_t
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ fixture::channel_minmax_value<gil::float64_t> f;
+ test_convert_to<fixture::channel_reference<channel_t const &>>::from(f.min_v_, f.max_v_);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_channel_reference_const_convert_from_float64_t{});
+ }
+};
+
+int main()
+{
+ test_channel_value_convert_from_uint8_t::run();
+ test_channel_value_convert_from_int8_t::run();
+ test_channel_value_convert_from_uint16_t::run();
+ test_channel_value_convert_from_int16_t::run();
+ test_channel_value_convert_from_uint32_t::run();
+ test_channel_value_convert_from_int32_t::run();
+
+ test_channel_value_convert_from_float32_t::run();
+ test_channel_reference_convert_from_float32_t::run();
+ test_channel_reference_const_from_float32_t::run();
+
+ test_channel_value_convert_from_float64_t::run();
+ test_channel_reference_convert_from_float64_t::run();
+ test_channel_reference_const_convert_from_float64_t::run();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/channel/algorithm_channel_invert.cpp b/src/boost/libs/gil/test/core/channel/algorithm_channel_invert.cpp
new file mode 100644
index 000000000..3f8dd5837
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/algorithm_channel_invert.cpp
@@ -0,0 +1,118 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+// Copyright 2018-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/channel_algorithm.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+
+#include "test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+template <typename ChannelFixtureBase>
+void test_channel_invert()
+{
+ fixture::channel<ChannelFixtureBase> f;
+ BOOST_TEST_EQ(gil::channel_invert(f.min_v_), f.max_v_);
+ BOOST_TEST_EQ(gil::channel_invert(f.max_v_), f.min_v_);
+}
+
+struct test_channel_value
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ using fixture_t = fixture::channel_value<channel_t>;
+ test_channel_invert<fixture_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_value{});
+ }
+};
+
+struct test_channel_reference
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ using fixture_t = fixture::channel_reference<channel_t&>;
+ test_channel_invert<fixture_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_reference{});
+ }
+};
+
+struct test_channel_reference_const
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ using fixture_t = fixture::channel_reference<channel_t const&>;
+ test_channel_invert<fixture_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_reference_const{});
+ }
+};
+
+struct test_packed_channel_reference
+{
+ template <typename BitField>
+ void operator()(BitField const &)
+ {
+ using bitfield_t = BitField;
+ using channels565_t = fixture::packed_channels565<bitfield_t>;
+ test_channel_invert<typename channels565_t::fixture_0_5_t>();
+ test_channel_invert<typename channels565_t::fixture_5_6_t>();
+ test_channel_invert<typename channels565_t::fixture_11_5_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_bitfield_types>(test_packed_channel_reference{});
+ }
+};
+
+struct test_packed_dynamic_channel_reference
+{
+ template <typename BitField>
+ void operator()(BitField const &)
+ {
+ using bitfield_t = BitField;
+ using channels565_t = fixture::packed_dynamic_channels565<bitfield_t>;
+ test_channel_invert<typename channels565_t::fixture_5_t>();
+ test_channel_invert<typename channels565_t::fixture_6_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_bitfield_types>(test_packed_dynamic_channel_reference{});
+ }
+};
+
+int main()
+{
+ test_channel_value::run();
+ test_channel_reference::run();
+ test_channel_reference_const::run();
+ test_packed_channel_reference::run();
+ test_packed_dynamic_channel_reference::run();
+
+ // TODO: packed_channel_reference_const ?
+ // TODO: packed_dynamic_channel_reference_const ?
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/channel/algorithm_channel_multiply.cpp b/src/boost/libs/gil/test/core/channel/algorithm_channel_multiply.cpp
new file mode 100644
index 000000000..bc7f017c6
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/algorithm_channel_multiply.cpp
@@ -0,0 +1,119 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+// Copyright 2018-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/channel_algorithm.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+
+#include "test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+template <typename ChannelFixtureBase>
+void test_channel_multiply()
+{
+ fixture::channel<ChannelFixtureBase> f;
+ BOOST_TEST_EQ(gil::channel_multiply(f.min_v_, f.min_v_), f.min_v_);
+ BOOST_TEST_EQ(gil::channel_multiply(f.max_v_, f.max_v_), f.max_v_);
+ BOOST_TEST_EQ(gil::channel_multiply(f.max_v_, f.min_v_), f.min_v_);
+}
+
+struct test_channel_value
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ using fixture_t = fixture::channel_value<channel_t>;
+ test_channel_multiply<fixture_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_value{});
+ }
+};
+
+struct test_channel_reference
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ using fixture_t = fixture::channel_reference<channel_t&>;
+ test_channel_multiply<fixture_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_reference{});
+ }
+};
+
+struct test_channel_reference_const
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ using fixture_t = fixture::channel_reference<channel_t const&>;
+ test_channel_multiply<fixture_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_reference_const{});
+ }
+};
+
+struct test_packed_channel_reference
+{
+ template <typename BitField>
+ void operator()(BitField const &)
+ {
+ using bitfield_t = BitField;
+ using channels565_t = fixture::packed_channels565<bitfield_t>;
+ test_channel_multiply<typename channels565_t::fixture_0_5_t>();
+ test_channel_multiply<typename channels565_t::fixture_5_6_t>();
+ test_channel_multiply<typename channels565_t::fixture_11_5_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_bitfield_types>(test_packed_channel_reference{});
+ }
+};
+
+struct test_packed_dynamic_channel_reference
+{
+ template <typename BitField>
+ void operator()(BitField const &)
+ {
+ using bitfield_t = BitField;
+ using channels565_t = fixture::packed_dynamic_channels565<bitfield_t>;
+ test_channel_multiply<typename channels565_t::fixture_5_t>();
+ test_channel_multiply<typename channels565_t::fixture_6_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_bitfield_types>(test_packed_dynamic_channel_reference{});
+ }
+};
+
+int main()
+{
+ test_channel_value::run();
+ test_channel_reference::run();
+ test_channel_reference_const::run();
+ test_packed_channel_reference::run();
+ test_packed_dynamic_channel_reference::run();
+
+ // TODO: packed_channel_reference_const ?
+ // TODO: packed_dynamic_channel_reference_const ?
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/channel/algorithm_channel_relation.cpp b/src/boost/libs/gil/test/core/channel/algorithm_channel_relation.cpp
new file mode 100644
index 000000000..bad3a1d4b
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/algorithm_channel_relation.cpp
@@ -0,0 +1,127 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+// Copyright 2018-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/channel_algorithm.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+
+#include "test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+template <typename ChannelFixtureBase>
+void test_channel_relation()
+{
+ using fixture_t = fixture::channel<ChannelFixtureBase>;
+ using channel_value_t = typename fixture_t::channel_value_t;
+ channel_value_t const one = 1;
+
+ fixture_t f;
+ BOOST_TEST_LE(f.min_v_, f.max_v_);
+ BOOST_TEST_GE(f.max_v_, f.min_v_);
+ BOOST_TEST_LT(f.min_v_, f.max_v_);
+ BOOST_TEST_GT(f.max_v_, f.min_v_);
+ BOOST_TEST_NE(f.max_v_, f.min_v_);
+ BOOST_TEST_EQ(f.min_v_, f.min_v_);
+ BOOST_TEST_NE(f.min_v_, one); // comparable to integral
+}
+
+struct test_channel_value
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ using fixture_t = fixture::channel_value<channel_t>;
+ test_channel_relation<fixture_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_value{});
+ }
+};
+
+struct test_channel_reference
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ using fixture_t = fixture::channel_reference<channel_t&>;
+ test_channel_relation<fixture_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_reference{});
+ }
+};
+
+struct test_channel_reference_const
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ using fixture_t = fixture::channel_reference<channel_t const&>;
+ test_channel_relation<fixture_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_reference_const{});
+ }
+};
+
+struct test_packed_channel_reference
+{
+ template <typename BitField>
+ void operator()(BitField const &)
+ {
+ using bitfield_t = BitField;
+ using channels565_t = fixture::packed_channels565<bitfield_t>;
+ test_channel_relation<typename channels565_t::fixture_0_5_t>();
+ test_channel_relation<typename channels565_t::fixture_5_6_t>();
+ test_channel_relation<typename channels565_t::fixture_11_5_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_bitfield_types>(test_packed_channel_reference{});
+ }
+};
+
+struct test_packed_dynamic_channel_reference
+{
+ template <typename BitField>
+ void operator()(BitField const &)
+ {
+ using bitfield_t = BitField;
+ using channels565_t = fixture::packed_dynamic_channels565<bitfield_t>;
+ test_channel_relation<typename channels565_t::fixture_5_t>();
+ test_channel_relation<typename channels565_t::fixture_6_t>();
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_bitfield_types>(test_packed_dynamic_channel_reference{});
+ }
+};
+
+int main()
+{
+ test_channel_value::run();
+ test_channel_reference::run();
+ test_channel_reference_const::run();
+ test_packed_channel_reference::run();
+ test_packed_dynamic_channel_reference::run();
+
+ // TODO: packed_channel_reference_const ?
+ // TODO: packed_dynamic_channel_reference_const ?
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/channel/channel_traits.cpp b/src/boost/libs/gil/test/core/channel/channel_traits.cpp
new file mode 100644
index 000000000..626f87b2a
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/channel_traits.cpp
@@ -0,0 +1,65 @@
+//
+// Copyright 2018-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/channel.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+#include <limits>
+
+namespace gil = boost::gil;
+
+template <typename T>
+void test_channel_minmax()
+{
+ BOOST_TEST_EQ(gil::channel_traits<T>::min_value(), std::numeric_limits<T>::min());
+ BOOST_TEST_EQ(gil::channel_traits<T>::max_value(), std::numeric_limits<T>::max());
+}
+
+void test_channel_minmax_uint8_t()
+{
+ test_channel_minmax<std::uint8_t>();
+}
+
+void test_channel_minmax_int8_t()
+{
+ test_channel_minmax<std::int8_t>();
+}
+
+void test_channel_minmax_uint16_t()
+{
+ test_channel_minmax<std::uint16_t>();
+}
+
+void test_channel_minmax_int16_t()
+{
+ test_channel_minmax<std::int16_t>();
+}
+
+void test_channel_minmax_uint32_t()
+{
+ test_channel_minmax<std::uint32_t>();
+}
+
+void test_channel_minmax_int32_t()
+{
+ test_channel_minmax<std::int32_t>();
+}
+
+int main()
+{
+ test_channel_minmax_uint8_t();
+ test_channel_minmax_int8_t();
+ test_channel_minmax_uint16_t();
+ test_channel_minmax_int16_t();
+ test_channel_minmax_uint32_t();
+ test_channel_minmax_int32_t();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/channel/concepts.cpp b/src/boost/libs/gil/test/core/channel/concepts.cpp
new file mode 100644
index 000000000..80499b5a1
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/concepts.cpp
@@ -0,0 +1,100 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+// Copyright 2018-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/concepts.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+
+#include "test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+// A channel archetype - to test the minimum requirements of the concept
+struct channel_value_archetype;
+
+struct channel_archetype
+{
+ // equality comparable
+ friend bool operator==(channel_archetype const&, channel_archetype const&)
+ { return true; }
+ // inequality comparable
+ friend bool operator!=(channel_archetype const&, channel_archetype const&)
+ { return false; }
+ // less-than comparable
+ friend bool operator<(channel_archetype const&, channel_archetype const&)
+ { return false; }
+ // convertible to a scalar
+ operator std::uint8_t() const { return 0; }
+
+ channel_archetype& operator++() { return *this; }
+ channel_archetype& operator--() { return *this; }
+ channel_archetype operator++(int) { return *this; }
+ channel_archetype operator--(int) { return *this; }
+
+ template <typename Scalar>
+ channel_archetype operator+=(Scalar) { return *this; }
+ template <typename Scalar>
+ channel_archetype operator-=(Scalar) { return *this; }
+ template <typename Scalar>
+ channel_archetype operator*=(Scalar) { return *this; }
+ template <typename Scalar>
+ channel_archetype operator/=(Scalar) { return *this; }
+
+ using value_type = channel_value_archetype;
+ using reference = channel_archetype;
+ using const_reference = channel_archetype const;
+ using pointer = channel_value_archetype*;
+ using const_pointer = channel_value_archetype const*;
+ static constexpr bool is_mutable = true;
+
+ static value_type min_value();
+ static value_type max_value();
+};
+
+struct channel_value_archetype : public channel_archetype
+{
+ // default constructible
+ channel_value_archetype() {}
+ // copy constructible
+ channel_value_archetype(channel_value_archetype const&) = default;
+ // assignable
+ channel_value_archetype& operator=(channel_value_archetype const&)
+ {return *this;}
+ channel_value_archetype(std::uint8_t) {}
+};
+
+channel_value_archetype channel_archetype::min_value()
+{
+ return channel_value_archetype();
+}
+
+channel_value_archetype channel_archetype::max_value()
+{
+ return channel_value_archetype();
+}
+
+void test_channel_minimal_requirements()
+{
+ // Do only compile-time tests for the archetype
+ // (because asserts like val1<val2 fail)
+ boost::function_requires<gil::MutableChannelConcept<channel_archetype>>();
+
+ fixture::channel_value<channel_value_archetype>();
+ fixture::channel_reference<channel_archetype>();
+ fixture::channel_reference<channel_archetype const&>();
+}
+
+int main()
+{
+ test_channel_minimal_requirements();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/channel/is_channel_integral.cpp b/src/boost/libs/gil/test/core/channel/is_channel_integral.cpp
new file mode 100644
index 000000000..0b7cb64f7
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/is_channel_integral.cpp
@@ -0,0 +1,74 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/channel.hpp>
+#include <boost/gil/typedefs.hpp>
+#include <boost/gil/detail/is_channel_integral.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+int main()
+{
+ static_assert(gil::detail::is_channel_integral
+ <
+ gil::packed_channel_value<1>
+ >::value,
+ "1-bit packed_channel_value should be recognized as integral");
+
+ static_assert(gil::detail::is_channel_integral
+ <
+ gil::packed_channel_value<8>
+ >::value,
+ "8-bit packed_channel_value should be recognized as integral");
+
+ static_assert(gil::detail::is_channel_integral
+ <
+ gil::packed_channel_reference
+ <
+ std::uint8_t, 0, 3, true
+ >
+ >::value,
+ "3-bit packed_channel_reference should be recognized as integral");
+
+ static_assert(gil::detail::is_channel_integral
+ <
+ gil::packed_dynamic_channel_reference
+ <
+ std::uint8_t, 2, true
+ >
+ >::value,
+ "2-bit packed_dynamic_channel_reference should be recognized as integral");
+
+ static_assert(gil::detail::is_channel_integral
+ <
+ gil::packed_dynamic_channel_reference
+ <
+ std::uint16_t, 15, true
+ >
+ >::value,
+ "15-bit packed_dynamic_channel_reference should be recognized as integral");
+
+
+ struct int_minus_value { static std::int8_t apply() { return -64; } };
+ struct int_plus_value { static std::int8_t apply() { return 64; } };
+ static_assert(gil::detail::is_channel_integral
+ <
+ gil::scoped_channel_value
+ <
+ std::uint8_t, int_minus_value, int_plus_value
+ >
+ >::value,
+ "integer-based scoped_channel_value should be recognized as integral");
+
+ static_assert(!gil::detail::is_channel_integral<gil::float32_t>::value,
+ "float-based packed_channel_value should not be recognized as integral");
+
+ static_assert(!gil::detail::is_channel_integral<gil::float64_t>::value,
+ "float-based packed_channel_value should not be recognized as integral");
+}
diff --git a/src/boost/libs/gil/test/core/channel/packed_channel_value.cpp b/src/boost/libs/gil/test/core/channel/packed_channel_value.cpp
new file mode 100644
index 000000000..5504bdafb
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/packed_channel_value.cpp
@@ -0,0 +1,137 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/channel.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+#include <limits>
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+template <typename T>
+void test_packed_channel_value_members()
+{
+ static_assert(std::is_same<typename T::value_type, T>::value,
+ "value_type should be the same as packed_channel_value specialization");
+
+ static_assert(std::is_lvalue_reference<typename T::reference>::value,
+ "reference should be lvalue reference type");
+
+ static_assert(std::is_lvalue_reference<typename T::reference>::value,
+ "const_reference should be lvalue reference type");
+
+ static_assert(std::is_pointer<typename T::pointer>::value,
+ "pointer should be pointer type");
+
+ static_assert(std::is_pointer<typename T::const_pointer>::value,
+ "const_pointer should be pointer type");
+
+ static_assert(T::is_mutable, "packed_channel_value should be mutable by default");
+
+ static_assert(std::is_constructible<T, typename T::integer_t>::value,
+ "packed_channel_value should be constructible from underlying integer_t");
+
+ static_assert(std::is_convertible<T, typename T::integer_t>::value,
+ "packed_channel_value should be convertible to underlying integer_t");
+}
+
+void test_packed_channel_value_with_num_bits_1()
+{
+ using bits1 = gil::packed_channel_value<1>;
+
+ test_packed_channel_value_members<bits1>();
+
+ static_assert(std::is_same<bits1::integer_t, std::uint8_t>::value,
+ "smallest integral type to store 1-bit value should be 8-bit unsigned");
+
+ BOOST_TEST_EQ(bits1::num_bits(), 1u);
+ BOOST_TEST_EQ(bits1::min_value(), 0u);
+ BOOST_TEST_EQ(bits1::max_value(), 1u);
+ BOOST_TEST_EQ(gil::channel_traits<bits1>::min_value(), 0u);
+ BOOST_TEST_EQ(gil::channel_traits<bits1>::max_value(), 1u);
+}
+
+void test_packed_channel_value_with_num_bits_8()
+{
+ using bits8 = gil::packed_channel_value<8>;
+
+ test_packed_channel_value_members<bits8>();
+
+ static_assert(std::is_same<bits8::integer_t, std::uint8_t>::value,
+ "smallest integral type to store 8-bit value should be 8-bit unsigned");
+
+ BOOST_TEST_EQ(bits8::num_bits(), 8u);
+ BOOST_TEST_EQ(bits8::min_value(), 0u);
+ BOOST_TEST_EQ(bits8::max_value(), 255u);
+ BOOST_TEST_EQ(gil::channel_traits<bits8>::min_value(), 0u);
+ BOOST_TEST_EQ(gil::channel_traits<bits8>::max_value(), 255u);
+}
+
+void test_packed_channel_value_with_num_bits15()
+{
+ using bits15 = gil::packed_channel_value<15>;
+
+ test_packed_channel_value_members<bits15>();
+
+ static_assert(std::is_same<bits15::integer_t, std::uint16_t>::value,
+ "smallest integral type to store 15-bit value should be 8-bit unsigned");
+
+ BOOST_TEST_EQ(bits15::num_bits(), 15u);
+ BOOST_TEST_EQ(bits15::min_value(), 0u);
+ BOOST_TEST_EQ(bits15::max_value(), 32767u);
+ BOOST_TEST_EQ(gil::channel_traits<bits15>::min_value(), 0u);
+ BOOST_TEST_EQ(gil::channel_traits<bits15>::max_value(), 32767u);
+}
+
+using fixture = gil::packed_channel_value<8>;
+
+void test_packed_channel_value_default_constructor()
+{
+ fixture f;
+ std::uint8_t v = f;
+ BOOST_TEST_EQ(v, std::uint8_t{0});
+}
+
+void test_packed_channel_value_user_defined_constructors()
+{
+ fixture f{1};
+ std::uint8_t v = f;
+ BOOST_TEST_EQ(v, std::uint8_t{1});
+}
+
+void test_packed_channel_value_copy_constructors()
+{
+ fixture f1{128};
+ fixture f2{f1};
+
+ BOOST_TEST_EQ(std::uint8_t{f1}, std::uint8_t{128});
+ BOOST_TEST_EQ(std::uint8_t{f1}, std::uint8_t{f2});
+}
+
+void test_packed_channel_value_assignment()
+{
+ fixture f;
+ f = 64;
+ BOOST_TEST_EQ(f, std::uint8_t{64});
+}
+
+int main()
+{
+ test_packed_channel_value_with_num_bits_1();
+ test_packed_channel_value_with_num_bits_8();
+ test_packed_channel_value_with_num_bits15();
+ test_packed_channel_value_default_constructor();
+ test_packed_channel_value_user_defined_constructors();
+ test_packed_channel_value_copy_constructors();
+ test_packed_channel_value_assignment();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/channel/scoped_channel_value.cpp b/src/boost/libs/gil/test/core/channel/scoped_channel_value.cpp
new file mode 100644
index 000000000..6b7c57dd9
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/scoped_channel_value.cpp
@@ -0,0 +1,110 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+// Copyright 2018-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distribtted under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/channel.hpp>
+#include <boost/gil/channel_algorithm.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cmath>
+#include <cstdint>
+#include <limits>
+
+namespace gil = boost::gil;
+
+// FIXME: Remove when https://github.com/boostorg/core/issues/38 happens
+#define BOOST_GIL_TEST_IS_CLOSE(a, b, epsilon) BOOST_TEST_LT(std::fabs((a) - (b)), (epsilon))
+
+struct int_minus_value { static std::int8_t apply() { return -64; } };
+struct int_plus_value { static std::int8_t apply() { return 64; } };
+using fixture = gil::scoped_channel_value
+ <
+ std::uint8_t, int_minus_value, int_plus_value
+ >;
+
+void test_scoped_channel_value_default_constructor()
+{
+ fixture f;
+ std::uint8_t v = f;
+ BOOST_TEST_EQ(v, std::uint8_t{0});
+}
+
+void test_scoped_channel_value_user_defined_constructors()
+{
+ fixture f{1};
+ std::uint8_t v = f;
+ BOOST_TEST_EQ(v, std::uint8_t{1});
+}
+
+void test_scoped_channel_value_copy_constructors()
+{
+ fixture f1{128};
+ fixture f2{f1};
+
+ BOOST_TEST_EQ(std::uint8_t{f1}, std::uint8_t{128});
+ BOOST_TEST_EQ(std::uint8_t{f1}, std::uint8_t{f2});
+}
+
+void test_scoped_channel_value_assignment()
+{
+ fixture f;
+ f = 64;
+ std::uint8_t v = f;
+ BOOST_TEST_EQ(v, std::uint8_t{64});
+}
+
+void test_scoped_channel_value_float32_t()
+{
+ auto const epsilon = std::numeric_limits<float>::epsilon();
+ // min
+ BOOST_GIL_TEST_IS_CLOSE(gil::float_point_zero<float>::apply(), 0.0, epsilon);
+ BOOST_TEST_EQ(gil::channel_traits<gil::float32_t>::min_value(), 0.0);
+ // max
+ BOOST_GIL_TEST_IS_CLOSE(gil::float_point_one<float>::apply(), 1.0, epsilon);
+ BOOST_TEST_EQ(gil::channel_traits<gil::float32_t>::max_value(), 1.0);
+}
+
+void test_scoped_channel_value_float64_t()
+{
+ auto const epsilon = std::numeric_limits<double>::epsilon();
+ // min
+ BOOST_GIL_TEST_IS_CLOSE(gil::float_point_zero<double>::apply(), 0.0, epsilon);
+ BOOST_GIL_TEST_IS_CLOSE(gil::channel_traits<gil::float64_t>::min_value(), 0.0, epsilon);
+ // max
+ BOOST_GIL_TEST_IS_CLOSE(gil::float_point_one<double>::apply(), 1.0, epsilon);
+ BOOST_GIL_TEST_IS_CLOSE(gil::channel_traits<gil::float64_t>::max_value(), 1.0, epsilon);
+}
+
+void test_scoped_channel_value_halfs()
+{
+ // Create a double channel with range [-0.5 .. 0.5]
+ struct minus_half { static double apply() { return -0.5; } };
+ struct plus_half { static double apply() { return 0.5; } };
+ using halfs = gil::scoped_channel_value<double, minus_half, plus_half>;
+
+ auto const epsilon = std::numeric_limits<double>::epsilon();
+ BOOST_GIL_TEST_IS_CLOSE(gil::channel_traits<halfs>::min_value(), minus_half::apply(), epsilon);
+ BOOST_GIL_TEST_IS_CLOSE(gil::channel_traits<halfs>::max_value(), plus_half::apply(), epsilon);
+ // scoped channel maximum should map to the maximum
+ BOOST_GIL_TEST_IS_CLOSE(gil::channel_convert<std::uint16_t>(
+ gil::channel_traits<halfs>::max_value()), 65535, epsilon);
+}
+
+int main()
+{
+ test_scoped_channel_value_default_constructor();
+ test_scoped_channel_value_user_defined_constructors();
+ test_scoped_channel_value_copy_constructors();
+ test_scoped_channel_value_assignment();
+ test_scoped_channel_value_float32_t();
+ test_scoped_channel_value_float64_t();
+ test_scoped_channel_value_halfs();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/channel/test_fixture.cpp b/src/boost/libs/gil/test/core/channel/test_fixture.cpp
new file mode 100644
index 000000000..b8643a1e4
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/test_fixture.cpp
@@ -0,0 +1,134 @@
+//
+// Copyright 2018-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include "test_fixture.hpp"
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <limits>
+
+namespace fixture = boost::gil::test::fixture;
+
+struct test_channel_minmax_value_float
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ fixture::channel_minmax_value<channel_t> fix;
+ fixture::channel_minmax_value<channel_t> exp;
+ BOOST_TEST_EQ(fix.min_v_, exp.min_v_);
+ BOOST_TEST_EQ(fix.max_v_, exp.max_v_);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_bitfield_types>(test_channel_minmax_value_float{});
+ }
+};
+
+struct test_channel_value
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ fixture::channel_value<channel_t> fix;
+ fixture::channel_minmax_value<channel_t> exp;
+ BOOST_TEST_EQ(fix.min_v_, exp.min_v_);
+ BOOST_TEST_EQ(fix.max_v_, exp.max_v_);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_value{});
+ }
+};
+
+struct test_channel_reference
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ fixture::channel_reference<channel_t &> fix;
+ fixture::channel_minmax_value<channel_t> exp;
+ BOOST_TEST_EQ(fix.min_v_, exp.min_v_);
+ BOOST_TEST_EQ(fix.max_v_, exp.max_v_);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_reference{});
+ }
+};
+
+struct test_channel_reference_const
+{
+ template <typename Channel>
+ void operator()(Channel const &)
+ {
+ using channel_t = Channel;
+ fixture::channel_reference<channel_t const &> fix;
+ fixture::channel_minmax_value<channel_t> exp;
+ BOOST_TEST_EQ(fix.min_v_, exp.min_v_);
+ BOOST_TEST_EQ(fix.max_v_, exp.max_v_);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_byte_types>(test_channel_reference_const{});
+ }
+};
+
+struct test_packed_channels565
+{
+ template <typename BitField>
+ void operator()(BitField const &)
+ {
+ using bitfield_t = BitField;
+ static_assert(std::is_integral<bitfield_t>::value, "bitfield is not integral type");
+
+ // Regardless of BitField buffer bit-size, the fixture is initialized
+ // with max value that fits into 5+6+5 bit integer
+ fixture::packed_channels565<bitfield_t> fix;
+ fixture::channel_minmax_value<std::uint16_t> exp;
+ BOOST_TEST_EQ(fix.data_, exp.max_v_);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_bitfield_types>(test_packed_channels565{});
+ }
+};
+
+struct test_packed_dynamic_channels565
+{
+ template <typename BitField>
+ void operator()(BitField const &)
+ {
+ using bitfield_t = BitField;
+ static_assert(std::is_integral<bitfield_t>::value, "bitfield is not integral type");
+
+ // Regardless of BitField buffer bit-size, the fixture is initialized
+ // with max value that fits into 5+6+5 bit integer
+ fixture::packed_dynamic_channels565<bitfield_t> fix;
+ fixture::channel_minmax_value<std::uint16_t> exp;
+ BOOST_TEST_EQ(fix.data_, exp.max_v_);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_bitfield_types>(test_packed_dynamic_channels565{});
+ }
+};
+
+int main()
+{
+ test_channel_minmax_value_float::run();
+ test_channel_value::run();
+ test_channel_reference::run();
+ test_channel_reference_const::run();
+ test_packed_channels565::run();
+ test_packed_dynamic_channels565::run();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/channel/test_fixture.hpp b/src/boost/libs/gil/test/core/channel/test_fixture.hpp
new file mode 100644
index 000000000..863fb1bd4
--- /dev/null
+++ b/src/boost/libs/gil/test/core/channel/test_fixture.hpp
@@ -0,0 +1,252 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+// Copyright 2018 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifndef BOOST_GIL_TEST_CORE_CHANNEL_TEST_FIXTURE_HPP
+#define BOOST_GIL_TEST_CORE_CHANNEL_TEST_FIXTURE_HPP
+
+#include <boost/gil/channel.hpp>
+#include <boost/gil/concepts.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <cstdint>
+#include <tuple>
+#include <type_traits>
+
+#include "test_utility_output_stream.hpp"
+
+namespace boost { namespace gil { namespace test { namespace fixture {
+
+using channel_byte_types = std::tuple
+ <
+ std::uint8_t,
+ std::int8_t,
+ std::uint16_t,
+ std::int16_t,
+ std::uint32_t,
+ std::int32_t,
+ gil::float32_t,
+ gil::float64_t
+ >;
+
+using channel_integer_types = std::tuple
+ <
+ std::uint8_t,
+ std::int8_t,
+ std::uint16_t,
+ std::int16_t,
+ std::uint32_t,
+ std::int32_t
+ >;
+
+using channel_integer_signed_types = std::tuple
+ <
+ std::int8_t,
+ std::int16_t,
+ std::int32_t
+ >;
+
+using channel_integer_unsigned_types = std::tuple
+ <
+ std::uint8_t,
+ std::uint16_t,
+ std::uint32_t
+ >;
+
+// FIXME: If float types are convertible between each other,
+// currently they are not, then move to channel_byte_types and
+// remove channel_integer_types as redundant.
+using channel_float_types = std::tuple
+ <
+ gil::float32_t,
+ gil::float64_t
+ >;
+
+using channel_bitfield_types = std::tuple
+ <
+ std::uint16_t,
+ std::uint32_t,
+ std::uint64_t
+ // TODO: Shall we test signed types for unexpected conversions, etc.?
+ >;
+
+
+template <typename ChannelValue>
+struct channel_minmax_value
+{
+ //static_assert(std::)
+ ChannelValue min_v_;
+ ChannelValue max_v_;
+ channel_minmax_value()
+ : min_v_(gil::channel_traits<ChannelValue>::min_value())
+ , max_v_(gil::channel_traits<ChannelValue>::max_value())
+ {}
+};
+
+template <typename ChannelFixtureBase>
+struct channel : public ChannelFixtureBase
+{
+ using channel_t = typename ChannelFixtureBase::channel_t;
+ using channel_value_t = typename gil::channel_traits<channel_t>::value_type;
+
+ channel()
+ {
+ BOOST_TEST_EQ(this->min_v_, gil::channel_traits<channel_t>::min_value());
+ BOOST_TEST_EQ(this->max_v_, gil::channel_traits<channel_t>::max_value());
+ }
+};
+
+// The channel fixtures are defined for different types of channels
+// (ie. channel values, references and subbyte references)
+// ensure there are two members, min_v_ and max_v_ initialized
+// with the minimum and maximum channel value.
+// The different channel types have different ways to initialize them,
+// thus require different fixtures provided.
+
+// For basic channel types values can be initialized directly.
+template <typename ChannelValue>
+struct channel_value
+{
+ using channel_t = ChannelValue;
+ channel_t min_v_;
+ channel_t max_v_;
+
+ channel_value()
+ : min_v_(gil::channel_traits<ChannelValue>::min_value())
+ , max_v_(gil::channel_traits<ChannelValue>::max_value())
+ {
+ boost::function_requires<gil::ChannelValueConcept<ChannelValue>>();
+ }
+};
+
+// For channel references we need to have separate channel values.
+template <typename ChannelRef>
+struct channel_reference
+ : public channel_value<typename gil::channel_traits<ChannelRef>::value_type>
+{
+ using parent_t = channel_value<typename gil::channel_traits<ChannelRef>::value_type>;
+ using channel_t = ChannelRef;
+ channel_t min_v_;
+ channel_t max_v_;
+
+ channel_reference()
+ : parent_t()
+ , min_v_(parent_t::min_v_)
+ , max_v_(parent_t::max_v_)
+ {
+ boost::function_requires<ChannelConcept<ChannelRef>>();
+ }
+};
+
+// For sub-byte channel references we need to store the bit buffers somewhere
+template <typename ChannelSubbyteRef, typename ChannelMutableRef = ChannelSubbyteRef>
+struct packed_channel_reference
+{
+ using channel_t = ChannelSubbyteRef;
+ using integer_t = typename channel_t::integer_t;
+ channel_t min_v_;
+ channel_t max_v_;
+ integer_t min_bitbuf_;
+ integer_t max_bitbuf_;
+
+ packed_channel_reference() : min_v_(&min_bitbuf_), max_v_(&max_bitbuf_)
+ {
+ boost::function_requires<ChannelConcept<ChannelSubbyteRef>>();
+
+ ChannelMutableRef b1(&min_bitbuf_);
+ b1 = gil::channel_traits<channel_t>::min_value();
+ ChannelMutableRef b2(&max_bitbuf_);
+ b2 = gil::channel_traits<channel_t>::max_value();
+ }
+};
+
+// For sub-byte channel references we need to store the bit buffers somewhere
+template <typename ChannelSubbyteRef, typename ChannelMutableRef = ChannelSubbyteRef>
+struct packed_dynamic_channel_reference
+{
+ using channel_t = ChannelSubbyteRef;
+ using integer_t = typename channel_t::integer_t;
+ channel_t min_v_;
+ channel_t max_v_;
+ integer_t min_bitbuf_;
+ integer_t max_bitbuf_;
+
+ packed_dynamic_channel_reference(int first_bit1 = 1, int first_bit2 = 2)
+ : min_v_(&min_bitbuf_, first_bit1)
+ , max_v_(&max_bitbuf_, first_bit2)
+ {
+ boost::function_requires<ChannelConcept<ChannelSubbyteRef>>();
+
+ ChannelMutableRef b1(&min_bitbuf_, 1);
+ b1 = gil::channel_traits<channel_t>::min_value();
+ ChannelMutableRef b2(&max_bitbuf_, 2);
+ b2 = gil::channel_traits<channel_t>::max_value();
+ }
+};
+
+// Concrete fixture for 16-bit pack of 5,6,5-bit channels
+template <typename BitField>
+struct packed_channels565
+{
+ static_assert(sizeof(BitField) >= sizeof(std::uint16_t), "16-bit or more required");
+ using channel_0_5_t = gil::packed_channel_reference<BitField, 0, 5,true>;
+ using channel_5_6_t = gil::packed_channel_reference<BitField, 5, 6,true>;
+ using channel_11_5_t = gil::packed_channel_reference<BitField, 11, 5,true>;
+
+ using fixture_0_5_t = fixture::packed_channel_reference<channel_0_5_t>;
+ using fixture_5_6_t = fixture::packed_channel_reference<channel_5_6_t>;
+ using fixture_11_5_t = fixture::packed_channel_reference<channel_11_5_t>;
+
+ std::uint16_t data_ = 0;
+ channel_0_5_t channel1_;
+ channel_5_6_t channel2_;
+ channel_11_5_t channel3_;
+
+ packed_channels565() : channel1_(&data_), channel2_(&data_), channel3_(&data_)
+ {
+ channel1_ = gil::channel_traits<channel_0_5_t>::max_value();
+ channel2_ = gil::channel_traits<channel_5_6_t>::max_value();
+ channel3_ = gil::channel_traits<channel_11_5_t>::max_value();
+#ifdef BOOST_TEST_EQ
+ BOOST_TEST_EQ(data_, 65535);
+#endif
+ }
+};
+
+// Concrete fixture for dynamically-referenced 16-bit pack of 5,6,5-bit channels
+template <typename BitField>
+struct packed_dynamic_channels565
+{
+ static_assert(sizeof(BitField) >= sizeof(std::uint16_t), "16-bit or more required");
+ using channel_5_t = gil::packed_dynamic_channel_reference<BitField,5,true>;
+ using channel_6_t = gil::packed_dynamic_channel_reference<BitField,6,true>;
+
+ using fixture_5_t = fixture::packed_dynamic_channel_reference<channel_5_t>;
+ using fixture_6_t = fixture::packed_dynamic_channel_reference<channel_6_t>;
+
+ std::uint16_t data_ = 0;
+ channel_5_t channel1_;
+ channel_6_t channel2_;
+ channel_5_t channel3_;
+
+ packed_dynamic_channels565()
+ : channel1_(&data_, 0)
+ , channel2_(&data_, 5)
+ , channel3_(&data_, 11)
+ {
+ channel1_ = gil::channel_traits<channel_5_t>::max_value();
+ channel2_ = gil::channel_traits<channel_6_t>::max_value();
+ channel3_ = gil::channel_traits<channel_5_t>::max_value();
+#ifdef BOOST_TEST_EQ
+ BOOST_TEST_EQ(data_, 65535);
+#endif
+ }
+};
+
+}}}} // namespace boost::gil::test::fixture
+
+#endif
diff --git a/src/boost/libs/gil/test/core/color/CMakeLists.txt b/src/boost/libs/gil/test/core/color/CMakeLists.txt
new file mode 100644
index 000000000..664bd74f0
--- /dev/null
+++ b/src/boost/libs/gil/test/core/color/CMakeLists.txt
@@ -0,0 +1,28 @@
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+foreach(_name
+ concepts
+ color_spaces_are_compatible
+ default_color_converter_impl)
+ set(_test t_core_color_${_name})
+ set(_target test_core_color_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
diff --git a/src/boost/libs/gil/test/core/color/Jamfile b/src/boost/libs/gil/test/core/color/Jamfile
new file mode 100644
index 000000000..0b5a23420
--- /dev/null
+++ b/src/boost/libs/gil/test/core/color/Jamfile
@@ -0,0 +1,15 @@
+# Boost.GIL (Generic Image Library) - tests
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+compile concepts.cpp ;
+compile color_spaces_are_compatible.cpp ;
+compile-fail default_color_converter_impl_fail.cpp ;
+
+run default_color_converter_impl.cpp ;
diff --git a/src/boost/libs/gil/test/core/color/color_spaces_are_compatible.cpp b/src/boost/libs/gil/test/core/color/color_spaces_are_compatible.cpp
new file mode 100644
index 000000000..15f7f41d4
--- /dev/null
+++ b/src/boost/libs/gil/test/core/color/color_spaces_are_compatible.cpp
@@ -0,0 +1,46 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/color_base.hpp>
+#include <boost/gil/concepts.hpp>
+#include <boost/gil/device_n.hpp>
+#include <boost/gil/gray.hpp>
+#include <boost/gil/rgb.hpp>
+#include <boost/gil/rgba.hpp>
+#include <boost/gil/cmyk.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/mp11.hpp>
+#include <type_traits>
+
+namespace gil = boost::gil;
+using namespace boost::mp11;
+
+template <typename T>
+using test_self_compatible = gil::color_spaces_are_compatible<T, T>;
+
+int main()
+{
+ using color_spaces = mp_list
+ <
+ gil::devicen_t<2>,
+ gil::devicen_t<3>,
+ gil::devicen_t<4>,
+ gil::devicen_t<5>,
+ gil::gray_t,
+ gil::cmyk_t,
+ gil::rgb_t,
+ gil::rgba_t
+ >;
+
+ static_assert(std::is_same
+ <
+ mp_all_of<color_spaces, test_self_compatible>,
+ std::true_type
+ >::value,
+ "color_spaces_are_compatible should yield true for the same types");
+}
diff --git a/src/boost/libs/gil/test/core/color/concepts.cpp b/src/boost/libs/gil/test/core/color/concepts.cpp
new file mode 100644
index 000000000..157f28220
--- /dev/null
+++ b/src/boost/libs/gil/test/core/color/concepts.cpp
@@ -0,0 +1,50 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+// FIXME: Avoid Clang's flooding of non-disableable warnings like:
+// "T does not declare any constructor to initialize its non-modifiable members"
+// when compiling with concepts check enabled.
+// See https://bugs.llvm.org/show_bug.cgi?id=41759
+#if !defined(BOOST_GIL_USE_CONCEPT_CHECK) && !defined(__clang__)
+#error Compile with BOOST_GIL_USE_CONCEPT_CHECK defined
+#endif
+#include <boost/gil/concepts.hpp>
+#include <boost/gil/device_n.hpp>
+#include <boost/gil/gray.hpp>
+#include <boost/gil/rgb.hpp>
+#include <boost/gil/rgba.hpp>
+#include <boost/gil/cmyk.hpp>
+
+#include <boost/concept_check.hpp>
+
+namespace gil = boost::gil;
+using boost::function_requires;
+
+int main()
+{
+ // TODO: Most constraints() for color concepts are no-op as not implemented.
+ // Once implemented, this test should help to catch any issues early.
+
+ function_requires<gil::ColorSpaceConcept<gil::devicen_t<2>>>();
+ function_requires<gil::ColorSpaceConcept<gil::devicen_t<3>>>();
+ function_requires<gil::ColorSpaceConcept<gil::devicen_t<4>>>();
+ function_requires<gil::ColorSpaceConcept<gil::devicen_t<5>>>();
+ function_requires<gil::ColorSpaceConcept<gil::gray_t>>();
+ function_requires<gil::ColorSpaceConcept<gil::cmyk_t>>();
+ function_requires<gil::ColorSpaceConcept<gil::rgb_t>>();
+ function_requires<gil::ColorSpaceConcept<gil::rgba_t>>();
+
+ function_requires<gil::ColorSpacesCompatibleConcept<gil::gray_t, gil::gray_t>>();
+ function_requires<gil::ColorSpacesCompatibleConcept<gil::cmyk_t, gil::cmyk_t>>();
+ function_requires<gil::ColorSpacesCompatibleConcept<gil::rgb_t, gil::rgb_t>>();
+ function_requires<gil::ColorSpacesCompatibleConcept<gil::rgba_t, gil::rgba_t>>();
+ function_requires<gil::ColorSpacesCompatibleConcept
+ <
+ gil::devicen_t<2>,
+ gil::devicen_t<2>
+ >>();
+}
diff --git a/src/boost/libs/gil/test/core/color/default_color_converter_impl.cpp b/src/boost/libs/gil/test/core/color/default_color_converter_impl.cpp
new file mode 100644
index 000000000..a2ea7fd9e
--- /dev/null
+++ b/src/boost/libs/gil/test/core/color/default_color_converter_impl.cpp
@@ -0,0 +1,112 @@
+//
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/color_convert.hpp>
+#include <boost/gil/gray.hpp>
+#include <boost/gil/rgb.hpp>
+#include <boost/gil/rgba.hpp>
+#include <boost/gil/cmyk.hpp>
+
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include <type_traits>
+
+#include "test_utility_output_stream.hpp"
+#include "core/pixel/test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+#ifdef BOOST_GIL_TEST_DEBUG
+#include <boost/core/demangle.hpp>
+#include <iostream>
+namespace {
+template <class T>
+std::string name() { return boost::core::demangle(typeid(T).name()); }
+}
+#endif
+
+template <typename ColorSpaces>
+struct test_roundtrip_convertible
+{
+ template<typename Src, typename Dst>
+ void operator()(mp11::mp_list<Src, Dst> const&) const
+ {
+#ifdef BOOST_GIL_TEST_DEBUG
+ std::cout << "test_lossless_roundtrip:\n"
+ << "\tsrc: " << name<Src>() << "\n\tdst: " << name<Dst>() << std::endl;
+#endif
+ using pixel_src_t = gil::pixel<std::uint8_t, gil::layout<Src>>;
+ using pixel_dst_t = gil::pixel<std::uint8_t, gil::layout<Dst>>;
+
+ pixel_src_t src1{};
+ pixel_dst_t dst1{};
+
+ gil::default_color_converter_impl<Src, Dst> convert_to;
+ convert_to(src1, dst1);
+
+ gil::default_color_converter_impl<Dst, Src> convert_from;
+ pixel_src_t src2{};
+ convert_from(dst1, src2);
+
+ BOOST_TEST_EQ(src1, src2);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each
+ <
+ mp11::mp_product<mp11::mp_list, ColorSpaces, ColorSpaces>
+ >(test_roundtrip_convertible{});
+ }
+};
+
+template <typename ColorSpaces>
+struct test_convertible
+{
+ template<typename Src, typename Dst>
+ void operator()(mp11::mp_list<Src, Dst> const&) const
+ {
+#ifdef BOOST_GIL_TEST_DEBUG
+ std::cout << "test_all:\n"
+ << "\tsrc: " << name<Src>() << "\n\tdst: " << name<Dst>() << std::endl;
+#endif
+ using pixel_src_t = gil::pixel<std::uint8_t, gil::layout<Src>>;
+ using pixel_dst_t = gil::pixel<std::uint8_t, gil::layout<Dst>>;
+
+ pixel_src_t src{};
+ pixel_dst_t dst{};
+
+ gil::default_color_converter_impl<Src, Dst> convert_to;
+ convert_to(src, dst);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each
+ <
+ mp11::mp_product<mp11::mp_list, ColorSpaces, ColorSpaces>
+ >(test_convertible{});
+ }
+};
+
+int main()
+{
+ test_convertible
+ <
+ mp11::mp_list<gil::cmyk_t, gil::gray_t, gil::rgb_t, gil::rgba_t>
+ >::run();
+
+ test_roundtrip_convertible
+ <
+ mp11::mp_list<gil::gray_t, gil::rgb_t>
+ >::run();
+
+ test_roundtrip_convertible<mp11::mp_list<gil::cmyk_t>>::run();
+ test_roundtrip_convertible<mp11::mp_list<gil::gray_t>>::run();
+ test_roundtrip_convertible<mp11::mp_list<gil::rgba_t>>::run();
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/color/default_color_converter_impl_fail.cpp b/src/boost/libs/gil/test/core/color/default_color_converter_impl_fail.cpp
new file mode 100644
index 000000000..0f62af7be
--- /dev/null
+++ b/src/boost/libs/gil/test/core/color/default_color_converter_impl_fail.cpp
@@ -0,0 +1,33 @@
+//
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/color_convert.hpp>
+#include <boost/gil/gray.hpp>
+#include <boost/gil/rgb.hpp>
+#include <boost/gil/rgba.hpp>
+#include <boost/gil/cmyk.hpp>
+
+#include <boost/core/ignore_unused.hpp>
+#include <boost/mp11.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+struct unknown_color_space {};
+
+int main()
+{
+ {
+ gil::default_color_converter_impl<unknown_color_space, gil::gray_t> c;
+ boost::ignore_unused(c);
+ }
+ {
+ gil::default_color_converter_impl<gil::rgb_t, unknown_color_space> c;
+ boost::ignore_unused(c);
+ }
+}
diff --git a/src/boost/libs/gil/test/core/color_base/CMakeLists.txt b/src/boost/libs/gil/test/core/color_base/CMakeLists.txt
new file mode 100644
index 000000000..db81366dc
--- /dev/null
+++ b/src/boost/libs/gil/test/core/color_base/CMakeLists.txt
@@ -0,0 +1,28 @@
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+foreach(_name
+ concepts
+ homogeneous_color_base
+ static_transform)
+ set(_test t_core_color_base_${_name})
+ set(_target test_core_color_base_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
diff --git a/src/boost/libs/gil/test/core/color_base/Jamfile b/src/boost/libs/gil/test/core/color_base/Jamfile
new file mode 100644
index 000000000..68f5dfe7a
--- /dev/null
+++ b/src/boost/libs/gil/test/core/color_base/Jamfile
@@ -0,0 +1,16 @@
+# Boost.GIL (Generic Image Library) - tests
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+compile concepts.cpp ;
+compile-fail static_transform_gray_to_rgb_fail.cpp ;
+compile-fail static_transform_rgb_to_cmyk_fail.cpp ;
+
+run homogeneous_color_base.cpp ;
+run static_transform.cpp ;
diff --git a/src/boost/libs/gil/test/core/color_base/concepts.cpp b/src/boost/libs/gil/test/core/color_base/concepts.cpp
new file mode 100644
index 000000000..1685df232
--- /dev/null
+++ b/src/boost/libs/gil/test/core/color_base/concepts.cpp
@@ -0,0 +1,54 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+// FIXME: Avoid Clang's flooding of non-disableable warnings like:
+// "T does not declare any constructor to initialize its non-modifiable members"
+// when compiling with concepts check enabled.
+// See https://bugs.llvm.org/show_bug.cgi?id=41759
+#if !defined(BOOST_GIL_USE_CONCEPT_CHECK) && !defined(__clang__)
+#error Compile with BOOST_GIL_USE_CONCEPT_CHECK defined
+#endif
+#include <boost/gil/concepts.hpp>
+#include <boost/gil/color_base.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/concept_check.hpp>
+
+namespace gil = boost::gil;
+using boost::function_requires;
+
+int main()
+{
+ function_requires<gil::ColorBaseConcept
+ <
+ gil::detail::homogeneous_color_base<std::uint8_t, gil::gray_layout_t, 1>
+ >>();
+
+ function_requires<gil::HomogeneousColorBaseConcept
+ <
+ gil::detail::homogeneous_color_base<std::uint8_t, gil::gray_layout_t, 1>
+ >>();
+
+ function_requires<gil::HomogeneousColorBaseValueConcept
+ <
+ gil::detail::homogeneous_color_base<std::uint8_t, gil::gray_layout_t, 1>
+ >>();
+
+ // FIXME: https://github.com/boostorg/gil/issues/271
+ //function_requires
+ //<
+ // gil::ColorBaseConcept
+ // <
+ // gil::detail::homogeneous_color_base<std::uint8_t, gil::rgb_layout_t, 3>
+ // >
+ //>();
+
+ function_requires<gil::ColorBaseConcept<gil::gray8_pixel_t>>();
+ function_requires<gil::ColorBaseConcept<gil::rgb8_pixel_t>>();
+ function_requires<gil::ColorBaseConcept<gil::bgr8_pixel_t>>();
+
+}
diff --git a/src/boost/libs/gil/test/core/color_base/homogeneous_color_base.cpp b/src/boost/libs/gil/test/core/color_base/homogeneous_color_base.cpp
new file mode 100644
index 000000000..76b5570cb
--- /dev/null
+++ b/src/boost/libs/gil/test/core/color_base/homogeneous_color_base.cpp
@@ -0,0 +1,141 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/color_base.hpp>
+#include <boost/gil/gray.hpp>
+#include <boost/gil/rgb.hpp>
+#include <boost/gil/rgba.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+#include <boost/core/typeinfo.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+namespace {
+
+// Unknown layout is used where layout mapping is irrelevant for a test and its result.
+using unknown_layout_t = gil::gray_layout_t;
+
+template <int N>
+using color_base = gil::detail::homogeneous_color_base<std::uint8_t, unknown_layout_t, N>;
+
+std::integral_constant<int, 0> e0;
+std::integral_constant<int, 1> e1;
+std::integral_constant<int, 2> e2;
+std::integral_constant<int, 3> e3;
+std::integral_constant<int, 4> e4;
+
+} // unnamed namespace
+
+void test_homogeneous_color_base_1_default_constructor()
+{
+ using fixture = color_base<1>;
+ fixture f;
+ BOOST_TEST_EQ(std::uint8_t{f}, std::uint8_t{0});
+ BOOST_TEST_EQ(f.at(e0), std::uint8_t{0});
+}
+
+void test_homogeneous_color_base_1_value_constructor()
+{
+ using fixture = color_base<1>;
+ fixture f{1};
+ BOOST_TEST_EQ(std::uint8_t{f}, std::uint8_t{1});
+ BOOST_TEST_EQ(f.at(e0), std::uint8_t{1});
+}
+
+void test_homogeneous_color_base_2_default_constructor()
+{
+ using fixture = color_base<2>;
+ fixture f;
+ BOOST_TEST_EQ(f.at(e0), std::uint8_t{0});
+ BOOST_TEST_EQ(f.at(e1), std::uint8_t{0});
+}
+
+void test_homogeneous_color_base_2_value_constructor()
+{
+ using fixture = color_base<2>;
+ fixture f{2};
+ BOOST_TEST_EQ(f.at(e0), std::uint8_t{2});
+ BOOST_TEST_EQ(f.at(e0), f.at(e1));
+}
+
+void test_homogeneous_color_base_3_default_constructor()
+{
+ using fixture = color_base<3>;
+ fixture f;
+ BOOST_TEST_EQ(f.at(e0), std::uint8_t{0});
+ BOOST_TEST_EQ(f.at(e1), std::uint8_t{0});
+ BOOST_TEST_EQ(f.at(e2), std::uint8_t{0});
+}
+
+void test_homogeneous_color_base_3_value_constructor()
+{
+ using fixture = color_base<3>;
+ fixture f{3};
+ BOOST_TEST_EQ(f.at(e0), std::uint8_t{3});
+ BOOST_TEST_EQ(f.at(e0), f.at(e1));
+ BOOST_TEST_EQ(f.at(e0), f.at(e2));
+}
+
+void test_homogeneous_color_base_4_default_constructor()
+{
+ using fixture = color_base<4>;
+ fixture f;
+ BOOST_TEST_EQ(f.at(e0), std::uint8_t{0});
+ BOOST_TEST_EQ(f.at(e1), std::uint8_t{0});
+ BOOST_TEST_EQ(f.at(e2), std::uint8_t{0});
+ BOOST_TEST_EQ(f.at(e3), std::uint8_t{0});
+}
+
+void test_homogeneous_color_base_4_value_constructor()
+{
+ using fixture = color_base<4>;
+ fixture f{4};
+ BOOST_TEST_EQ(f.at(e0), std::uint8_t{4});
+ BOOST_TEST_EQ(f.at(e0), f.at(e1));
+ BOOST_TEST_EQ(f.at(e0), f.at(e2));
+ BOOST_TEST_EQ(f.at(e0), f.at(e3));
+}
+
+void test_homogeneous_color_base_5_default_constructor()
+{
+ using fixture = color_base<5>;
+ fixture f;
+ BOOST_TEST_EQ(f.at(e0), std::uint8_t{0});
+ BOOST_TEST_EQ(f.at(e1), std::uint8_t{0});
+ BOOST_TEST_EQ(f.at(e2), std::uint8_t{0});
+ BOOST_TEST_EQ(f.at(e3), std::uint8_t{0});
+ BOOST_TEST_EQ(f.at(e4), std::uint8_t{0});
+}
+
+void test_homogeneous_color_base_5_value_constructor()
+{
+ using fixture = color_base<5>;
+ fixture f{5};
+ BOOST_TEST_EQ(f.at(e0), f.at(e1));
+ BOOST_TEST_EQ(f.at(e0), f.at(e2));
+ BOOST_TEST_EQ(f.at(e0), f.at(e3));
+ BOOST_TEST_EQ(f.at(e0), f.at(e4));
+}
+
+int main()
+{
+ test_homogeneous_color_base_1_default_constructor();
+ test_homogeneous_color_base_1_value_constructor();
+ test_homogeneous_color_base_2_default_constructor();
+ test_homogeneous_color_base_2_value_constructor();
+ test_homogeneous_color_base_3_default_constructor();
+ test_homogeneous_color_base_3_value_constructor();
+ test_homogeneous_color_base_4_default_constructor();
+ test_homogeneous_color_base_4_value_constructor();
+ test_homogeneous_color_base_5_default_constructor();
+ test_homogeneous_color_base_5_value_constructor();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/color_base/static_transform.cpp b/src/boost/libs/gil/test/core/color_base/static_transform.cpp
new file mode 100644
index 000000000..f2f6405fd
--- /dev/null
+++ b/src/boost/libs/gil/test/core/color_base/static_transform.cpp
@@ -0,0 +1,72 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/color_base.hpp>
+#include <boost/gil/pixel.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+void test_single_source_gray8_to_gray8()
+{
+ gil::gray8_pixel_t src{128};
+ gil::gray8_pixel_t dst{0};
+ gil::static_transform(src, dst, [](std::uint8_t src_channel) {
+ return src_channel; // copy
+ });
+ BOOST_TEST_EQ(gil::at_c<0>(src), gil::at_c<0>(dst));
+}
+
+void test_single_source_rgb8_to_rgb8()
+{
+ gil::rgb8_pixel_t src{32, 64, 128};
+ gil::rgb8_pixel_t dst{0, 0, 0};
+ gil::static_transform(src, dst, [](std::uint8_t src_channel) {
+ return src_channel; // copy
+ });
+ BOOST_TEST_EQ(gil::at_c<0>(src), gil::at_c<0>(dst));
+ BOOST_TEST_EQ(gil::at_c<1>(src), gil::at_c<1>(dst));
+ BOOST_TEST_EQ(gil::at_c<2>(src), gil::at_c<2>(dst));
+}
+
+void test_single_source_rgb8_to_gray8()
+{
+ // Transformation of wider space to narrower space is a valid operation
+ gil::rgb8_pixel_t src{32,64, 128};
+ gil::gray8_pixel_t dst{0};
+ gil::static_transform(src, dst, [](std::uint8_t src_channel) {
+ return src_channel; // copy
+ });
+ BOOST_TEST_EQ(gil::at_c<0>(dst), std::uint8_t{32});
+}
+
+void test_single_source_cmyk8_to_rgb8()
+{
+ // Transformation of wider space to narrower space is a valid operation
+ gil::cmyk8_pixel_t src{16, 32, 64, 128};
+ gil::rgb8_pixel_t dst{0, 0, 0};
+ gil::static_transform(src, dst, [](std::uint8_t src_channel) {
+ return src_channel; // copy
+ });
+ BOOST_TEST_EQ(gil::at_c<0>(dst), std::uint8_t{16});
+ BOOST_TEST_EQ(gil::at_c<1>(dst), std::uint8_t{32});
+ BOOST_TEST_EQ(gil::at_c<2>(dst), std::uint8_t{64});
+}
+
+int main()
+{
+ test_single_source_gray8_to_gray8();
+ test_single_source_rgb8_to_rgb8();
+ test_single_source_rgb8_to_gray8();
+ test_single_source_cmyk8_to_rgb8();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/color_base/static_transform_gray_to_rgb_fail.cpp b/src/boost/libs/gil/test/core/color_base/static_transform_gray_to_rgb_fail.cpp
new file mode 100644
index 000000000..f07c9ad49
--- /dev/null
+++ b/src/boost/libs/gil/test/core/color_base/static_transform_gray_to_rgb_fail.cpp
@@ -0,0 +1,40 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/color_base_algorithm.hpp>
+#include <boost/gil/pixel.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <cassert>
+#include <cstdint>
+
+namespace gil = boost::gil;
+
+int main()
+{
+ // K-element index must be less than size of channel_mapping_t sequence
+ // of the *destination* color base.
+
+ // RGB (wider space) transformation to Gray (narrower space) takes only R channel value
+ {
+ gil::rgb8_pixel_t src{ 32, 64, 128 };
+ gil::gray8_pixel_t dst{ 0 };
+ gil::static_transform(src, dst, [](std::uint8_t src_channel) {
+ return src_channel; // copy
+ });
+ assert(gil::at_c<0>(dst) == std::uint16_t{32});
+ }
+
+ // Gray (narrower space) to RGB (wider space) transformation FAILS to compile
+ {
+ gil::gray8_pixel_t src{32};
+ gil::rgb8_pixel_t dst{0, 0, 0};
+ gil::static_transform(src, dst, [](std::uint8_t src_channel) {
+ return src_channel; // copy
+ });
+ }
+}
diff --git a/src/boost/libs/gil/test/core/color_base/static_transform_rgb_to_cmyk_fail.cpp b/src/boost/libs/gil/test/core/color_base/static_transform_rgb_to_cmyk_fail.cpp
new file mode 100644
index 000000000..6aa6ee5d7
--- /dev/null
+++ b/src/boost/libs/gil/test/core/color_base/static_transform_rgb_to_cmyk_fail.cpp
@@ -0,0 +1,42 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/color_base_algorithm.hpp>
+#include <boost/gil/pixel.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <cassert>
+#include <cstdint>
+
+namespace gil = boost::gil;
+
+int main()
+{
+ // K-element index must be less than size of channel_mapping_t sequence
+ // of the *destination* color base.
+
+ // RGB (wider space) transformation to Gray (narrower space) takes only R channel value
+ {
+ gil::cmyk8_pixel_t src{16, 32, 64, 128};
+ gil::rgb8_pixel_t dst{0, 0, 0};
+ gil::static_transform(src, dst, [](std::uint8_t src_channel) {
+ return src_channel; // copy
+ });
+ assert(gil::at_c<0>(dst) == std::uint16_t{16});
+ assert(gil::at_c<0>(dst) == std::uint16_t{32});
+ assert(gil::at_c<0>(dst) == std::uint16_t{64});
+ }
+
+ // RGB (narrower space) to CMYK (wider space) transformation FAILS to compile
+ {
+ gil::rgb8_pixel_t src{16, 32, 64};
+ gil::cmyk8_pixel_t dst{0, 0, 0, 0};
+ gil::static_transform(src, dst, [](std::uint8_t src_channel) {
+ return src_channel; // copy
+ });
+ }
+}
diff --git a/src/boost/libs/gil/test/core/image/CMakeLists.txt b/src/boost/libs/gil/test/core/image/CMakeLists.txt
new file mode 100644
index 000000000..6574cf275
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image/CMakeLists.txt
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+foreach(_name
+ concepts
+ image)
+ set(_test t_core_image_${_name})
+ set(_target test_core_image_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
diff --git a/src/boost/libs/gil/test/core/image/Jamfile b/src/boost/libs/gil/test/core/image/Jamfile
new file mode 100644
index 000000000..07da63467
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image/Jamfile
@@ -0,0 +1,13 @@
+# Boost.GIL (Generic Image Library) - tests
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+compile concepts.cpp ;
+
+run image.cpp ;
diff --git a/src/boost/libs/gil/test/core/image/concepts.cpp b/src/boost/libs/gil/test/core/image/concepts.cpp
new file mode 100644
index 000000000..b9bd25513
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image/concepts.cpp
@@ -0,0 +1,30 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+// FIXME: Avoid Clang's flooding of non-disableable warnings like:
+// "T does not declare any constructor to initialize its non-modifiable members"
+// when compiling with concepts check enabled.
+// See https://bugs.llvm.org/show_bug.cgi?id=41759
+#if !defined(BOOST_GIL_USE_CONCEPT_CHECK) && !defined(__clang__)
+#error Compile with BOOST_GIL_USE_CONCEPT_CHECK defined
+#endif
+#include <boost/gil.hpp>
+
+#include <boost/concept_check.hpp>
+
+#include <array>
+
+namespace gil = boost::gil;
+using boost::function_requires;
+
+int main()
+{
+ function_requires<gil::ImageConcept<gil::gray8_image_t>>();
+ function_requires<gil::ImageConcept<gil::rgb8_image_t>>();
+
+ return 0;
+}
diff --git a/src/boost/libs/gil/test/core/image/image.cpp b/src/boost/libs/gil/test/core/image/image.cpp
new file mode 100644
index 000000000..b12183432
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image/image.cpp
@@ -0,0 +1,91 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "test_fixture.hpp"
+#include "test_utility_output_stream.hpp"
+#include "core/pixel/test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+struct test_constructor_with_dimensions_pixel
+{
+ template <typename Image>
+ void operator()(Image const &)
+ {
+ using image_t = Image;
+ gil::point_t const dimensions{256, 128};
+ using pixel_t = typename image_t::view_t::value_type;
+ pixel_t const rnd_pixel = fixture::pixel_generator<pixel_t>::random();
+ image_t image(dimensions, rnd_pixel);
+ BOOST_TEST_EQ(image.width(), dimensions.x);
+ BOOST_TEST_EQ(image.height(), dimensions.y);
+
+ for (pixel_t const &p : gil::view(image))
+ BOOST_TEST_EQ(p, rnd_pixel);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_constructor_with_dimensions_pixel{});
+ }
+};
+
+struct test_move_constructor
+{
+ template <typename Image>
+ void operator()(Image const&)
+ {
+ using image_t = Image;
+ gil::point_t const dimensions{256, 128};
+ {
+ image_t image(fixture::create_image<image_t>(dimensions.x, dimensions.y, 0));
+
+ image_t image2(std::move(image));
+ BOOST_TEST_EQ(image2.dimensions(), dimensions);
+ BOOST_TEST_EQ(image.dimensions(), gil::point_t{});
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_move_constructor{});
+ }
+};
+
+struct test_move_assignement
+{
+ template <typename Image>
+ void operator()(Image const&)
+ {
+ using image_t = Image;
+ gil::point_t const dimensions{256, 128};
+ {
+ image_t image = fixture::create_image<image_t>(dimensions.x, dimensions.y, 0);
+ image_t image2 = fixture::create_image<image_t>(dimensions.x * 2, dimensions.y * 2, 1);
+ image2 = std::move(image);
+ BOOST_TEST_EQ(image2.dimensions(), dimensions);
+ BOOST_TEST_EQ(image.dimensions(), gil::point_t{});
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_move_assignement{});
+ }
+};
+
+int main()
+{
+ test_constructor_with_dimensions_pixel::run();
+
+ test_move_constructor::run();
+ test_move_assignement::run();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image/test_fixture.hpp b/src/boost/libs/gil/test/core/image/test_fixture.hpp
new file mode 100644
index 000000000..da604093b
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image/test_fixture.hpp
@@ -0,0 +1,71 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifndef BOOST_GIL_TEST_CORE_IMAGE_TEST_FIXTURE_HPP
+#define BOOST_GIL_TEST_CORE_IMAGE_TEST_FIXTURE_HPP
+
+#include <boost/gil.hpp>
+#include <boost/assert.hpp>
+
+#include <cstdint>
+#include <initializer_list>
+#include <limits>
+#include <random>
+#include <tuple>
+#include <type_traits>
+
+#include "core/test_fixture.hpp"
+
+namespace boost { namespace gil { namespace test { namespace fixture {
+
+using image_types = std::tuple
+<
+ gil::gray8_image_t,
+ gil::gray16_image_t,
+ gil::gray32_image_t,
+ gil::bgr8_image_t,
+ gil::bgr16_image_t,
+ gil::bgr32_image_t,
+ gil::rgb8_image_t,
+ gil::rgb16_image_t,
+ gil::rgb32_image_t,
+ gil::rgba8_image_t,
+ gil::rgba16_image_t,
+ gil::rgba32_image_t
+>;
+
+template <typename Image, typename Generator>
+auto generate_image(std::ptrdiff_t size_x, std::ptrdiff_t size_y, Generator&& generate) -> Image
+{
+ using pixel_t = typename Image::value_type;
+
+ Image out(size_x, size_y);
+ gil::for_each_pixel(view(out), [&generate](pixel_t& p) {
+ gil::static_generate(p, [&generate]() { return generate(); });
+ });
+
+ return out;
+}
+
+template <typename Image>
+auto create_image(std::ptrdiff_t size_x, std::ptrdiff_t size_y, int channel_value) -> Image
+{
+ using pixel_t = typename Image::value_type;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ static_assert(std::is_integral<channel_t>::value, "channel must be integral type");
+
+ Image out(size_x, size_y);
+ gil::for_each_pixel(view(out), [&channel_value](pixel_t& p) {
+ gil::static_fill(p, static_cast<channel_t>(channel_value));
+ });
+
+ return out;
+}
+
+}}}} // namespace boost::gil::test::fixture
+
+#endif
diff --git a/src/boost/libs/gil/test/core/image_processing/CMakeLists.txt b/src/boost/libs/gil/test/core/image_processing/CMakeLists.txt
new file mode 100644
index 000000000..5ecd59062
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_processing/CMakeLists.txt
@@ -0,0 +1,53 @@
+# Boost.GIL (Generic Image Library) - tests
+#
+# Copyright 2019 Miral Shah <miralshah2211@gmail.com>
+#
+# Use, modification and distribution are subject to the Boost Software License,
+# Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+foreach(_name
+ threshold_binary
+ threshold_truncate
+ threshold_otsu)
+ set(_test t_core_image_processing_${_name})
+ set(_target test_core_image_processing_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+endforeach()
+
+foreach(_name
+ lanczos_scaling
+ simple_kernels
+ harris
+ hessian
+ box_filter
+ median_filter
+ sobel_scharr)
+ set(_test t_core_image_processing_${_name})
+ set(_target test_core_image_processing_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
diff --git a/src/boost/libs/gil/test/core/image_processing/Jamfile b/src/boost/libs/gil/test/core/image_processing/Jamfile
new file mode 100644
index 000000000..d9593f079
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_processing/Jamfile
@@ -0,0 +1,21 @@
+# Boost.GIL (Generic Image Library) - tests
+#
+# Copyright 2019 Miral Shah <miralshah2211@gmail.com>
+#
+# Use, modification and distribution are subject to the Boost Software License,
+# Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+import testing ;
+
+compile-fail threshold_color_spaces_not_compatible_fail.cpp ;
+run threshold_binary.cpp ;
+run threshold_truncate.cpp ;
+run threshold_otsu.cpp ;
+run lanczos_scaling.cpp ;
+run simple_kernels.cpp ;
+run harris.cpp ;
+run hessian.cpp ;
+run sobel_scharr.cpp ;
+run box_filter.cpp ;
+run median_filter.cpp ;
diff --git a/src/boost/libs/gil/test/core/image_processing/box_filter.cpp b/src/boost/libs/gil/test/core/image_processing/box_filter.cpp
new file mode 100644
index 000000000..54b0dd0e8
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_processing/box_filter.cpp
@@ -0,0 +1,65 @@
+//
+// Copyright 2019 Miral Shah <miralshah2211@gmail.com>
+//
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+#include <boost/gil/algorithm.hpp>
+#include <boost/gil/gray.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/image_processing/filter.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+namespace gil = boost::gil;
+
+std::uint8_t img[] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 255, 0, 0, 0, 255, 0, 0,
+ 0, 0, 0, 255, 0, 255, 0, 0, 0,
+ 0, 0, 0, 0, 255, 0, 0, 0, 0,
+ 0, 0, 0, 255, 0, 255, 0, 0, 0,
+ 0, 0, 255, 0, 0, 0, 255, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+std::uint8_t output[] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 28, 28, 28, 0, 28, 28, 28, 0,
+ 0, 28, 56, 56, 56, 56, 56, 28, 0,
+ 0, 28, 56, 85, 85, 85, 56, 28, 0,
+ 0, 0, 56, 85, 141, 85, 56, 0, 0,
+ 0, 28, 56, 85, 85, 85, 56, 28, 0,
+ 0, 28, 56, 56, 56, 56, 56, 28, 0,
+ 0, 28, 28, 28, 0, 28, 28, 28, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+void test_box_filter_with_default_parameters()
+{
+ gil::gray8c_view_t src_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t*>(img), 9);
+
+ gil::image<gil::gray8_pixel_t> temp_img(src_view.width(), src_view.height());
+ typename gil::image<gil::gray8_pixel_t>::view_t temp_view = view(temp_img);
+ gil::gray8_view_t dst_view(temp_view);
+
+ gil::box_filter(src_view, dst_view, 3);
+
+ gil::gray8c_view_t out_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t*>(output), 9);
+
+ BOOST_TEST(gil::equal_pixels(out_view, dst_view));
+}
+
+int main()
+{
+ test_box_filter_with_default_parameters();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_processing/harris.cpp b/src/boost/libs/gil/test/core/image_processing/harris.cpp
new file mode 100644
index 000000000..f8c8e7dc6
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_processing/harris.cpp
@@ -0,0 +1,73 @@
+//
+// Copyright 2019 Olzhas Zhumabek <anonymous.from.applecity@gmail.com>
+//
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+#include <boost/gil/image.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/image_processing/numeric.hpp>
+#include <boost/gil/image_processing/harris.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+namespace gil = boost::gil;
+
+bool are_equal(gil::gray32f_view_t expected, gil::gray32f_view_t actual) {
+ if (expected.dimensions() != actual.dimensions())
+ return false;
+
+ for (long int y = 0; y < expected.height(); ++y)
+ {
+ for (long int x = 0; x < expected.width(); ++x)
+ {
+ if (expected(x, y) != actual(x, y))
+ {
+ return false;
+ }
+ }
+ }
+
+ return true;
+}
+
+void test_blank_image()
+{
+ const gil::point_t dimensions(20, 20);
+ gil::gray16s_image_t dx(dimensions, gil::gray16s_pixel_t(0), 0);
+ gil::gray16s_image_t dy(dimensions, gil::gray16s_pixel_t(0), 0);
+
+ gil::gray32f_image_t m11(dimensions);
+ gil::gray32f_image_t m12_21(dimensions);
+ gil::gray32f_image_t m22(dimensions);
+ gil::gray32f_image_t expected(dimensions, gil::gray32f_pixel_t(0), 0);
+ gil::compute_tensor_entries(
+ gil::view(dx),
+ gil::view(dy),
+ gil::view(m11),
+ gil::view(m12_21),
+ gil::view(m22)
+ );
+ BOOST_TEST(are_equal(gil::view(expected), gil::view(m11)));
+ BOOST_TEST(are_equal(gil::view(expected), gil::view(m12_21)));
+ BOOST_TEST(are_equal(gil::view(expected), gil::view(m22)));
+
+ gil::gray32f_image_t harris_response(dimensions, gil::gray32f_pixel_t(0), 0);
+ auto unnormalized_mean = gil::generate_unnormalized_mean(5);
+ gil::compute_harris_responses(
+ gil::view(m11),
+ gil::view(m12_21),
+ gil::view(m22),
+ unnormalized_mean,
+ 0.04f,
+ gil::view(harris_response)
+ );
+ BOOST_TEST(are_equal(gil::view(expected), gil::view(harris_response)));
+}
+
+int main(int argc, char* argv[])
+{
+ test_blank_image();
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_processing/hessian.cpp b/src/boost/libs/gil/test/core/image_processing/hessian.cpp
new file mode 100644
index 000000000..b8e797d55
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_processing/hessian.cpp
@@ -0,0 +1,72 @@
+//
+// Copyright 2019 Olzhas Zhumabek <anonymous.from.applecity@gmail.com>
+//
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+#include <boost/gil/image.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/image_processing/numeric.hpp>
+#include <boost/gil/image_processing/hessian.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+namespace gil = boost::gil;
+
+bool are_equal(gil::gray32f_view_t expected, gil::gray32f_view_t actual) {
+ if (expected.dimensions() != actual.dimensions())
+ return false;
+
+ for (long int y = 0; y < expected.height(); ++y)
+ {
+ for (long int x = 0; x < expected.width(); ++x)
+ {
+ if (expected(x, y) != actual(x, y))
+ {
+ return false;
+ }
+ }
+ }
+
+ return true;
+}
+
+void test_blank_image()
+{
+ const gil::point_t dimensions(20, 20);
+ gil::gray16s_image_t dx(dimensions, gil::gray16s_pixel_t(0), 0);
+ gil::gray16s_image_t dy(dimensions, gil::gray16s_pixel_t(0), 0);
+
+ gil::gray32f_image_t m11(dimensions);
+ gil::gray32f_image_t m12_21(dimensions);
+ gil::gray32f_image_t m22(dimensions);
+ gil::gray32f_image_t expected(dimensions, gil::gray32f_pixel_t(0), 0);
+ gil::compute_hessian_entries(
+ gil::view(dx),
+ gil::view(dy),
+ gil::view(m11),
+ gil::view(m12_21),
+ gil::view(m22)
+ );
+ BOOST_TEST(are_equal(gil::view(expected), gil::view(m11)));
+ BOOST_TEST(are_equal(gil::view(expected), gil::view(m12_21)));
+ BOOST_TEST(are_equal(gil::view(expected), gil::view(m22)));
+
+ gil::gray32f_image_t hessian_response(dimensions, gil::gray32f_pixel_t(0), 0);
+ auto unnormalized_mean = gil::generate_unnormalized_mean(5);
+ gil::compute_hessian_responses(
+ gil::view(m11),
+ gil::view(m12_21),
+ gil::view(m22),
+ unnormalized_mean,
+ gil::view(hessian_response)
+ );
+ BOOST_TEST(are_equal(gil::view(expected), gil::view(hessian_response)));
+}
+
+int main(int argc, char* argv[])
+{
+ test_blank_image();
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_processing/lanczos_scaling.cpp b/src/boost/libs/gil/test/core/image_processing/lanczos_scaling.cpp
new file mode 100755
index 000000000..610de5ade
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_processing/lanczos_scaling.cpp
@@ -0,0 +1,67 @@
+//
+// Copyright 2019 Olzhas Zhumabek <anonymous.from.applecity@gmail.com>
+//
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+#include <boost/gil/image.hpp>
+#include <boost/gil/image_processing/scaling.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+namespace gil = boost::gil;
+
+bool are_equal(gil::rgb8_view_t expected, gil::rgb8_view_t actual)
+{
+ if (expected.dimensions() != actual.dimensions())
+ return false;
+
+ for (long int y = 0; y < expected.height(); ++y)
+ {
+ for (long int x = 0; x < expected.width(); ++x)
+ {
+ if (expected(x, y) != actual(x, y))
+ return false;
+ }
+ }
+
+ return true;
+}
+
+void test_lanczos_black_image()
+{
+ const gil::point_t input_dimensions(20, 20);
+ const gil::point_t output_dimensions(input_dimensions.x / 2, input_dimensions.y / 2);
+ gil::rgb8_image_t image(input_dimensions, gil::rgb8_pixel_t(0, 0, 0), 0);
+ // fill with values other than 0
+ gil::rgb8_image_t output_image(
+ output_dimensions,
+ gil::rgb8_pixel_t(100, 100, 100),
+ 0
+ );
+ gil::rgb8_image_t expected(
+ output_dimensions,
+ gil::rgb8_pixel_t(0, 0, 0),
+ 0
+ );
+
+ auto view = gil::view(image);
+ auto output_view = gil::view(output_image);
+ auto expected_view = gil::view(expected);
+ gil::scale_lanczos(view, output_view, 5);
+ BOOST_TEST(are_equal(expected_view,output_view));
+}
+
+void test_lanczos_response_on_zero()
+{
+ //random value for a
+ BOOST_TEST_EQ(gil::lanczos(0, 2), 1);
+}
+
+int main()
+{
+ test_lanczos_black_image();
+ test_lanczos_response_on_zero();
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_processing/median_filter.cpp b/src/boost/libs/gil/test/core/image_processing/median_filter.cpp
new file mode 100644
index 000000000..e2b3ca7e2
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_processing/median_filter.cpp
@@ -0,0 +1,65 @@
+//
+// Copyright 2019 Miral Shah <miralshah2211@gmail.com>
+//
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/algorithm.hpp>
+#include <boost/gil/gray.hpp>
+#include <boost/gil/image_processing/filter.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+namespace gil = boost::gil;
+
+std::uint8_t img[] =
+{
+ 183, 128, 181, 86, 34, 55, 134, 164, 15,
+ 90, 59, 94, 158, 202, 0, 106, 120, 255,
+ 65, 48, 4, 21, 21, 38, 50, 37, 228,
+ 27, 245, 254, 164, 135, 192, 17, 241, 19,
+ 56, 165, 253, 169, 24, 200, 249, 70, 199,
+ 59, 84, 41, 96, 70, 58, 24, 20, 218,
+ 235, 180, 12, 168, 224, 204, 166, 153, 1,
+ 181, 213, 232, 178, 165, 253, 93, 214, 72,
+ 171, 50, 20, 65, 67, 133, 249, 157, 105
+};
+
+std::uint8_t output[] =
+{
+ 128, 128, 128, 94, 55, 55, 120, 134, 120,
+ 90, 90, 86, 86, 38, 50, 55, 120, 164,
+ 65, 65, 94, 135, 135, 50, 50, 106, 228,
+ 56, 65, 165, 135, 135, 50, 70, 70, 199,
+ 59, 84, 165, 135, 135, 70, 70, 70, 199,
+ 84, 84, 165, 96, 168, 166, 153, 153, 153,
+ 181, 180, 168, 165, 168, 165, 153, 93, 72,
+ 181, 180, 168, 165, 168, 166, 166, 153, 105,
+ 171, 171, 65, 67, 133, 133, 157, 157, 105
+};
+
+void test_median_filter_with_kernel_size_3()
+{
+ gil::gray8c_view_t src_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t*>(img), 9);
+
+ gil::image<gil::gray8_pixel_t> temp_img(src_view.width(), src_view.height());
+ typename gil::image<gil::gray8_pixel_t>::view_t temp_view = view(temp_img);
+ gil::gray8_view_t dst_view(temp_view);
+
+ gil::median_filter(src_view, dst_view, 3);
+
+ gil::gray8c_view_t out_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t*>(output), 9);
+
+ BOOST_TEST(gil::equal_pixels(out_view, dst_view));
+}
+
+int main()
+{
+ test_median_filter_with_kernel_size_3();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_processing/simple_kernels.cpp b/src/boost/libs/gil/test/core/image_processing/simple_kernels.cpp
new file mode 100644
index 000000000..522dec2f1
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_processing/simple_kernels.cpp
@@ -0,0 +1,68 @@
+//
+// Copyright 2019 Olzhas Zhumabek <anonymous.from.applecity@gmail.com>
+//
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+#include <boost/gil/image.hpp>
+#include <boost/gil/image_processing/numeric.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+namespace gil = boost::gil;
+
+void test_normalized_mean_generation()
+{
+ auto kernel = gil::generate_normalized_mean(5);
+ for (const auto& cell: kernel)
+ {
+ const auto expected_value = static_cast<float>(1 / 25.f);
+ BOOST_TEST_EQ(cell, expected_value);
+ }
+}
+
+void test_unnormalized_mean_generation()
+{
+ auto kernel = gil::generate_unnormalized_mean(5);
+ for (const auto& cell: kernel)
+ {
+ BOOST_TEST_EQ(cell, 1.0f);
+ }
+}
+
+void test_gaussian_kernel_generation()
+{
+ auto kernel = boost::gil::generate_gaussian_kernel(7, 0.84089642);
+ const float expected_values[7][7] =
+ {
+ {0.00000067f, 0.00002292f, 0.00019117f, 0.00038771f, 0.00019117f, 0.00002292f, 0.00000067f},
+ {0.00002292f, 0.00078633f, 0.00655965f, 0.01330373f, 0.00655965f, 0.00078633f, 0.00002292f},
+ {0.00019117f, 0.00655965f, 0.05472157f, 0.11098164f, 0.05472157f, 0.00655965f, 0.00019117f},
+ {0.00038771f, 0.01330373f, 0.11098164f, 0.25508352f, 0.11098164f, 0.01330373f, 0.00038711f},
+ {0.00019117f, 0.00655965f, 0.05472157f, 0.11098164f, 0.05472157f, 0.00655965f, 0.00019117f},
+ {0.00002292f, 0.00078633f, 0.00655965f, 0.01330373f, 0.00655965f, 0.00078633f, 0.00002292f},
+ {0.00000067f, 0.00002292f, 0.00019117f, 0.00038771f, 0.00019117f, 0.00002292f, 0.00000067f}
+ };
+
+ for (gil::gray32f_view_t::coord_t y = 0; static_cast<std::size_t>(y) < kernel.size(); ++y)
+ {
+ for (gil::gray32f_view_t::coord_t x = 0; static_cast<std::size_t>(x) < kernel.size(); ++x)
+ {
+ auto output = kernel.at(static_cast<std::size_t>(x), static_cast<std::size_t>(y));
+ auto expected = expected_values[y][x];
+ auto percent_difference = std::ceil(std::abs(expected - output) / expected);
+ BOOST_TEST_LT(percent_difference, 5);
+ }
+ }
+}
+
+int main()
+{
+ test_normalized_mean_generation();
+ test_unnormalized_mean_generation();
+ test_gaussian_kernel_generation();
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_processing/sobel_scharr.cpp b/src/boost/libs/gil/test/core/image_processing/sobel_scharr.cpp
new file mode 100644
index 000000000..6ebc90cad
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_processing/sobel_scharr.cpp
@@ -0,0 +1,50 @@
+//
+// Copyright 2019 Olzhas Zhumabek <anonymous.from.applecity@gmail.com>
+//
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+#include <boost/gil/detail/math.hpp>
+#include <boost/gil/image_processing/numeric.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <algorithm>
+
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+
+void test_dx_sobel_kernel()
+{
+ auto const kernel = gil::generate_dx_sobel(1);
+ BOOST_TEST_ALL_EQ(kernel.begin(), kernel.end(), gil::detail::dx_sobel.begin(), gil::detail::dx_sobel.end());
+}
+
+void test_dx_scharr_kernel()
+{
+ auto const kernel = gil::generate_dx_scharr(1);
+ BOOST_TEST_ALL_EQ(kernel.begin(), kernel.end(), gil::detail::dx_scharr.begin(), gil::detail::dx_scharr.end());
+}
+
+void test_dy_sobel_kernel()
+{
+ auto const kernel = gil::generate_dy_sobel(1);
+ BOOST_TEST_ALL_EQ(kernel.begin(), kernel.end(), gil::detail::dy_sobel.begin(), gil::detail::dy_sobel.end());
+}
+
+void test_dy_scharr_kernel()
+{
+ auto const kernel = gil::generate_dy_scharr(1);
+ BOOST_TEST_ALL_EQ(kernel.begin(), kernel.end(), gil::detail::dy_scharr.begin(), gil::detail::dy_scharr.end());
+}
+
+int main()
+{
+ test_dx_sobel_kernel();
+ test_dx_scharr_kernel();
+ test_dy_sobel_kernel();
+ test_dy_scharr_kernel();
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_processing/threshold_binary.cpp b/src/boost/libs/gil/test/core/image_processing/threshold_binary.cpp
new file mode 100644
index 000000000..098cfc062
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_processing/threshold_binary.cpp
@@ -0,0 +1,137 @@
+//
+// Copyright 2019 Miral Shah <miralshah2211@gmail.com>
+//
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+#include <boost/gil/gray.hpp>
+#include <boost/gil/algorithm.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/image_processing/threshold.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+namespace gil = boost::gil;
+
+int height = 4;
+int width = 4;
+
+gil::gray8_image_t original_gray(width, height), threshold_gray(width, height),
+expected_gray(width, height);
+
+gil::rgb8_image_t original_rgb(width, height), threshold_rgb(width, height),
+expected_rgb(width, height);
+
+
+void fill_original_gray()
+{
+ //filling original_gray view's upper half part with gray pixels of value 50
+ //filling original_gray view's lower half part with gray pixels of value 150
+ gil::fill_pixels(gil::subimage_view(gil::view(original_gray), 0, 0, original_gray.width(),
+ original_gray.height() / 2), gil::gray8_pixel_t(50));
+ gil::fill_pixels(gil::subimage_view(gil::view(original_gray), 0, original_gray.height() / 2,
+ original_gray.width(), original_gray.height() / 2), gil::gray8_pixel_t(150));
+}
+
+void fill_original_rgb()
+{
+ //filling original_rgb view's upper half part with rgb pixels of value 50, 155, 115
+ //filling original_rgb view's lower half part with rgb pixels of value 203, 9, 60
+ gil::fill_pixels(gil::subimage_view(gil::view(original_rgb), 0, 0, original_rgb.width(),
+ original_rgb.height() / 2), gil::rgb8_pixel_t(50, 155, 115));
+ gil::fill_pixels(gil::subimage_view(gil::view(original_rgb), 0, original_rgb.height() / 2,
+ original_rgb.width(), original_rgb.height() / 2), gil::rgb8_pixel_t(203, 9, 60));
+}
+
+void binary_gray_to_gray()
+{
+ //expected_gray view after thresholding of the original_gray view with threshold_gray value of 100
+ //filling expected_gray view's upper half part with gray pixels of value 0
+ //filling expected_gray view's lower half part with gray pixels of value 255
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_gray), 0, 0, original_gray.width(),
+ original_gray.height() / 2), gil::gray8_pixel_t(0));
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_gray), 0, original_gray.height() / 2,
+ original_gray.width(), original_gray.height() / 2), gil::gray8_pixel_t(255));
+
+ gil::threshold_binary(gil::view(original_gray), gil::view(threshold_gray), 100);
+
+ //comparing threshold_gray view generated by the function with the expected_gray view
+ BOOST_TEST(gil::equal_pixels(gil::view(threshold_gray), gil::view(expected_gray)));
+}
+
+void binary_inverse_gray_to_gray()
+{
+ //expected_gray view after thresholding of the original_gray view with threshold_gray value of 100
+ //filling expected_gray view's upper half part with gray pixels of value 200
+ //filling expected_gray view's lower half part with gray pixels of value 0
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_gray), 0, 0, original_gray.width(),
+ original_gray.height() / 2), gil::gray8_pixel_t(200));
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_gray), 0, original_gray.height() / 2,
+ original_gray.width(), original_gray.height() / 2), gil::gray8_pixel_t(0));
+
+ gil::threshold_binary
+ (
+ gil::view(original_gray),
+ gil::view(threshold_gray),
+ 100,
+ 200,
+ gil::threshold_direction::inverse
+ );
+
+ //comparing threshold_gray view generated by the function with the expected_gray view
+ BOOST_TEST(gil::equal_pixels(gil::view(threshold_gray), gil::view(expected_gray)));
+}
+
+void binary_rgb_to_rgb()
+{
+ //expected_rgb view after thresholding of the original_rgb view with threshold value of 100
+ //filling expected_rgb view's upper half part with rgb pixels of value 0, 165, 165
+ //filling expected_rgb view's lower half part with rgb pixels of value 165, 0, 0
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_rgb), 0, 0, original_rgb.width(),
+ original_rgb.height() / 2), gil::rgb8_pixel_t(0, 165, 165));
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_rgb), 0, original_rgb.height() / 2,
+ original_rgb.width(), original_rgb.height() / 2), gil::rgb8_pixel_t(165, 0, 0));
+
+ gil::threshold_binary(gil::view(original_rgb), gil::view(threshold_rgb), 100, 165);
+
+ //comparing threshold_rgb view generated by the function with the expected_rgb view
+ BOOST_TEST(gil::equal_pixels(gil::view(threshold_rgb), gil::view(expected_rgb)));
+}
+
+void binary_inverse_rgb_to_rgb()
+{
+ //expected_rgb view after thresholding of the original_rgb view with threshold value of 100
+ //filling expected_rgb view's upper half part with rgb pixels of value 90, 0, 0
+ //filling expected_rgb view's lower half part with rgb pixels of value 0, 90, 90
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_rgb), 0, 0, original_rgb.width(),
+ original_rgb.height() / 2), gil::rgb8_pixel_t(90, 0, 0));
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_rgb), 0, original_rgb.height() / 2,
+ original_rgb.width(), original_rgb.height() / 2), gil::rgb8_pixel_t(0, 90, 90));
+
+ gil::threshold_binary
+ (
+ gil::view(original_rgb),
+ gil::view(threshold_rgb),
+ 100,
+ 90,
+ gil::threshold_direction::inverse
+ );
+
+ //comparing threshold_rgb view generated by the function with the expected_rgb view
+ BOOST_TEST(gil::equal_pixels(gil::view(threshold_rgb), gil::view(expected_rgb)));
+}
+
+
+int main()
+{
+ fill_original_gray();
+ fill_original_rgb();
+
+ binary_gray_to_gray();
+ binary_inverse_gray_to_gray();
+ binary_rgb_to_rgb();
+ binary_inverse_rgb_to_rgb();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_processing/threshold_color_spaces_not_compatible_fail.cpp b/src/boost/libs/gil/test/core/image_processing/threshold_color_spaces_not_compatible_fail.cpp
new file mode 100644
index 000000000..3facaf19b
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_processing/threshold_color_spaces_not_compatible_fail.cpp
@@ -0,0 +1,25 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/image_processing/threshold.hpp>
+
+namespace gil = boost::gil;
+
+int main()
+{
+ // Source and destination views must have pixels with the same (compatible) color space
+ {
+ gil::rgb8_image_t src;
+ gil::gray8_image_t dst;
+ gil::threshold_binary(const_view(src), view(dst), 0, 255);
+ }
+ {
+ gil::gray8_image_t src;
+ gil::rgb8_image_t dst;
+ gil::threshold_binary(const_view(src), view(dst), 0, 255);
+ }
+}
diff --git a/src/boost/libs/gil/test/core/image_processing/threshold_otsu.cpp b/src/boost/libs/gil/test/core/image_processing/threshold_otsu.cpp
new file mode 100644
index 000000000..f1eaf849e
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_processing/threshold_otsu.cpp
@@ -0,0 +1,118 @@
+//
+// Copyright 2019 Miral Shah <miralshah2211@gmail.com>
+//
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+#include <boost/gil/algorithm.hpp>
+#include <boost/gil/gray.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/image_processing/threshold.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+namespace gil = boost::gil;
+
+int height = 2;
+int width = 2;
+
+gil::gray8_image_t original_gray(width, height), otsu_gray(width, height),
+expected_gray(width, height);
+
+gil::rgb8_image_t original_rgb(width, height), otsu_rgb(width, height), expected_rgb(width, height);
+
+void fill_gray()
+{
+ gil::view(original_gray)(0, 0) = gil::gray8_pixel_t(56);
+ gil::view(original_gray)(1, 0) = gil::gray8_pixel_t(89);
+ gil::view(original_gray)(0, 1) = gil::gray8_pixel_t(206);
+ gil::view(original_gray)(1, 1) = gil::gray8_pixel_t(139);
+}
+
+void fill_rgb()
+{
+ gil::view(original_rgb)(0, 0) = gil::rgb8_pixel_t(15, 158, 150);
+ gil::view(original_rgb)(1, 0) = gil::rgb8_pixel_t(200, 175, 150);
+ gil::view(original_rgb)(0, 1) = gil::rgb8_pixel_t(230, 170, 150);
+ gil::view(original_rgb)(1, 1) = gil::rgb8_pixel_t(25, 248, 150);
+}
+
+void test_gray_regular()
+{
+ gil::view(expected_gray)(0, 0) = gil::gray8_pixel_t(0);
+ gil::view(expected_gray)(1, 0) = gil::gray8_pixel_t(0);
+ gil::view(expected_gray)(0, 1) = gil::gray8_pixel_t(255);
+ gil::view(expected_gray)(1, 1) = gil::gray8_pixel_t(255);
+
+ gil::threshold_optimal(
+ gil::view(original_gray),
+ gil::view(otsu_gray),
+ gil::threshold_optimal_value::otsu
+ );
+
+ BOOST_TEST(gil::equal_pixels(gil::view(otsu_gray), gil::view(expected_gray)));
+}
+
+void test_gray_inverse()
+{
+ gil::view(expected_gray)(0, 0) = gil::gray8_pixel_t(255);
+ gil::view(expected_gray)(1, 0) = gil::gray8_pixel_t(255);
+ gil::view(expected_gray)(0, 1) = gil::gray8_pixel_t(0);
+ gil::view(expected_gray)(1, 1) = gil::gray8_pixel_t(0);
+
+ gil::threshold_optimal(
+ gil::view(original_gray),
+ gil::view(otsu_gray),
+ gil::threshold_optimal_value::otsu,
+ gil::threshold_direction::inverse
+ );
+
+ BOOST_TEST(gil::equal_pixels(gil::view(otsu_gray), gil::view(expected_gray)));
+}
+
+void test_rgb_regular()
+{
+ gil::view(expected_rgb)(0, 0) = gil::rgb8_pixel_t(0, 0, 255);
+ gil::view(expected_rgb)(1, 0) = gil::rgb8_pixel_t(255, 0, 255);
+ gil::view(expected_rgb)(0, 1) = gil::rgb8_pixel_t(255, 0, 255);
+ gil::view(expected_rgb)(1, 1) = gil::rgb8_pixel_t(0, 255, 255);
+
+ gil::threshold_optimal(
+ gil::view(original_rgb),
+ gil::view(otsu_rgb),
+ gil::threshold_optimal_value::otsu
+ );
+
+ BOOST_TEST(gil::equal_pixels(gil::view(otsu_rgb), gil::view(expected_rgb)));
+}
+
+void test_rgb_inverse()
+{
+ gil::view(expected_rgb)(0, 0) = gil::rgb8_pixel_t(255, 255, 0);
+ gil::view(expected_rgb)(1, 0) = gil::rgb8_pixel_t(0, 255, 0);
+ gil::view(expected_rgb)(0, 1) = gil::rgb8_pixel_t(0, 255, 0);
+ gil::view(expected_rgb)(1, 1) = gil::rgb8_pixel_t(255, 0, 0);
+
+ gil::threshold_optimal(
+ gil::view(original_rgb),
+ gil::view(otsu_rgb),
+ gil::threshold_optimal_value::otsu,
+ gil::threshold_direction::inverse
+ );
+
+ BOOST_TEST(gil::equal_pixels(gil::view(otsu_rgb), gil::view(expected_rgb)));
+}
+
+int main()
+{
+ fill_gray();
+ fill_rgb();
+
+ test_gray_regular();
+ test_gray_inverse();
+ test_rgb_regular();
+ test_rgb_inverse();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_processing/threshold_truncate.cpp b/src/boost/libs/gil/test/core/image_processing/threshold_truncate.cpp
new file mode 100644
index 000000000..18266dec6
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_processing/threshold_truncate.cpp
@@ -0,0 +1,233 @@
+//
+// Copyright 2019 Miral Shah <miralshah2211@gmail.com>
+//
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+#include <boost/gil/algorithm.hpp>
+#include <boost/gil/gray.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/image_processing/threshold.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+namespace gil = boost::gil;
+
+int height = 4;
+int width = 4;
+
+gil::gray8_image_t original_gray(width, height), threshold_gray(width, height),
+expected_gray(width, height);
+
+gil::rgb8_image_t original_rgb(width, height), threshold_rgb(width, height),
+expected_rgb(width, height);
+
+void fill_original_gray()
+{
+ //filling original view's upper half part with gray pixels of value 50
+ //filling original view's lower half part with gray pixels of value 150
+ gil::fill_pixels(gil::subimage_view(gil::view(original_gray), 0, 0, original_gray.width(),
+ original_gray.height() / 2), gil::gray8_pixel_t(50));
+ gil::fill_pixels(gil::subimage_view(gil::view(original_gray), 0, original_gray.height() / 2,
+ original_gray.width(), original_gray.height() / 2), gil::gray8_pixel_t(150));
+}
+
+void fill_original_rgb()
+{
+ //filling original_rgb view's upper half part with rgb pixels of value 50, 85, 135
+ //filling original_rgb view's lower half part with rgb pixels of value 150, 205, 106
+ gil::fill_pixels(gil::subimage_view(gil::view(original_rgb), 0, 0, original_rgb.width(),
+ original_rgb.height() / 2), gil::rgb8_pixel_t(50, 85, 135));
+ gil::fill_pixels(gil::subimage_view(gil::view(original_rgb), 0, original_rgb.height() / 2,
+ original_rgb.width(), original_rgb.height() / 2), gil::rgb8_pixel_t(150, 205, 106));
+}
+
+void threshold_gray_to_gray()
+{
+ //expected view after thresholding of the original view with threshold value of 100
+ //filling expected view's upper half part with gray pixels of value 50
+ //filling expected view's lower half part with gray pixels of value 100
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_gray), 0, 0, original_gray.width(),
+ original_gray.height() / 2), gil::gray8_pixel_t(50));
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_gray), 0, original_gray.height() / 2,
+ original_gray.width(), original_gray.height() / 2), gil::gray8_pixel_t(100));
+
+ gil::threshold_truncate(gil::view(original_gray), gil::view(threshold_gray), 100);
+
+ //comparing threshold view generated by the function with the expected view
+ BOOST_TEST(gil::equal_pixels(gil::view(threshold_gray), gil::view(expected_gray)));
+}
+
+void threshold_inverse_gray_to_gray()
+{
+ //expected view after thresholding of the original view with threshold value of 100
+ //filling expected view's upper half part with gray pixels of value 100
+ //filling expected view's lower half part with gray pixels of value 150
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_gray), 0, 0, original_gray.width(),
+ original_gray.height() / 2), gil::gray8_pixel_t(100));
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_gray), 0, original_gray.height() / 2,
+ original_gray.width(), original_gray.height() / 2), gil::gray8_pixel_t(150));
+
+ gil::threshold_truncate
+ (
+ gil::view(original_gray),
+ gil::view(threshold_gray),
+ 100,
+ gil::threshold_truncate_mode::threshold,
+ gil::threshold_direction::inverse
+ );
+
+ //comparing threshold view generated by the function with the expected view
+ BOOST_TEST(gil::equal_pixels(gil::view(threshold_gray), gil::view(expected_gray)));
+}
+
+void zero_gray_to_gray()
+{
+ //expected view after thresholding of the original view with threshold value of 100
+ //filling expected view's upper half part with gray pixels of value 0
+ //filling expected view's lower half part with gray pixels of value 150
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_gray), 0, 0, original_gray.width(),
+ original_gray.height() / 2), gil::gray8_pixel_t(0));
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_gray), 0, original_gray.height() / 2,
+ original_gray.width(), original_gray.height() / 2), gil::gray8_pixel_t(150));
+
+ gil::threshold_truncate
+ (
+ gil::view(original_gray),
+ gil::view(threshold_gray),
+ 100,
+ gil::threshold_truncate_mode::zero,
+ gil::threshold_direction::regular
+ );
+
+ //comparing threshold view generated by the function with the expected view
+ BOOST_TEST(gil::equal_pixels(gil::view(threshold_gray), gil::view(expected_gray)));
+}
+
+void zero_inverse_gray_to_gray()
+{
+ //expected view after thresholding of the original view with threshold value of 100
+ //filling expected view's upper half part with gray pixels of value 50
+ //filling expected view's lower half part with gray pixels of value 0
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_gray), 0, 0, original_gray.width(),
+ original_gray.height() / 2), gil::gray8_pixel_t(50));
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_gray), 0, original_gray.height() / 2,
+ original_gray.width(), original_gray.height() / 2), gil::gray8_pixel_t(0));
+
+ gil::threshold_truncate
+ (
+ gil::view(original_gray),
+ gil::view(threshold_gray),
+ 100,
+ gil::threshold_truncate_mode::zero,
+ gil::threshold_direction::inverse
+ );
+
+ //comparing threshold view generated by the function with the expected view
+ BOOST_TEST(gil::equal_pixels(gil::view(threshold_gray), gil::view(expected_gray)));
+}
+
+void threshold_rgb_to_rgb()
+{
+ //expected view after thresholding of the original view with threshold value of 100
+ //filling expected_rgb view's upper half part with rgb pixels of value 50
+ //filling expected_rgb view's lower half part with rgb pixels of value 100
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_rgb), 0, 0, original_rgb.width(),
+ original_rgb.height() / 2), gil::rgb8_pixel_t(50, 85, 100));
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_rgb), 0, original_rgb.height() / 2,
+ original_rgb.width(), original_rgb.height() / 2), gil::rgb8_pixel_t(100, 100, 100));
+
+ gil::threshold_truncate(gil::view(original_rgb), gil::view(threshold_rgb), 100);
+
+ //comparing threshold_rgb view generated by the function with the expected_rgb view
+ BOOST_TEST(gil::equal_pixels(gil::view(threshold_rgb), gil::view(expected_rgb)));
+}
+
+void threshold_inverse_rgb_to_rgb()
+{
+ //expected view after thresholding of the original view with threshold value of 100
+ //filling expected_rgb view's upper half part with rgb pixels of value 103, 59, 246
+ //filling expected_rgb view's lower half part with rgb pixels of value 150
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_rgb), 0, 0, original_rgb.width(),
+ original_rgb.height() / 2), gil::rgb8_pixel_t(100, 100, 135));
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_rgb), 0, original_rgb.height() / 2,
+ original_rgb.width(), original_rgb.height() / 2), gil::rgb8_pixel_t(150, 205, 106));
+
+ gil::threshold_truncate
+ (
+ gil::view(original_rgb),
+ gil::view(threshold_rgb),
+ 100,
+ gil::threshold_truncate_mode::threshold,
+ gil::threshold_direction::inverse
+ );
+
+ //comparing threshold_rgb view generated by the function with the expected_rgb view
+ BOOST_TEST(gil::equal_pixels(gil::view(threshold_rgb), gil::view(expected_rgb)));
+}
+
+void zero_rgb_to_rgb()
+{
+ //expected view after thresholding of the original view with threshold value of 100
+ //filling expected_rgb view's upper half part with rgb pixels of value 0
+ //filling expected_rgb view's lower half part with rgb pixels of value 150
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_rgb), 0, 0, original_rgb.width(),
+ original_rgb.height() / 2), gil::rgb8_pixel_t(0, 0, 135));
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_rgb), 0, original_rgb.height() / 2,
+ original_rgb.width(), original_rgb.height() / 2), gil::rgb8_pixel_t(150, 205, 106));
+
+ gil::threshold_truncate
+ (
+ gil::view(original_rgb),
+ gil::view(threshold_rgb),
+ 100,
+ gil::threshold_truncate_mode::zero,
+ gil::threshold_direction::regular
+ );
+
+ //comparing threshold_rgb view generated by the function with the expected_rgb view
+ BOOST_TEST(gil::equal_pixels(gil::view(threshold_rgb), gil::view(expected_rgb)));
+}
+
+void zero_inverse_rgb_to_rgb()
+{
+ //expected view after thresholding of the original view with threshold value of 100
+ //filling expected_rgb view's upper half part with rgb pixels of value 50
+ //filling expected_rgb view's lower half part with rgb pixels of value 0
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_rgb), 0, 0, original_rgb.width(),
+ original_rgb.height() / 2), gil::rgb8_pixel_t(50, 85, 0));
+ gil::fill_pixels(gil::subimage_view(gil::view(expected_rgb), 0, original_rgb.height() / 2,
+ original_rgb.width(), original_rgb.height() / 2), gil::rgb8_pixel_t(0, 0, 0));
+
+ gil::threshold_truncate
+ (
+ gil::view(original_rgb),
+ gil::view(threshold_rgb),
+ 100,
+ gil::threshold_truncate_mode::zero,
+ gil::threshold_direction::inverse
+ );
+
+ //comparing threshold_rgb view generated by the function with the expected_rgb view
+ BOOST_TEST(gil::equal_pixels(gil::view(threshold_rgb), gil::view(expected_rgb)));
+}
+
+
+int main()
+{
+ fill_original_gray();
+ fill_original_rgb();
+
+ threshold_gray_to_gray();
+ threshold_inverse_gray_to_gray();
+ zero_gray_to_gray();
+ zero_inverse_gray_to_gray();
+
+ threshold_rgb_to_rgb();
+ threshold_inverse_rgb_to_rgb();
+ zero_rgb_to_rgb();
+ zero_inverse_rgb_to_rgb();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/CMakeLists.txt b/src/boost/libs/gil/test/core/image_view/CMakeLists.txt
new file mode 100644
index 000000000..e9983da94
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/CMakeLists.txt
@@ -0,0 +1,43 @@
+#
+# Copyright (c) 2018 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+foreach(_name
+ axis_iterator
+ collection
+ concepts
+ derived_view_type
+ dynamic_step
+ is_planar
+ iterator
+ planar_rgba_view
+ reverse_iterator
+ subimage_view
+ view_is_basic
+ view_is_mutable
+ view_is_step
+ view_type
+ x_iterator
+ xy_locator
+ y_iterator
+ view_type_from_pixel)
+ set(_test t_core_image_view_${_name})
+ set(_target test_core_image_view_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
diff --git a/src/boost/libs/gil/test/core/image_view/Jamfile b/src/boost/libs/gil/test/core/image_view/Jamfile
new file mode 100644
index 000000000..4b654b92c
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/Jamfile
@@ -0,0 +1,29 @@
+# Boost.GIL (Generic Image Library) - tests
+#
+# Copyright (c) 2018 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+compile concepts.cpp ;
+compile derived_view_type.cpp ;
+compile dynamic_step.cpp ;
+compile is_planar.cpp ;
+compile view_is_basic.cpp ;
+compile view_is_mutable.cpp ;
+compile view_is_step.cpp ;
+compile view_type.cpp ;
+compile view_type_from_pixel.cpp ;
+
+run axis_iterator.cpp ;
+run collection.cpp ;
+run iterator.cpp ;
+run planar_rgba_view.cpp ;
+run reverse_iterator.cpp ;
+run subimage_view.cpp ;
+run x_iterator.cpp ;
+run xy_locator.cpp ;
+run y_iterator.cpp ;
diff --git a/src/boost/libs/gil/test/core/image_view/axis_iterator.cpp b/src/boost/libs/gil/test/core/image_view/axis_iterator.cpp
new file mode 100644
index 000000000..6b7c68813
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/axis_iterator.cpp
@@ -0,0 +1,91 @@
+//
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/image.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "test_fixture.hpp"
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+void test_axis_0()
+{
+ {
+ gil::gray8_image_t image = fixture::make_image_gray8();
+ auto view = gil::view(image);
+ // 0,0
+ auto axit = view.axis_iterator<0>(gil::point_t{0, 0});
+ BOOST_TEST_EQ(*axit, fixture::gray8_draw_pixel);
+ BOOST_TEST(axit == view.row_begin(0));
+ // 0,1
+ ++axit;
+ BOOST_TEST_EQ(*axit, fixture::gray8_back_pixel);
+ // 1,1
+ ++axit;
+ BOOST_TEST_EQ(*axit, fixture::gray8_back_pixel);
+ BOOST_TEST(axit == view.row_end(0));
+ BOOST_TEST(axit == view.row_begin(1));
+ // 1,1
+ ++axit;
+ BOOST_TEST_EQ(*axit, fixture::gray8_draw_pixel);
+ // 2,0 - pass the end
+ ++axit;
+ BOOST_TEST(axit == view.row_end(1));
+ }
+ {
+ gil::rgb8_image_t image = fixture::make_image_rgb8();
+ auto view = gil::view(image);
+ auto axit = view.axis_iterator<0>(gil::point_t{0, 0});
+ BOOST_TEST(axit == view.row_begin(0));
+ BOOST_TEST_EQ(*axit, fixture::rgb8_draw_pixel);
+ // 0,1
+ ++axit;
+ BOOST_TEST_EQ(*axit, fixture::rgb8_back_pixel);
+ // 1,1
+ ++axit;
+ BOOST_TEST(axit == view.row_end(0));
+ BOOST_TEST_EQ(*axit, fixture::rgb8_back_pixel);
+ BOOST_TEST(axit == view.row_begin(1));
+ // 1,1
+ ++axit;
+ BOOST_TEST_EQ(*axit, fixture::rgb8_draw_pixel);
+ // 2,0 - pass the end
+ ++axit;
+ BOOST_TEST(axit == view.row_end(1));
+ }
+}
+
+void test_axis_1()
+{
+ {
+ gil::gray8_image_t image = fixture::make_image_gray8();
+ auto view = gil::view(image);
+ // 0,0
+ auto axit = view.axis_iterator<1>(gil::point_t{0, 0});
+ BOOST_TEST(axit == view.col_begin(0));
+ BOOST_TEST_EQ(*axit, fixture::gray8_draw_pixel);
+ // 0,1
+ ++axit;
+ BOOST_TEST_EQ(*axit, fixture::gray8_back_pixel);
+ // 0,2
+ ++axit;
+ BOOST_TEST(axit == view.col_end(0));
+ }
+}
+
+int main()
+{
+ test_axis_0();
+ test_axis_1();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/collection.cpp b/src/boost/libs/gil/test/core/image_view/collection.cpp
new file mode 100644
index 000000000..113488805
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/collection.cpp
@@ -0,0 +1,119 @@
+//
+// Copyright 2018-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/image.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <iterator>
+
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+
+namespace
+{
+gil::gray8_pixel_t const gray128(128);
+gil::gray8_pixel_t const gray255(255);
+} // unnamed namespace
+
+// Collection
+
+void test_begin()
+{
+ gil::gray8_image_t image(2, 2, gray255);
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.begin(), gray255);
+}
+
+void test_end()
+{
+ gil::gray8_image_t::view_t view;
+ BOOST_TEST(view.begin() == view.end());
+}
+
+void test_empty()
+{
+ gil::gray8_image_t::view_t view;
+ BOOST_TEST(view.empty());
+
+ gil::gray8_image_t image(2, 2);
+ view = gil::view(image);
+ BOOST_TEST(!view.empty());
+}
+
+void test_size()
+{
+ gil::gray8_image_t::view_t view;
+ BOOST_TEST_EQ(view.size(), 0);
+
+ gil::gray8_image_t image(2, 2);
+ view = gil::view(image);
+ BOOST_TEST_EQ(view.size(), 4);
+}
+
+void test_swap()
+{
+ gil::gray8_image_t::view_t view1;
+ gil::gray8_image_t::view_t view2;
+
+ gil::gray8_image_t image(2, 2);
+ view1 = gil::view(image);
+ view1.swap(view2);
+
+ BOOST_TEST(view1.empty());
+ BOOST_TEST(!view2.empty());
+}
+
+// ForwardCollection
+
+void test_back()
+{
+ gil::gray8_image_t image(2, 2, gray255);
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(view.back(), gray255);
+}
+
+void test_front()
+{
+ gil::gray8_image_t image(2, 2, gray255);
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(view.front(), gray255);
+}
+
+// ReversibleCollection
+
+void test_rbegin()
+{
+ gil::gray8_image_t image(2, 2, gray255);
+ auto view = gil::view(image);
+ view(1,1) = gray128;
+ BOOST_TEST_EQ(*view.rbegin(), gray128);
+}
+
+void test_rend()
+{
+ gil::gray8_image_t::view_t view;
+ BOOST_TEST(view.rbegin() == view.rend());
+}
+
+int main()
+{
+ test_begin();
+ test_end();
+ test_empty();
+ test_size();
+ test_swap();
+ test_back();
+ test_front();
+ test_rbegin();
+ test_rend();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/concepts.cpp b/src/boost/libs/gil/test/core/image_view/concepts.cpp
new file mode 100644
index 000000000..480e9e86f
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/concepts.cpp
@@ -0,0 +1,96 @@
+//
+// Copyright 2018 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+// FIXME: Avoid Clang's flooding of non-disableable warnings like:
+// "T does not declare any constructor to initialize its non-modifiable members"
+// when compiling with concepts check enabled.
+// See https://bugs.llvm.org/show_bug.cgi?id=41759
+#if !defined(BOOST_GIL_USE_CONCEPT_CHECK) && !defined(__clang__)
+#error Compile with BOOST_GIL_USE_CONCEPT_CHECK defined
+#endif
+// FIXME: There are missing headers internally, leading to incomplete types
+#if 0
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/planar_pixel_reference.hpp>
+#include <boost/gil/typedefs.hpp>
+#else
+#include <boost/gil.hpp>
+#endif
+
+namespace gil = boost::gil;
+
+template <typename View>
+void test_view()
+{
+ boost::function_requires<gil::ImageViewConcept<View>>();
+ boost::function_requires<gil::CollectionImageViewConcept<View>>();
+ boost::function_requires<gil::ForwardCollectionImageViewConcept<View>>();
+ boost::function_requires<gil::ReversibleCollectionImageViewConcept<View>>();
+}
+
+template <typename View>
+void test_view_planar()
+{
+ boost::function_requires<gil::ImageViewConcept<View>>();
+ boost::function_requires<gil::CollectionImageViewConcept<View>>();
+}
+
+int main()
+{
+ test_view<gil::gray8_view_t>();
+ test_view<gil::gray8c_view_t>();
+
+ test_view<gil::abgr8_view_t>();
+ test_view<gil::abgr8_step_view_t>();
+ test_view<gil::abgr8c_view_t>();
+ test_view<gil::abgr8c_step_view_t>();
+
+ test_view<gil::argb8_view_t>();
+ test_view<gil::argb8_step_view_t>();
+ test_view<gil::argb8c_view_t>();
+ test_view<gil::argb8c_step_view_t>();
+
+ test_view<gil::bgr8_view_t>();
+ test_view<gil::bgr8_step_view_t>();
+ test_view<gil::bgr8c_view_t>();
+ test_view<gil::bgr8c_step_view_t>();
+
+ test_view<gil::bgra8_view_t>();
+ test_view<gil::bgra8_step_view_t>();
+ test_view<gil::bgra8c_view_t>();
+ test_view<gil::bgra8c_step_view_t>();
+
+ test_view<gil::rgb8_view_t>();
+ test_view<gil::rgb8_step_view_t>();
+ test_view<gil::rgb8c_view_t>();
+ test_view<gil::rgb8c_step_view_t>();
+ test_view_planar<gil::rgb8_planar_view_t>();
+ test_view_planar<gil::rgb8_planar_step_view_t>();
+ test_view_planar<gil::rgb8c_planar_view_t>();
+ test_view_planar<gil::rgb8c_planar_step_view_t>();
+
+ test_view<gil::rgba8_view_t>();
+ test_view<gil::rgba8_step_view_t>();
+ test_view<gil::rgba8c_view_t>();
+ test_view<gil::rgba8c_step_view_t>();
+ test_view_planar<gil::rgba8_planar_view_t>();
+ test_view_planar<gil::rgba8_planar_step_view_t>();
+ test_view_planar<gil::rgba8c_planar_view_t>();
+ test_view_planar<gil::rgba8c_planar_step_view_t>();
+
+ test_view<gil::cmyk8_view_t>();
+ test_view<gil::cmyk8_step_view_t>();
+ test_view<gil::cmyk8c_view_t>();
+ test_view<gil::cmyk8c_step_view_t>();
+
+ test_view_planar<gil::cmyk8_planar_view_t>();
+ test_view_planar<gil::cmyk8_planar_step_view_t>();
+ test_view_planar<gil::cmyk8c_planar_view_t>();
+ test_view_planar<gil::cmyk8c_planar_step_view_t>();
+
+ return 0;
+}
diff --git a/src/boost/libs/gil/test/core/image_view/derived_view_type.cpp b/src/boost/libs/gil/test/core/image_view/derived_view_type.cpp
new file mode 100644
index 000000000..0ec59ffc9
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/derived_view_type.cpp
@@ -0,0 +1,45 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+int main()
+{
+
+ static_assert(std::is_same
+ <
+ gil::derived_view_type<gil::cmyk8c_planar_step_view_t>::type,
+ gil::cmyk8c_planar_step_view_t
+ >::value, "derived_view_type should be cmyk8c_planar_step_view_t");
+
+ static_assert(std::is_same
+ <
+ gil::derived_view_type
+ <
+ gil::cmyk8c_planar_step_view_t, std::uint16_t, gil::rgb_layout_t
+ >::type,
+ gil::rgb16c_planar_step_view_t
+ >::value, "derived_view_type should be rgb16c_planar_step_view_t");
+
+ static_assert(std::is_same
+ <
+ gil::derived_view_type
+ <
+ gil::cmyk8c_planar_step_view_t,
+ boost::use_default,
+ gil::rgb_layout_t,
+ std::false_type,
+ boost::use_default,
+ std::false_type
+ >::type,
+ gil::rgb8c_step_view_t
+ >::value, "derived_view_type should be rgb8c_step_view_t");
+}
diff --git a/src/boost/libs/gil/test/core/image_view/dynamic_step.cpp b/src/boost/libs/gil/test/core/image_view/dynamic_step.cpp
new file mode 100644
index 000000000..f04b135f8
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/dynamic_step.cpp
@@ -0,0 +1,133 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/dynamic_step.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/typedefs.hpp>
+
+namespace gil = boost::gil;
+
+template <typename View>
+void test()
+{
+ static_assert(
+ gil::view_is_basic
+ <
+ typename gil::dynamic_x_step_type<View>::type
+ >::value, "view does not model HasDynamicXStepTypeConcept");
+
+ static_assert(
+ gil::view_is_basic
+ <
+ typename gil::dynamic_y_step_type<View>::type
+ >::value, "view does not model HasDynamicYStepTypeConcept");
+}
+
+int main()
+{
+ test<gil::gray8_view_t>();
+ test<gil::gray8_step_view_t>();
+ test<gil::gray8c_view_t>();
+ test<gil::gray8c_step_view_t>();
+ test<gil::gray16_view_t>();
+ test<gil::gray16_step_view_t>();
+ test<gil::gray16c_view_t>();
+ test<gil::gray16c_step_view_t>();
+ test<gil::gray32_view_t>();
+ test<gil::gray32_step_view_t>();
+ test<gil::gray32c_view_t>();
+ test<gil::gray32c_step_view_t>();
+ test<gil::gray32f_view_t>();
+ test<gil::gray32f_step_view_t>();
+
+ test<gil::abgr8_view_t>();
+ test<gil::abgr8_step_view_t>();
+ test<gil::abgr16_view_t>();
+ test<gil::abgr16_step_view_t>();
+ test<gil::abgr32_view_t>();
+ test<gil::abgr32_step_view_t>();
+ test<gil::abgr32f_view_t>();
+ test<gil::abgr32f_step_view_t>();
+
+ test<gil::argb8_view_t>();
+ test<gil::argb8_step_view_t>();
+ test<gil::argb16_view_t>();
+ test<gil::argb16_step_view_t>();
+ test<gil::argb32_view_t>();
+ test<gil::argb32_step_view_t>();
+ test<gil::argb32f_view_t>();
+ test<gil::argb32f_step_view_t>();
+
+ test<gil::bgr8_view_t>();
+ test<gil::bgr8_step_view_t>();
+ test<gil::bgr16_view_t>();
+ test<gil::bgr16_step_view_t>();
+ test<gil::bgr32_view_t>();
+ test<gil::bgr32_step_view_t>();
+ test<gil::bgr32f_view_t>();
+ test<gil::bgr32f_step_view_t>();
+
+ test<gil::bgra8_view_t>();
+ test<gil::bgra8_step_view_t>();
+ test<gil::bgra16_view_t>();
+ test<gil::bgra16_step_view_t>();
+ test<gil::bgra32_view_t>();
+ test<gil::bgra32_step_view_t>();
+ test<gil::bgra32f_view_t>();
+ test<gil::bgra32f_step_view_t>();
+
+ test<gil::rgb8_view_t>();
+ test<gil::rgb8_step_view_t>();
+ test<gil::rgb8_planar_view_t>();
+ test<gil::rgb8_planar_step_view_t>();
+ test<gil::rgb16_view_t>();
+ test<gil::rgb16_step_view_t>();
+ test<gil::rgb16_planar_view_t>();
+ test<gil::rgb16_planar_step_view_t>();
+ test<gil::rgb32_view_t>();
+ test<gil::rgb32_step_view_t>();
+ test<gil::rgb32_planar_view_t>();
+ test<gil::rgb32_planar_step_view_t>();
+ test<gil::rgb32f_view_t>();
+ test<gil::rgb32f_step_view_t>();
+ test<gil::rgb32f_planar_view_t>();
+ test<gil::rgb32f_planar_step_view_t>();
+
+ test<gil::rgba8_view_t>();
+ test<gil::rgba8_step_view_t>();
+ test<gil::rgba8_planar_view_t>();
+ test<gil::rgba8_planar_step_view_t>();
+ test<gil::rgba16_view_t>();
+ test<gil::rgba16_step_view_t>();
+ test<gil::rgba16_planar_view_t>();
+ test<gil::rgba16_planar_step_view_t>();
+ test<gil::rgba32_view_t>();
+ test<gil::rgba32_step_view_t>();
+ test<gil::rgba32_planar_view_t>();
+ test<gil::rgba32_planar_step_view_t>();
+ test<gil::rgba32f_view_t>();
+ test<gil::rgba32f_step_view_t>();
+ test<gil::rgba32f_planar_view_t>();
+ test<gil::rgba32f_planar_step_view_t>();
+
+ test<gil::cmyk8_view_t>();
+ test<gil::cmyk8_step_view_t>();
+ test<gil::cmyk8_planar_view_t>();
+ test<gil::cmyk8_planar_step_view_t>();
+ test<gil::cmyk16_view_t>();
+ test<gil::cmyk16_step_view_t>();
+ test<gil::cmyk16_planar_view_t>();
+ test<gil::cmyk16_planar_step_view_t>();
+ test<gil::cmyk32_view_t>();
+ test<gil::cmyk32_step_view_t>();
+ test<gil::cmyk32_planar_view_t>();
+ test<gil::cmyk32_planar_step_view_t>();
+ test<gil::cmyk32f_view_t>();
+ test<gil::cmyk32f_step_view_t>();
+ test<gil::cmyk32f_planar_view_t>();
+ test<gil::cmyk32f_planar_step_view_t>();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/is_planar.cpp b/src/boost/libs/gil/test/core/image_view/is_planar.cpp
new file mode 100644
index 000000000..f7f6c3797
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/is_planar.cpp
@@ -0,0 +1,77 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+
+namespace gil = boost::gil;
+
+template <typename View>
+void test_is_planar()
+{
+ static_assert(gil::is_planar<View>::value, "view should be planar");
+}
+
+template <typename View>
+void test_is_planar_not()
+{
+ static_assert(!gil::is_planar<View>::value, "view should not be planar");
+}
+
+
+int main()
+{
+ test_is_planar_not<gil::gray8_view_t>();
+ test_is_planar_not<gil::gray8c_view_t>();
+
+ test_is_planar_not<gil::abgr8_view_t>();
+ test_is_planar_not<gil::abgr8_step_view_t>();
+ test_is_planar_not<gil::abgr8c_view_t>();
+ test_is_planar_not<gil::abgr8c_step_view_t>();
+
+ test_is_planar_not<gil::argb8_view_t>();
+ test_is_planar_not<gil::argb8_step_view_t>();
+ test_is_planar_not<gil::argb8c_view_t>();
+ test_is_planar_not<gil::argb8c_step_view_t>();
+
+ test_is_planar_not<gil::bgr8_view_t>();
+ test_is_planar_not<gil::bgr8_step_view_t>();
+ test_is_planar_not<gil::bgr8c_view_t>();
+ test_is_planar_not<gil::bgr8c_step_view_t>();
+
+ test_is_planar_not<gil::bgra8_view_t>();
+ test_is_planar_not<gil::bgra8_step_view_t>();
+ test_is_planar_not<gil::bgra8c_view_t>();
+ test_is_planar_not<gil::bgra8c_step_view_t>();
+
+ test_is_planar_not<gil::rgb8_view_t>();
+ test_is_planar_not<gil::rgb8_step_view_t>();
+ test_is_planar_not<gil::rgb8c_view_t>();
+ test_is_planar_not<gil::rgb8c_step_view_t>();
+ test_is_planar<gil::rgb8_planar_view_t>();
+ test_is_planar<gil::rgb8_planar_step_view_t>();
+ test_is_planar<gil::rgb8c_planar_view_t>();
+ test_is_planar<gil::rgb8c_planar_step_view_t>();
+
+ test_is_planar_not<gil::rgba8_view_t>();
+ test_is_planar_not<gil::rgba8_step_view_t>();
+ test_is_planar_not<gil::rgba8c_view_t>();
+ test_is_planar_not<gil::rgba8c_step_view_t>();
+ test_is_planar<gil::rgba8_planar_view_t>();
+ test_is_planar<gil::rgba8_planar_step_view_t>();
+ test_is_planar<gil::rgba8c_planar_view_t>();
+ test_is_planar<gil::rgba8c_planar_step_view_t>();
+
+ test_is_planar_not<gil::cmyk8_view_t>();
+ test_is_planar_not<gil::cmyk8_step_view_t>();
+ test_is_planar_not<gil::cmyk8c_view_t>();
+ test_is_planar_not<gil::cmyk8c_step_view_t>();
+
+ test_is_planar<gil::cmyk8_planar_view_t>();
+ test_is_planar<gil::cmyk8_planar_step_view_t>();
+ test_is_planar<gil::cmyk8c_planar_view_t>();
+ test_is_planar<gil::cmyk8c_planar_step_view_t>();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/iterator.cpp b/src/boost/libs/gil/test/core/image_view/iterator.cpp
new file mode 100644
index 000000000..8b9cecd98
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/iterator.cpp
@@ -0,0 +1,95 @@
+//
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/image.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "test_fixture.hpp"
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+void test_begin()
+{
+ {
+ gil::gray8_image_t image = fixture::make_image_gray8();
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.begin(), fixture::gray8_draw_pixel);
+ }
+ {
+ gil::rgb8_image_t image = fixture::make_image_rgb8();
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.begin(), fixture::rgb8_draw_pixel);
+ }
+}
+
+void test_end()
+{
+ {
+ gil::gray8_image_t image;
+ auto view = gil::view(image);
+ BOOST_TEST(view.begin() == view.end());
+ }
+ {
+ gil::rgb8_image_t image;
+ auto view = gil::view(image);
+ BOOST_TEST(view.begin() == view.end());
+ }
+}
+
+void test_at()
+{
+ {
+ gil::gray8_image_t image = fixture::make_image_gray8();
+ auto view = gil::view(image);
+ // begin
+ BOOST_TEST_EQ(*view.at(0), fixture::gray8_draw_pixel);
+ BOOST_TEST_EQ(*view.at(1), fixture::gray8_back_pixel);
+ BOOST_TEST_EQ(*view.at(0, 0), fixture::gray8_draw_pixel);
+ BOOST_TEST_EQ(*view.at(0, 1), fixture::gray8_back_pixel);
+ BOOST_TEST_EQ(*view.at(gil::point_t{0, 0}), fixture::gray8_draw_pixel);
+ BOOST_TEST_EQ(*view.at(gil::point_t{0, 1}), fixture::gray8_back_pixel);
+ // end
+#ifdef NDEBUG // skip assertions
+ BOOST_TEST(view.at(4) == view.end());
+ // convoluted access to end iterator
+ BOOST_TEST(view.at(0, 2) == view.end());
+ BOOST_TEST(view.at(2, 1) == view.end());
+#endif
+ }
+ {
+ gil::rgb8_image_t image = fixture::make_image_rgb8();
+ auto view = gil::view(image);
+ // begin
+ BOOST_TEST_EQ(*view.at(0), fixture::rgb8_draw_pixel);
+ BOOST_TEST_EQ(*view.at(1), fixture::rgb8_back_pixel);
+ BOOST_TEST_EQ(*view.at(0, 0), fixture::rgb8_draw_pixel);
+ BOOST_TEST_EQ(*view.at(0, 1), fixture::rgb8_back_pixel);
+ BOOST_TEST_EQ(*view.at(gil::point_t{0, 0}), fixture::rgb8_draw_pixel);
+ BOOST_TEST_EQ(*view.at(gil::point_t{0, 1}), fixture::rgb8_back_pixel);
+ // end
+#ifdef NDEBUG // skip assertions
+ BOOST_TEST(view.at(4) == view.end());
+ // convoluted access to end iterator
+ BOOST_TEST(view.at(0, 2) == view.end());
+ BOOST_TEST(view.at(2, 1) == view.end());
+#endif
+ }
+}
+
+int main()
+{
+ test_begin();
+ test_end();
+ test_at();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/planar_rgba_view.cpp b/src/boost/libs/gil/test/core/image_view/planar_rgba_view.cpp
new file mode 100644
index 000000000..925a2ebec
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/planar_rgba_view.cpp
@@ -0,0 +1,71 @@
+//
+// Copyright 2018-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+
+#include "test_utility_output_stream.hpp"
+
+namespace boost { namespace gil {
+namespace test { namespace fixture {
+
+gil::point_t d{2, 2};
+std::uint8_t r[] = { 1, 2, 3, 4 };
+std::uint8_t g[] = { 10, 20, 30, 40 };
+std::uint8_t b[] = { 110, 120, 130, 140 };
+std::uint8_t a[] = { 251, 252, 253, 254 };
+
+}}}}
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+void test_dimensions()
+{
+ auto v = gil::planar_rgba_view(fixture::d.x, fixture::d.y, fixture::r, fixture::g, fixture::b, fixture::a, sizeof(std::uint8_t) * 2);
+ BOOST_TEST(!v.empty());
+ BOOST_TEST_EQ(v.dimensions(), fixture::d);
+ BOOST_TEST_EQ(v.num_channels(), 4u);
+ BOOST_TEST_EQ(v.size(), static_cast<std::size_t>(fixture::d.x * fixture::d.y));
+}
+
+void test_front()
+{
+ auto v = gil::planar_rgba_view(fixture::d.x, fixture::d.y, fixture::r, fixture::g, fixture::b, fixture::a, sizeof(std::uint8_t) * 2);
+ gil::rgba8_pixel_t const pf{1, 10, 110, 251};
+ BOOST_TEST_EQ(v.front(), pf);
+}
+
+void test_back()
+{
+ auto v = gil::planar_rgba_view(fixture::d.x, fixture::d.y, fixture::r, fixture::g, fixture::b, fixture::a, sizeof(std::uint8_t) * 2);
+ gil::rgba8_pixel_t const pb{4, 40, 140, 254};
+ BOOST_TEST_EQ(v.back(), pb);
+}
+
+void test_pixel_equal_to_operator()
+{
+ auto v = gil::planar_rgba_view(fixture::d.x, fixture::d.y, fixture::r, fixture::g, fixture::b, fixture::a, sizeof(std::uint8_t) * 2);
+ for (std::ptrdiff_t i = 0; i < static_cast<std::ptrdiff_t>(v.size()); i++)
+ {
+ gil::rgba8_pixel_t const p{fixture::r[i], fixture::g[i], fixture::b[i], fixture::a[i]};
+ BOOST_TEST_EQ(v[i], p);
+ }
+}
+
+int main()
+{
+ test_dimensions();
+ test_front();
+ test_back();
+ test_pixel_equal_to_operator();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/reverse_iterator.cpp b/src/boost/libs/gil/test/core/image_view/reverse_iterator.cpp
new file mode 100644
index 000000000..c901a00f9
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/reverse_iterator.cpp
@@ -0,0 +1,54 @@
+//
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/image.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "test_fixture.hpp"
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+void test_rbegin()
+{
+ {
+ gil::gray8_image_t image = fixture::make_image_gray8();
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.rbegin(), fixture::gray8_draw_pixel);
+ }
+ {
+ gil::rgb8_image_t image = fixture::make_image_rgb8();
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.rbegin(), fixture::rgb8_draw_pixel);
+ }
+}
+
+void test_rend()
+{
+ {
+ gil::gray8_image_t image;
+ auto view = gil::view(image);
+ BOOST_TEST(view.rbegin() == view.rend());
+ }
+ {
+ gil::rgb8_image_t image;
+ auto view = gil::view(image);
+ BOOST_TEST(view.rbegin() == view.rend());
+ }
+}
+
+int main()
+{
+ test_rbegin();
+ test_rend();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/subimage_view.cpp b/src/boost/libs/gil/test/core/image_view/subimage_view.cpp
new file mode 100644
index 000000000..d6ddbd847
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/subimage_view.cpp
@@ -0,0 +1,91 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "test_utility_output_stream.hpp"
+#include "core/image/test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+struct test_subimage_equals_image
+{
+ template <typename Image>
+ void operator()(Image const&)
+ {
+ using image_t = Image;
+ auto i0 = fixture::create_image<image_t>(4, 4, 128);
+ auto const v0 = gil::const_view(i0);
+ BOOST_TEST_EQ(v0.dimensions().x, 4);
+ BOOST_TEST_EQ(v0.dimensions().y, 4);
+
+ // request with 2 x point_t values
+ {
+ auto v1 = gil::subimage_view(gil::view(i0), {0, 0}, i0.dimensions());
+ BOOST_TEST_EQ(v0.dimensions(), v1.dimensions());
+ BOOST_TEST(gil::equal_pixels(v0, v1));
+ }
+ // request with 4 x dimension values
+ {
+ auto v1 = gil::subimage_view(gil::view(i0), 0, 0, i0.dimensions().x, i0.dimensions().y);
+ BOOST_TEST_EQ(v0.dimensions(), v1.dimensions());
+ BOOST_TEST(gil::equal_pixels(v0, v1));
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_subimage_equals_image{});
+ }
+};
+
+struct test_subimage_equals_image_quadrants
+{
+ template <typename Image>
+ void operator()(Image const&)
+ {
+ using image_t = Image;
+ auto i0 = fixture::create_image<image_t>(4, 4, 0);
+ auto v0 = gil::view(i0);
+ // create test image and set values of pixels in:
+ // quadrant 1
+ auto const i1 = fixture::create_image<image_t>(2, 2, 255);
+ v0[2] = v0[3] = v0[6] = v0[7] = gil::const_view(i1)[0];
+ // quadrant 2
+ auto const i2 = fixture::create_image<image_t>(2, 2, 128);
+ v0[0] = v0[1] = v0[4] = v0[5] = gil::const_view(i2)[0];
+ // quadrant 3
+ auto const i3 = fixture::create_image<image_t>(2, 2, 64);
+ v0[8] = v0[9] = v0[12] = v0[13] = gil::const_view(i3)[0];
+ // quadrant 4
+ auto const i4 = fixture::create_image<image_t>(2, 2, 32);
+ v0[10] = v0[11] = v0[14] = v0[15] = gil::const_view(i4)[0];
+
+ auto v1 = gil::subimage_view(gil::view(i0), { 2, 0 }, i0.dimensions() / 2);
+ BOOST_TEST(gil::equal_pixels(v1, gil::const_view(i1)));
+ auto v2 = gil::subimage_view(gil::view(i0), { 0, 0 }, i0.dimensions() / 2);
+ BOOST_TEST(gil::equal_pixels(v2, gil::const_view(i2)));
+ auto v3 = gil::subimage_view(gil::view(i0), { 0, 2 }, i0.dimensions() / 2);
+ BOOST_TEST(gil::equal_pixels(v3, gil::const_view(i3)));
+ auto v4 = gil::subimage_view(gil::view(i0), { 2, 2 }, i0.dimensions() / 2);
+ BOOST_TEST(gil::equal_pixels(v4, gil::const_view(i4)));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_subimage_equals_image_quadrants{});
+ }
+};
+
+int main()
+{
+ test_subimage_equals_image::run();
+ test_subimage_equals_image_quadrants::run();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/test_fixture.hpp b/src/boost/libs/gil/test/core/image_view/test_fixture.hpp
new file mode 100644
index 000000000..559402f6b
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/test_fixture.hpp
@@ -0,0 +1,37 @@
+//
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/image.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/typedefs.hpp>
+
+namespace boost { namespace gil { namespace test { namespace fixture {
+
+gil::gray8_pixel_t gray8_back_pixel{128};
+gil::gray8_pixel_t gray8_draw_pixel{64};
+gil::rgb8_pixel_t rgb8_back_pixel{255, 128, 64};
+gil::rgb8_pixel_t rgb8_draw_pixel{64, 32, 16};
+
+auto make_image_gray8() -> gil::gray8_image_t
+{
+ gil::gray8_image_t image(2, 2, gray8_back_pixel);
+ auto view = gil::view(image);
+ view(0, 0) = gray8_draw_pixel;
+ view(1, 1) = gray8_draw_pixel;
+ return image;
+}
+
+auto make_image_rgb8() -> gil::rgb8_image_t
+{
+ gil::rgb8_image_t image(2, 2, rgb8_back_pixel);
+ auto view = gil::view(image);
+ view(0, 0) = rgb8_draw_pixel;
+ view(1, 1) = rgb8_draw_pixel;
+ return image;
+}
+
+}}}}
diff --git a/src/boost/libs/gil/test/core/image_view/view_is_basic.cpp b/src/boost/libs/gil/test/core/image_view/view_is_basic.cpp
new file mode 100644
index 000000000..660efcda9
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/view_is_basic.cpp
@@ -0,0 +1,76 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+
+namespace gil = boost::gil;
+
+template <typename View>
+void test_view_is_basic()
+{
+ static_assert(gil::view_is_basic<View>::value, "view should be basic");
+}
+
+template <typename View>
+void test_view_is_basic_not()
+{
+ static_assert(!gil::view_is_basic<View>::value, "view should not be basic");
+}
+
+int main()
+{
+ test_view_is_basic<gil::gray8_view_t>();
+ test_view_is_basic<gil::gray8c_view_t>();
+
+ test_view_is_basic<gil::abgr8_view_t>();
+ test_view_is_basic<gil::abgr8_step_view_t>();
+ test_view_is_basic<gil::abgr8c_view_t>();
+ test_view_is_basic<gil::abgr8c_step_view_t>();
+
+ test_view_is_basic<gil::argb8_view_t>();
+ test_view_is_basic<gil::argb8_step_view_t>();
+ test_view_is_basic<gil::argb8c_view_t>();
+ test_view_is_basic<gil::argb8c_step_view_t>();
+
+ test_view_is_basic<gil::bgr8_view_t>();
+ test_view_is_basic<gil::bgr8_step_view_t>();
+ test_view_is_basic<gil::bgr8c_view_t>();
+ test_view_is_basic<gil::bgr8c_step_view_t>();
+
+ test_view_is_basic<gil::bgra8_view_t>();
+ test_view_is_basic<gil::bgra8_step_view_t>();
+ test_view_is_basic<gil::bgra8c_view_t>();
+ test_view_is_basic<gil::bgra8c_step_view_t>();
+
+ test_view_is_basic<gil::rgb8_view_t>();
+ test_view_is_basic<gil::rgb8_step_view_t>();
+ test_view_is_basic<gil::rgb8_planar_view_t>();
+ test_view_is_basic<gil::rgb8_planar_step_view_t>();
+ test_view_is_basic<gil::rgb8c_view_t>();
+ test_view_is_basic<gil::rgb8c_step_view_t>();
+ test_view_is_basic<gil::rgb8c_planar_view_t>();
+ test_view_is_basic<gil::rgb8c_planar_step_view_t>();
+
+ test_view_is_basic<gil::rgba8_view_t>();
+ test_view_is_basic<gil::rgba8_step_view_t>();
+ test_view_is_basic<gil::rgba8_planar_view_t>();
+ test_view_is_basic<gil::rgba8_planar_step_view_t>();
+ test_view_is_basic<gil::rgba8c_view_t>();
+ test_view_is_basic<gil::rgba8c_step_view_t>();
+ test_view_is_basic<gil::rgba8c_planar_view_t>();
+ test_view_is_basic<gil::rgba8c_planar_step_view_t>();
+
+ test_view_is_basic<gil::cmyk8_view_t>();
+ test_view_is_basic<gil::cmyk8_step_view_t>();
+ test_view_is_basic<gil::cmyk8c_view_t>();
+ test_view_is_basic<gil::cmyk8c_step_view_t>();
+
+ test_view_is_basic<gil::cmyk8_planar_view_t>();
+ test_view_is_basic<gil::cmyk8_planar_step_view_t>();
+ test_view_is_basic<gil::cmyk8c_planar_view_t>();
+ test_view_is_basic<gil::cmyk8c_planar_step_view_t>();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/view_is_mutable.cpp b/src/boost/libs/gil/test/core/image_view/view_is_mutable.cpp
new file mode 100644
index 000000000..560007df3
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/view_is_mutable.cpp
@@ -0,0 +1,76 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+
+namespace gil = boost::gil;
+
+template <typename View>
+void test_view_is_mutable()
+{
+ static_assert(gil::view_is_mutable<View>::value, "view should be mutable");
+}
+
+template <typename View>
+void test_view_is_mutable_not()
+{
+ static_assert(!gil::view_is_mutable<View>::value, "view should not be mutable");
+}
+
+int main()
+{
+ test_view_is_mutable<gil::gray8_view_t>();
+ test_view_is_mutable_not<gil::gray8c_view_t>();
+
+ test_view_is_mutable<gil::abgr8_view_t>();
+ test_view_is_mutable<gil::abgr8_step_view_t>();
+ test_view_is_mutable_not<gil::abgr8c_view_t>();
+ test_view_is_mutable_not<gil::abgr8c_step_view_t>();
+
+ test_view_is_mutable<gil::argb8_view_t>();
+ test_view_is_mutable<gil::argb8_step_view_t>();
+ test_view_is_mutable_not<gil::argb8c_view_t>();
+ test_view_is_mutable_not<gil::argb8c_step_view_t>();
+
+ test_view_is_mutable<gil::bgr8_view_t>();
+ test_view_is_mutable<gil::bgr8_step_view_t>();
+ test_view_is_mutable_not<gil::bgr8c_view_t>();
+ test_view_is_mutable_not<gil::bgr8c_step_view_t>();
+
+ test_view_is_mutable<gil::bgra8_view_t>();
+ test_view_is_mutable<gil::bgra8_step_view_t>();
+ test_view_is_mutable_not<gil::bgra8c_view_t>();
+ test_view_is_mutable_not<gil::bgra8c_step_view_t>();
+
+ test_view_is_mutable<gil::rgb8_view_t>();
+ test_view_is_mutable<gil::rgb8_step_view_t>();
+ test_view_is_mutable<gil::rgb8_planar_view_t>();
+ test_view_is_mutable<gil::rgb8_planar_step_view_t>();
+ test_view_is_mutable_not<gil::rgb8c_view_t>();
+ test_view_is_mutable_not<gil::rgb8c_step_view_t>();
+ test_view_is_mutable_not<gil::rgb8c_planar_view_t>();
+ test_view_is_mutable_not<gil::rgb8c_planar_step_view_t>();
+
+ test_view_is_mutable<gil::rgba8_view_t>();
+ test_view_is_mutable<gil::rgba8_step_view_t>();
+ test_view_is_mutable<gil::rgba8_planar_view_t>();
+ test_view_is_mutable<gil::rgba8_planar_step_view_t>();
+ test_view_is_mutable_not<gil::rgba8c_view_t>();
+ test_view_is_mutable_not<gil::rgba8c_step_view_t>();
+ test_view_is_mutable_not<gil::rgba8c_planar_view_t>();
+ test_view_is_mutable_not<gil::rgba8c_planar_step_view_t>();
+
+ test_view_is_mutable<gil::cmyk8_view_t>();
+ test_view_is_mutable<gil::cmyk8_step_view_t>();
+ test_view_is_mutable_not<gil::cmyk8c_view_t>();
+ test_view_is_mutable_not<gil::cmyk8c_step_view_t>();
+
+ test_view_is_mutable<gil::cmyk8_planar_view_t>();
+ test_view_is_mutable<gil::cmyk8_planar_step_view_t>();
+ test_view_is_mutable_not<gil::cmyk8c_planar_view_t>();
+ test_view_is_mutable_not<gil::cmyk8c_planar_step_view_t>();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/view_is_step.cpp b/src/boost/libs/gil/test/core/image_view/view_is_step.cpp
new file mode 100644
index 000000000..5371a7825
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/view_is_step.cpp
@@ -0,0 +1,57 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+
+namespace gil = boost::gil;
+
+template <typename View>
+void test_view_is_step_in_xy()
+{
+ static_assert(gil::view_is_step_in_x<View>::value, "view should support horizontal step");
+ static_assert(gil::view_is_step_in_y<View>::value, "view should support vertical step");
+}
+
+template <typename View>
+void test_view_is_step_in_y()
+{
+ static_assert(gil::view_is_step_in_y<View>::value, "view should support vertical step");
+}
+
+template <typename View>
+void test_view_is_step_in_x_not()
+{
+ static_assert(!gil::view_is_step_in_x<View>::value, "view should not support horizontal step");
+}
+
+int main()
+{
+ test_view_is_step_in_xy<gil::gray8_step_view_t>();
+ test_view_is_step_in_xy<gil::abgr8_step_view_t>();
+ test_view_is_step_in_xy<gil::argb8_step_view_t>();
+ test_view_is_step_in_xy<gil::bgr8_step_view_t>();
+ test_view_is_step_in_xy<gil::bgra8_step_view_t>();
+ test_view_is_step_in_xy<gil::rgb8_step_view_t>();
+ test_view_is_step_in_xy<gil::rgba8_step_view_t>();
+ test_view_is_step_in_xy<gil::rgba8_planar_step_view_t>();
+ test_view_is_step_in_xy<gil::cmyk8_step_view_t>();
+ test_view_is_step_in_xy<gil::cmyk8_planar_step_view_t>();
+
+ test_view_is_step_in_y<gil::rgb8_view_t>();
+ test_view_is_step_in_y<gil::rgb8_planar_view_t>();
+ test_view_is_step_in_y<gil::rgba8_view_t>();
+ test_view_is_step_in_y<gil::rgba8_planar_view_t>();
+ test_view_is_step_in_y<gil::cmyk8_view_t>();
+ test_view_is_step_in_y<gil::cmyk8_planar_view_t>();
+
+ test_view_is_step_in_x_not<gil::rgb8_view_t>();
+ test_view_is_step_in_x_not<gil::rgb8_planar_view_t>();
+ test_view_is_step_in_x_not<gil::rgba8_view_t>();
+ test_view_is_step_in_x_not<gil::rgba8_planar_view_t>();
+ test_view_is_step_in_x_not<gil::cmyk8_view_t>();
+ test_view_is_step_in_x_not<gil::cmyk8_planar_view_t>();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/view_type.cpp b/src/boost/libs/gil/test/core/image_view/view_type.cpp
new file mode 100644
index 000000000..6c8180035
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/view_type.cpp
@@ -0,0 +1,114 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+struct Interleaved : std::false_type {};
+struct Planar : std::true_type {};
+struct NotStepX : std::false_type {};
+struct StepX : std::true_type {};
+struct Immutable : std::false_type {};
+struct Mutable : std::true_type {};
+
+template <typename ResultView, typename Layout, typename IsPlanar, typename IsStepX, typename IsMutable>
+void test()
+{
+ static_assert(std::is_same
+ <
+ typename gil::view_type
+ <
+ std::uint8_t,
+ Layout,
+ IsPlanar::value,
+ IsStepX::value,
+ IsMutable::value
+ >::type,
+ ResultView
+ >::value, "view_type yields unexpected view");
+}
+
+template <typename ResultView, typename Layout, typename IsPlanar, typename IsStepX, typename IsMutable>
+void test_not()
+{
+ static_assert(!std::is_same
+ <
+ typename gil::view_type
+ <
+ std::uint8_t,
+ Layout,
+ IsPlanar::value,
+ IsStepX::value,
+ IsMutable::value
+ >::type,
+ ResultView
+ >::value, "view_type yields unexpected view");
+}
+
+int main()
+{
+ test<gil::gray8_view_t, gil::gray_layout_t, Interleaved, NotStepX, Mutable>();
+ test<gil::gray8c_view_t, gil::gray_layout_t, Interleaved, NotStepX, Immutable>();
+ test<gil::gray8_step_view_t, gil::gray_layout_t, Interleaved, StepX, Mutable>();
+ test<gil::gray8c_step_view_t, gil::gray_layout_t, Interleaved, StepX, Immutable>();
+ test_not<gil::gray8_view_t, gil::gray_layout_t, Planar, NotStepX, Mutable>();
+ test_not<gil::gray8_view_t, gil::rgb_layout_t, Planar, NotStepX, Mutable>();
+ test_not<gil::gray8_view_t, gil::gray_layout_t, Interleaved, StepX, Mutable>();
+ test_not<gil::gray8_view_t, gil::gray_layout_t, Interleaved, NotStepX, Immutable>();
+
+ test<gil::abgr8_view_t, gil::abgr_layout_t, Interleaved, NotStepX, Mutable>();
+ test<gil::abgr8c_view_t, gil::abgr_layout_t, Interleaved, NotStepX, Immutable>();
+ test<gil::abgr8_step_view_t, gil::abgr_layout_t, Interleaved, StepX, Mutable>();
+ test<gil::abgr8c_step_view_t, gil::abgr_layout_t, Interleaved, StepX, Immutable>();
+ test_not<gil::abgr8_view_t, gil::bgra_layout_t, Interleaved, NotStepX, Mutable>();
+ test_not<gil::abgr8_view_t, gil::rgba_layout_t, Interleaved, NotStepX, Mutable>();
+
+ test<gil::argb8_view_t, gil::argb_layout_t, Interleaved, NotStepX, Mutable>();
+ test<gil::argb8c_view_t, gil::argb_layout_t, Interleaved, NotStepX, Immutable>();
+ test<gil::argb8_step_view_t, gil::argb_layout_t, Interleaved, StepX, Mutable>();
+ test<gil::argb8c_step_view_t, gil::argb_layout_t, Interleaved, StepX, Immutable>();
+
+ test<gil::bgr8_view_t, gil::bgr_layout_t, Interleaved, NotStepX, Mutable>();
+ test<gil::bgr8c_view_t, gil::bgr_layout_t, Interleaved, NotStepX, Immutable>();
+ test<gil::bgr8_step_view_t, gil::bgr_layout_t, Interleaved, StepX, Mutable>();
+ test<gil::bgr8c_step_view_t, gil::bgr_layout_t, Interleaved, StepX, Immutable>();
+ test_not<gil::bgr8_view_t, gil::rgb_layout_t, Interleaved, NotStepX, Mutable>();
+
+ test<gil::bgra8_view_t, gil::bgra_layout_t, Interleaved, NotStepX, Mutable>();
+ test<gil::bgra8c_view_t, gil::bgra_layout_t, Interleaved, NotStepX, Immutable>();
+ test<gil::bgra8_step_view_t, gil::bgra_layout_t, Interleaved, StepX, Mutable>();
+ test<gil::bgra8c_step_view_t, gil::bgra_layout_t, Interleaved, StepX, Immutable>();
+ test_not<gil::bgra8_view_t, gil::abgr_layout_t, Interleaved, NotStepX, Mutable>();
+ test_not<gil::bgra8_view_t, gil::rgba_layout_t, Interleaved, NotStepX, Mutable>();
+
+ test<gil::rgb8_view_t, gil::rgb_layout_t, Interleaved, NotStepX, Mutable>();
+ test<gil::rgb8c_view_t, gil::rgb_layout_t, Interleaved, NotStepX, Immutable>();
+ test<gil::rgb8_step_view_t, gil::rgb_layout_t, Interleaved, StepX, Mutable>();
+ test<gil::rgb8c_step_view_t, gil::rgb_layout_t, Interleaved, StepX, Immutable>();
+ test_not<gil::rgb8_view_t, gil::rgb_layout_t, Planar, NotStepX, Mutable>();
+ test_not<gil::rgb8_view_t, gil::abgr_layout_t, Interleaved, NotStepX, Mutable>();
+ test_not<gil::rgb8_view_t, gil::bgra_layout_t, Interleaved, NotStepX, Mutable>();
+
+ test<gil::rgb8_planar_view_t, gil::rgb_layout_t, Planar, NotStepX, Mutable>();
+ test<gil::rgb8c_planar_view_t, gil::rgb_layout_t, Planar, NotStepX, Immutable>();
+ test<gil::rgb8_planar_step_view_t, gil::rgb_layout_t, Planar, StepX, Mutable>();
+ test<gil::rgb8c_planar_step_view_t, gil::rgb_layout_t, Planar, StepX, Immutable>();
+
+ test<gil::cmyk8_view_t, gil::cmyk_layout_t, Interleaved, NotStepX, Mutable>();
+ test<gil::cmyk8c_view_t, gil::cmyk_layout_t, Interleaved, NotStepX, Immutable>();
+ test<gil::cmyk8_step_view_t, gil::cmyk_layout_t, Interleaved, StepX, Mutable>();
+ test<gil::cmyk8c_step_view_t, gil::cmyk_layout_t, Interleaved, StepX, Immutable>();
+ test_not<gil::cmyk8_view_t, gil::rgba_layout_t, Interleaved, NotStepX, Mutable>();
+
+ test<gil::cmyk8_planar_view_t, gil::cmyk_layout_t, Planar, NotStepX, Mutable>();
+ test<gil::cmyk8c_planar_view_t, gil::cmyk_layout_t, Planar, NotStepX, Immutable>();
+ test<gil::cmyk8_planar_step_view_t, gil::cmyk_layout_t, Planar, StepX, Mutable>();
+ test<gil::cmyk8c_planar_step_view_t, gil::cmyk_layout_t, Planar, StepX, Immutable>();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/view_type_from_pixel.cpp b/src/boost/libs/gil/test/core/image_view/view_type_from_pixel.cpp
new file mode 100644
index 000000000..bb5144095
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/view_type_from_pixel.cpp
@@ -0,0 +1,119 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+struct Interleaved : std::false_type {};
+struct Planar : std::true_type {};
+struct NotStepX : std::false_type {};
+struct StepX : std::true_type {};
+struct Immutable : std::false_type {};
+struct Mutable : std::true_type {};
+
+template <typename ResultView, typename Pixel, typename IsPlanar, typename IsStepX, typename IsMutable>
+void test()
+{
+ static_assert(std::is_same
+ <
+ typename gil::view_type_from_pixel
+ <
+ Pixel,
+ IsPlanar::value,
+ IsStepX::value,
+ IsMutable::value
+ >::type,
+ ResultView
+ >::value, "view_type_from_pixel yields unexpected view");
+}
+
+template <typename ResultView, typename Pixel, typename IsPlanar, typename IsStepX, typename IsMutable>
+void test_not()
+{
+ static_assert(!std::is_same
+ <
+ typename gil::view_type_from_pixel
+ <
+ Pixel,
+ IsPlanar::value,
+ IsStepX::value,
+ IsMutable::value
+ >::type,
+ ResultView
+ >::value, "view_type_from_pixel yields unexpected view");
+}
+
+int main()
+{
+ test<gil::gray8_view_t, gil::gray8_pixel_t, Interleaved, NotStepX, Mutable>();
+ test<gil::gray8c_view_t, gil::gray8c_pixel_t, Interleaved, NotStepX, Immutable>();
+ // Immutable view from mutable pixel type is allowed
+ test<gil::gray8c_view_t, gil::gray8_pixel_t, Interleaved, NotStepX, Immutable>();
+ // Mutable view from immutable pixel type not allowed
+ test_not<gil::gray8_view_t, gil::gray8c_pixel_t, Interleaved, NotStepX, Mutable>();
+
+ test<gil::gray8_step_view_t, gil::gray8_pixel_t, Interleaved, StepX, Mutable>();
+ test_not<gil::gray8_view_t, gil::gray8c_pixel_t, Interleaved, NotStepX, Mutable>();
+ test<gil::gray8c_step_view_t, gil::gray8_pixel_t, Interleaved, StepX, Immutable>();
+ test_not<gil::gray8_view_t, gil::gray8_pixel_t, Planar, NotStepX, Mutable>();
+ test_not<gil::gray8_view_t, gil::rgb8_pixel_t, Planar, NotStepX, Mutable>();
+ test_not<gil::gray8_view_t, gil::gray8_pixel_t, Interleaved, StepX, Mutable>();
+ test_not<gil::gray8_view_t, gil::gray8_pixel_t, Interleaved, NotStepX, Immutable>();
+
+ test<gil::abgr8_view_t, gil::abgr8_pixel_t, Interleaved, NotStepX, Mutable>();
+ test<gil::abgr8c_view_t, gil::abgr8_pixel_t, Interleaved, NotStepX, Immutable>();
+ test<gil::abgr8_step_view_t, gil::abgr8_pixel_t, Interleaved, StepX, Mutable>();
+ test<gil::abgr8c_step_view_t, gil::abgr8_pixel_t, Interleaved, StepX, Immutable>();
+ test_not<gil::abgr8_view_t, gil::bgra8_pixel_t, Interleaved, NotStepX, Mutable>();
+ test_not<gil::abgr8_view_t, gil::rgba8_pixel_t, Interleaved, NotStepX, Mutable>();
+
+ test<gil::argb8_view_t, gil::argb8_pixel_t, Interleaved, NotStepX, Mutable>();
+ test<gil::argb8c_view_t, gil::argb8_pixel_t, Interleaved, NotStepX, Immutable>();
+ test<gil::argb8_step_view_t, gil::argb8_pixel_t, Interleaved, StepX, Mutable>();
+ test<gil::argb8c_step_view_t, gil::argb8_pixel_t, Interleaved, StepX, Immutable>();
+
+ test<gil::bgr8_view_t, gil::bgr8_pixel_t, Interleaved, NotStepX, Mutable>();
+ test<gil::bgr8c_view_t, gil::bgr8_pixel_t, Interleaved, NotStepX, Immutable>();
+ test<gil::bgr8_step_view_t, gil::bgr8_pixel_t, Interleaved, StepX, Mutable>();
+ test<gil::bgr8c_step_view_t, gil::bgr8_pixel_t, Interleaved, StepX, Immutable>();
+ test_not<gil::bgr8_view_t, gil::rgb8_pixel_t, Interleaved, NotStepX, Mutable>();
+
+ test<gil::bgra8_view_t, gil::bgra8_pixel_t, Interleaved, NotStepX, Mutable>();
+ test<gil::bgra8c_view_t, gil::bgra8_pixel_t, Interleaved, NotStepX, Immutable>();
+ test<gil::bgra8_step_view_t, gil::bgra8_pixel_t, Interleaved, StepX, Mutable>();
+ test<gil::bgra8c_step_view_t, gil::bgra8_pixel_t, Interleaved, StepX, Immutable>();
+ test_not<gil::bgra8_view_t, gil::abgr8_pixel_t, Interleaved, NotStepX, Mutable>();
+ test_not<gil::bgra8_view_t, gil::rgba8_pixel_t, Interleaved, NotStepX, Mutable>();
+
+ test<gil::rgb8_view_t, gil::rgb8_pixel_t, Interleaved, NotStepX, Mutable>();
+ test<gil::rgb8c_view_t, gil::rgb8_pixel_t, Interleaved, NotStepX, Immutable>();
+ test<gil::rgb8_step_view_t, gil::rgb8_pixel_t, Interleaved, StepX, Mutable>();
+ test<gil::rgb8c_step_view_t, gil::rgb8_pixel_t, Interleaved, StepX, Immutable>();
+ test_not<gil::rgb8_view_t, gil::rgb8c_pixel_t, Interleaved, NotStepX, Mutable>();
+ test_not<gil::rgb8_view_t, gil::rgb8_pixel_t, Planar, NotStepX, Mutable>();
+ test_not<gil::rgb8_view_t, gil::abgr8_pixel_t, Interleaved, NotStepX, Mutable>();
+ test_not<gil::rgb8_view_t, gil::bgra8_pixel_t, Interleaved, NotStepX, Mutable>();
+
+ test<gil::rgb8_planar_view_t, gil::rgb8_pixel_t, Planar, NotStepX, Mutable>();
+ test<gil::rgb8c_planar_view_t, gil::rgb8_pixel_t, Planar, NotStepX, Immutable>();
+ test<gil::rgb8_planar_step_view_t, gil::rgb8_pixel_t, Planar, StepX, Mutable>();
+ test<gil::rgb8c_planar_step_view_t, gil::rgb8_pixel_t, Planar, StepX, Immutable>();
+
+ test<gil::cmyk8_view_t, gil::cmyk8_pixel_t, Interleaved, NotStepX, Mutable>();
+ test<gil::cmyk8c_view_t, gil::cmyk8_pixel_t, Interleaved, NotStepX, Immutable>();
+ test<gil::cmyk8_step_view_t, gil::cmyk8_pixel_t, Interleaved, StepX, Mutable>();
+ test<gil::cmyk8c_step_view_t, gil::cmyk8_pixel_t, Interleaved, StepX, Immutable>();
+ test_not<gil::cmyk8_view_t, gil::rgba8_pixel_t, Interleaved, NotStepX, Mutable>();
+
+ test<gil::cmyk8_planar_view_t, gil::cmyk8_pixel_t, Planar, NotStepX, Mutable>();
+ test<gil::cmyk8c_planar_view_t, gil::cmyk8_pixel_t, Planar, NotStepX, Immutable>();
+ test<gil::cmyk8_planar_step_view_t, gil::cmyk8_pixel_t, Planar, StepX, Mutable>();
+ test<gil::cmyk8c_planar_step_view_t, gil::cmyk8_pixel_t, Planar, StepX, Immutable>();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/x_iterator.cpp b/src/boost/libs/gil/test/core/image_view/x_iterator.cpp
new file mode 100644
index 000000000..30a73b965
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/x_iterator.cpp
@@ -0,0 +1,98 @@
+//
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/image.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/core/ignore_unused.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include "test_fixture.hpp"
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+void test_x_at()
+{
+ {
+ gil::gray8_image_t image = fixture::make_image_gray8();
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.x_at(0, 0), fixture::gray8_draw_pixel);
+ BOOST_TEST_EQ(*view.x_at(1, 0), fixture::gray8_back_pixel);
+ BOOST_TEST_EQ(*view.x_at(1, 1), fixture::gray8_draw_pixel);
+ BOOST_TEST_EQ(*view.x_at(gil::point_t{0, 0}), fixture::gray8_draw_pixel);
+ BOOST_TEST_EQ(*view.x_at(gil::point_t{0, 1}), fixture::gray8_back_pixel);
+ BOOST_TEST_EQ(*view.x_at(gil::point_t{1, 1}), fixture::gray8_draw_pixel);
+ BOOST_TEST_EQ(view.x_at(0, 0), view.row_begin(0));
+ BOOST_TEST_EQ(view.x_at(0, 1), view.row_begin(1));
+ BOOST_TEST_EQ(view.x_at(2, 0), view.row_end(0));
+ BOOST_TEST_EQ(view.x_at(2, 1), view.row_end(1));
+ }
+ {
+ gil::rgb8_image_t image = fixture::make_image_rgb8();
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.x_at(0, 0), fixture::rgb8_draw_pixel);
+ BOOST_TEST_EQ(*view.x_at(1, 0), fixture::rgb8_back_pixel);
+ BOOST_TEST_EQ(*view.x_at(1, 1), fixture::rgb8_draw_pixel);
+ BOOST_TEST_EQ(*view.x_at(gil::point_t{0, 0}), fixture::rgb8_draw_pixel);
+ BOOST_TEST_EQ(*view.x_at(gil::point_t{0, 1}), fixture::rgb8_back_pixel);
+ BOOST_TEST_EQ(*view.x_at(gil::point_t{1, 1}), fixture::rgb8_draw_pixel);
+ BOOST_TEST_EQ(view.x_at(0, 0), view.row_begin(0));
+ BOOST_TEST_EQ(view.x_at(0, 1), view.row_begin(1));
+ BOOST_TEST_EQ(view.x_at(2, 0), view.row_end(0));
+ BOOST_TEST_EQ(view.x_at(2, 1), view.row_end(1));
+ }
+}
+
+void test_row_begin()
+{
+ {
+ gil::gray8_image_t image = fixture::make_image_gray8();
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.row_begin(0), fixture::gray8_draw_pixel);
+ BOOST_TEST_EQ(*view.row_begin(1), fixture::gray8_back_pixel);
+ }
+ {
+ gil::rgb8_image_t image = fixture::make_image_rgb8();
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.row_begin(0), fixture::rgb8_draw_pixel);
+ BOOST_TEST_EQ(*view.row_begin(1), fixture::rgb8_back_pixel);
+ }
+}
+
+void test_row_end()
+{
+ {
+ gil::gray8_image_t image;
+ auto view = gil::view(image);
+#ifdef NDEBUG // skip assertion on y < height(), see TODO comment in image_view.hpp
+ BOOST_TEST_EQ(view.row_begin(0), view.row_end(0));
+#else
+ boost::ignore_unused(view);
+#endif
+ }
+ {
+ gil::rgb8_image_t image;
+ auto view = gil::view(image);
+#ifdef NDEBUG // skip assertion on y < height(), see TODO comment in image_view.hpp
+ BOOST_TEST_EQ(view.row_begin(0), view.row_end(0));
+#else
+ boost::ignore_unused(view);
+#endif
+ }
+}
+
+int main()
+{
+ test_x_at();
+ test_row_begin();
+ test_row_end();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/xy_locator.cpp b/src/boost/libs/gil/test/core/image_view/xy_locator.cpp
new file mode 100644
index 000000000..af42ee641
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/xy_locator.cpp
@@ -0,0 +1,122 @@
+//
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/image.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/core/ignore_unused.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include "test_fixture.hpp"
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+void test_xy_at()
+{
+ {
+ gil::gray8_image_t image = fixture::make_image_gray8();
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.xy_at(0, 0), fixture::gray8_draw_pixel);
+ BOOST_TEST_EQ(*view.xy_at(1, 0), fixture::gray8_back_pixel);
+ BOOST_TEST_EQ(*view.xy_at(0, 1), fixture::gray8_back_pixel);
+ BOOST_TEST_EQ(*view.xy_at(1, 1), fixture::gray8_draw_pixel);
+ }
+ {
+ gil::rgb8_image_t image = fixture::make_image_rgb8();
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.xy_at(0, 0), fixture::rgb8_draw_pixel);
+ BOOST_TEST_EQ(*view.xy_at(1, 0), fixture::rgb8_back_pixel);
+ BOOST_TEST_EQ(*view.xy_at(0, 1), fixture::rgb8_back_pixel);
+ BOOST_TEST_EQ(*view.xy_at(1, 1), fixture::rgb8_draw_pixel);
+ }
+}
+
+void test_xy_x_begin()
+{
+ {
+ gil::gray8_image_t image = fixture::make_image_gray8();
+ auto view = gil::view(image);
+ BOOST_TEST(view.xy_at(0, 0).x() == view.row_begin(0));
+ BOOST_TEST(view.xy_at(0, 1).x() == view.row_begin(1));
+ }
+ {
+ gil::rgb8_image_t image = fixture::make_image_rgb8();
+ auto view = gil::view(image);
+ BOOST_TEST(view.xy_at(0, 0).x() == view.row_begin(0));
+ BOOST_TEST(view.xy_at(0, 1).x() == view.row_begin(1));
+ }
+}
+
+void test_xy_x_end()
+{
+ {
+ gil::gray8_image_t image = fixture::make_image_gray8();
+ auto view = gil::view(image);
+#ifdef NDEBUG // skip assertion on x < width(), see TODO comment in image_view.hpp
+ BOOST_TEST(view.xy_at(2, 0).x() == view.row_end(0));
+ BOOST_TEST(view.xy_at(2, 1).x() == view.row_end(1));
+#else
+ boost::ignore_unused(view);
+#endif
+ }
+ {
+ gil::rgb8_image_t image = fixture::make_image_rgb8();
+ auto view = gil::view(image);
+#ifdef NDEBUG // skip assertion on x < width(), see TODO comment in image_view.hpp
+ BOOST_TEST(view.xy_at(2, 0).x() == view.row_end(0));
+ BOOST_TEST(view.xy_at(2, 1).x() == view.row_end(1));
+#else
+ boost::ignore_unused(view);
+#endif
+ }
+}
+
+void test_xy_y_begin()
+{
+ {
+ gil::gray8_image_t image = fixture::make_image_gray8();
+ auto view = gil::view(image);
+ BOOST_TEST(view.xy_at(0, 0).y() == view.col_begin(0));
+ BOOST_TEST(view.xy_at(1, 0).y() == view.col_begin(1));
+ }
+ {
+ gil::rgb8_image_t image = fixture::make_image_rgb8();
+ auto view = gil::view(image);
+ BOOST_TEST(view.xy_at(0, 0).y() == view.col_begin(0));
+ BOOST_TEST(view.xy_at(1, 0).y() == view.col_begin(1));
+ }
+}
+
+void test_xy_y_end()
+{
+ {
+ gil::gray8_image_t image = fixture::make_image_gray8();
+ auto view = gil::view(image);
+ BOOST_TEST(view.xy_at(0, 2).y() == view.col_end(0));
+ BOOST_TEST(view.xy_at(1, 2).y() == view.col_end(1));
+ }
+ {
+ gil::rgb8_image_t image = fixture::make_image_rgb8();
+ auto view = gil::view(image);
+ BOOST_TEST(view.xy_at(0, 2).y() == view.col_end(0));
+ BOOST_TEST(view.xy_at(1, 2).y() == view.col_end(1));
+ }
+}
+
+int main()
+{
+ test_xy_at();
+ test_xy_x_begin();
+ test_xy_x_end();
+ test_xy_y_begin();
+ test_xy_y_end();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/image_view/y_iterator.cpp b/src/boost/libs/gil/test/core/image_view/y_iterator.cpp
new file mode 100644
index 000000000..6070ebd2f
--- /dev/null
+++ b/src/boost/libs/gil/test/core/image_view/y_iterator.cpp
@@ -0,0 +1,118 @@
+//
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/image.hpp>
+#include <boost/gil/image_view.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/core/ignore_unused.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include <vector>
+
+#include "test_fixture.hpp"
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+void test_y_at()
+{
+ {
+ gil::gray8_image_t image = fixture::make_image_gray8();
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.y_at(0, 0), fixture::gray8_draw_pixel);
+ BOOST_TEST_EQ(*view.y_at(1, 0), fixture::gray8_back_pixel);
+ BOOST_TEST_EQ(*view.y_at(1, 1), fixture::gray8_draw_pixel);
+ BOOST_TEST_EQ(*view.y_at(gil::point_t{0, 0}), fixture::gray8_draw_pixel);
+ BOOST_TEST_EQ(*view.y_at(gil::point_t{0, 1}), fixture::gray8_back_pixel);
+ BOOST_TEST_EQ(*view.y_at(gil::point_t{1, 1}), fixture::gray8_draw_pixel);
+ BOOST_TEST(view.y_at(0, 0) == view.col_begin(0));
+ BOOST_TEST(view.y_at(1, 0) == view.col_begin(1));
+ BOOST_TEST(view.y_at(0, 2) == view.col_end(0));
+ BOOST_TEST(view.y_at(1, 2) == view.col_end(1));
+ }
+ {
+ gil::rgb8_image_t image = fixture::make_image_rgb8();
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.y_at(0, 0), fixture::rgb8_draw_pixel);
+ BOOST_TEST_EQ(*view.y_at(1, 0), fixture::rgb8_back_pixel);
+ BOOST_TEST_EQ(*view.y_at(1, 1), fixture::rgb8_draw_pixel);
+ BOOST_TEST_EQ(*view.y_at(gil::point_t{0, 0}), fixture::rgb8_draw_pixel);
+ BOOST_TEST_EQ(*view.y_at(gil::point_t{0, 1}), fixture::rgb8_back_pixel);
+ BOOST_TEST_EQ(*view.y_at(gil::point_t{1, 1}), fixture::rgb8_draw_pixel);
+ BOOST_TEST(view.y_at(0, 0) == view.col_begin(0));
+ BOOST_TEST(view.y_at(1, 0) == view.col_begin(1));
+ BOOST_TEST(view.y_at(0, 2) == view.col_end(0));
+ BOOST_TEST(view.y_at(1, 2) == view.col_end(1));
+ }
+}
+
+void test_col_begin()
+{
+ {
+ gil::gray8_image_t image = fixture::make_image_gray8();
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.col_begin(0), fixture::gray8_draw_pixel);
+ BOOST_TEST_EQ(*view.col_begin(1), fixture::gray8_back_pixel);
+ }
+ {
+ gil::rgb8_image_t image = fixture::make_image_rgb8();
+ auto view = gil::view(image);
+ BOOST_TEST_EQ(*view.col_begin(0), fixture::rgb8_draw_pixel);
+ BOOST_TEST_EQ(*view.col_begin(1), fixture::rgb8_back_pixel);
+ }
+}
+void test_col_end()
+{
+ {
+ gil::gray8_image_t image;
+ auto view = gil::view(image);
+#ifdef NDEBUG // skip assertion on x < width(), see TODO comment in image_view.hpp
+ BOOST_TEST(view.col_begin(0) == view.col_end(0));
+#else
+ boost::ignore_unused(view);
+#endif
+ }
+ {
+ gil::rgb8_image_t image;
+ auto view = gil::view(image);
+#ifdef NDEBUG // skip assertion on x < width(), see TODO comment in image_view.hpp
+ BOOST_TEST(view.col_begin(0) == view.col_end(0));
+#else
+ boost::ignore_unused(view);
+#endif
+ }
+}
+
+void test_issue_432()
+{
+ // Verifies https://github.com/boostorg/gil/pull/450 fix for https://github.com/boostorg/gil/issues/432
+ // The tests were adapted from contribution of Daniel Evans by Olzhas Zhumabek.
+ {
+ std::vector<gil::gray8_pixel_t> v(50);
+ auto view = boost::gil::interleaved_view(10, 5, v.data(), 10 * sizeof(gil::gray8_pixel_t));
+ view.col_end(0); // BUG: Boost 1.72 always asserts
+ }
+ {
+ std::vector<gil::rgb8_pixel_t> v(50);
+ auto view = boost::gil::interleaved_view(10, 5, v.data(), 10 * sizeof(gil::rgb8_pixel_t));
+ auto it = view.row_end(0); // BUG: Boost 1.72 always asserts
+ boost::ignore_unused(it);
+ }
+}
+
+int main()
+{
+ test_y_at();
+ test_col_begin();
+ test_col_end();
+
+ test_issue_432();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/iterator/CMakeLists.txt b/src/boost/libs/gil/test/core/iterator/CMakeLists.txt
new file mode 100644
index 000000000..cff287e66
--- /dev/null
+++ b/src/boost/libs/gil/test/core/iterator/CMakeLists.txt
@@ -0,0 +1,28 @@
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+foreach(_name
+ concepts
+ dynamic_step
+ is_planar)
+ set(_test t_core_iterator_${_name})
+ set(_target test_core_iterator_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
diff --git a/src/boost/libs/gil/test/core/iterator/Jamfile b/src/boost/libs/gil/test/core/iterator/Jamfile
new file mode 100644
index 000000000..8da365c86
--- /dev/null
+++ b/src/boost/libs/gil/test/core/iterator/Jamfile
@@ -0,0 +1,13 @@
+# Boost.GIL (Generic Image Library) - tests
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+compile concepts.cpp ;
+compile dynamic_step.cpp ;
+compile is_planar.cpp ;
diff --git a/src/boost/libs/gil/test/core/iterator/concepts.cpp b/src/boost/libs/gil/test/core/iterator/concepts.cpp
new file mode 100644
index 000000000..39f5bc736
--- /dev/null
+++ b/src/boost/libs/gil/test/core/iterator/concepts.cpp
@@ -0,0 +1,172 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+// FIXME: Avoid Clang's flooding of non-disableable warnings like:
+// "T does not declare any constructor to initialize its non-modifiable members"
+// when compiling with concepts check enabled.
+// See https://bugs.llvm.org/show_bug.cgi?id=41759
+#if !defined(BOOST_GIL_USE_CONCEPT_CHECK) && !defined(__clang__)
+#error Compile with BOOST_GIL_USE_CONCEPT_CHECK defined
+#endif
+#include <boost/gil/concepts.hpp>
+#include <boost/gil/color_base.hpp> // kth_element_type
+#include <boost/gil/pixel.hpp> // kth_element_type
+#include <boost/gil/pixel_iterator.hpp>
+#include <boost/gil/pixel_iterator_adaptor.hpp>
+#include <boost/gil/planar_pixel_iterator.hpp> // kth_element_type
+#include <boost/gil/planar_pixel_reference.hpp> // kth_element_type
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/concept_check.hpp>
+
+namespace gil = boost::gil;
+using boost::function_requires;
+
+template <typename Iterator>
+void test_immutable()
+{
+ function_requires<gil::PixelIteratorConcept<Iterator>>();
+ function_requires<gil::HasDynamicXStepTypeConcept<Iterator>>();
+ // NOTE: Pixel iterator does not model Y-step
+ //function_requires<gil::HasDynamicYStepTypeConcept<Iterator>>();
+}
+
+template <typename Iterator>
+void test_mutable()
+{
+ function_requires<gil::MutablePixelIteratorConcept<Iterator>>();
+ function_requires<gil::HasDynamicXStepTypeConcept<Iterator>>();
+ // NOTE: Pixel iterator does not model Y-step
+ //function_requires<gil::HasDynamicYStepTypeConcept<Iterator>>();
+}
+
+int main()
+{
+ test_mutable<gil::gray8_ptr_t>();
+ test_mutable<gil::gray8_step_ptr_t>();
+ test_mutable<gil::gray16_ptr_t>();
+ test_mutable<gil::gray16_step_ptr_t>();
+ test_mutable<gil::gray32_ptr_t>();
+ test_mutable<gil::gray32_step_ptr_t>();
+ test_mutable<gil::gray32f_ptr_t>();
+ test_mutable<gil::gray32f_step_ptr_t>();
+ test_immutable<gil::gray8c_ptr_t>();
+ test_immutable<gil::gray8c_step_ptr_t>();
+ test_immutable<gil::gray16c_ptr_t>();
+ test_immutable<gil::gray16c_step_ptr_t>();
+ test_immutable<gil::gray32c_ptr_t>();
+ test_immutable<gil::gray32c_step_ptr_t>();
+ test_immutable<gil::gray32fc_ptr_t>();
+ test_immutable<gil::gray32fc_step_ptr_t>();
+
+ test_mutable<gil::abgr8_ptr_t>();
+ test_mutable<gil::abgr8_step_ptr_t>();
+ test_mutable<gil::abgr16_ptr_t>();
+ test_mutable<gil::abgr16_step_ptr_t>();
+ test_mutable<gil::abgr32_ptr_t>();
+ test_mutable<gil::abgr32_step_ptr_t>();
+ test_mutable<gil::abgr32f_ptr_t>();
+ test_mutable<gil::abgr32f_step_ptr_t>();
+ test_immutable<gil::abgr8c_ptr_t>();
+ test_immutable<gil::abgr8c_step_ptr_t>();
+ test_immutable<gil::abgr16c_ptr_t>();
+ test_immutable<gil::abgr16c_step_ptr_t>();
+ test_immutable<gil::abgr32c_ptr_t>();
+ test_immutable<gil::abgr32c_step_ptr_t>();
+ test_immutable<gil::abgr32fc_ptr_t>();
+ test_immutable<gil::abgr32fc_step_ptr_t>();
+
+ test_mutable<gil::argb8_ptr_t>();
+ test_mutable<gil::argb8_step_ptr_t>();
+ test_mutable<gil::argb16_ptr_t>();
+ test_mutable<gil::argb16_step_ptr_t>();
+ test_mutable<gil::argb32_ptr_t>();
+ test_mutable<gil::argb32_step_ptr_t>();
+ test_mutable<gil::argb32f_ptr_t>();
+ test_mutable<gil::argb32f_step_ptr_t>();
+
+ test_mutable<gil::bgr8_ptr_t>();
+ test_mutable<gil::bgr8_step_ptr_t>();
+ test_mutable<gil::bgr16_ptr_t>();
+ test_mutable<gil::bgr16_step_ptr_t>();
+ test_mutable<gil::bgr32_ptr_t>();
+ test_mutable<gil::bgr32_step_ptr_t>();
+ test_mutable<gil::bgr32f_ptr_t>();
+ test_mutable<gil::bgr32f_step_ptr_t>();
+
+ test_mutable<gil::bgra8_ptr_t>();
+ test_mutable<gil::bgra8_step_ptr_t>();
+ test_mutable<gil::bgra16_ptr_t>();
+ test_mutable<gil::bgra16_step_ptr_t>();
+ test_mutable<gil::bgra32_ptr_t>();
+ test_mutable<gil::bgra32_step_ptr_t>();
+ test_mutable<gil::bgra32f_ptr_t>();
+ test_mutable<gil::bgra32f_step_ptr_t>();
+
+ test_mutable<gil::rgb8_ptr_t>();
+ test_mutable<gil::rgb8_step_ptr_t>();
+ test_mutable<gil::rgb8_planar_ptr_t>();
+ test_mutable<gil::rgb8_planar_step_ptr_t>();
+ test_mutable<gil::rgb16_ptr_t>();
+ test_mutable<gil::rgb16_step_ptr_t>();
+ test_mutable<gil::rgb16_planar_ptr_t>();
+ test_mutable<gil::rgb16_planar_step_ptr_t>();
+ test_mutable<gil::rgb32_ptr_t>();
+ test_mutable<gil::rgb32_step_ptr_t>();
+ test_mutable<gil::rgb32_planar_ptr_t>();
+ test_mutable<gil::rgb32_planar_step_ptr_t>();
+ test_mutable<gil::rgb32f_ptr_t>();
+ test_mutable<gil::rgb32f_step_ptr_t>();
+ test_mutable<gil::rgb32f_planar_ptr_t>();
+ test_mutable<gil::rgb32f_planar_step_ptr_t>();
+ test_immutable<gil::rgb8c_ptr_t>();
+ test_immutable<gil::rgb8c_step_ptr_t>();
+ test_immutable<gil::rgb16c_ptr_t>();
+ test_immutable<gil::rgb16c_step_ptr_t>();
+ test_immutable<gil::rgb32c_ptr_t>();
+ test_immutable<gil::rgb32c_step_ptr_t>();
+ test_immutable<gil::rgb32fc_ptr_t>();
+ test_immutable<gil::rgb32fc_step_ptr_t>();
+
+ test_mutable<gil::rgba8_ptr_t>();
+ test_mutable<gil::rgba8_step_ptr_t>();
+ test_mutable<gil::rgba8_planar_ptr_t>();
+ test_mutable<gil::rgba8_planar_step_ptr_t>();
+ test_mutable<gil::rgba16_ptr_t>();
+ test_mutable<gil::rgba16_step_ptr_t>();
+ test_mutable<gil::rgba16_planar_ptr_t>();
+ test_mutable<gil::rgba16_planar_step_ptr_t>();
+ test_mutable<gil::rgba32_ptr_t>();
+ test_mutable<gil::rgba32_step_ptr_t>();
+ test_mutable<gil::rgba32_planar_ptr_t>();
+ test_mutable<gil::rgba32_planar_step_ptr_t>();
+ test_mutable<gil::rgba32f_ptr_t>();
+ test_mutable<gil::rgba32f_step_ptr_t>();
+ test_mutable<gil::rgba32f_planar_ptr_t>();
+ test_mutable<gil::rgba32f_planar_step_ptr_t>();
+
+ test_mutable<gil::cmyk8_ptr_t>();
+ test_mutable<gil::cmyk8_step_ptr_t>();
+ test_mutable<gil::cmyk8_planar_ptr_t>();
+ test_mutable<gil::cmyk8_planar_step_ptr_t>();
+ test_mutable<gil::cmyk16_ptr_t>();
+ test_mutable<gil::cmyk16_step_ptr_t>();
+ test_mutable<gil::cmyk16_planar_ptr_t>();
+ test_mutable<gil::cmyk16_planar_step_ptr_t>();
+ test_mutable<gil::cmyk32_ptr_t>();
+ test_mutable<gil::cmyk32_step_ptr_t>();
+ test_mutable<gil::cmyk32_planar_ptr_t>();
+ test_mutable<gil::cmyk32_planar_step_ptr_t>();
+ test_mutable<gil::cmyk32f_ptr_t>();
+ test_mutable<gil::cmyk32f_step_ptr_t>();
+ test_mutable<gil::cmyk32f_planar_ptr_t>();
+ test_mutable<gil::cmyk32f_planar_step_ptr_t>();
+ test_immutable<gil::cmyk8c_ptr_t>();
+ test_immutable<gil::cmyk8c_step_ptr_t>();
+ test_immutable<gil::cmyk8c_planar_ptr_t>();
+ test_immutable<gil::cmyk8c_planar_step_ptr_t>();
+}
diff --git a/src/boost/libs/gil/test/core/iterator/dynamic_step.cpp b/src/boost/libs/gil/test/core/iterator/dynamic_step.cpp
new file mode 100644
index 000000000..269c7306b
--- /dev/null
+++ b/src/boost/libs/gil/test/core/iterator/dynamic_step.cpp
@@ -0,0 +1,160 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/dynamic_step.hpp>
+#include <boost/gil/color_base.hpp> // kth_element_type
+#include <boost/gil/pixel.hpp> // kth_element_type
+#include <boost/gil/pixel_iterator.hpp>
+#include <boost/gil/pixel_iterator_adaptor.hpp>
+#include <boost/gil/planar_pixel_iterator.hpp> // kth_element_type
+#include <boost/gil/planar_pixel_reference.hpp> // kth_element_type
+#include <boost/gil/step_iterator.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+// NOTE: Iterator does not model HasDynamicYStepTypeConcept
+// TODO: Add compile-fail tests to verify that.
+
+template <typename Iterator>
+void test_non_step()
+{
+ static_assert(std::is_same
+ <
+ gil::memory_based_step_iterator<Iterator>,
+ typename gil::dynamic_x_step_type<Iterator>::type
+ >::value, "iterator does not model HasDynamicXStepTypeConcept");
+
+ static_assert(!std::is_same
+ <
+ Iterator,
+ typename gil::dynamic_x_step_type<Iterator>::type
+ >::value, "dynamic_x_step_type yields X step iterator, not X iterator");
+}
+
+template <typename Iterator>
+void test_step()
+{
+ static_assert(std::is_same
+ <
+ Iterator,
+ typename gil::dynamic_x_step_type<Iterator>::type
+ >::value, "iterator does not model HasDynamicXStepTypeConcept");
+
+ static_assert(!std::is_same
+ <
+ typename Iterator::x_iterator,
+ typename gil::dynamic_x_step_type<gil::gray8_step_ptr_t>::type
+ >::value, "dynamic_x_step_type yields X step iterator, not X iterator");
+}
+
+int main()
+{
+ test_non_step<gil::gray8_ptr_t>();
+ test_non_step<gil::gray8c_ptr_t>();
+ test_non_step<gil::gray16_ptr_t>();
+ test_non_step<gil::gray16c_ptr_t>();
+ test_non_step<gil::gray32_ptr_t>();
+ test_non_step<gil::gray32c_ptr_t>();
+ test_non_step<gil::gray32f_ptr_t>();
+ test_step<gil::gray8_step_ptr_t>();
+ test_step<gil::gray8c_step_ptr_t>();
+ test_step<gil::gray16_step_ptr_t>();
+ test_step<gil::gray16c_step_ptr_t>();
+ test_step<gil::gray32_step_ptr_t>();
+ test_step<gil::gray32c_step_ptr_t>();
+ test_step<gil::gray32f_step_ptr_t>();
+
+ test_non_step<gil::abgr8_ptr_t>();
+ test_non_step<gil::abgr16_ptr_t>();
+ test_non_step<gil::abgr32_ptr_t>();
+ test_non_step<gil::abgr32f_ptr_t>();
+ test_step<gil::abgr8_step_ptr_t>();
+ test_step<gil::abgr16_step_ptr_t>();
+ test_step<gil::abgr32_step_ptr_t>();
+ test_step<gil::abgr32f_step_ptr_t>();
+
+ test_non_step<gil::argb8_ptr_t>();
+ test_non_step<gil::argb16_ptr_t>();
+ test_non_step<gil::argb32_ptr_t>();
+ test_non_step<gil::argb32f_ptr_t>();
+ test_step<gil::argb8_step_ptr_t>();
+ test_step<gil::argb16_step_ptr_t>();
+ test_step<gil::argb32_step_ptr_t>();
+ test_step<gil::argb32f_step_ptr_t>();
+
+ test_non_step<gil::bgr8_ptr_t>();
+ test_non_step<gil::bgr16_ptr_t>();
+ test_non_step<gil::bgr32_ptr_t>();
+ test_non_step<gil::bgr32f_ptr_t>();
+ test_step<gil::bgr8_step_ptr_t>();
+ test_step<gil::bgr16_step_ptr_t>();
+ test_step<gil::bgr32_step_ptr_t>();
+ test_step<gil::bgr32f_step_ptr_t>();
+
+ test_non_step<gil::bgra8_ptr_t>();
+ test_non_step<gil::bgra16_ptr_t>();
+ test_non_step<gil::bgra32_ptr_t>();
+ test_non_step<gil::bgra32f_ptr_t>();
+ test_step<gil::bgra8_step_ptr_t>();
+ test_step<gil::bgra16_step_ptr_t>();
+ test_step<gil::bgra32_step_ptr_t>();
+ test_step<gil::bgra32f_step_ptr_t>();
+
+ test_non_step<gil::rgb8_ptr_t>();
+ test_non_step<gil::rgb8_planar_ptr_t>();
+ test_non_step<gil::rgb16_ptr_t>();
+ test_non_step<gil::rgb16_planar_ptr_t>();
+ test_non_step<gil::rgb32_ptr_t>();
+ test_non_step<gil::rgb32_planar_ptr_t>();
+ test_non_step<gil::rgb32f_ptr_t>();
+ test_non_step<gil::rgb32f_planar_ptr_t>();
+ test_step<gil::rgb8_step_ptr_t>();
+ test_step<gil::rgb8_planar_step_ptr_t>();
+ test_step<gil::rgb16_step_ptr_t>();
+ test_step<gil::rgb16_planar_step_ptr_t>();
+ test_step<gil::rgb32_step_ptr_t>();
+ test_step<gil::rgb32_planar_step_ptr_t>();
+ test_step<gil::rgb32f_step_ptr_t>();
+ test_step<gil::rgb32f_planar_step_ptr_t>();
+
+ test_non_step<gil::rgba8_ptr_t>();
+ test_non_step<gil::rgba8_planar_ptr_t>();
+ test_non_step<gil::rgba16_ptr_t>();
+ test_non_step<gil::rgba16_planar_ptr_t>();
+ test_non_step<gil::rgba32_ptr_t>();
+ test_non_step<gil::rgba32_planar_ptr_t>();
+ test_non_step<gil::rgba32f_ptr_t>();
+ test_non_step<gil::rgba32f_planar_ptr_t>();
+ test_step<gil::rgba8_step_ptr_t>();
+ test_step<gil::rgba8_planar_step_ptr_t>();
+ test_step<gil::rgba16_step_ptr_t>();
+ test_step<gil::rgba16_planar_step_ptr_t>();
+ test_step<gil::rgba32_step_ptr_t>();
+ test_step<gil::rgba32_planar_step_ptr_t>();
+ test_step<gil::rgba32f_step_ptr_t>();
+ test_step<gil::rgba32f_planar_step_ptr_t>();
+
+ test_non_step<gil::cmyk8_ptr_t>();
+ test_non_step<gil::cmyk8_planar_ptr_t>();
+ test_non_step<gil::cmyk16_ptr_t>();
+ test_non_step<gil::cmyk16_planar_ptr_t>();
+ test_non_step<gil::cmyk32_ptr_t>();
+ test_non_step<gil::cmyk32_planar_ptr_t>();
+ test_non_step<gil::cmyk32f_ptr_t>();
+ test_non_step<gil::cmyk32f_planar_ptr_t>();
+ test_step<gil::cmyk8_step_ptr_t>();
+ test_step<gil::cmyk8_planar_step_ptr_t>();
+ test_step<gil::cmyk16_step_ptr_t>();
+ test_step<gil::cmyk16_planar_step_ptr_t>();
+ test_step<gil::cmyk32_step_ptr_t>();
+ test_step<gil::cmyk32_planar_step_ptr_t>();
+ test_step<gil::cmyk32f_step_ptr_t>();
+ test_step<gil::cmyk32f_planar_step_ptr_t>();
+}
diff --git a/src/boost/libs/gil/test/core/iterator/is_planar.cpp b/src/boost/libs/gil/test/core/iterator/is_planar.cpp
new file mode 100644
index 000000000..240e5854b
--- /dev/null
+++ b/src/boost/libs/gil/test/core/iterator/is_planar.cpp
@@ -0,0 +1,72 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/pixel.hpp>
+#include <boost/gil/planar_pixel_iterator.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/mp11.hpp>
+
+namespace gil = boost::gil;
+using namespace boost::mp11;
+
+int main()
+{
+ using iterators = mp_list
+ <
+ gil::planar_pixel_iterator<gil::rgb8_view_t*, gil::rgb_t>,
+ gil::rgb8_planar_ptr_t,
+ gil::rgb8_planar_step_ptr_t,
+ gil::rgb8c_planar_ptr_t,
+ gil::rgb8c_planar_step_ptr_t,
+ gil::rgb16_planar_ptr_t,
+ gil::rgb16c_planar_ptr_t,
+ gil::rgb16s_planar_ptr_t,
+ gil::rgb16sc_planar_ptr_t,
+ gil::rgb32_planar_ptr_t,
+ gil::rgb32c_planar_ptr_t,
+ gil::rgb32f_planar_ptr_t,
+ gil::rgb32fc_planar_ptr_t,
+ gil::rgb32s_planar_ptr_t,
+ gil::rgb32sc_planar_ptr_t,
+ gil::cmyk8_planar_ptr_t,
+ gil::cmyk8c_planar_ptr_t,
+ gil::cmyk8s_planar_ptr_t,
+ gil::cmyk8sc_planar_ptr_t,
+ gil::cmyk16_planar_ptr_t,
+ gil::cmyk16c_planar_ptr_t,
+ gil::cmyk16s_planar_ptr_t,
+ gil::cmyk16sc_planar_ptr_t,
+ gil::cmyk32_planar_ptr_t,
+ gil::cmyk32c_planar_ptr_t,
+ gil::cmyk32f_planar_ptr_t,
+ gil::cmyk32fc_planar_ptr_t,
+ gil::cmyk32s_planar_ptr_t,
+ gil::cmyk32sc_planar_ptr_t,
+ gil::rgba8_planar_ptr_t,
+ gil::rgba8c_planar_ptr_t,
+ gil::rgba8s_planar_ptr_t,
+ gil::rgba8sc_planar_ptr_t,
+ gil::rgba16_planar_ptr_t,
+ gil::rgba16c_planar_ptr_t,
+ gil::rgba16s_planar_ptr_t,
+ gil::rgba16sc_planar_ptr_t,
+ gil::rgba32_planar_ptr_t,
+ gil::rgba32c_planar_ptr_t,
+ gil::rgba32f_planar_ptr_t,
+ gil::rgba32fc_planar_ptr_t,
+ gil::rgba32s_planar_ptr_t,
+ gil::rgba32sc_planar_ptr_t
+ >;
+
+ static_assert(std::is_same
+ <
+ mp_all_of<iterators, gil::is_planar>,
+ std::true_type
+ >::value,
+ "is_planar yields true for non-planar pixel iterator");
+}
diff --git a/src/boost/libs/gil/test/core/locator/CMakeLists.txt b/src/boost/libs/gil/test/core/locator/CMakeLists.txt
new file mode 100644
index 000000000..b9beac82f
--- /dev/null
+++ b/src/boost/libs/gil/test/core/locator/CMakeLists.txt
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+foreach(_name
+ concepts
+ dynamic_step)
+ set(_test t_core_locator_${_name})
+ set(_target test_core_locator_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
diff --git a/src/boost/libs/gil/test/core/locator/Jamfile b/src/boost/libs/gil/test/core/locator/Jamfile
new file mode 100644
index 000000000..54e8e5aeb
--- /dev/null
+++ b/src/boost/libs/gil/test/core/locator/Jamfile
@@ -0,0 +1,12 @@
+# Boost.GIL (Generic Image Library) - tests
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+compile concepts.cpp ;
+compile dynamic_step.cpp ;
diff --git a/src/boost/libs/gil/test/core/locator/concepts.cpp b/src/boost/libs/gil/test/core/locator/concepts.cpp
new file mode 100644
index 000000000..bf72d2c9e
--- /dev/null
+++ b/src/boost/libs/gil/test/core/locator/concepts.cpp
@@ -0,0 +1,202 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+// FIXME: Avoid Clang's flooding of non-disableable warnings like:
+// "T does not declare any constructor to initialize its non-modifiable members"
+// when compiling with concepts check enabled.
+// See https://bugs.llvm.org/show_bug.cgi?id=41759
+#if !defined(BOOST_GIL_USE_CONCEPT_CHECK) && !defined(__clang__)
+#error Compile with BOOST_GIL_USE_CONCEPT_CHECK defined
+#endif
+#include <boost/gil/concepts.hpp>
+#include <boost/gil/locator.hpp>
+#include <boost/gil/planar_pixel_reference.hpp>
+#include <boost/gil/typedefs.hpp>
+#include <boost/gil/virtual_locator.hpp>
+
+#include <boost/concept_check.hpp>
+
+namespace gil = boost::gil;
+using boost::function_requires;
+
+template <typename Locator>
+void test_immutable()
+{
+ function_requires<gil::PixelLocatorConcept<Locator>>();
+ function_requires<gil::HasDynamicXStepTypeConcept<Locator>>();
+ function_requires<gil::HasDynamicYStepTypeConcept<Locator>>();
+}
+
+template <typename Locator>
+void test_mutable()
+{
+ function_requires<gil::MutablePixelLocatorConcept<Locator>>();
+ function_requires<gil::HasDynamicXStepTypeConcept<Locator>>();
+ function_requires<gil::HasDynamicYStepTypeConcept<Locator>>();
+}
+
+template <typename Pixel>
+struct archetype_pixel_dereference
+{
+ using point_t = gil::point_t;
+ using const_t = archetype_pixel_dereference;
+ using value_type = Pixel;
+ using reference = value_type;
+ using const_reference = value_type;
+ using argument_type = gil::point_t;
+ using result_type = reference;
+ static constexpr bool is_mutable = false;
+ result_type operator()(argument_type const&) const { return result_type{}; }
+};
+
+template <typename Pixel>
+using virtual_locator = gil::virtual_2d_locator<archetype_pixel_dereference<Pixel>, false>;
+
+int main()
+{
+ test_mutable<gil::gray8_loc_t>();
+ test_mutable<gil::gray8_step_loc_t>();
+ test_mutable<gil::gray16_loc_t>();
+ test_mutable<gil::gray16_step_loc_t>();
+ test_mutable<gil::gray32_loc_t>();
+ test_mutable<gil::gray32_step_loc_t>();
+ test_mutable<gil::gray32f_loc_t>();
+ test_mutable<gil::gray32f_step_loc_t>();
+ test_immutable<gil::gray8c_loc_t>();
+ test_immutable<gil::gray8c_step_loc_t>();
+ test_immutable<gil::gray16c_loc_t>();
+ test_immutable<gil::gray16c_step_loc_t>();
+ test_immutable<gil::gray32c_loc_t>();
+ test_immutable<gil::gray32c_step_loc_t>();
+ test_immutable<gil::gray32fc_loc_t>();
+ test_immutable<gil::gray32fc_step_loc_t>();
+
+ test_mutable<gil::memory_based_2d_locator<gil::gray8_step_ptr_t>>();
+ test_immutable<gil::memory_based_2d_locator<gil::gray8c_step_ptr_t>>();
+ test_mutable<virtual_locator<gil::gray8_pixel_t>>();
+ test_immutable<virtual_locator<gil::gray8c_pixel_t>>();
+
+ test_mutable<gil::abgr8_loc_t>();
+ test_mutable<gil::abgr8_step_loc_t>();
+ test_mutable<gil::memory_based_2d_locator<gil::abgr8_step_ptr_t>>();
+ test_mutable<gil::abgr16_loc_t>();
+ test_mutable<gil::abgr16_step_loc_t>();
+ test_mutable<gil::abgr32_loc_t>();
+ test_mutable<gil::abgr32_step_loc_t>();
+ test_mutable<gil::abgr32f_loc_t>();
+ test_mutable<gil::abgr32f_step_loc_t>();
+ test_immutable<gil::abgr8c_loc_t>();
+ test_immutable<gil::abgr8c_step_loc_t>();
+ test_immutable<gil::memory_based_2d_locator<gil::abgr8c_step_ptr_t>>();
+ test_immutable<gil::abgr16c_loc_t>();
+ test_immutable<gil::abgr16c_step_loc_t>();
+ test_immutable<gil::abgr32c_loc_t>();
+ test_immutable<gil::abgr32c_step_loc_t>();
+ test_immutable<gil::abgr32fc_loc_t>();
+ test_immutable<gil::abgr32fc_step_loc_t>();
+
+ test_mutable<gil::argb8_loc_t>();
+ test_mutable<gil::argb8_step_loc_t>();
+ test_mutable<gil::memory_based_2d_locator<gil::argb8_step_ptr_t>>();
+ test_mutable<gil::argb16_loc_t>();
+ test_mutable<gil::argb16_step_loc_t>();
+ test_mutable<gil::argb32_loc_t>();
+ test_mutable<gil::argb32_step_loc_t>();
+ test_mutable<gil::argb32f_loc_t>();
+ test_mutable<gil::argb32f_step_loc_t>();
+
+ test_mutable<gil::bgr8_loc_t>();
+ test_mutable<gil::bgr8_step_loc_t>();
+ test_mutable<gil::memory_based_2d_locator<gil::bgr8_step_ptr_t>>();
+ test_mutable<gil::bgr16_loc_t>();
+ test_mutable<gil::bgr16_step_loc_t>();
+ test_mutable<gil::bgr32_loc_t>();
+ test_mutable<gil::bgr32_step_loc_t>();
+ test_mutable<gil::bgr32f_loc_t>();
+ test_mutable<gil::bgr32f_step_loc_t>();
+
+ test_mutable<gil::bgra8_loc_t>();
+ test_mutable<gil::bgra8_step_loc_t>();
+ test_mutable<gil::memory_based_2d_locator<gil::bgra8_step_ptr_t>>();
+ test_mutable<gil::bgra16_loc_t>();
+ test_mutable<gil::bgra16_step_loc_t>();
+ test_mutable<gil::bgra32_loc_t>();
+ test_mutable<gil::bgra32_step_loc_t>();
+ test_mutable<gil::bgra32f_loc_t>();
+ test_mutable<gil::bgra32f_step_loc_t>();
+
+ test_mutable<gil::rgb8_loc_t>();
+ test_mutable<gil::rgb8_step_loc_t>();
+ test_mutable<gil::rgb8_planar_loc_t>();
+ test_mutable<gil::rgb8_planar_step_loc_t>();
+ test_mutable<gil::rgb16_loc_t>();
+ test_mutable<gil::rgb16_step_loc_t>();
+ test_mutable<gil::rgb16_planar_loc_t>();
+ test_mutable<gil::rgb16_planar_step_loc_t>();
+ test_mutable<gil::rgb32_loc_t>();
+ test_mutable<gil::rgb32_step_loc_t>();
+ test_mutable<gil::rgb32_planar_loc_t>();
+ test_mutable<gil::rgb32_planar_step_loc_t>();
+ test_mutable<gil::rgb32f_loc_t>();
+ test_mutable<gil::rgb32f_step_loc_t>();
+ test_mutable<gil::rgb32f_planar_loc_t>();
+ test_mutable<gil::rgb32f_planar_step_loc_t>();
+ test_immutable<gil::rgb8c_loc_t>();
+ test_immutable<gil::rgb8c_step_loc_t>();
+ test_immutable<gil::rgb16c_loc_t>();
+ test_immutable<gil::rgb16c_step_loc_t>();
+ test_immutable<gil::rgb32c_loc_t>();
+ test_immutable<gil::rgb32c_step_loc_t>();
+ test_immutable<gil::rgb32fc_loc_t>();
+ test_immutable<gil::rgb32fc_step_loc_t>();
+
+ test_mutable<gil::memory_based_2d_locator<gil::rgb8_step_ptr_t>>();
+ test_immutable<gil::memory_based_2d_locator<gil::rgb8c_step_ptr_t>>();
+ test_mutable<virtual_locator<gil::rgb8_pixel_t>>();
+ test_immutable<virtual_locator<gil::rgb8c_pixel_t>>();
+
+ test_mutable<gil::rgba8_loc_t>();
+ test_mutable<gil::rgba8_step_loc_t>();
+ test_mutable<gil::rgba8_planar_loc_t>();
+ test_mutable<gil::rgba8_planar_step_loc_t>();
+ test_mutable<gil::memory_based_2d_locator<gil::rgba8_step_ptr_t>>();
+ test_mutable<gil::rgba16_loc_t>();
+ test_mutable<gil::rgba16_step_loc_t>();
+ test_mutable<gil::rgba16_planar_loc_t>();
+ test_mutable<gil::rgba16_planar_step_loc_t>();
+ test_mutable<gil::rgba32_loc_t>();
+ test_mutable<gil::rgba32_step_loc_t>();
+ test_mutable<gil::rgba32_planar_loc_t>();
+ test_mutable<gil::rgba32_planar_step_loc_t>();
+ test_mutable<gil::rgba32f_loc_t>();
+ test_mutable<gil::rgba32f_step_loc_t>();
+ test_mutable<gil::rgba32f_planar_loc_t>();
+ test_mutable<gil::rgba32f_planar_step_loc_t>();
+
+ test_mutable<gil::cmyk8_loc_t>();
+ test_mutable<gil::cmyk8_step_loc_t>();
+ test_mutable<gil::cmyk8_planar_loc_t>();
+ test_mutable<gil::cmyk8_planar_step_loc_t>();
+ test_mutable<gil::memory_based_2d_locator<gil::cmyk8_step_ptr_t>>();
+ test_mutable<gil::cmyk16_loc_t>();
+ test_mutable<gil::cmyk16_step_loc_t>();
+ test_mutable<gil::cmyk16_planar_loc_t>();
+ test_mutable<gil::cmyk16_planar_step_loc_t>();
+ test_mutable<gil::cmyk32_loc_t>();
+ test_mutable<gil::cmyk32_step_loc_t>();
+ test_mutable<gil::cmyk32_planar_loc_t>();
+ test_mutable<gil::cmyk32_planar_step_loc_t>();
+ test_mutable<gil::cmyk32f_loc_t>();
+ test_mutable<gil::cmyk32f_step_loc_t>();
+ test_mutable<gil::cmyk32f_planar_loc_t>();
+ test_mutable<gil::cmyk32f_planar_step_loc_t>();
+ test_immutable<gil::cmyk8c_loc_t>();
+ test_immutable<gil::cmyk8c_step_loc_t>();
+ test_immutable<gil::cmyk8c_planar_loc_t>();
+ test_immutable<gil::cmyk8c_planar_step_loc_t>();
+ test_immutable<gil::memory_based_2d_locator<gil::cmyk8c_step_ptr_t>>();
+}
diff --git a/src/boost/libs/gil/test/core/locator/dynamic_step.cpp b/src/boost/libs/gil/test/core/locator/dynamic_step.cpp
new file mode 100644
index 000000000..c19d8093a
--- /dev/null
+++ b/src/boost/libs/gil/test/core/locator/dynamic_step.cpp
@@ -0,0 +1,92 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/dynamic_step.hpp>
+#include <boost/gil/color_base.hpp> // kth_element_type
+#include <boost/gil/pixel.hpp> // kth_element_type
+#include <boost/gil/locator.hpp>
+#include <boost/gil/pixel_iterator.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+template <typename Locator>
+void test_locator_from_iterator()
+{
+ // The `memory_based_2d_locator` for X-step is calculated based on adapted iterator
+ // Only verify `type` member is available (i.e. specialization defined).
+ static_assert(std::is_class
+ <
+ typename gil::dynamic_x_step_type<Locator>::type
+ >::value, "");
+
+ static_assert(std::is_same
+ <
+ Locator,
+ typename gil::dynamic_y_step_type<Locator>::type
+ >::value, "locator does not model HasDynamicYStepTypeConcept");
+}
+
+int main()
+{
+ test_locator_from_iterator<gil::gray8_loc_t>();
+ test_locator_from_iterator<gil::gray8c_loc_t>();
+ test_locator_from_iterator<gil::gray16_loc_t>();
+ test_locator_from_iterator<gil::gray16c_loc_t>();
+ test_locator_from_iterator<gil::gray32_loc_t>();
+ test_locator_from_iterator<gil::gray32c_loc_t>();
+ test_locator_from_iterator<gil::gray32f_loc_t>();
+
+ test_locator_from_iterator<gil::abgr8_loc_t>();
+ test_locator_from_iterator<gil::abgr16_loc_t>();
+ test_locator_from_iterator<gil::abgr32_loc_t>();
+ test_locator_from_iterator<gil::abgr32f_loc_t>();
+
+ test_locator_from_iterator<gil::argb8_loc_t>();
+ test_locator_from_iterator<gil::argb16_loc_t>();
+ test_locator_from_iterator<gil::argb32_loc_t>();
+ test_locator_from_iterator<gil::argb32f_loc_t>();
+
+ test_locator_from_iterator<gil::bgr8_loc_t>();
+ test_locator_from_iterator<gil::bgr16_loc_t>();
+ test_locator_from_iterator<gil::bgr32_loc_t>();
+ test_locator_from_iterator<gil::bgr32f_loc_t>();
+
+ test_locator_from_iterator<gil::bgra8_loc_t>();
+ test_locator_from_iterator<gil::bgra16_loc_t>();
+ test_locator_from_iterator<gil::bgra32_loc_t>();
+ test_locator_from_iterator<gil::bgra32f_loc_t>();
+
+ test_locator_from_iterator<gil::rgb8_loc_t>();
+ test_locator_from_iterator<gil::rgb8_planar_loc_t>();
+ test_locator_from_iterator<gil::rgb16_loc_t>();
+ test_locator_from_iterator<gil::rgb16_planar_loc_t>();
+ test_locator_from_iterator<gil::rgb32_loc_t>();
+ test_locator_from_iterator<gil::rgb32_planar_loc_t>();
+ test_locator_from_iterator<gil::rgb32f_loc_t>();
+ test_locator_from_iterator<gil::rgb32f_planar_loc_t>();
+
+ test_locator_from_iterator<gil::rgba8_loc_t>();
+ test_locator_from_iterator<gil::rgba8_planar_loc_t>();
+ test_locator_from_iterator<gil::rgba16_loc_t>();
+ test_locator_from_iterator<gil::rgba16_planar_loc_t>();
+ test_locator_from_iterator<gil::rgba32_loc_t>();
+ test_locator_from_iterator<gil::rgba32_planar_loc_t>();
+ test_locator_from_iterator<gil::rgba32f_loc_t>();
+ test_locator_from_iterator<gil::rgba32f_planar_loc_t>();
+
+ test_locator_from_iterator<gil::cmyk8_loc_t>();
+ test_locator_from_iterator<gil::cmyk8_planar_loc_t>();
+ test_locator_from_iterator<gil::cmyk16_loc_t>();
+ test_locator_from_iterator<gil::cmyk16_planar_loc_t>();
+ test_locator_from_iterator<gil::cmyk32_loc_t>();
+ test_locator_from_iterator<gil::cmyk32_planar_loc_t>();
+ test_locator_from_iterator<gil::cmyk32f_loc_t>();
+ test_locator_from_iterator<gil::cmyk32f_planar_loc_t>();
+}
diff --git a/src/boost/libs/gil/test/core/pixel/CMakeLists.txt b/src/boost/libs/gil/test/core/pixel/CMakeLists.txt
new file mode 100644
index 000000000..8f90a72be
--- /dev/null
+++ b/src/boost/libs/gil/test/core/pixel/CMakeLists.txt
@@ -0,0 +1,34 @@
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+foreach(_name
+ concepts
+ bit_aligned_pixel_reference
+ is_pixel
+ is_planar
+ num_channels
+ packed_pixel
+ pixel_reference_is_mutable
+ pixels_are_compatible
+ test_fixture)
+ set(_test t_core_pixel_${_name})
+ set(_target test_core_pixel_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
diff --git a/src/boost/libs/gil/test/core/pixel/Jamfile b/src/boost/libs/gil/test/core/pixel/Jamfile
new file mode 100644
index 000000000..724565236
--- /dev/null
+++ b/src/boost/libs/gil/test/core/pixel/Jamfile
@@ -0,0 +1,20 @@
+# Boost.GIL (Generic Image Library) - tests
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+compile bit_aligned_pixel_reference.cpp ;
+compile concepts.cpp ;
+compile is_pixel.cpp ;
+compile is_planar.cpp ;
+compile num_channels.cpp ;
+compile pixel_reference_is_mutable.cpp ;
+compile pixels_are_compatible.cpp ;
+
+run packed_pixel.cpp ;
+run test_fixture.cpp ;
diff --git a/src/boost/libs/gil/test/core/pixel/bit_aligned_pixel_reference.cpp b/src/boost/libs/gil/test/core/pixel/bit_aligned_pixel_reference.cpp
new file mode 100644
index 000000000..8f834e695
--- /dev/null
+++ b/src/boost/libs/gil/test/core/pixel/bit_aligned_pixel_reference.cpp
@@ -0,0 +1,46 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/bit_aligned_pixel_reference.hpp>
+#include <boost/gil/packed_pixel.hpp>
+#include <boost/gil/rgb.hpp>
+#include <boost/mp11.hpp>
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+int main()
+{
+ using bgr121_ref_t = gil::bit_aligned_pixel_reference
+ <
+ std::uint8_t, mp11::mp_list_c<int, 1, 2, 1>, gil::bgr_layout_t, true
+ >;
+
+ static_assert(bgr121_ref_t::bit_size == 4,
+ "bit size should be 4");
+
+ static_assert(std::is_same<bgr121_ref_t::bitfield_t, std::uint8_t>::value,
+ "bit field type should be std::uint8_t");
+
+ static_assert(std::is_same<bgr121_ref_t::layout_t, gil::bgr_layout_t>::value,
+ "layout type should be bgr");
+
+ static_assert(std::is_same<decltype(bgr121_ref_t::is_mutable), bool const>::value &&
+ bgr121_ref_t::is_mutable,
+ "is_mutable should be boolean");
+
+ using packed_pixel_t = gil::packed_pixel
+ <
+ std::uint8_t,
+ typename gil::detail::packed_channel_references_vector_type
+ <
+ std::uint8_t, mp11::mp_list_c<int, 1, 2, 1>
+ >::type,
+ gil::bgr_layout_t
+ >;
+ static_assert(std::is_same<bgr121_ref_t::value_type, packed_pixel_t>::value,
+ "value_type should be specialization of packed_pixel");
+}
diff --git a/src/boost/libs/gil/test/core/pixel/concepts.cpp b/src/boost/libs/gil/test/core/pixel/concepts.cpp
new file mode 100644
index 000000000..7543ec60f
--- /dev/null
+++ b/src/boost/libs/gil/test/core/pixel/concepts.cpp
@@ -0,0 +1,67 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+// FIXME: Avoid Clang's flooding of non-disableable warnings like:
+// "T does not declare any constructor to initialize its non-modifiable members"
+// when compiling with concepts check enabled.
+// See https://bugs.llvm.org/show_bug.cgi?id=41759
+#if !defined(BOOST_GIL_USE_CONCEPT_CHECK) && !defined(__clang__)
+#error Compile with BOOST_GIL_USE_CONCEPT_CHECK defined
+#endif
+#include <boost/gil.hpp>
+
+#include <boost/concept_check.hpp>
+#include <boost/mp11.hpp>
+
+#include "test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+using boost::function_requires;
+
+template <template<typename> class Concept>
+struct assert_concept
+{
+ template <typename Pixel>
+ void operator()(Pixel&&)
+ {
+ function_requires<Concept<Pixel>>();
+ }
+};
+
+template <template<typename> class Concept, typename... Pixels>
+void test_concept()
+{
+ mp11::mp_for_each<Pixels...>(assert_concept<Concept>());
+}
+
+int main()
+{
+ test_concept<gil::PixelConcept, gil::test::fixture::pixel_typedefs>();
+ test_concept<gil::MutablePixelConcept, gil::test::fixture::pixel_typedefs>();
+
+ using rgb565_pixel_t = gil::packed_pixel_type
+ <
+ std::uint16_t,
+ mp11::mp_list_c<unsigned, 5, 6, 5>,
+ gil::rgb_layout_t
+ >::type;
+ function_requires<gil::PixelConcept<rgb565_pixel_t>>();
+ function_requires<gil::PixelValueConcept<rgb565_pixel_t>>();
+
+ using bgr556_pixel_t = gil::packed_pixel_type
+ <
+ std::uint16_t,
+ mp11::mp_list_c<unsigned, 5, 6, 5>,
+ gil::bgr_layout_t>::type;
+ function_requires<gil::PixelConcept<bgr556_pixel_t>>();
+ function_requires<gil::PixelValueConcept<bgr556_pixel_t>>();
+
+ function_requires<gil::PixelsCompatibleConcept<rgb565_pixel_t, bgr556_pixel_t>>();
+
+ return 0;
+}
diff --git a/src/boost/libs/gil/test/core/pixel/is_pixel.cpp b/src/boost/libs/gil/test/core/pixel/is_pixel.cpp
new file mode 100644
index 000000000..b9f84975a
--- /dev/null
+++ b/src/boost/libs/gil/test/core/pixel/is_pixel.cpp
@@ -0,0 +1,77 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/bit_aligned_pixel_reference.hpp>
+#include <boost/gil/packed_pixel.hpp>
+#include <boost/gil/pixel.hpp>
+#include <boost/gil/rgb.hpp>
+#include <boost/gil/typedefs.hpp>
+#include <boost/gil/concepts/pixel.hpp>
+
+#include <boost/mp11.hpp>
+
+#include "test_fixture.hpp"
+
+namespace gil = boost::gil;
+using namespace boost::mp11;
+
+int main()
+{
+ static_assert(std::is_same
+ <
+ mp_all_of<gil::test::fixture::pixel_typedefs, gil::is_pixel>,
+ std::true_type
+ >::value,
+ "is_pixel does not yield true for all core pixel types");
+
+ static_assert(std::is_same
+ <
+ mp_all_of
+ <
+ mp_transform
+ <
+ gil::test::fixture::nested_pixel_type,
+ gil::test::fixture::representative_pixel_types
+ >,
+ gil::is_pixel
+ >,
+ std::true_type
+ >::value,
+ "is_pixel does not yield true for representative pixel types");
+
+ static_assert(std::is_same
+ <
+ mp_all_of<gil::test::fixture::non_pixels, gil::is_pixel>,
+ std::false_type
+ >::value,
+ "is_pixel yields true for non-pixel type");
+
+ static_assert(std::is_same
+ <
+ mp_none_of<gil::test::fixture::non_pixels, gil::is_pixel>,
+ std::true_type
+ >::value,
+ "is_pixel yields true for non-pixel type");
+
+ using bgr121_ref_t = gil::bit_aligned_pixel_reference
+ <
+ std::uint8_t, mp_list_c<int, 1, 2, 1>, gil::bgr_layout_t, true
+ >;
+ static_assert(gil::is_pixel<bgr121_ref_t>::value,
+ "is_pixel does not yield true for bit_aligned_pixel_reference");
+
+ using rgb121_ref_t = gil::bit_aligned_pixel_reference
+ <
+ std::uint8_t, mp_list_c<int, 1, 2, 1>, gil::rgb_layout_t, true
+ >;
+ static_assert(gil::is_pixel<bgr121_ref_t>::value,
+ "is_pixel does not yield true for bit_aligned_pixel_reference");
+
+ using rgb121_packed_pixel_t = rgb121_ref_t::value_type;
+ static_assert(gil::is_pixel<rgb121_packed_pixel_t>::value,
+ "is_pixel does not yield true for packed_pixel");
+}
diff --git a/src/boost/libs/gil/test/core/pixel/is_planar.cpp b/src/boost/libs/gil/test/core/pixel/is_planar.cpp
new file mode 100644
index 000000000..fde33d4bd
--- /dev/null
+++ b/src/boost/libs/gil/test/core/pixel/is_planar.cpp
@@ -0,0 +1,137 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/pixel.hpp>
+#include <boost/gil/planar_pixel_iterator.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/mp11.hpp>
+
+namespace gil = boost::gil;
+using namespace boost::mp11;
+
+int main()
+{
+ using non_planar_pixels = mp_list
+ <
+ gil::gray8_pixel_t,
+ gil::gray8c_pixel_t,
+ gil::gray8s_pixel_t,
+ gil::gray8sc_pixel_t,
+ gil::gray16_pixel_t,
+ gil::gray16c_pixel_t,
+ gil::gray16s_pixel_t,
+ gil::gray16sc_pixel_t,
+ gil::gray16_pixel_t,
+ gil::gray32_pixel_t,
+ gil::gray32c_pixel_t,
+ gil::gray32f_pixel_t,
+ gil::gray32fc_pixel_t,
+ gil::gray32s_pixel_t,
+ gil::gray32sc_pixel_t,
+ gil::bgr8_pixel_t,
+ gil::bgr8c_pixel_t,
+ gil::bgr8s_pixel_t,
+ gil::bgr8sc_pixel_t,
+ gil::bgr16_pixel_t,
+ gil::bgr16c_pixel_t,
+ gil::bgr16s_pixel_t,
+ gil::bgr16sc_pixel_t,
+ gil::bgr32_pixel_t,
+ gil::bgr32c_pixel_t,
+ gil::bgr32f_pixel_t,
+ gil::bgr32fc_pixel_t,
+ gil::bgr32s_pixel_t,
+ gil::bgr32sc_pixel_t,
+ gil::rgb8_pixel_t,
+ gil::rgb8c_pixel_t,
+ gil::rgb8s_pixel_t,
+ gil::rgb8sc_pixel_t,
+ gil::rgb16_pixel_t,
+ gil::rgb16c_pixel_t,
+ gil::rgb16s_pixel_t,
+ gil::rgb16sc_pixel_t,
+ gil::rgb32_pixel_t,
+ gil::rgb32c_pixel_t,
+ gil::rgb32f_pixel_t,
+ gil::rgb32fc_pixel_t,
+ gil::rgb32s_pixel_t,
+ gil::rgb32sc_pixel_t,
+ gil::abgr8_pixel_t,
+ gil::abgr8c_pixel_t,
+ gil::abgr8s_pixel_t,
+ gil::abgr8sc_pixel_t,
+ gil::abgr16_pixel_t,
+ gil::abgr16c_pixel_t,
+ gil::abgr16s_pixel_t,
+ gil::abgr16sc_pixel_t,
+ gil::abgr32_pixel_t,
+ gil::abgr32c_pixel_t,
+ gil::abgr32f_pixel_t,
+ gil::abgr32fc_pixel_t,
+ gil::abgr32s_pixel_t,
+ gil::abgr32sc_pixel_t,
+ gil::bgra8_pixel_t,
+ gil::bgra8c_pixel_t,
+ gil::bgra8s_pixel_t,
+ gil::bgra8sc_pixel_t,
+ gil::bgra16_pixel_t,
+ gil::bgra16c_pixel_t,
+ gil::bgra16s_pixel_t,
+ gil::bgra16sc_pixel_t,
+ gil::bgra32_pixel_t,
+ gil::bgra32c_pixel_t,
+ gil::bgra32f_pixel_t,
+ gil::bgra32fc_pixel_t,
+ gil::bgra32s_pixel_t,
+ gil::bgra32sc_pixel_t,
+ gil::cmyk8_pixel_t,
+ gil::cmyk8c_pixel_t,
+ gil::cmyk8s_pixel_t,
+ gil::cmyk8sc_pixel_t,
+ gil::cmyk16_pixel_t,
+ gil::cmyk16c_pixel_t,
+ gil::cmyk16s_pixel_t,
+ gil::cmyk16sc_pixel_t,
+ gil::cmyk32_pixel_t,
+ gil::cmyk32c_pixel_t,
+ gil::cmyk32f_pixel_t,
+ gil::cmyk32fc_pixel_t,
+ gil::cmyk32s_pixel_t,
+ gil::cmyk32sc_pixel_t,
+ gil::rgba8_pixel_t,
+ gil::rgba8c_pixel_t,
+ gil::rgba8s_pixel_t,
+ gil::rgba8sc_pixel_t,
+ gil::rgba16_pixel_t,
+ gil::rgba16c_pixel_t,
+ gil::rgba16s_pixel_t,
+ gil::rgba16sc_pixel_t,
+ gil::rgba32_pixel_t,
+ gil::rgba32c_pixel_t,
+ gil::rgba32f_pixel_t,
+ gil::rgba32fc_pixel_t,
+ gil::rgba32s_pixel_t,
+ gil::rgba32sc_pixel_t
+ >;
+
+ static_assert(
+ std::is_same
+ <
+ mp_all_of<non_planar_pixels, gil::is_planar>,
+ std::false_type
+ >::value,
+ "is_planar yields true for non-planar pixel type");
+
+ static_assert(
+ std::is_same
+ <
+ mp_none_of<non_planar_pixels, gil::is_planar>,
+ std::true_type
+ >::value,
+ "is_planar yields true for non-planar pixel type");
+}
diff --git a/src/boost/libs/gil/test/core/pixel/num_channels.cpp b/src/boost/libs/gil/test/core/pixel/num_channels.cpp
new file mode 100644
index 000000000..ba80a260e
--- /dev/null
+++ b/src/boost/libs/gil/test/core/pixel/num_channels.cpp
@@ -0,0 +1,154 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/pixel.hpp>
+#include <boost/gil/concepts/pixel.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/mp11.hpp>
+
+namespace gil = boost::gil;
+using namespace boost::mp11;
+
+template <std::size_t NumChannels>
+struct assert_num_channels
+{
+ template <typename Pixel>
+ void operator()(Pixel&&)
+ {
+ static_assert(
+ gil::num_channels<Pixel>::value == NumChannels,
+ "pixels does not have expected number of channels");
+
+ // TODO: Verify num_channels type with std::is_same
+ // e.g. is std::integral_constant<T, ...>
+ }
+};
+
+template <std::size_t NumChannels, typename... Pixels>
+void test()
+{
+ mp_for_each<Pixels...>(assert_num_channels<NumChannels>());
+}
+
+
+int main()
+{
+ using one = mp_list
+ <
+ gil::gray8_pixel_t,
+ gil::gray8c_pixel_t,
+ gil::gray8s_pixel_t,
+ gil::gray8sc_pixel_t,
+ gil::gray16_pixel_t,
+ gil::gray16c_pixel_t,
+ gil::gray16s_pixel_t,
+ gil::gray16sc_pixel_t,
+ gil::gray16_pixel_t,
+ gil::gray32_pixel_t,
+ gil::gray32c_pixel_t,
+ gil::gray32f_pixel_t,
+ gil::gray32fc_pixel_t,
+ gil::gray32s_pixel_t,
+ gil::gray32sc_pixel_t
+ >;
+ test<1, one>();
+
+ using three = mp_list
+ <
+ gil::bgr8_pixel_t,
+ gil::bgr8c_pixel_t,
+ gil::bgr8s_pixel_t,
+ gil::bgr8sc_pixel_t,
+ gil::bgr16_pixel_t,
+ gil::bgr16c_pixel_t,
+ gil::bgr16s_pixel_t,
+ gil::bgr16sc_pixel_t,
+ gil::bgr32_pixel_t,
+ gil::bgr32c_pixel_t,
+ gil::bgr32f_pixel_t,
+ gil::bgr32fc_pixel_t,
+ gil::bgr32s_pixel_t,
+ gil::bgr32sc_pixel_t,
+ gil::rgb8_pixel_t,
+ gil::rgb8c_pixel_t,
+ gil::rgb8s_pixel_t,
+ gil::rgb8sc_pixel_t,
+ gil::rgb16_pixel_t,
+ gil::rgb16c_pixel_t,
+ gil::rgb16s_pixel_t,
+ gil::rgb16sc_pixel_t,
+ gil::rgb32_pixel_t,
+ gil::rgb32c_pixel_t,
+ gil::rgb32f_pixel_t,
+ gil::rgb32fc_pixel_t,
+ gil::rgb32s_pixel_t,
+ gil::rgb32sc_pixel_t
+ >;
+ test<3, three>();
+
+ using four = mp_list
+ <
+ gil::abgr8_pixel_t,
+ gil::abgr8c_pixel_t,
+ gil::abgr8s_pixel_t,
+ gil::abgr8sc_pixel_t,
+ gil::abgr16_pixel_t,
+ gil::abgr16c_pixel_t,
+ gil::abgr16s_pixel_t,
+ gil::abgr16sc_pixel_t,
+ gil::abgr32_pixel_t,
+ gil::abgr32c_pixel_t,
+ gil::abgr32f_pixel_t,
+ gil::abgr32fc_pixel_t,
+ gil::abgr32s_pixel_t,
+ gil::abgr32sc_pixel_t,
+ gil::bgra8_pixel_t,
+ gil::bgra8c_pixel_t,
+ gil::bgra8s_pixel_t,
+ gil::bgra8sc_pixel_t,
+ gil::bgra16_pixel_t,
+ gil::bgra16c_pixel_t,
+ gil::bgra16s_pixel_t,
+ gil::bgra16sc_pixel_t,
+ gil::bgra32_pixel_t,
+ gil::bgra32c_pixel_t,
+ gil::bgra32f_pixel_t,
+ gil::bgra32fc_pixel_t,
+ gil::bgra32s_pixel_t,
+ gil::bgra32sc_pixel_t,
+ gil::cmyk8_pixel_t,
+ gil::cmyk8c_pixel_t,
+ gil::cmyk8s_pixel_t,
+ gil::cmyk8sc_pixel_t,
+ gil::cmyk16_pixel_t,
+ gil::cmyk16c_pixel_t,
+ gil::cmyk16s_pixel_t,
+ gil::cmyk16sc_pixel_t,
+ gil::cmyk32_pixel_t,
+ gil::cmyk32c_pixel_t,
+ gil::cmyk32f_pixel_t,
+ gil::cmyk32fc_pixel_t,
+ gil::cmyk32s_pixel_t,
+ gil::cmyk32sc_pixel_t,
+ gil::rgba8_pixel_t,
+ gil::rgba8c_pixel_t,
+ gil::rgba8s_pixel_t,
+ gil::rgba8sc_pixel_t,
+ gil::rgba16_pixel_t,
+ gil::rgba16c_pixel_t,
+ gil::rgba16s_pixel_t,
+ gil::rgba16sc_pixel_t,
+ gil::rgba32_pixel_t,
+ gil::rgba32c_pixel_t,
+ gil::rgba32f_pixel_t,
+ gil::rgba32fc_pixel_t,
+ gil::rgba32s_pixel_t,
+ gil::rgba32sc_pixel_t
+ >;
+ test<4, four>();
+}
diff --git a/src/boost/libs/gil/test/core/pixel/packed_pixel.cpp b/src/boost/libs/gil/test/core/pixel/packed_pixel.cpp
new file mode 100644
index 000000000..d73584c34
--- /dev/null
+++ b/src/boost/libs/gil/test/core/pixel/packed_pixel.cpp
@@ -0,0 +1,336 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/channel.hpp>
+#include <boost/gil/gray.hpp>
+#include <boost/gil/packed_pixel.hpp>
+#include <boost/gil/rgb.hpp>
+
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+#include <boost/core/typeinfo.hpp>
+
+#include "test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+namespace mp11 = boost::mp11;
+
+void test_packed_pixel_gray3_definition()
+{
+ // Verify packed_pixel members
+
+ static_assert(std::is_same<fixture::packed_pixel_gray3::layout_t, gil::gray_layout_t>::value,
+ "layout should be bgr");
+
+ static_assert(std::is_same<fixture::packed_pixel_gray3::value_type, fixture::packed_pixel_gray3>::value,
+ "value_type member should be of the same type as the packed_pixel specialization");
+
+ static_assert(std::is_reference<fixture::packed_pixel_gray3::reference>::value,
+ "reference member should be a reference");
+
+ static_assert(std::is_reference<fixture::packed_pixel_gray3::const_reference>::value,
+ "const_reference member should be a reference");
+
+ static_assert(std::is_same<decltype(fixture::packed_pixel_gray3::is_mutable), bool const>::value &&
+ fixture::packed_pixel_gray3::is_mutable,
+ "is_mutable should be boolean");
+
+ // Verify metafunctions
+
+ static_assert(mp11::mp_size<fixture::packed_channel_references_3>::value == 1,
+ "packed_channel_references_vector_type should define one reference to channel start bits");
+
+ using channel1_ref_t = mp11::mp_at_c<fixture::packed_channel_references_3, 0>;
+ static_assert(channel1_ref_t::num_bits == 3,
+ "1st channel of gray3 pixel should be of 3-bit size");
+
+ static_assert(std::is_same
+ <
+ channel1_ref_t,
+ gil::packed_channel_reference<std::uint8_t, 0, 3, true> const
+ >::value,
+ "1st element of packed_channel_references_vector should be packed_channel_reference of 1st channel");
+
+ // double check intermediate metafunction packed_channel_reference_type
+ static_assert(std::is_same
+ <
+ gil::detail::packed_channel_reference_type
+ <
+ std::uint8_t,
+ std::integral_constant<int, 0>,
+ std::integral_constant<int, 3>
+ >::type,
+ channel1_ref_t
+ >::value,
+ "packed_channel_reference_type should return packed_channel_reference");
+ static_assert(std::is_same
+ <
+ gil::detail::packed_channel_reference_type
+ <
+ std::uint8_t,
+ std::integral_constant<int, 0>,
+ std::integral_constant<int, 3>
+ >::type,
+ gil::packed_channel_reference<std::uint8_t, 0, 3, true> const
+ >::value,
+ "packed_channel_reference_type should return packed_channel_reference");
+}
+
+void test_packed_pixel_gray3_assignment()
+{
+ fixture::packed_pixel_gray3 p1{int{5}};
+ fixture::packed_pixel_gray3 p2;
+ p2 = p1;
+ BOOST_TEST_EQ(p1._bitfield, p2._bitfield);
+}
+
+void test_packed_pixel_gray3_equality()
+{
+ fixture::packed_pixel_gray3 p1{int{5}};
+ fixture::packed_pixel_gray3 p2{int{5}};
+ BOOST_TEST_EQ(p1, p2);
+
+ fixture::packed_pixel_gray3 p3{int{3}};
+ BOOST_TEST_NE(p2, p3);
+}
+
+void test_packed_pixel_gray3_assignment_gray_channel()
+{
+ {
+ fixture::packed_pixel_gray3 p1; // default-initialized
+ p1 = int{5};
+ BOOST_TEST_EQ(p1._bitfield, int{5});
+ }
+
+ {
+ fixture::packed_pixel_gray3 p1{0}; // value-initialized
+ p1 = int{5};
+ BOOST_TEST_EQ(p1._bitfield, int{5});
+ }
+}
+
+void test_packed_pixel_gray3_equality_gray_channel()
+{
+ fixture::packed_pixel_gray3 p1{int{3}};
+ BOOST_TEST_EQ(p1, int{3});
+}
+
+void test_packed_pixel_bgr121_definition()
+{
+ // Verify packed_pixel members
+
+ static_assert(std::is_same<fixture::packed_pixel_bgr121::layout_t, gil::bgr_layout_t>::value,
+ "layout should be bgr");
+
+ static_assert(std::is_same<fixture::packed_pixel_bgr121::value_type, fixture::packed_pixel_bgr121>::value,
+ "value_type member should be of the same type as the packed_pixel specialization");
+
+ static_assert(std::is_reference<fixture::packed_pixel_bgr121::reference>::value,
+ "reference member should be a reference");
+
+ static_assert(std::is_reference<fixture::packed_pixel_bgr121::const_reference>::value,
+ "const_reference member should be a reference");
+
+ static_assert(std::is_same<decltype(fixture::packed_pixel_bgr121::is_mutable), bool const>::value &&
+ fixture::packed_pixel_bgr121::is_mutable,
+ "is_mutable should be boolean");
+
+ // Verify metafunctions
+
+ static_assert(mp11::mp_size<fixture::packed_channel_references_121>::value == 3,
+ "packed_channel_references_vector_type should define three references to channel start bits");
+
+ using channel1_ref_t = mp11::mp_at_c<fixture::packed_channel_references_121, 0>;
+ static_assert(channel1_ref_t::num_bits == 1,
+ "1st channel of bgr121 pixel should be of 1-bit size");
+
+ using channel2_ref_t = mp11::mp_at_c<fixture::packed_channel_references_121, 1>;
+ static_assert(channel2_ref_t::num_bits == 2,
+ "2nd channel of bgr121 pixel should be of 2-bit size");
+
+ using channel3_ref_t = mp11::mp_at_c<fixture::packed_channel_references_121, 2>;
+ static_assert(channel3_ref_t::num_bits == 1,
+ "3rd channel of bgr121 pixel should be of 1-bit size");
+
+ static_assert(std::is_same
+ <
+ channel1_ref_t,
+ gil::packed_channel_reference<std::uint8_t, 0, 1, true> const
+ >::value,
+ "1st element of packed_channel_references_vector should be packed_channel_reference of 1st channel");
+
+ static_assert(std::is_same
+ <
+ channel2_ref_t,
+ gil::packed_channel_reference<std::uint8_t, 1, 2, true> const
+ >::value,
+ "2nd element of packed_channel_references_vector should be packed_channel_reference of 2nd channel");
+
+ static_assert(std::is_same
+ <
+ channel3_ref_t,
+ gil::packed_channel_reference<std::uint8_t, 3, 1, true> const
+ >::value,
+ "3rd element of packed_channel_references_vector should be packed_channel_reference of 3rd channel");
+
+ // double check intermediate metafunction packed_channel_reference_type
+ static_assert(std::is_same
+ <
+ gil::detail::packed_channel_reference_type
+ <
+ std::uint8_t, mp11::mp_int<0>, mp11::mp_int<1>
+ >::type,
+ channel1_ref_t
+ >::value,
+ "packed_channel_reference_type should return packed_channel_reference");
+ static_assert(std::is_same
+ <
+ gil::detail::packed_channel_reference_type
+ <
+ std::uint8_t, mp11::mp_int<0>, mp11::mp_int<1>
+ >::type,
+ gil::packed_channel_reference<std::uint8_t, 0, 1, true> const
+ >::value,
+ "packed_channel_reference_type should return packed_channel_reference");
+}
+
+void test_packed_pixel_bgr121_assignment()
+{
+ fixture::packed_pixel_bgr121 p1{0, 3, 1};
+ fixture::packed_pixel_bgr121 p2;
+ p2 = p1;
+ BOOST_TEST_EQ(p1._bitfield, p2._bitfield);
+}
+
+void test_packed_pixel_bgr121_equality()
+{
+ fixture::packed_pixel_bgr121 p1{1, 3, 0};
+ fixture::packed_pixel_bgr121 p2{1, 3, 0};
+ BOOST_TEST_EQ(p1, p2);
+
+ fixture::packed_pixel_bgr121 p3{0, 3, 1};
+ BOOST_TEST_NE(p2, p3);
+}
+
+void test_packed_pixel_rgb535_definition()
+{
+ // Verify packed_pixel members
+
+ static_assert(std::is_same<fixture::packed_pixel_rgb535::layout_t, gil::rgb_layout_t>::value,
+ "layout should be bgr");
+
+ static_assert(std::is_same<fixture::packed_pixel_rgb535::value_type, fixture::packed_pixel_rgb535>::value,
+ "value_type member should be of the same type as the packed_pixel specialization");
+
+ static_assert(std::is_reference<fixture::packed_pixel_rgb535::reference>::value,
+ "reference member should be a reference");
+
+ static_assert(std::is_reference<fixture::packed_pixel_rgb535::const_reference>::value,
+ "const_reference member should be a reference");
+
+ static_assert(std::is_same<decltype(fixture::packed_pixel_rgb535::is_mutable), bool const>::value &&
+ fixture::packed_pixel_rgb535::is_mutable,
+ "is_mutable should be boolean");
+
+ // Verify metafunctions
+
+ static_assert(mp11::mp_size<fixture::packed_channel_references_535>::value == 3,
+ "packed_channel_references_vector_type should define three references to channel start bits");
+
+ using channel1_ref_t = mp11::mp_at_c<fixture::packed_channel_references_535, 0>;
+ static_assert(channel1_ref_t::num_bits == 5,
+ "1st channel of rgb535 pixel should be of 5-bit size");
+
+ using channel2_ref_t = mp11::mp_at_c<fixture::packed_channel_references_535, 1>;
+ static_assert(channel2_ref_t::num_bits == 3,
+ "2nd channel of rgb535 pixel should be of 3-bit size");
+
+ using channel3_ref_t = mp11::mp_at_c<fixture::packed_channel_references_535, 2>;
+ static_assert(channel3_ref_t::num_bits == 5,
+ "3rd channel of rgb535 pixel should be of 5-bit size");
+
+ static_assert(std::is_same
+ <
+ channel1_ref_t,
+ gil::packed_channel_reference<std::uint16_t, 0, 5, true> const
+ >::value,
+ "1st element of packed_channel_references_vector should be packed_channel_reference of 1st channel");
+
+ static_assert(std::is_same
+ <
+ channel2_ref_t,
+ gil::packed_channel_reference<std::uint16_t, 5, 3, true> const
+ >::value,
+ "2nd element of packed_channel_references_vector should be packed_channel_reference of 2nd channel");
+
+ static_assert(std::is_same
+ <
+ channel3_ref_t,
+ gil::packed_channel_reference<std::uint16_t, 8, 5, true> const
+ >::value,
+ "3rd element of packed_channel_references_vector should be packed_channel_reference of 3rd channel");
+
+ // double check intermediate metafunction packed_channel_reference_type
+ static_assert(std::is_same
+ <
+ gil::detail::packed_channel_reference_type
+ <
+ std::uint16_t,
+ std::integral_constant<int, 0>,
+ std::integral_constant<int, 5>
+ >::type,
+ channel1_ref_t
+ >::value,
+ "packed_channel_reference_type should return packed_channel_reference");
+ static_assert(std::is_same
+ <
+ gil::detail::packed_channel_reference_type
+ <
+ std::uint16_t,
+ std::integral_constant<int, 0>,
+ std::integral_constant<int, 5>
+ >::type,
+ gil::packed_channel_reference<std::uint16_t, 0, 5, true> const
+ >::value,
+ "packed_channel_reference_type should return packed_channel_reference");
+}
+
+void test_packed_pixel_rgb535_assignment()
+{
+ fixture::packed_pixel_rgb535 p1{31, 7, 31};
+ fixture::packed_pixel_rgb535 p2;
+ p2 = p1;
+ BOOST_TEST_EQ(p1._bitfield, p2._bitfield);
+}
+
+void test_packed_pixel_rgb535_equality()
+{
+ fixture::packed_pixel_rgb535 p1{7, 3, 7};
+ fixture::packed_pixel_rgb535 p2{7, 3, 7};
+ BOOST_TEST_EQ(p1, p2);
+
+ fixture::packed_pixel_rgb535 p3{7, 7, 7};
+ BOOST_TEST_NE(p2, p3);
+}
+
+int main()
+{
+ test_packed_pixel_gray3_definition();
+ test_packed_pixel_gray3_assignment();
+ test_packed_pixel_gray3_equality();
+ test_packed_pixel_gray3_assignment_gray_channel();
+ test_packed_pixel_gray3_equality_gray_channel();
+ test_packed_pixel_bgr121_definition();
+ test_packed_pixel_bgr121_assignment();
+ test_packed_pixel_bgr121_equality();
+ test_packed_pixel_rgb535_definition();
+ test_packed_pixel_rgb535_assignment();
+ test_packed_pixel_rgb535_equality();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/pixel/pixel_reference_is_mutable.cpp b/src/boost/libs/gil/test/core/pixel/pixel_reference_is_mutable.cpp
new file mode 100644
index 000000000..a9f1475cf
--- /dev/null
+++ b/src/boost/libs/gil/test/core/pixel/pixel_reference_is_mutable.cpp
@@ -0,0 +1,35 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/mp11.hpp>
+
+#include "test_fixture.hpp"
+
+namespace gil = boost::gil;
+using namespace boost::mp11;
+
+int main()
+{
+ static_assert(mp_all_of
+ <
+ gil::test::fixture::pixel_typedefs,
+ gil::pixel_reference_is_mutable
+ >::value,
+ "pixel_reference_is_mutable should yield true for all core pixel typedefs");
+
+ static_assert(!mp_all_of
+ <
+ mp_transform
+ <
+ gil::test::fixture::nested_type,
+ gil::test::fixture::representative_pixel_types
+ >,
+ gil::pixel_reference_is_mutable
+ >::value,
+ "pixel_reference_is_mutable should yield true for some representative core pixel types");
+}
diff --git a/src/boost/libs/gil/test/core/pixel/pixels_are_compatible.cpp b/src/boost/libs/gil/test/core/pixel/pixels_are_compatible.cpp
new file mode 100644
index 000000000..f4ce4d84d
--- /dev/null
+++ b/src/boost/libs/gil/test/core/pixel/pixels_are_compatible.cpp
@@ -0,0 +1,132 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/pixel.hpp>
+#include <boost/gil/concepts/pixel.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <boost/mp11.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+using namespace boost::mp11;
+
+template <typename Pixel>
+struct assert_compatible
+{
+ template <typename CompatiblePixel>
+ void operator()(CompatiblePixel&&)
+ {
+ using result_t = typename gil::pixels_are_compatible<Pixel, CompatiblePixel>::type;
+ static_assert(result_t::value, "pixels should be compatible");
+
+ // TODO: Refine after MPL -> MP11 switch
+ static_assert(
+ std::is_same<result_t, std::true_type>::value,
+ "pixels_are_compatible result type should be std::true_type");
+
+ static_assert(
+ !std::is_same<result_t, std::false_type>::value,
+ "pixels_are_compatible result type should no be std::false_type");
+ }
+};
+
+template <typename Pixel>
+struct assert_not_compatible
+{
+ template <typename NotCompatiblePixel>
+ void operator()(NotCompatiblePixel&&)
+ {
+ static_assert(
+ !gil::pixels_are_compatible<Pixel, NotCompatiblePixel>::value,
+ "pixels should not be compatible");
+ }
+};
+
+template <typename Pixel, typename... CompatiblePixels>
+void test_compatible()
+{
+ mp_for_each<CompatiblePixels...>(assert_compatible<Pixel>());
+}
+
+template <typename Pixel, typename... CompatiblePixels>
+void test_not_compatible()
+{
+ mp_for_each<CompatiblePixels...>(assert_not_compatible<Pixel>());
+}
+
+int main()
+{
+ test_compatible<gil::gray8_pixel_t, mp_list<
+ gil::gray8_pixel_t,
+ gil::gray8c_pixel_t>>();
+ test_compatible<gil::gray8s_pixel_t, mp_list<
+ gil::gray8s_pixel_t,
+ gil::gray8sc_pixel_t>>();
+ test_not_compatible<gil::gray8_pixel_t, mp_list<
+ gil::gray8s_pixel_t,
+ gil::gray8sc_pixel_t>>();
+
+ test_compatible<gil::gray16_pixel_t, mp_list<
+ gil::gray16_pixel_t,
+ gil::gray16c_pixel_t>>();
+ test_compatible<gil::gray16s_pixel_t, mp_list<
+ gil::gray16s_pixel_t,
+ gil::gray16sc_pixel_t>>();
+ test_not_compatible<gil::gray16_pixel_t, mp_list<
+ gil::gray16s_pixel_t,
+ gil::gray16sc_pixel_t>>();
+
+ test_compatible<gil::rgb8_pixel_t, mp_list<
+ gil::bgr8_pixel_t,
+ gil::bgr8c_pixel_t,
+ gil::rgb8_pixel_t,
+ gil::rgb8c_pixel_t>>();
+ test_compatible<gil::rgb8s_pixel_t, mp_list<
+ gil::bgr8s_pixel_t,
+ gil::bgr8sc_pixel_t,
+ gil::rgb8s_pixel_t,
+ gil::rgb8sc_pixel_t>>();
+ test_not_compatible<gil::rgb8_pixel_t, mp_list<
+ gil::argb8_pixel_t,
+ gil::abgr8_pixel_t,
+ gil::rgba8_pixel_t,
+ gil::bgr8s_pixel_t,
+ gil::bgr8sc_pixel_t,
+ gil::rgb8s_pixel_t,
+ gil::rgb8sc_pixel_t>>();
+
+ test_compatible<gil::rgba8_pixel_t, mp_list<
+ gil::abgr8_pixel_t,
+ gil::argb8_pixel_t,
+ gil::bgra8_pixel_t,
+ gil::bgra8c_pixel_t,
+ gil::rgba8_pixel_t,
+ gil::rgba8c_pixel_t>>();
+ test_not_compatible<gil::rgba8_pixel_t, mp_list<
+ gil::rgb8_pixel_t,
+ gil::rgb16_pixel_t,
+ gil::rgba16_pixel_t,
+ gil::cmyk8_pixel_t,
+ gil::cmyk16_pixel_t>>();
+
+ test_compatible<gil::cmyk8_pixel_t, mp_list<
+ gil::cmyk8_pixel_t,
+ gil::cmyk8c_pixel_t>>();
+ test_compatible<gil::cmyk8s_pixel_t, mp_list<
+ gil::cmyk8s_pixel_t,
+ gil::cmyk8sc_pixel_t>>();
+ test_not_compatible<gil::cmyk8_pixel_t, mp_list<
+ gil::cmyk8s_pixel_t,
+ gil::cmyk8sc_pixel_t>>();
+
+ test_compatible<gil::cmyk32f_pixel_t, mp_list<
+ gil::cmyk32f_pixel_t,
+ gil::cmyk32fc_pixel_t>>();
+
+}
diff --git a/src/boost/libs/gil/test/core/pixel/test_fixture.cpp b/src/boost/libs/gil/test/core/pixel/test_fixture.cpp
new file mode 100644
index 000000000..1d6e5d470
--- /dev/null
+++ b/src/boost/libs/gil/test/core/pixel/test_fixture.cpp
@@ -0,0 +1,113 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#if defined(BOOST_CLANG)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wconversion"
+#pragma clang diagnostic ignored "-Wfloat-equal"
+#pragma clang diagnostic ignored "-Wsign-conversion"
+#elif BOOST_GCC >= 40700
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#pragma GCC diagnostic ignored "-Wfloat-equal"
+#pragma GCC diagnostic ignored "-Wsign-conversion"
+#endif
+
+#include <boost/gil/channel.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <limits>
+#include <ostream>
+
+#include "test_fixture.hpp"
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+struct test_pixel_value_default_constructor
+{
+ template <typename Pixel>
+ void operator()(Pixel const &)
+ {
+ using pixel_t = Pixel;
+ fixture::pixel_value<pixel_t> fix;
+ pixel_t const default_value{};
+ BOOST_TEST_EQ(fix.pixel_, default_value);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_types>(test_pixel_value_default_constructor{});
+ }
+};
+
+struct test_pixel_value_parameterized_constructor
+{
+ template <typename Pixel>
+ void operator()(Pixel const &)
+ {
+ using pixel_t = Pixel;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ // Sample channel value, simplified, could be min, max, random
+ channel_t const sample_channel = 2;
+ pixel_t sample_pixel;
+ gil::static_fill(sample_pixel, sample_channel);
+ fixture::pixel_value<pixel_t> fix{sample_pixel};
+ BOOST_TEST_EQ(fix.pixel_, sample_pixel);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_types>(test_pixel_value_parameterized_constructor{});
+ }
+};
+
+struct test_pixel_reference_default_constructor
+{
+ template <typename Pixel>
+ void operator()(Pixel const &)
+ {
+ using pixel_t = Pixel;
+ fixture::pixel_reference<pixel_t&> fix;
+ pixel_t pix_default{};
+ BOOST_TEST_EQ(fix.pixel_, pix_default);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_types>(test_pixel_reference_default_constructor{});
+ }
+};
+
+struct test_pixel_reference_parameterized_constructor
+{
+ template <typename Pixel>
+ void operator()(Pixel const &)
+ {
+ using pixel_t = Pixel;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ // Sample channel value, simplified, could be min, max, random
+ channel_t const sample_channel = 3;
+ pixel_t sample_pixel;
+ gil::static_fill(sample_pixel, sample_channel);
+ fixture::pixel_reference<pixel_t&> fix{sample_pixel};
+ BOOST_TEST_EQ(fix.pixel_, sample_pixel);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_types>(test_pixel_reference_parameterized_constructor{});
+ }
+};
+
+int main()
+{
+ test_pixel_value_default_constructor::run();
+ test_pixel_value_parameterized_constructor::run();
+ test_pixel_reference_default_constructor::run();
+ test_pixel_reference_parameterized_constructor::run();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/pixel/test_fixture.hpp b/src/boost/libs/gil/test/core/pixel/test_fixture.hpp
new file mode 100644
index 000000000..bf4e1ed8d
--- /dev/null
+++ b/src/boost/libs/gil/test/core/pixel/test_fixture.hpp
@@ -0,0 +1,346 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+// Copyright 2005-2007 Adobe Systems Incorporated
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifndef BOOST_GIL_TEST_CORE_PIXEL_TEST_FIXTURE_HPP
+#define BOOST_GIL_TEST_CORE_PIXEL_TEST_FIXTURE_HPP
+
+#include <boost/gil/channel.hpp>
+#include <boost/gil/color_base_algorithm.hpp>
+#include <boost/gil/concepts/pixel.hpp>
+#include <boost/gil/packed_pixel.hpp>
+#include <boost/gil/pixel.hpp>
+#include <boost/gil/planar_pixel_reference.hpp>
+#include <boost/gil/promote_integral.hpp>
+#include <boost/gil/typedefs.hpp>
+#include <boost/gil/extension/toolbox/metafunctions/channel_type.hpp> // channel_type for packed and bit-aligned pixels
+
+#include <boost/core/ignore_unused.hpp>
+#include <boost/mp11.hpp>
+#include <boost/mp11/mpl.hpp> // for compatibility with Boost.Test
+
+#include <cstdint>
+#include <iterator>
+#include <tuple>
+#include <type_traits>
+
+#include "core/test_fixture.hpp" // random_value
+#include "core/channel/test_fixture.hpp" // channel_minmax_value
+
+namespace boost { namespace gil { namespace test { namespace fixture {
+
+template <typename Pixel>
+struct pixel_generator
+{
+ using channel_t = typename gil::channel_type<Pixel>::type;
+
+ static auto max() -> Pixel
+ {
+ channel_minmax_value<channel_t> channel;
+ Pixel pixel;
+ gil::static_fill(pixel, channel.max_v_);
+ return pixel;
+ }
+
+ static auto min()-> Pixel
+ {
+ channel_minmax_value<channel_t> channel;
+ Pixel pixel;
+ gil::static_fill(pixel, channel.min_v_);
+ return pixel;
+ }
+
+ static auto random() -> Pixel
+ {
+ random_value<channel_t> generate;
+ Pixel pixel;
+ gil::static_generate(pixel, [&generate]() { return generate(); });
+ return pixel;
+ }
+};
+
+template <typename Pixel, int Tag = 0>
+class pixel_value
+{
+public:
+ using type = Pixel;
+ using pixel_t = type;
+ type pixel_{};
+
+ pixel_value() = default;
+ explicit pixel_value(pixel_t const& pixel)
+ : pixel_(pixel) // test copy constructor
+ {
+ type temp_pixel; // test default constructor
+ boost::ignore_unused(temp_pixel);
+ boost::function_requires<PixelValueConcept<pixel_t> >();
+ }
+};
+
+// Alias compatible with naming of equivalent class in the test/legacy/pixel.cpp
+// The core suffix indicates `Pixel` is GIL core pixel type.
+template <typename Pixel, int Tag = 0>
+using value_core = pixel_value<Pixel, Tag>;
+
+template <typename PixelRef, int Tag = 0>
+struct pixel_reference
+ : pixel_value
+ <
+ typename std::remove_reference<PixelRef>::type,
+ Tag
+ >
+{
+ static_assert(
+ std::is_reference<PixelRef>::value ||
+ gil::is_planar<PixelRef>::value, // poor-man test for specialization of planar_pixel_reference
+ "PixelRef must be reference or gil::planar_pixel_reference");
+
+ using type = PixelRef;
+ using pixel_t = typename std::remove_reference<PixelRef>::type;
+ using parent_t = pixel_value<typename pixel_t::value_type, Tag>;
+ using value_t = typename pixel_t::value_type;
+ type pixel_; // reference
+
+ pixel_reference() : parent_t{}, pixel_(parent_t::pixel_) {}
+ explicit pixel_reference(value_t const& pixel) : parent_t(pixel), pixel_(parent_t::pixel_)
+ {
+ boost::function_requires<PixelConcept<pixel_t>>();
+ }
+};
+
+// Alias compatible with naming of equivalent class in the test/legacy/pixel.cpp
+// The core suffix indicates `Pixel` is GIL core pixel type.
+template <typename Pixel, int Tag = 0>
+using reference_core = pixel_reference<Pixel, Tag>;
+
+// Metafunction to yield nested type of a representative pixel type
+template <typename PixelValueOrReference>
+using nested_type = typename PixelValueOrReference::type;
+
+// Metafunction to yield nested type of a representative pixel_t type
+template <typename PixelValueOrReference>
+using nested_pixel_type = typename PixelValueOrReference::pixel_t;
+
+// Subset of pixel models that covers all color spaces, channel depths,
+// reference/value, planar/interleaved, const/mutable.
+// Operations like color conversion will be invoked on pairs of those.
+using representative_pixel_types= ::boost::mp11::mp_list
+<
+ value_core<gil::gray8_pixel_t>,
+ reference_core<gil::gray16_pixel_t&>,
+ value_core<gil::bgr8_pixel_t>,
+ reference_core<gil::rgb8_planar_ref_t>,
+ value_core<gil::argb32_pixel_t>,
+ reference_core<gil::cmyk32f_pixel_t&>,
+ reference_core<gil::abgr16c_ref_t>, // immutable reference
+ reference_core<gil::rgb32fc_planar_ref_t>
+>;
+
+// List of all integer-based core pixel typedefs (i.e. with cv-qualifiers)
+using pixel_integer_types = ::boost::mp11::mp_list
+<
+ gil::gray8_pixel_t,
+ gil::gray8s_pixel_t,
+ gil::gray16_pixel_t,
+ gil::gray16s_pixel_t,
+ gil::gray32_pixel_t,
+ gil::gray32s_pixel_t,
+ gil::bgr8_pixel_t,
+ gil::bgr8s_pixel_t,
+ gil::bgr16_pixel_t,
+ gil::bgr16s_pixel_t,
+ gil::bgr32_pixel_t,
+ gil::bgr32s_pixel_t,
+ gil::rgb8_pixel_t,
+ gil::rgb8s_pixel_t,
+ gil::rgb16_pixel_t,
+ gil::rgb16s_pixel_t,
+ gil::rgb32_pixel_t,
+ gil::rgb32s_pixel_t,
+ gil::abgr8_pixel_t,
+ gil::abgr8s_pixel_t,
+ gil::abgr16_pixel_t,
+ gil::abgr16s_pixel_t,
+ gil::abgr32_pixel_t,
+ gil::abgr32s_pixel_t,
+ gil::bgra8_pixel_t,
+ gil::bgra8s_pixel_t,
+ gil::bgra16_pixel_t,
+ gil::bgra16s_pixel_t,
+ gil::bgra32_pixel_t,
+ gil::bgra32s_pixel_t,
+ gil::cmyk8_pixel_t,
+ gil::cmyk8s_pixel_t,
+ gil::cmyk16_pixel_t,
+ gil::cmyk16s_pixel_t,
+ gil::cmyk32_pixel_t,
+ gil::cmyk32s_pixel_t,
+ gil::rgba8_pixel_t,
+ gil::rgba8s_pixel_t,
+ gil::rgba16_pixel_t,
+ gil::rgba16s_pixel_t,
+ gil::rgba32_pixel_t,
+ gil::rgba32s_pixel_t
+>;
+
+// List of all integer-based core pixel typedefs (i.e. with cv-qualifiers)
+using pixel_float_types = ::boost::mp11::mp_list
+<
+ gil::gray32f_pixel_t,
+ gil::bgr32f_pixel_t,
+ gil::rgb32f_pixel_t,
+ gil::abgr32f_pixel_t,
+ gil::bgra32f_pixel_t,
+ gil::cmyk32f_pixel_t,
+ gil::rgba32f_pixel_t
+>;
+
+// List of all core pixel types (i.e. without cv-qualifiers)
+using pixel_types = ::boost::mp11::mp_append
+<
+ pixel_integer_types,
+ pixel_float_types
+>;
+
+// List of all core pixel typedefs (i.e. with cv-qualifiers)
+using pixel_typedefs = ::boost::mp11::mp_append
+<
+ pixel_integer_types,
+ pixel_float_types,
+ ::boost::mp11::mp_list
+ <
+ gil::gray8c_pixel_t,
+ gil::gray8sc_pixel_t,
+ gil::gray16c_pixel_t,
+ gil::gray16sc_pixel_t,
+ gil::gray32c_pixel_t,
+ gil::gray32fc_pixel_t,
+ gil::gray32sc_pixel_t,
+ gil::bgr8c_pixel_t,
+ gil::bgr8sc_pixel_t,
+ gil::bgr16c_pixel_t,
+ gil::bgr16sc_pixel_t,
+ gil::bgr32c_pixel_t,
+ gil::bgr32fc_pixel_t,
+ gil::bgr32sc_pixel_t,
+ gil::rgb8c_pixel_t,
+ gil::rgb8sc_pixel_t,
+ gil::rgb16c_pixel_t,
+ gil::rgb16sc_pixel_t,
+ gil::rgb32c_pixel_t,
+ gil::rgb32fc_pixel_t,
+ gil::rgb32sc_pixel_t,
+ gil::abgr8c_pixel_t,
+ gil::abgr8sc_pixel_t,
+ gil::abgr16c_pixel_t,
+ gil::abgr16sc_pixel_t,
+ gil::abgr32c_pixel_t,
+ gil::abgr32fc_pixel_t,
+ gil::abgr32sc_pixel_t,
+ gil::bgra8c_pixel_t,
+ gil::bgra8sc_pixel_t,
+ gil::bgra16c_pixel_t,
+ gil::bgra16sc_pixel_t,
+ gil::bgra32c_pixel_t,
+ gil::bgra32fc_pixel_t,
+ gil::bgra32sc_pixel_t,
+ gil::cmyk8c_pixel_t,
+ gil::cmyk8sc_pixel_t,
+ gil::cmyk16c_pixel_t,
+ gil::cmyk16sc_pixel_t,
+ gil::cmyk32c_pixel_t,
+ gil::cmyk32fc_pixel_t,
+ gil::cmyk32sc_pixel_t,
+ gil::rgba8c_pixel_t,
+ gil::rgba8sc_pixel_t,
+ gil::rgba16c_pixel_t,
+ gil::rgba16sc_pixel_t,
+ gil::rgba32c_pixel_t,
+ gil::rgba32fc_pixel_t,
+ gil::rgba32sc_pixel_t
+ >
+>;
+
+struct not_a_pixel_type {};
+
+using non_pixels = ::boost::mp11::mp_list
+<
+ not_a_pixel_type,
+ char,
+ short, int, long,
+ double, float,
+ std::size_t,
+ std::true_type,
+ std::false_type
+>;
+
+using packed_channel_references_3 = typename gil::detail::packed_channel_references_vector_type
+<
+ std::uint8_t,
+ mp11::mp_list_c<int, 3>
+>::type;
+
+using packed_pixel_gray3 = gil::packed_pixel
+<
+ std::uint8_t,
+ packed_channel_references_3,
+ gil::gray_layout_t
+>;
+
+using packed_channel_references_121 = typename gil::detail::packed_channel_references_vector_type
+<
+ std::uint8_t,
+ mp11::mp_list_c<int, 1, 2, 1>
+>::type;
+
+using packed_pixel_bgr121 = gil::packed_pixel
+<
+ std::uint8_t,
+ packed_channel_references_121,
+ gil::bgr_layout_t
+>;
+
+using packed_channel_references_535 = typename gil::detail::packed_channel_references_vector_type
+<
+ std::uint16_t,
+ mp11::mp_list_c<int, 5, 3, 5>
+>::type;
+
+using packed_pixel_rgb535 = gil::packed_pixel
+<
+ std::uint16_t,
+ packed_channel_references_535,
+ gil::rgb_layout_t
+>;
+
+using bit_aligned_pixel_bgr232_refefence = gil::bit_aligned_pixel_reference
+ <
+ std::uint8_t,
+ mp11::mp_list_c<int, 2, 3, 2>,
+ gil::bgr_layout_t,
+ true
+ > const;
+
+using bit_aligned_pixel_bgr232_iterator = bit_aligned_pixel_iterator<bit_aligned_pixel_bgr232_refefence>;
+
+using bit_aligned_pixel_bgr232 = std::iterator_traits<bit_aligned_pixel_bgr232_iterator>::value_type;
+
+using bit_aligned_pixel_rgb567_refefence = gil::bit_aligned_pixel_reference
+ <
+ std::uint32_t,
+ mp11::mp_list_c<int, 5, 6, 7>,
+ gil::rgb_layout_t,
+ true
+ > const;
+
+using bit_aligned_pixel_rgb567_iterator = bit_aligned_pixel_iterator<bit_aligned_pixel_rgb567_refefence>;
+
+using bit_aligned_pixel_rgb567 = std::iterator_traits<bit_aligned_pixel_rgb567_iterator>::value_type;
+
+}}}} // namespace boost::gil::test::fixture
+
+#endif
diff --git a/src/boost/libs/gil/test/core/point/CMakeLists.txt b/src/boost/libs/gil/test/core/point/CMakeLists.txt
new file mode 100644
index 000000000..e30f6752b
--- /dev/null
+++ b/src/boost/libs/gil/test/core/point/CMakeLists.txt
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2018 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+foreach(_name
+ concepts
+ point)
+ set(_test t_core_point_${_name})
+ set(_target test_core_point_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
diff --git a/src/boost/libs/gil/test/core/point/Jamfile b/src/boost/libs/gil/test/core/point/Jamfile
new file mode 100644
index 000000000..4d0a82928
--- /dev/null
+++ b/src/boost/libs/gil/test/core/point/Jamfile
@@ -0,0 +1,14 @@
+# Boost.GIL (Generic Image Library) - tests
+#
+# Copyright (c) 2018 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+compile concepts.cpp ;
+compile-fail multiply_by_non_arithmetic_fail.cpp ;
+
+run point.cpp ;
diff --git a/src/boost/libs/gil/test/core/point/concepts.cpp b/src/boost/libs/gil/test/core/point/concepts.cpp
new file mode 100644
index 000000000..09c04c524
--- /dev/null
+++ b/src/boost/libs/gil/test/core/point/concepts.cpp
@@ -0,0 +1,51 @@
+//
+// Copyright 2018 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+// FIXME: Avoid Clang's flooding of non-disableable warnings like:
+// "T does not declare any constructor to initialize its non-modifiable members"
+// when compiling with concepts check enabled.
+// See https://bugs.llvm.org/show_bug.cgi?id=41759
+#if !defined(BOOST_GIL_USE_CONCEPT_CHECK) && !defined(__clang__)
+#error Compile with BOOST_GIL_USE_CONCEPT_CHECK defined
+#endif
+#include <boost/gil/concepts.hpp>
+#include <boost/gil/point.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+
+template <typename Point>
+void test_members()
+{
+ static_assert(Point::num_dimensions == 2U, "point is not 2D");
+
+ using value_t = typename Point::value_type;
+ using coord_t = typename Point::template axis<0>::coord_t;
+ static_assert(std::is_same<value_t, coord_t>::value,
+ "point and axis type mismatch");
+}
+
+int main()
+{
+ boost::function_requires<gil::PointNDConcept<gil::point<int>>>();
+ boost::function_requires<gil::PointNDConcept<gil::point_t>>();
+
+ boost::function_requires<gil::Point2DConcept<gil::point<int>>>();
+ boost::function_requires<gil::Point2DConcept<gil::point_t>>();
+
+ test_members<gil::point<int>>();
+ test_members<gil::point_t>();
+
+ // NOTE: point2 is deprecated, available for backward compatibility
+ boost::function_requires<gil::PointNDConcept<gil::point2<int>>>();
+ boost::function_requires<gil::Point2DConcept<gil::point2<int>>>();
+ test_members<gil::point2<int>>();
+
+ return 0;
+}
diff --git a/src/boost/libs/gil/test/core/point/multiply_by_non_arithmetic_fail.cpp b/src/boost/libs/gil/test/core/point/multiply_by_non_arithmetic_fail.cpp
new file mode 100644
index 000000000..b5c703109
--- /dev/null
+++ b/src/boost/libs/gil/test/core/point/multiply_by_non_arithmetic_fail.cpp
@@ -0,0 +1,23 @@
+//
+// Copyright 2018 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/point.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+struct FakeMatrix {};
+
+int main()
+{
+ gil::point<int> p1{2, 4};
+
+ FakeMatrix m1;
+ auto r1 = p1 * m1;
+ auto r2 = m1 * p1;
+}
diff --git a/src/boost/libs/gil/test/core/point/point.cpp b/src/boost/libs/gil/test/core/point/point.cpp
new file mode 100644
index 000000000..00e52f212
--- /dev/null
+++ b/src/boost/libs/gil/test/core/point/point.cpp
@@ -0,0 +1,235 @@
+//
+// Copyright 2018-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/point.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <type_traits>
+
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+
+void test_default_constructor()
+{
+ gil::point<int> p;
+ BOOST_TEST_EQ(p.x, 0);
+ BOOST_TEST_EQ(p.y, 0);
+}
+
+void test_user_constructor()
+{
+ gil::point<int> p{1, 2};
+ BOOST_TEST_EQ(p.x, 1);
+ BOOST_TEST_EQ(p.y, 2);
+}
+
+void test_copy_constructor()
+{
+ gil::point<int> p1{1, 2};
+ gil::point<int> p2{p1};
+ BOOST_TEST_EQ(p1.x, p2.x);
+ BOOST_TEST_EQ(p1.y, p2.y);
+}
+
+void test_copy_assignment_operator()
+{
+ gil::point<int> p1{1, 2};
+ gil::point<int> p2;
+ p2 = p1;
+ BOOST_TEST_EQ(p1.x, p2.x);
+ BOOST_TEST_EQ(p1.y, p2.y);
+}
+
+void test_index_operator()
+{
+ gil::point<int> p{1, 2};
+ BOOST_TEST_EQ(p[0], 1);
+ BOOST_TEST_EQ(p[1], 2);
+}
+
+void test_addition_operator()
+{
+ gil::point<int> p1{1, 1};
+ gil::point<int> const p2{2, 4};
+ auto p3 = p1 + p2;
+ BOOST_TEST_EQ(p3.x, 3);
+ BOOST_TEST_EQ(p3.y, 5);
+}
+
+void test_addition_assignment_operator()
+{
+ gil::point<int> p1{1, 1};
+ gil::point<int> const p2{2, 4};
+ p1 += p2;
+ BOOST_TEST_EQ(p1.x, 3);
+ BOOST_TEST_EQ(p1.y, 5);
+}
+
+void test_subtraction_assignment_operator()
+{
+ gil::point<int> p1{2, 4};
+ gil::point<int> const p2{1, 1};
+ p1 -= p2;
+ BOOST_TEST_EQ(p1.x, 1);
+ BOOST_TEST_EQ(p1.y, 3);
+}
+
+void test_subtraction_operator()
+{
+ gil::point<int> p1{2, 4};
+ gil::point<int> const p2{1, 1};
+ p1 = p1 - p2;
+ BOOST_TEST_EQ(p1.x, 1);
+ BOOST_TEST_EQ(p1.y, 3);
+}
+
+void test_unary_minus_operator()
+{
+ gil::point<int> p1{2, 4};
+ auto p2 = -p1;
+ BOOST_TEST_EQ(p2.x, -2);
+ BOOST_TEST_EQ(p2.y, -4);
+ p2 = -p2;
+ BOOST_TEST_EQ(p2.x, p1.x);
+ BOOST_TEST_EQ(p2.y, p1.y);
+}
+
+void test_division_assignment_operator()
+{
+ {
+ gil::point<int> p1{2, 4};
+ p1 /= 2;
+ static_assert(std::is_same<decltype((p1 / short{}).x), int>::value, "!int");
+ static_assert(std::is_same<decltype((p1 / int{}).x), int>::value, "!int");
+ static_assert(std::is_same<decltype((p1 / float{}).x), float>::value, "!float");
+ static_assert(std::is_same<decltype((p1 / double{}).x), double>::value, "!double");
+ BOOST_TEST_EQ(p1.x, 1);
+ BOOST_TEST_EQ(p1.y, 2);
+ }
+ // point / d
+ {
+ gil::point<int> p1{2, 4};
+ auto p2 = p1 / float{2};
+ static_assert(std::is_same<decltype((p2 / int{}).x), float>::value, "!float");
+ static_assert(std::is_same<decltype((p2 / float{}).x), float>::value, "!float");
+ static_assert(std::is_same<decltype((p2 / double{}).x), double>::value, "!double");
+ BOOST_TEST_GE(p2.x, 1.0); // means, but >= avoids compiler warning
+ BOOST_TEST_GE(p2.y, 2.0);
+ }
+}
+
+void test_multiplication_operator()
+{
+ gil::point<int> p1{2, 4};
+ p1 *= 2;
+ BOOST_TEST_EQ(p1.x, 4);
+ BOOST_TEST_EQ(p1.y, 8);
+
+ // point * m
+ {
+ auto p2 = p1 * int{2};
+ static_assert(std::is_same<decltype(p2.x), int>::value, "!int");
+ static_assert(std::is_same<decltype(p2.y), int>::value, "!int");
+ BOOST_TEST_EQ(p2.x, 8);
+ BOOST_TEST_EQ(p2.y, 16);
+ }
+ // m * point
+ {
+ auto p2 = double{2} *p1;
+ static_assert(std::is_same<decltype(p2.x), double>::value, "!double");
+ static_assert(std::is_same<decltype(p2.y), double>::value, "!double");
+ BOOST_TEST_GE(p2.x, 8); // means, but >= avoids compiler warning
+ BOOST_TEST_GE(p2.y, 16);
+ }
+}
+
+void test_multiplication_assignment_operator()
+{
+ gil::point<int> p1{2, 4};
+ // point * m
+ {
+ auto p2 = p1 * int{2};
+ static_assert(std::is_same<decltype(p2.x), int>::value, "!int");
+ static_assert(std::is_same<decltype(p2.y), int>::value, "!int");
+ BOOST_TEST_EQ(p2.x, 4);
+ BOOST_TEST_EQ(p2.y, 8);
+ }
+ // m * point
+ {
+ auto p2 = double{2} * p1;
+ static_assert(std::is_same<decltype(p2.x), double>::value, "!double");
+ static_assert(std::is_same<decltype(p2.y), double>::value, "!double");
+ BOOST_TEST_GE(p2.x, 4); // means, but >= avoids compiler warning
+ BOOST_TEST_GE(p2.y, 8);
+ }
+}
+
+void test_bitwise_left_shift_operator()
+{
+ gil::point<unsigned int> p{2, 4};
+ p = p << 1;
+ BOOST_TEST_EQ(p.x, 4u);
+ BOOST_TEST_EQ(p.y, 8u);
+}
+
+void test_bitwise_right_shift_operator()
+{
+ gil::point<unsigned int> p{2, 4};
+ p = p >> 1;
+ BOOST_TEST_EQ(p.x, 2u / 2);
+ BOOST_TEST_EQ(p.y, 4u / 2);
+}
+
+void test_equal_to_operator()
+{
+ gil::point<int> p1{2, 4};
+ gil::point<int> p2{2, 4};
+ BOOST_TEST_EQ(p1, p2);
+}
+
+void test_not_equal_to_operator()
+{
+ gil::point<int> p1{1, 1};
+ gil::point<int> p2{2, 4};
+ BOOST_TEST_NE(p1, p2);
+}
+
+void test_axis_value()
+{
+ gil::point<int> p1{1, 2};
+ gil::point<int> const p2{1, 2};
+ BOOST_TEST_EQ(gil::axis_value<0>(p1), p1.x);
+ BOOST_TEST_EQ(gil::axis_value<1>(p1), p1.y);
+ BOOST_TEST_EQ(gil::axis_value<0>(p2), p2.x);
+ BOOST_TEST_EQ(gil::axis_value<1>(p2), p2.y);
+}
+
+int main()
+{
+ test_default_constructor();
+ test_user_constructor();
+ test_copy_constructor();
+ test_copy_assignment_operator();
+ test_index_operator();
+ test_addition_operator();
+ test_addition_assignment_operator();
+ test_subtraction_assignment_operator();
+ test_subtraction_operator();
+ test_unary_minus_operator();
+ test_division_assignment_operator();
+ test_multiplication_operator();
+ test_multiplication_assignment_operator();
+ test_bitwise_left_shift_operator();
+ test_bitwise_right_shift_operator();
+ test_equal_to_operator();
+ test_not_equal_to_operator();
+ test_axis_value();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/promote_integral.cpp b/src/boost/libs/gil/test/core/promote_integral.cpp
new file mode 100644
index 000000000..d0e97c820
--- /dev/null
+++ b/src/boost/libs/gil/test/core/promote_integral.cpp
@@ -0,0 +1,370 @@
+// Boost.GIL (Generic Image Library)
+//
+// Copyright (c) 2015, Oracle and/or its affiliates.
+// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
+//
+// Licensed under the Boost Software License version 1.0.
+// http://www.boost.org/users/license.html
+//
+// Source: Boost.Geometry (aka GGL, Generic Geometry Library)
+// Modifications: adapted for Boost.GIL
+// - Rename namespace boost::geometry to boost::gil
+// - Rename define BOOST_GEOMETRY_TEST_DEBUG to BOOST_GIL_TEST_DEBUG
+// - Remove use of macro BOOST_GEOMETRY_CONDITION
+// - Remove support for boost::multiprecision types
+// - Remove support for 128-bit integer types
+// - Update and sort includes
+// - Add explicit conversions to avoid warnings due to implicit integral promotions
+//
+// Uncomment to enable debugging output
+//#define BOOST_GIL_TEST_DEBUG 1
+#include <boost/config.hpp> // BOOST_HAS_LONG_LONG
+#include <boost/gil/promote_integral.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <algorithm>
+#include <climits>
+#include <cstddef>
+#ifdef BOOST_GIL_TEST_DEBUG
+#include <iostream>
+#endif
+#include <limits>
+#include <string>
+
+namespace bg = boost::gil;
+
+template
+<
+ typename T,
+ bool Signed = std::is_fundamental<T>::value && !std::is_unsigned<T>::type::value
+>
+struct absolute_value
+{
+ static inline T apply(T const& t)
+ {
+ return static_cast<T>(t < 0 ? -t : t);
+ }
+};
+
+template <typename T>
+struct absolute_value<T, false>
+{
+ static inline T apply(T const& t)
+ {
+ return t;
+ }
+};
+
+template
+ <
+ typename Integral,
+ typename Promoted,
+ bool Signed = !std::is_unsigned<Promoted>::value
+ >
+struct test_max_values
+{
+ static inline void apply()
+ {
+ // Use >= where value is guaranteed to never be greater than comparator
+ // but to avoid warning: comparing floating point with == is unsafe.
+
+ Promoted min_value = (std::numeric_limits<Integral>::min)();
+ // Explicit casts to avoid warning: conversion to short int from int may alter its value
+ min_value = static_cast<Promoted>(min_value * min_value);
+ BOOST_TEST(absolute_value<Promoted>::apply(min_value) >= min_value);
+ BOOST_TEST(absolute_value<Promoted>::apply(min_value) <= min_value);
+ Promoted max_value = (std::numeric_limits<Integral>::max)();
+ max_value = static_cast<Promoted>(max_value * max_value);
+ BOOST_TEST(absolute_value<Promoted>::apply(max_value) >= max_value);
+ BOOST_TEST(absolute_value<Promoted>::apply(max_value) <= max_value);
+
+#ifdef BOOST_GIL_TEST_DEBUG
+ std::cout << "integral min_value^2: " << min_value << std::endl;
+ std::cout << "promoted max_value: "
+ << (std::numeric_limits<Promoted>::max)() << std::endl;
+#endif
+ }
+};
+
+template <typename Integral, typename Promoted>
+struct test_max_values<Integral, Promoted, false>
+{
+ static inline void apply()
+ {
+ Promoted max_value = (std::numeric_limits<Integral>::max)();
+ Promoted max_value_sqr = static_cast<Promoted>(max_value * max_value);
+ BOOST_TEST(max_value_sqr < (std::numeric_limits<Promoted>::max)()
+ &&
+ max_value_sqr > max_value);
+
+#ifdef BOOST_GIL_TEST_DEBUG
+ std::cout << "integral max_value^2: " << max_value_sqr << std::endl;
+ std::cout << "promoted max_value: "
+ << (std::numeric_limits<Promoted>::max)() << std::endl;
+#endif
+ }
+};
+
+
+// helper function that returns the bit size of a type
+template
+ <
+ typename T,
+ bool IsFundamental = std::is_fundamental<T>::value
+ >
+struct bit_size_impl : std::integral_constant<std::size_t, 0>
+{};
+
+template <typename T>
+struct bit_size_impl<T, true> : bg::detail::promote_integral::bit_size<T>::type
+{};
+
+template <typename T>
+std::size_t bit_size()
+{
+ return bit_size_impl<T>::value;
+}
+
+#define BOOST_CHECK_MESSAGE(expr, msg) BOOST_TEST(expr)
+
+template <bool PromoteUnsignedToUnsigned>
+struct test_promote_integral
+{
+ template <typename Type, typename ExpectedPromotedType>
+ static inline void apply(std::string const& case_id)
+ {
+ using promoted_integral_type = typename bg::promote_integral
+ <
+ Type, PromoteUnsignedToUnsigned
+ >::type;
+
+ bool const same_types = std::is_same
+ <
+ promoted_integral_type, ExpectedPromotedType
+ >::value;
+
+ BOOST_CHECK_MESSAGE(same_types,
+ "case ID: " << case_id
+ << "input type: " << typeid(Type).name()
+ << "; detected: "
+ << typeid(promoted_integral_type).name()
+ << "; expected: "
+ << typeid(ExpectedPromotedType).name());
+
+ if (!std::is_same<Type, promoted_integral_type>::value)
+ {
+ test_max_values<Type, promoted_integral_type>::apply();
+ }
+
+#ifdef BOOST_GIL_TEST_DEBUG
+ std::cout << "case ID: " << case_id << std::endl
+ << "type : " << typeid(Type).name()
+ << ", sizeof (bits): " << bit_size<Type>()
+ << ", min value: "
+ << (std::numeric_limits<Type>::min)()
+ << ", max value: "
+ << (std::numeric_limits<Type>::max)()
+ << std::endl;
+ std::cout << "detected promoted type : "
+ << typeid(promoted_integral_type).name()
+ << ", sizeof (bits): " << bit_size<promoted_integral_type>()
+ << ", min value: "
+ << (std::numeric_limits<promoted_integral_type>::min)()
+ << ", max value: "
+ << (std::numeric_limits<promoted_integral_type>::max)()
+ << std::endl;
+ std::cout << "expected promoted type : "
+ << typeid(ExpectedPromotedType).name()
+ << ", sizeof (bits): " << bit_size<ExpectedPromotedType>()
+ << ", min value: "
+ << (std::numeric_limits<ExpectedPromotedType>::min)()
+ << ", max value: "
+ << (std::numeric_limits<ExpectedPromotedType>::max)()
+ << std::endl;
+ std::cout << std::endl;
+#endif
+ }
+};
+
+template
+ <
+ typename T,
+ bool PromoteUnsignedToUnsigned = false,
+ bool IsSigned = !std::is_unsigned<T>::value
+ >
+struct test_promotion
+{
+ static inline void apply(std::string case_id)
+ {
+#ifdef BOOST_GIL_TEST_DEBUG
+ std::cout << "*** "
+ << (IsSigned ? "signed" : "unsigned")
+ << " -> signed ***" << std::endl;
+#endif
+
+ using tester = test_promote_integral<PromoteUnsignedToUnsigned>;
+
+ case_id += (PromoteUnsignedToUnsigned ? "-t" : "-f");
+
+ std::size_t min_size = 2 * bit_size<T>() - 1;
+ if (!IsSigned)
+ {
+ min_size += 2;
+ }
+
+#ifdef BOOST_GIL_TEST_DEBUG
+ std::cout << "min size: " << min_size << std::endl;
+#endif
+
+ if (bit_size<short>() >= min_size)
+ {
+ tester::template apply<T, short>(case_id);
+ }
+ else if (bit_size<int>() >= min_size)
+ {
+ tester::template apply<T, int>(case_id);
+ }
+ else if (bit_size<long>() >= min_size)
+ {
+ tester::template apply<T, long>(case_id);
+ }
+#if defined(BOOST_HAS_LONG_LONG)
+ else if (bit_size<boost::long_long_type>() >= min_size)
+ {
+ tester::template apply<T, boost::long_long_type>(case_id);
+ }
+#endif
+ else
+ {
+ tester::template apply<T, T>(case_id);
+ }
+ }
+};
+
+template <typename T>
+struct test_promotion<T, true, false>
+{
+ static inline void apply(std::string case_id)
+ {
+#ifdef BOOST_GIL_TEST_DEBUG
+ std::cout << "*** unsigned -> unsigned ***" << std::endl;
+#endif
+ case_id += "-t";
+
+ using tester = test_promote_integral<true>;
+
+ std::size_t min_size = 2 * bit_size<T>();
+
+#ifdef BOOST_GIL_TEST_DEBUG
+ std::cout << "min size: " << min_size << std::endl;
+#endif
+
+ if (bit_size<unsigned short>() >= min_size)
+ {
+ tester::apply<T, unsigned short>(case_id);
+ }
+ else if (bit_size<unsigned int>() >= min_size)
+ {
+ tester::apply<T, unsigned int>(case_id);
+ }
+ else if (bit_size<unsigned long>() >= min_size)
+ {
+ tester::apply<T, unsigned long>(case_id);
+ }
+ else if (bit_size<std::size_t>() >= min_size)
+ {
+ tester::apply<T, std::size_t>(case_id);
+ }
+#if defined(BOOST_HAS_LONG_LONG)
+ else if (bit_size<boost::ulong_long_type>() >= min_size)
+ {
+ tester::template apply<T, boost::ulong_long_type>(case_id);
+ }
+#endif
+ else
+ {
+ tester::apply<T, T>(case_id);
+ }
+ }
+};
+
+void test_char()
+{
+ test_promotion<char>::apply("char");
+ test_promotion<char, true>::apply("char");
+ test_promotion<signed char>::apply("schar");
+ test_promotion<signed char, true>::apply("schar");
+ test_promotion<unsigned char>::apply("uchar");
+ test_promotion<unsigned char, true>::apply("uchar");
+}
+
+void test_short()
+{
+ test_promotion<short>::apply("short");
+ test_promotion<short, true>::apply("short");
+ test_promotion<unsigned short>::apply("ushort");
+ test_promotion<unsigned short, true>::apply("ushort");
+}
+
+void test_int()
+{
+ test_promotion<int>::apply("int");
+ test_promotion<int, true>::apply("int");
+ test_promotion<unsigned int>::apply("uint");
+ test_promotion<unsigned int, true>::apply("uint");
+}
+
+void test_long()
+{
+ test_promotion<long>::apply("long");
+ test_promotion<long, true>::apply("long");
+ test_promotion<unsigned long>::apply("ulong");
+ test_promotion<unsigned long, true>::apply("ulong");
+}
+
+void test_std_size_t()
+{
+ test_promotion<std::size_t>::apply("size_t");
+ test_promotion<std::size_t, true>::apply("size_t");
+}
+
+#ifdef BOOST_HAS_LONG_LONG
+void test_long_long()
+{
+ test_promotion<boost::long_long_type>::apply("long long");
+ test_promotion<boost::long_long_type, true>::apply("long long");
+ test_promotion<boost::ulong_long_type>::apply("ulong long");
+ test_promotion<boost::ulong_long_type, true>::apply("ulong long");
+}
+#endif
+
+void test_floating_point()
+{
+ using tester1 = test_promote_integral<true>;
+ using tester2 = test_promote_integral<false>;
+
+ // for floating-point types we do not do any promotion
+ tester1::apply<float, float>("fp-f");
+ tester1::apply<double, double>("fp-d");
+ tester1::apply<long double, long double>("fp-ld");
+
+ tester2::apply<float, float>("fp-f");
+ tester2::apply<double, double>("fp-d");
+ tester2::apply<long double, long double>("fp-ld");
+}
+
+int main()
+{
+ test_char();
+ test_short();
+ test_int();
+ test_long();
+ test_std_size_t();
+#ifdef BOOST_HAS_LONG_LONG
+ test_long_long();
+#endif
+ test_floating_point();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/test_fixture.cpp b/src/boost/libs/gil/test/core/test_fixture.cpp
new file mode 100644
index 000000000..d0de5964d
--- /dev/null
+++ b/src/boost/libs/gil/test/core/test_fixture.cpp
@@ -0,0 +1,71 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#if defined(BOOST_CLANG)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wconversion"
+#pragma clang diagnostic ignored "-Wfloat-equal"
+#pragma clang diagnostic ignored "-Wsign-conversion"
+#elif BOOST_GCC >= 40700
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#pragma GCC diagnostic ignored "-Wfloat-equal"
+#pragma GCC diagnostic ignored "-Wsign-conversion"
+#endif
+
+#include <boost/gil.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <algorithm>
+#include <cstdint>
+#include <vector>
+
+#include "test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+void test_consecutive_value()
+{
+ fixture::consecutive_value<std::uint8_t> v(10);
+ BOOST_TEST_EQ(v(), std::uint8_t{11});
+ BOOST_TEST_EQ(v(), std::uint8_t{12});
+ BOOST_TEST_EQ(v(), std::uint8_t{13});
+}
+
+void test_reverse_consecutive_value()
+{
+ fixture::reverse_consecutive_value<std::uint8_t> v(10);
+ BOOST_TEST_EQ(v(), std::uint8_t{9});
+ BOOST_TEST_EQ(v(), std::uint8_t{8});
+ BOOST_TEST_EQ(v(), std::uint8_t{7});
+}
+
+void test_random_value()
+{
+ // Generate N pseudo-random values
+ fixture::random_value<std::uint8_t> random;
+ std::vector<std::uint8_t> v(10, 0);
+ for (auto& i : v) i = random();
+
+ // Require not all of N values are equal (duplicates are possible!)
+ std::sort(v.begin(), v.end());
+ auto last = std::unique(v.begin(), v.end());
+ v.erase(last, v.end());
+ BOOST_TEST_GT(v.size(), 0);
+ BOOST_TEST_LE(v.size(), 10);
+}
+
+int main()
+{
+ test_consecutive_value();
+ test_reverse_consecutive_value();
+ test_random_value();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/core/test_fixture.hpp b/src/boost/libs/gil/test/core/test_fixture.hpp
new file mode 100644
index 000000000..819b2cac2
--- /dev/null
+++ b/src/boost/libs/gil/test/core/test_fixture.hpp
@@ -0,0 +1,82 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifndef BOOST_GIL_TEST_CORE_TEST_FIXTURE_HPP
+#define BOOST_GIL_TEST_CORE_TEST_FIXTURE_HPP
+
+#include <boost/gil/promote_integral.hpp>
+#include <boost/assert.hpp>
+
+#include <cstdint>
+#include <initializer_list>
+#include <limits>
+#include <random>
+#include <tuple>
+#include <type_traits>
+
+namespace boost { namespace gil { namespace test { namespace fixture {
+
+template <typename T>
+struct consecutive_value
+{
+ consecutive_value(T start) : current_(start)
+ {
+ BOOST_ASSERT(static_cast<int>(current_) >= 0);
+ }
+
+ T operator()()
+ {
+ BOOST_ASSERT(static_cast<int>(current_) + 1 > 0);
+ current_++;
+ return current_;
+ }
+
+ T current_;
+};
+
+template <typename T>
+struct reverse_consecutive_value
+{
+ reverse_consecutive_value(T start) : current_(start)
+ {
+ BOOST_ASSERT(static_cast<int>(current_) > 0);
+ }
+
+ T operator()()
+ {
+ BOOST_ASSERT(static_cast<int>(current_) + 1 >= 0);
+ current_--;
+ return current_;
+ }
+
+ T current_;
+};
+
+template <typename T>
+struct random_value
+{
+ static_assert(std::is_integral<T>::value, "T must be integral type");
+ static constexpr auto range_min = std::numeric_limits<T>::min();
+ static constexpr auto range_max = std::numeric_limits<T>::max();
+
+ random_value() : rng_(rd_()), uid_(range_min, range_max) {}
+
+ T operator()()
+ {
+ auto value = uid_(rng_);
+ BOOST_ASSERT(range_min <= value && value <= range_max);
+ return static_cast<T>(value);
+ }
+
+ std::random_device rd_;
+ std::mt19937 rng_;
+ std::uniform_int_distribution<typename gil::promote_integral<T>::type> uid_;
+};
+
+}}}} // namespace boost::gil::test::fixture
+
+#endif
diff --git a/src/boost/libs/gil/test/extension/CMakeLists.txt b/src/boost/libs/gil/test/extension/CMakeLists.txt
new file mode 100644
index 000000000..b642d2b29
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/CMakeLists.txt
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+if(BOOST_GIL_ENABLE_EXT_DYNAMIC_IMAGE)
+ add_subdirectory(dynamic_image)
+endif()
+
+if(BOOST_GIL_ENABLE_EXT_NUMERIC)
+ add_subdirectory(numeric)
+endif()
+
+if(BOOST_GIL_ENABLE_EXT_TOOLBOX)
+ add_subdirectory(toolbox)
+endif()
+
+if(BOOST_GIL_ENABLE_EXT_IO)
+ add_subdirectory(io)
+endif()
diff --git a/src/boost/libs/gil/test/extension/Jamfile b/src/boost/libs/gil/test/extension/Jamfile
new file mode 100644
index 000000000..cf9ef4089
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/Jamfile
@@ -0,0 +1,12 @@
+# Boost.GIL (Generic Image Library) - extensions tests
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+build-project dynamic_image ;
+build-project numeric ;
+build-project toolbox ;
+build-project io ;
diff --git a/src/boost/libs/gil/test/extension/dynamic_image/CMakeLists.txt b/src/boost/libs/gil/test/extension/dynamic_image/CMakeLists.txt
new file mode 100644
index 000000000..cf80e8f8c
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/dynamic_image/CMakeLists.txt
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+message(STATUS "Boost.GIL: Configuring tests in test/extension/dynamic_image")
+foreach(_name
+ subimage_view)
+ set(_test t_ext_dynamic_image_${_name})
+ set(_target test_ext_dynamic_image_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
diff --git a/src/boost/libs/gil/test/extension/dynamic_image/Jamfile b/src/boost/libs/gil/test/extension/dynamic_image/Jamfile
new file mode 100644
index 000000000..5f9bdd23a
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/dynamic_image/Jamfile
@@ -0,0 +1,13 @@
+# Boost.GIL (Generic Image Library) - dynamic_image tests
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+alias headers : [ generate_self_contained_headers extension/dynamic_image ] ;
+
+run subimage_view.cpp ;
diff --git a/src/boost/libs/gil/test/extension/dynamic_image/subimage_view.cpp b/src/boost/libs/gil/test/extension/dynamic_image/subimage_view.cpp
new file mode 100644
index 000000000..b1e22ae5f
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/dynamic_image/subimage_view.cpp
@@ -0,0 +1,96 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/dynamic_image/dynamic_image_all.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "test_fixture.hpp"
+#include "test_utility_output_stream.hpp"
+#include "core/image/test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+struct test_subimage_equals_image
+{
+ template <typename Image>
+ void operator()(Image const&)
+ {
+ using image_t = Image;
+ fixture::dynamic_image i0(fixture::create_image<image_t>(4, 4, 128));
+ auto const v0 = gil::const_view(i0);
+ BOOST_TEST_EQ(v0.dimensions().x, 4);
+ BOOST_TEST_EQ(v0.dimensions().y, 4);
+ BOOST_TEST_EQ(v0.size(), 4 * 4);
+
+ // request with 2 x point_t values
+ {
+ auto v1 = gil::subimage_view(gil::view(i0), {0, 0}, i0.dimensions());
+ BOOST_TEST_EQ(v0.dimensions(), v1.dimensions());
+ BOOST_TEST_EQ(v0.size(), v1.size());
+ BOOST_TEST(gil::equal_pixels(v0, v1));
+ }
+ // request with 4 x dimension values
+ {
+ auto v1 = gil::subimage_view(gil::view(i0), 0, 0, i0.dimensions().x, i0.dimensions().y);
+ BOOST_TEST_EQ(v0.dimensions(), v1.dimensions());
+ BOOST_TEST_EQ(v0.size(), v1.size());
+ BOOST_TEST(gil::equal_pixels(v0, v1));
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_subimage_equals_image{});
+ }
+};
+
+struct test_subimage_equals_image_quadrants
+{
+ template <typename Image>
+ void operator()(Image const&)
+ {
+ using image_t = Image;
+ fixture::dynamic_image i0(fixture::create_image<image_t>(4, 4, 0));
+ auto v0 = gil::view(i0);
+ // create test image and set values of pixels in:
+ // quadrant 1
+ auto const i1 = fixture::create_image<image_t>(2, 2, 255);
+ gil::apply_operation(v0, fixture::fill_any_view<image_t>({2, 3, 6, 7}, gil::const_view(i1)[0]));
+ // quadrant 2
+ auto const i2 = fixture::create_image<image_t>(2, 2, 128);
+ gil::apply_operation(v0, fixture::fill_any_view<image_t>({0, 1, 4, 5}, gil::const_view(i2)[0]));
+ // quadrant 3
+ auto const i3 = fixture::create_image<image_t>(2, 2, 64);
+ gil::apply_operation(v0, fixture::fill_any_view<image_t>({8, 9, 12, 13}, gil::const_view(i3)[0]));
+ // quadrant 4
+ auto const i4 = fixture::create_image<image_t>(2, 2, 32);
+ gil::apply_operation(v0, fixture::fill_any_view<image_t>({10, 11, 14, 15}, gil::const_view(i4)[0]));
+
+ auto v1 = gil::subimage_view(gil::view(i0), { 2, 0 }, i0.dimensions() / 2);
+ BOOST_TEST(gil::equal_pixels(v1, gil::const_view(i1)));
+ auto v2 = gil::subimage_view(gil::view(i0), { 0, 0 }, i0.dimensions() / 2);
+ BOOST_TEST(gil::equal_pixels(v2, gil::const_view(i2)));
+ auto v3 = gil::subimage_view(gil::view(i0), { 0, 2 }, i0.dimensions() / 2);
+ BOOST_TEST(gil::equal_pixels(v3, gil::const_view(i3)));
+ auto v4 = gil::subimage_view(gil::view(i0), { 2, 2 }, i0.dimensions() / 2);
+ BOOST_TEST(gil::equal_pixels(v4, gil::const_view(i4)));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_subimage_equals_image_quadrants{});
+ }
+};
+
+int main()
+{
+ test_subimage_equals_image::run();
+ test_subimage_equals_image_quadrants::run();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/dynamic_image/test_fixture.hpp b/src/boost/libs/gil/test/extension/dynamic_image/test_fixture.hpp
new file mode 100644
index 000000000..00b1b38cf
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/dynamic_image/test_fixture.hpp
@@ -0,0 +1,61 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/dynamic_image/any_image.hpp>
+#include <boost/mp11.hpp>
+
+#include <tuple>
+
+namespace boost { namespace gil {
+
+namespace test { namespace fixture {
+
+using dynamic_image = gil::any_image
+<
+ boost::mp11::mp_list
+ <
+ gil::gray8_image_t,
+ gil::gray16_image_t,
+ gil::gray32_image_t,
+ gil::bgr8_image_t,
+ gil::bgr16_image_t,
+ gil::bgr32_image_t,
+ gil::rgb8_image_t,
+ gil::rgb16_image_t,
+ gil::rgb32_image_t,
+ gil::rgba8_image_t,
+ gil::rgba16_image_t,
+ gil::rgba32_image_t
+ >
+>;
+
+template <typename Image>
+struct fill_any_view
+{
+ using result_type = void;
+ using pixel_t = typename Image::value_type;
+
+ fill_any_view(std::initializer_list<int> dst_view_indices, pixel_t pixel_value)
+ : dst_view_indices_(dst_view_indices), pixel_value_(pixel_value)
+ {}
+
+ template <typename View>
+ void operator()(View& /*dst_view*/) { /* sink any other views here */ }
+
+ void operator()(typename Image::view_t& dst_view)
+ {
+ // sink view of interest here
+ for (auto const& i : dst_view_indices_)
+ dst_view[i] = pixel_value_;
+ }
+
+ std::initializer_list<int> dst_view_indices_;
+ pixel_t pixel_value_;
+};
+
+}}}} // namespace boost::gil::test::fixture
diff --git a/src/boost/libs/gil/test/extension/io/CMakeLists.txt b/src/boost/libs/gil/test/extension/io/CMakeLists.txt
new file mode 100644
index 000000000..bc4fe25a4
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/CMakeLists.txt
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2017-2020 Mateusz Loskot <mateusz at loskot dot net>
+# All rights reserved.
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+message(STATUS "Boost.GIL: Configuring tests in test/extension/io")
+
+add_executable(test_ext_io_simple "simple_all_formats.cpp")
+target_link_libraries(test_ext_io_simple
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+add_test(NAME t_ext_io_simple COMMAND test_ext_io_simple)
+
+# TODO: Add <format>/CMakeLists.txt configuration for each format ~mloskot
diff --git a/src/boost/libs/gil/test/extension/io/Jamfile b/src/boost/libs/gil/test/extension/io/Jamfile
new file mode 100644
index 000000000..6e1705d7c
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/Jamfile
@@ -0,0 +1,49 @@
+# Boost.GIL (Generic Image Library) - IO tests
+#
+# Copyright (c) 2012 Christian Henning
+# Copyright (c) 2017 Stefan Seefeld
+# Copyright (c) 2012-2020 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import ac ;
+import testing ;
+
+using libjpeg : : : : true ; # work around bug on master
+using zlib ;
+using libpng : : : : true ;
+using libtiff : : : : true ;
+
+lib libraw : : <name>raw ;
+
+project
+ :
+ requirements
+ <include>.
+ ;
+
+alias headers : [ generate_self_contained_headers extension/io ] ;
+explicit headers ;
+
+# The `simple` in names of targets, somewhat misleading, means two things:
+# - minimal set of tests
+# - set of tests that require third-party libraries which are de-facto ubiquitous
+alias simple
+ :
+ [
+ run simple_all_formats.cpp
+ : # args
+ : # input files
+ : # requirements
+ <library>/boost/filesystem//boost_filesystem
+ [ ac.check-library /libjpeg//libjpeg : <library>/libjpeg//libjpeg : <build>no ]
+ [ ac.check-library /zlib//zlib : <library>/zlib//zlib : <build>no ]
+ [ ac.check-library /libpng//libpng : <library>/libpng//libpng : <build>no ]
+ [ ac.check-library /libtiff//libtiff : <library>/libtiff//libtiff : <build>no ]
+ ]
+ ;
+
+alias full : bmp jpeg png pnm raw targa tiff ;
+explicit full ;
diff --git a/src/boost/libs/gil/test/extension/io/bmp/Jamfile b/src/boost/libs/gil/test/extension/io/bmp/Jamfile
new file mode 100644
index 000000000..f1cfe092a
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/bmp/Jamfile
@@ -0,0 +1,26 @@
+# Boost.GIL (Generic Image Library) - IO tests
+#
+# Copyright (c) 2012 Christian Henning
+# Copyright (c) 2017 Stefan Seefeld
+# Copyright (c) 2012-2020 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+# TODO: Download BMP test suite images and build with <define>BOOST_GIL_IO_USE_BMP_TEST_SUITE_IMAGES
+
+project
+ : requirements
+ <library>/boost/filesystem//boost_filesystem
+ ;
+
+run bmp_make.cpp ;
+
+run bmp_test.cpp ;
+run bmp_read_test.cpp ;
+run bmp_write_test.cpp ;
+
+run bmp_old_test.cpp ;
diff --git a/src/boost/libs/gil/test/extension/io/bmp/bmp_make.cpp b/src/boost/libs/gil/test/extension/io/bmp/bmp_make.cpp
new file mode 100644
index 000000000..26be07726
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/bmp/bmp_make.cpp
@@ -0,0 +1,289 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#define BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
+#define BOOST_FILESYSTEM_VERSION 3
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/bmp.hpp>
+
+#include <boost/gil.hpp>
+#include <boost/gil/detail/mp11.hpp>
+
+#include <boost/core/ignore_unused.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include <fstream>
+#include <string>
+#include <type_traits>
+
+#include "paths.hpp"
+
+namespace fs = boost::filesystem;
+namespace gil = boost::gil;
+
+void test_make_reader_backend()
+{
+ {
+ static_assert(
+ std::is_same<gil::detail::is_supported_path_spec<char*>::type, std::true_type>::value,
+ "");
+
+ gil::get_reader_backend<const char*, gil::bmp_tag>::type backend_char =
+ gil::make_reader_backend(bmp_filename.c_str(), gil::bmp_tag());
+ gil::get_reader_backend<std::string, gil::bmp_tag>::type backend_string =
+ gil::make_reader_backend(bmp_filename, gil::bmp_tag());
+
+ FILE* file = fopen(bmp_filename.c_str(), "rb");
+ gil::get_reader_backend<FILE*, gil::bmp_tag>::type backend_file =
+ gil::make_reader_backend(file, gil::bmp_tag());
+
+ std::ifstream in(bmp_filename.c_str(), std::ios::binary);
+ gil::get_reader_backend<std::ifstream, gil::bmp_tag>::type backend_ifstream =
+ gil::make_reader_backend(in, gil::bmp_tag());
+
+ fs::path my_path(bmp_filename);
+ gil::get_reader_backend<std::wstring, gil::bmp_tag>::type backend_wstring =
+ gil::make_reader_backend(my_path.wstring(), gil::bmp_tag());
+ gil::get_reader_backend<fs::path, gil::bmp_tag>::type backend_path =
+ gil::make_reader_backend(my_path, gil::bmp_tag());
+ }
+ {
+ gil::get_reader_backend<const char*, gil::bmp_tag>::type backend_char =
+ gil::make_reader_backend(bmp_filename.c_str(), gil::image_read_settings<gil::bmp_tag>());
+ gil::get_reader_backend<std::string, gil::bmp_tag>::type backend_string =
+ gil::make_reader_backend(bmp_filename, gil::image_read_settings<gil::bmp_tag>());
+
+ FILE* file = fopen(bmp_filename.c_str(), "rb");
+ gil::get_reader_backend<FILE*, gil::bmp_tag>::type backend_file =
+ gil::make_reader_backend(file, gil::image_read_settings<gil::bmp_tag>());
+
+ std::ifstream in(bmp_filename.c_str(), std::ios::binary);
+ gil::get_reader_backend<std::ifstream, gil::bmp_tag>::type backend_ifstream =
+ gil::make_reader_backend(in, gil::image_read_settings<gil::bmp_tag>());
+
+ fs::path my_path(bmp_filename);
+ gil::get_reader_backend<std::wstring, gil::bmp_tag>::type backend_wstring =
+ gil::make_reader_backend(my_path.wstring(), gil::image_read_settings<gil::bmp_tag>());
+ gil::get_reader_backend<fs::path, gil::bmp_tag>::type backend_path =
+ gil::make_reader_backend(my_path, gil::image_read_settings<gil::bmp_tag>());
+ }
+}
+
+void test_make_reader()
+{
+ {
+ gil::get_reader_backend<const char*, gil::bmp_tag>::type reader_char = gil::make_reader(
+ bmp_filename.c_str(), gil::bmp_tag(), gil::detail::read_and_no_convert());
+ gil::get_reader_backend<std::string, gil::bmp_tag>::type reader_string =
+ gil::make_reader(bmp_filename, gil::bmp_tag(), gil::detail::read_and_no_convert());
+
+ FILE* file = fopen(bmp_filename.c_str(), "rb");
+ gil::get_reader_backend<FILE*, gil::bmp_tag>::type reader_file =
+ gil::make_reader(file, gil::bmp_tag(), gil::detail::read_and_no_convert());
+
+ std::ifstream in(bmp_filename.c_str(), std::ios::binary);
+ gil::get_reader_backend<std::ifstream, gil::bmp_tag>::type reader_ifstream =
+ gil::make_reader(in, gil::bmp_tag(), gil::detail::read_and_no_convert());
+
+ fs::path my_path(bmp_filename);
+ gil::get_reader_backend<std::wstring, gil::bmp_tag>::type reader_wstring =
+ gil::make_reader(my_path.wstring(), gil::bmp_tag(), gil::detail::read_and_no_convert());
+ gil::get_reader_backend<fs::path, gil::bmp_tag>::type reader_path =
+ gil::make_reader(my_path, gil::bmp_tag(), gil::detail::read_and_no_convert());
+ }
+ {
+ gil::get_reader_backend<const char*, gil::bmp_tag>::type reader_char = gil::make_reader(
+ bmp_filename.c_str(), gil::image_read_settings<gil::bmp_tag>(),
+ gil::detail::read_and_no_convert());
+ gil::get_reader_backend<std::string, gil::bmp_tag>::type reader_string = gil::make_reader(
+ bmp_filename, gil::image_read_settings<gil::bmp_tag>(),
+ gil::detail::read_and_no_convert());
+
+ FILE* file = fopen(bmp_filename.c_str(), "rb");
+ gil::get_reader_backend<FILE*, gil::bmp_tag>::type reader_file = gil::make_reader(
+ file, gil::image_read_settings<gil::bmp_tag>(), gil::detail::read_and_no_convert());
+
+ std::ifstream in(bmp_filename.c_str(), std::ios::binary);
+ gil::get_reader_backend<std::ifstream, gil::bmp_tag>::type reader_ifstream =
+ gil::make_reader(
+ in, gil::image_read_settings<gil::bmp_tag>(), gil::detail::read_and_no_convert());
+
+ fs::path my_path(bmp_filename);
+ gil::get_reader_backend<std::wstring, gil::bmp_tag>::type reader_wstring = gil::make_reader(
+ my_path.wstring(), gil::image_read_settings<gil::bmp_tag>(),
+ gil::detail::read_and_no_convert());
+ gil::get_reader_backend<fs::path, gil::bmp_tag>::type reader_path = gil::make_reader(
+ my_path, gil::image_read_settings<gil::bmp_tag>(), gil::detail::read_and_no_convert());
+ }
+}
+
+void test_make_dynamic_image_reader()
+{
+ {
+ gil::get_dynamic_image_reader<const char*, gil::bmp_tag>::type reader_char =
+ gil::make_dynamic_image_reader(bmp_filename.c_str(), gil::bmp_tag());
+ gil::get_dynamic_image_reader<std::string, gil::bmp_tag>::type reader_string =
+ gil::make_dynamic_image_reader(bmp_filename, gil::bmp_tag());
+
+ FILE* file = fopen(bmp_filename.c_str(), "rb");
+ gil::get_dynamic_image_reader<FILE*, gil::bmp_tag>::type reader_file =
+ gil::make_dynamic_image_reader(file, gil::bmp_tag());
+
+ std::ifstream in(bmp_filename.c_str(), std::ios::binary);
+ gil::get_dynamic_image_reader<std::ifstream, gil::bmp_tag>::type reader_ifstream =
+ gil::make_dynamic_image_reader(in, gil::bmp_tag());
+
+ fs::path my_path(bmp_filename);
+ gil::get_dynamic_image_reader<std::wstring, gil::bmp_tag>::type reader_wstring =
+ gil::make_dynamic_image_reader(my_path.wstring(), gil::bmp_tag());
+ gil::get_dynamic_image_reader<fs::path, gil::bmp_tag>::type reader_path =
+ gil::make_dynamic_image_reader(my_path, gil::bmp_tag());
+ }
+ {
+ gil::get_dynamic_image_reader<const char*, gil::bmp_tag>::type reader_char =
+ gil::make_dynamic_image_reader(
+ bmp_filename.c_str(), gil::image_read_settings<gil::bmp_tag>());
+ gil::get_dynamic_image_reader<std::string, gil::bmp_tag>::type reader_string =
+ gil::make_dynamic_image_reader(bmp_filename, gil::image_read_settings<gil::bmp_tag>());
+
+ FILE* file = fopen(bmp_filename.c_str(), "rb");
+ gil::get_dynamic_image_reader<FILE*, gil::bmp_tag>::type reader_file =
+ gil::make_dynamic_image_reader(file, gil::image_read_settings<gil::bmp_tag>());
+
+ std::ifstream in(bmp_filename.c_str(), std::ios::binary);
+ gil::get_dynamic_image_reader<std::ifstream, gil::bmp_tag>::type reader_ifstream =
+ gil::make_dynamic_image_reader(in, gil::image_read_settings<gil::bmp_tag>());
+
+ fs::path my_path(bmp_filename);
+ gil::get_dynamic_image_reader<std::wstring, gil::bmp_tag>::type reader_wstring =
+ gil::make_dynamic_image_reader(
+ my_path.wstring(), gil::image_read_settings<gil::bmp_tag>());
+ gil::get_dynamic_image_reader<fs::path, gil::bmp_tag>::type reader_path =
+ gil::make_dynamic_image_reader(my_path, gil::image_read_settings<gil::bmp_tag>());
+ }
+}
+
+void test_make_writer()
+{
+ // Empty files may be created, but noo image data is written.
+ {
+ using writer_t = gil::get_writer<char const*, gil::bmp_tag>::type;
+
+ static_assert(
+ std::is_same<gil::detail::is_writer<writer_t>::type, std::true_type>::value, "");
+ }
+ {
+ gil::get_writer<const char*, gil::bmp_tag>::type writer_char =
+ gil::make_writer((bmp_out + "make_test.bmp").c_str(), gil::bmp_tag());
+ gil::get_writer<std::string, gil::bmp_tag>::type writer_string =
+ gil::make_writer((bmp_out + "make_test.bmp"), gil::bmp_tag());
+
+ FILE* file = fopen((bmp_out + "make_test.bmp").c_str(), "wb");
+ gil::get_writer<FILE*, gil::bmp_tag>::type writer_file =
+ gil::make_writer(file, gil::bmp_tag());
+
+ std::ofstream out((bmp_out + "make_test.bmp").c_str(), std::ios::binary);
+ gil::get_writer<std::ofstream, gil::bmp_tag>::type writer_ofstream =
+ gil::make_writer(out, gil::image_write_info<gil::bmp_tag>());
+ boost::ignore_unused(writer_ofstream);
+
+ fs::path my_path((bmp_out + "make_test.bmp").c_str());
+ gil::get_writer<std::wstring, gil::bmp_tag>::type writer_wstring =
+ gil::make_writer(my_path.wstring(), gil::bmp_tag());
+ gil::get_writer<fs::path, gil::bmp_tag>::type writer_path =
+ gil::make_writer(my_path, gil::bmp_tag());
+ }
+ {
+ gil::get_writer<const char*, gil::bmp_tag>::type writer_char =
+ gil::make_writer((bmp_out + "make_test.bmp").c_str(), gil::image_write_info<gil::bmp_tag>());
+ gil::get_writer<std::string, gil::bmp_tag>::type writer_string =
+ gil::make_writer((bmp_out + "make_test.bmp"), gil::image_write_info<gil::bmp_tag>());
+
+ FILE* file = fopen((bmp_out + std::string("make_test.bmp")).c_str(), "wb");
+ gil::get_writer<FILE*, gil::bmp_tag>::type writer_file =
+ gil::make_writer(file, gil::image_write_info<gil::bmp_tag>());
+
+ std::ofstream out((bmp_out + "make_test.bmp").c_str(), std::ios::binary);
+ gil::get_writer<std::ofstream, gil::bmp_tag>::type writer_ofstream =
+ gil::make_writer(out, gil::image_write_info<gil::bmp_tag>());
+ boost::ignore_unused(writer_ofstream);
+
+ fs::path my_path(bmp_out + "make_test.bmp");
+ gil::get_writer<std::wstring, gil::bmp_tag>::type writer_wstring =
+ gil::make_writer(my_path.wstring(), gil::image_write_info<gil::bmp_tag>());
+ gil::get_writer<fs::path, gil::bmp_tag>::type writer_path =
+ gil::make_writer(my_path, gil::image_write_info<gil::bmp_tag>());
+ }
+}
+
+void test_make_dynamic_image_writer()
+{
+ // Empty files may be created, but noo image data is written.
+ {
+ gil::get_dynamic_image_writer<const char*, gil::bmp_tag>::type writer_char =
+ gil::make_dynamic_image_writer(
+ (bmp_out + std::string("make_test.bmp")).c_str(), gil::bmp_tag());
+ gil::get_dynamic_image_writer<std::string, gil::bmp_tag>::type writer_string =
+ gil::make_dynamic_image_writer(bmp_out + "make_test.bmp", gil::bmp_tag());
+
+ FILE* file = fopen((bmp_out + std::string("make_test.bmp")).c_str(), "wb");
+ gil::get_dynamic_image_writer<FILE*, gil::bmp_tag>::type writer_file =
+ gil::make_dynamic_image_writer(file, gil::bmp_tag());
+
+ std::ofstream out((bmp_out + "make_test.bmp").c_str(), std::ios::binary);
+ gil::get_dynamic_image_writer<std::ofstream, gil::bmp_tag>::type writer_ofstream =
+ gil::make_dynamic_image_writer(out, gil::bmp_tag());
+ boost::ignore_unused(writer_ofstream);
+
+ fs::path my_path(bmp_out + "make_test.bmp");
+ gil::get_dynamic_image_writer<std::wstring, gil::bmp_tag>::type writer_wstring =
+ gil::make_dynamic_image_writer(my_path.wstring(), gil::bmp_tag());
+ gil::get_dynamic_image_writer<fs::path, gil::bmp_tag>::type writer_path =
+ gil::make_dynamic_image_writer(my_path, gil::bmp_tag());
+ }
+ {
+ gil::get_dynamic_image_writer<const char*, gil::bmp_tag>::type writer_char =
+ gil::make_dynamic_image_writer(
+ (bmp_out + std::string("make_test.bmp")).c_str(), gil::image_write_info<gil::bmp_tag>());
+
+ gil::get_dynamic_image_writer<std::string, gil::bmp_tag>::type writer_string =
+ gil::make_dynamic_image_writer(
+ bmp_out + "make_test.bmp", gil::image_write_info<gil::bmp_tag>());
+
+ FILE* file = fopen((bmp_out + std::string("make_test.bmp")).c_str(), "wb");
+ gil::get_dynamic_image_writer<FILE*, gil::bmp_tag>::type writer_file =
+ gil::make_dynamic_image_writer(file, gil::image_write_info<gil::bmp_tag>());
+
+ std::ofstream out((bmp_out + "make_test.bmp").c_str(), std::ios::binary);
+ gil::get_dynamic_image_writer<std::ofstream, gil::bmp_tag>::type writer_ofstream =
+ gil::make_dynamic_image_writer(out, gil::image_write_info<gil::bmp_tag>());
+ boost::ignore_unused(writer_ofstream);
+
+ fs::path my_path(bmp_out + "make_test.bmp");
+ gil::get_dynamic_image_writer<std::wstring, gil::bmp_tag>::type writer_wstring =
+ gil::make_dynamic_image_writer(my_path.wstring(), gil::image_write_info<gil::bmp_tag>());
+ gil::get_dynamic_image_writer<fs::path, gil::bmp_tag>::type writer_path =
+ gil::make_dynamic_image_writer(my_path, gil::image_write_info<gil::bmp_tag>());
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ try
+ {
+ test_make_reader_backend();
+ test_make_reader();
+ test_make_dynamic_image_reader();
+ test_make_writer();
+ test_make_dynamic_image_writer();
+ }
+ catch (std::exception const& e)
+ {
+ BOOST_ERROR(e.what());
+ }
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/io/bmp/bmp_old_test.cpp b/src/boost/libs/gil/test/extension/io/bmp/bmp_old_test.cpp
new file mode 100644
index 000000000..bd7fd27d8
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/bmp/bmp_old_test.cpp
@@ -0,0 +1,97 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/bmp/old.hpp>
+
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include "mandel_view.hpp"
+#include "paths.hpp"
+
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+void test_old_read_dimensions()
+{
+ boost::gil::point_t dim = gil::bmp_read_dimensions(bmp_filename);
+ BOOST_TEST_EQ(dim.x, 1000);
+ BOOST_TEST_EQ(dim.y, 600);
+}
+
+void test_old_read_image()
+{
+ gil::rgb8_image_t img;
+ gil::bmp_read_image(bmp_filename, img);
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+}
+
+void test_old_read_and_convert_image()
+{
+ gil::rgb8_image_t img;
+ gil::bmp_read_and_convert_image(bmp_filename, img);
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+}
+
+void test_old_read_view()
+{
+ gil::rgb8_image_t img(1000, 600);
+ gil::bmp_read_view(bmp_filename, view(img));
+}
+
+void test_old_read_and_convert_view()
+{
+ gil::rgb8_image_t img(1000, 600);
+ gil::bmp_read_and_convert_view(bmp_filename, view(img));
+}
+
+void test_old_write_view()
+{
+ auto b = gil::rgb8_pixel_t(0, 0, 255);
+ auto g = gil::rgb8_pixel_t(0, 255, 0);
+ gil::bmp_write_view(bmp_out + "old_write_view_test.bmp", create_mandel_view(1000, 600, b, g));
+}
+
+void test_old_dynamic_image()
+{
+ using my_img_types = mp11::mp_list
+ <
+ gil::gray8_image_t,
+ gil::gray16_image_t,
+ gil::rgb8_image_t,
+ gil::rgba8_image_t
+ >;
+
+ gil::any_image<my_img_types> image;
+ gil::bmp_read_image(bmp_filename.c_str(), image);
+
+ gil::bmp_write_view(bmp_out + "old_dynamic_image_test.bmp", gil::view(image));
+}
+
+int main(int argc, char *argv[])
+{
+ try
+ {
+ test_old_read_dimensions();
+ test_old_read_image();
+ test_old_read_and_convert_image();
+ test_old_read_view();
+ test_old_read_and_convert_view();
+ test_old_write_view();
+ test_old_dynamic_image();
+ }
+ catch (std::exception const& e)
+ {
+ BOOST_ERROR(e.what());
+ }
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/io/bmp/bmp_read_test.cpp b/src/boost/libs/gil/test/extension/io/bmp/bmp_read_test.cpp
new file mode 100644
index 000000000..5d36c22de
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/bmp/bmp_read_test.cpp
@@ -0,0 +1,463 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/bmp.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "paths.hpp"
+#include "scanline_read_test.hpp"
+
+#include <string>
+
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+template <typename Image>
+void write(Image& img, std::string const& file_name)
+{
+ write_view(bmp_out + file_name, gil::view(img), gil::bmp_tag());
+}
+
+void test_read_header()
+{
+ using backend_t = gil::get_reader_backend<std::string const, gil::bmp_tag>::type;
+ backend_t backend = gil::read_image_info(bmp_filename, gil::bmp_tag());
+ BOOST_TEST_EQ(backend._info._offset , 54u);
+ BOOST_TEST_EQ(backend._info._header_size , 40u);
+ BOOST_TEST_EQ(backend._info._width , 1000);
+ BOOST_TEST_EQ(backend._info._height , 600);
+ BOOST_TEST_EQ(backend._info._bits_per_pixel , 24);
+ BOOST_TEST_EQ(backend._info._compression , 0u);
+ BOOST_TEST_EQ(backend._info._image_size , 1800000u);
+ BOOST_TEST_EQ(backend._info._horizontal_resolution, 0);
+ BOOST_TEST_EQ(backend._info._vertical_resolution , 0);
+ BOOST_TEST_EQ(backend._info._num_colors , 0u);
+ BOOST_TEST_EQ(backend._info._num_important_colors , 0u);
+ BOOST_TEST_EQ(backend._info._valid , true);
+}
+
+#ifdef BOOST_GIL_IO_USE_BMP_TEST_SUITE_IMAGES
+void test_read_reference_images_test()
+{
+ // comments are taken from http://entropymine.com/jason/bmpsuite/reference/reference.html
+
+ // g01bw.bmp - black and white palette (#000000,#FFFFFF)
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g01bw.bmp", img, gil::bmp_tag());
+ }
+
+ // g01wb.bmp - white and black palette (#FFFFFF,#000000).
+ // Should look the same as g01bw, not inverted.
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g01wb.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g01wb.bmp");
+ }
+
+ // g01bg.bmp - blue and green palette (#4040FF,#40FF40)
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g01bg.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g01bg.bmp");
+ }
+
+ // g01p1.bmp - 1-color (blue) palette (#4040FF)
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g01p1.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g01p1.bmp");
+ }
+
+ // g04.bmp - basic 4bpp (16 color) image
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g04.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+ write(img, "g04.bmp");
+ }
+
+ // g04rle.bmp - RLE compressed.
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(bmp_in + "g04rle.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g04rle.bmp");
+ }
+
+ // g04p4.bmp - 4-color grayscale palette
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g04p4.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g04p4.bmp");
+ }
+
+ // g08.bmp - basic 8bpp (256 color) image
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g08.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g08.bmp");
+ }
+
+ // g08p256.bmp - biClrUsed=256, biClrImportant=0 [=256]
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g08p256.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g08p256.bmp");
+ }
+
+ // g08pi256.bmp - biClrUsed=256, biClrImportant=256
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g08pi256.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g08pi256.bmp");
+ }
+
+ // g08pi64.bmp - biClrUsed=256, biClrImportant=64. It's barely possible that some
+ // sophisticated viewers may display this image in grayscale, if there are a
+ // limited number of colors available.
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g08pi64.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g08pi64.bmp");
+ }
+
+ // g08rle.bmp - RLE compressed.
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(bmp_in + "g08rle.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g08rle.bmp");
+ }
+
+ // g08os2.bmp - OS/2-style bitmap. This is an obsolete variety of BMP
+ // that is still encountered sometimes. It has 3-byte palette
+ // entries (instead of 4), and 16-bit width/height fields (instead of 32).
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(bmp_in + "g08os2.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g08os2.bmp");
+ }
+
+ // g08res22.bmp - resolution 7874x7874 pixels/meter (200x200 dpi)
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g08res22.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g08res22.bmp");
+ }
+
+ // g08res11.bmp - resolution 3937x3937 pixels/meter (100x100 dpi)
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g08res11.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g08res11.bmp");
+ }
+
+ // g08res21.bmp resolution 7874x3937 pixels/meter (200x100 dpi).
+ // Some programs (e.g. Imaging for Windows) may display this image
+ // stretched vertically, which is the optimal thing to do if the
+ // program is primarily a viewer, rather than an editor.
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g08res21.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g08res21.bmp");
+ }
+
+ // g08s0.bmp - bits size not given (set to 0). This is legal for uncompressed bitmaps.
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g08s0.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g08s0.bmp");
+ }
+
+ // g08offs.bmp - bfOffBits in header not set to the usual value.
+ // There are 100 extra unused bytes between palette and bits.
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g08offs.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g08offs.bmp");
+ }
+
+ // g08w126.bmp - size 126x63 (right and bottom slightly clipped)
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g08w126.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 126u);
+ BOOST_TEST_EQ(view(img).height(), 63u);
+
+ write(img, "g08w126.bmp");
+ }
+
+ // g08w125.bmp - size 125x62
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g08w125.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 125u);
+ BOOST_TEST_EQ(view(img).height(), 62u);
+
+ write(img, "g08w125.bmp");
+ }
+
+ // g08w124.bmp - size 124x61
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g08w124.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 124u);
+ BOOST_TEST_EQ(view(img).height(), 61u);
+
+ write(img, "g08w124.bmp");
+ }
+
+ // g08p64.bmp - 64-color grayscale palette
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g08p64.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g08p64.bmp");
+ }
+
+ // g16def555.bmp - 15-bit color (1 bit wasted), biCompression=BI_RGB (no bitfields, defaults to 5-5-5)
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(bmp_in + "g16def555.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g16def555.bmp");
+ }
+
+ // g16bf555.bmp - 15-bit color, biCompression=BI_BITFIELDS (bitfields indicate 5-5-5)
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(bmp_in + "g16bf555.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g16bf555.bmp");
+ }
+
+ // g16bf565.bmp - 16-bit color, biCompression=BI_BITFIELDS (bitfields indicate 5-6-5)
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(bmp_in + "g16bf565.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g16bf565.bmp");
+ }
+
+ // g24.bmp - 24-bit color (BGR)
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(bmp_in + "g24.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g24.bmp");
+ }
+
+ // g32def.bmp - 24-bit color (8 bits wasted), biCompression=BI_RGB (no bitfields, defaults to BGRx)
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g32def.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g32def.bmp");
+ }
+
+ // g32bf.bmp - 24-bit color (8 bits wasted), biCompression=BI_BITFIELDS (bitfields indicate BGRx)
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(bmp_in + "g32bf.bmp", img, gil::bmp_tag());
+ BOOST_TEST_EQ(view(img).width(), 127u);
+ BOOST_TEST_EQ(view(img).height(), 64u);
+
+ write(img, "g32bf.bmp");
+ }
+}
+
+void test_read_reference_images_image_iterator()
+{
+ // comments are taken from http://entropymine.com/jason/bmpsuite/reference/reference.html
+
+ // g01bw.bmp - black and white palette (#000000,#FFFFFF)
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g01bw.bmp").c_str());
+
+ // g01wb.bmp - white and black palette (#FFFFFF,#000000).
+ // Should look the same as g01bw, not inverted.
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g01wb.bmp").c_str());
+
+ // g01bg.bmp - blue and green palette (#4040FF,#40FF40)
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g01bg.bmp").c_str());
+
+ // g01p1.bmp - 1-color (blue) palette (#4040FF)
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g01p1.bmp").c_str());
+
+ // g04.bmp - basic 4bpp (16 color) image
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g04.bmp").c_str());
+
+ // not supported
+ // g04rle.bmp - RLE compressed.
+ //test_scanline_reader<gil::bgra8_image_t, gil::bmp_tag>(std::string(bmp_in + "g01bg.bmp").c_str());
+
+ // g04p4.bmp - 4-color grayscale palette
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g04p4.bmp").c_str());
+
+ // g08.bmp - basic 8bpp (256 color) image
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g08.bmp").c_str());
+
+ // g08p256.bmp - biClrUsed=256, biClrImportant=0 [=256]
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g08p256.bmp").c_str());
+
+ // g08pi256.bmp - biClrUsed=256, biClrImportant=256
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g08pi256.bmp").c_str());
+
+ // g08pi64.bmp - biClrUsed=256, biClrImportant=64. It's barely possible that some
+ // sophisticated viewers may display this image in grayscale, if there are a
+ // limited number of colors available.
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g08pi64.bmp").c_str());
+
+ // not supported
+ // g08rle.bmp - RLE compressed.
+
+ // g08os2.bmp - OS/2-style bitmap. This is an obsolete variety of BMP
+ // that is still encountered sometimes. It has 3-byte palette
+ // entries (instead of 4), and 16-bit width/height fields (instead of 32).
+ test_scanline_reader<gil::rgb8_image_t, gil::bmp_tag>(std::string(bmp_in + "g08os2.bmp").c_str());
+
+ // g08res22.bmp - resolution 7874x7874 pixels/meter (200x200 dpi)
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g08res22.bmp").c_str());
+
+ // g08res11.bmp - resolution 3937x3937 pixels/meter (100x100 dpi)
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g08res11.bmp").c_str());
+
+ // g08res21.bmp resolution 7874x3937 pixels/meter (200x100 dpi).
+ // Some programs (e.g. Imaging for Windows) may display this image
+ // stretched vertically, which is the optimal thing to do if the
+ // program is primarily a viewer, rather than an editor.
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g08res21.bmp").c_str());
+
+ // g08s0.bmp - bits size not given (set to 0). This is legal for uncompressed bitmaps.
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g08s0.bmp").c_str());
+
+ // g08offs.bmp - bfOffBits in header not set to the usual value.
+ // There are 100 extra unused bytes between palette and bits.
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g08offs.bmp").c_str());
+
+ // g08w126.bmp - size 126x63 (right and bottom slightly clipped)
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g08w126.bmp").c_str());
+
+ // g08w125.bmp - size 125x62
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g08w125.bmp").c_str());
+
+ // g08w124.bmp - size 124x61
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g08w124.bmp").c_str());
+
+ // g08p64.bmp - 64-color grayscale palette
+ test_scanline_reader<gil::rgba8_image_t, gil::bmp_tag>(std::string(bmp_in + "g08p64.bmp").c_str());
+
+ // g16def555.bmp - 15-bit color (1 bit wasted), biCompression=BI_RGB (no bitfields, defaults to 5-5-5)
+ test_scanline_reader<gil::rgb8_image_t, gil::bmp_tag>(std::string(bmp_in + "g16def555.bmp").c_str());
+
+ // g16bf555.bmp - 15-bit color, biCompression=BI_BITFIELDS (bitfields indicate 5-5-5)
+ test_scanline_reader<gil::rgb8_image_t, gil::bmp_tag>(std::string(bmp_in + "g16bf555.bmp").c_str());
+
+ // g16bf565.bmp - 16-bit color, biCompression=BI_BITFIELDS (bitfields indicate 5-6-5)
+ test_scanline_reader<gil::rgb8_image_t, gil::bmp_tag>(std::string(bmp_in + "g16bf565.bmp").c_str());
+
+ // g24.bmp - 24-bit color (BGR)
+ test_scanline_reader<gil::bgr8_image_t, gil::bmp_tag>(std::string(bmp_in + "g24.bmp").c_str());
+
+ // g32def.bmp - 24-bit color (8 bits wasted), biCompression=BI_RGB (no bitfields, defaults to BGRx)
+ test_scanline_reader<gil::bgra8_image_t, gil::bmp_tag>(std::string(bmp_in + "g32def.bmp").c_str());
+
+ // g32bf.bmp - 24-bit color (8 bits wasted), biCompression=BI_BITFIELDS (bitfields indicate BGRx)
+ test_scanline_reader<gil::bgra8_image_t, gil::bmp_tag>(std::string(bmp_in + "g32bf.bmp").c_str());
+}
+
+void test_partial_image()
+{
+ std::string const filename(bmp_in + "g24.bmp");
+
+ gil::rgb8_image_t img;
+ gil::read_image(filename, img, gil::image_read_settings<gil::bmp_tag>(
+ gil::point_t(0, 0), gil::point_t(50, 50)));
+
+ write_view(bmp_out + "rgb_partial.bmp", gil::view(img), gil::bmp_tag());
+}
+#endif // BOOST_GIL_IO_USE_BMP_TEST_SUITE_IMAGES
+
+int main(int argc, char *argv[])
+{
+ try
+ {
+ test_read_header();
+
+#ifdef BOOST_GIL_IO_USE_BMP_TEST_SUITE_IMAGES
+ test_read_reference_images_test();
+ test_read_reference_images_image_iterator();
+ test_partial_image();
+#endif
+ }
+ catch (std::exception const& e)
+ {
+ BOOST_ERROR(e.what());
+ }
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/io/bmp/bmp_test.cpp b/src/boost/libs/gil/test/extension/io/bmp/bmp_test.cpp
new file mode 100644
index 000000000..6b1385464
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/bmp/bmp_test.cpp
@@ -0,0 +1,284 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#define BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
+#define BOOST_FILESYSTEM_VERSION 3
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/bmp.hpp>
+
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include <fstream>
+#include <sstream>
+#include <string>
+
+#include "mandel_view.hpp"
+#include "paths.hpp"
+#include "subimage_test.hpp"
+
+namespace fs = boost::filesystem;
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+void test_read_image_info_using_string()
+{
+ {
+ using backend_t = gil::get_reader_backend<std::string const, gil::bmp_tag>::type;
+ backend_t backend = read_image_info(bmp_filename, gil::bmp_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000);
+ BOOST_TEST_EQ(backend._info._height, 600);
+ }
+ {
+ std::ifstream in(bmp_filename.c_str(), std::ios::binary);
+ using backend_t = gil::get_reader_backend<std::ifstream, gil::bmp_tag>::type;
+ backend_t backend = read_image_info(in, gil::bmp_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000);
+ BOOST_TEST_EQ(backend._info._height, 600);
+ }
+ {
+ FILE *file = fopen(bmp_filename.c_str(), "rb");
+ using backend_t = gil::get_reader_backend<FILE *, gil::bmp_tag>::type;
+ backend_t backend = read_image_info(file, gil::bmp_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000);
+ BOOST_TEST_EQ(backend._info._height, 600);
+ }
+ {
+ fs::path my_path(bmp_filename);
+ using backend_t = gil::get_reader_backend<fs::path, gil::bmp_tag>::type;
+ backend_t backend = read_image_info(my_path, gil::bmp_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000);
+ BOOST_TEST_EQ(backend._info._height, 600);
+ }
+}
+
+void test_read_image()
+{
+ {
+ gil::rgb8_image_t img;
+ read_image(bmp_filename, img, gil::bmp_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+ }
+ {
+ std::ifstream in(bmp_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img;
+ read_image(in, img, gil::bmp_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+ }
+ {
+ FILE *file = fopen(bmp_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img;
+ read_image(file, img, gil::bmp_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+ }
+ {
+ fs::path my_path(bmp_filename);
+
+ gil::rgb8_image_t img;
+ read_image(my_path, img, gil::bmp_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+ }
+}
+
+void test_read_and_convert_image()
+{
+ {
+ gil::rgb8_image_t img;
+ read_and_convert_image(bmp_filename, img, gil::bmp_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+ }
+ {
+ std::ifstream in(bmp_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img;
+ read_and_convert_image(in, img, gil::bmp_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+ }
+ {
+ FILE *file = fopen(bmp_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img;
+ read_and_convert_image(file, img, gil::bmp_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+ }
+}
+
+void test_read_view()
+{
+ {
+ gil::rgb8_image_t img(1000, 600);
+ read_view(bmp_filename, gil::view(img), gil::bmp_tag());
+ }
+ {
+ std::ifstream in(bmp_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img(1000, 600);
+ read_view(in, gil::view(img), gil::bmp_tag());
+ }
+ {
+ FILE *file = fopen(bmp_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img(1000, 600);
+ read_view(file, gil::view(img), gil::bmp_tag());
+ }
+}
+
+void test_read_and_convert_view()
+{
+ {
+ gil::rgb8_image_t img(1000, 600);
+ read_and_convert_view(bmp_filename, gil::view(img), gil::bmp_tag());
+ }
+ {
+ std::ifstream in(bmp_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img(1000, 600);
+ read_and_convert_view(in, gil::view(img), gil::bmp_tag());
+ }
+ {
+ FILE *file = fopen(bmp_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img(1000, 600);
+ read_and_convert_view(file, gil::view(img), gil::bmp_tag());
+ }
+}
+
+void test_write_view()
+{
+ auto const b = gil::rgb8_pixel_t(0, 0, 255);
+ auto const g = gil::rgb8_pixel_t(0, 255, 0);
+ {
+ std::string filename(bmp_out + "write_test_string.bmp");
+ gil::write_view(filename, create_mandel_view(1000, 600, b, g), gil::bmp_tag());
+ }
+ {
+ std::string filename(bmp_out + "write_test_ofstream.bmp");
+ std::ofstream out(filename.c_str(), std::ios::binary);
+
+ gil::write_view(out, create_mandel_view(1000, 600, b, g), gil::bmp_tag());
+ }
+ {
+ std::string filename(bmp_out + "write_test_file.bmp");
+
+ FILE *file = fopen(filename.c_str(), "wb");
+ gil::write_view(file, create_mandel_view(1000, 600, b, g), gil::bmp_tag());
+ }
+ {
+ std::string filename(bmp_out + "write_test_info.bmp");
+
+ gil::image_write_info<gil::bmp_tag> info;
+ FILE *file = fopen(filename.c_str(), "wb");
+ gil::write_view(file, create_mandel_view(1000, 600, b, g), info);
+ }
+}
+
+void test_stream()
+{
+ // 1. Read an image.
+ std::ifstream in(bmp_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img;
+ gil::read_image(in, img, gil::bmp_tag());
+
+ // 2. Write image to in-memory buffer.
+ std::stringstream out_buffer(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
+ gil::write_view(out_buffer, gil::view(img), gil::bmp_tag());
+
+ // 3. Copy in-memory buffer to another.
+ std::stringstream in_buffer(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
+ in_buffer << out_buffer.rdbuf();
+
+ // 4. Read in-memory buffer to gil image
+ gil::rgb8_image_t dst;
+ gil::read_image(in_buffer, dst, gil::bmp_tag());
+
+ // 5. Write out image.
+ std::string filename(bmp_out + "stream_test.bmp");
+ std::ofstream out(filename.c_str(), std::ios_base::binary);
+
+ gil::write_view( out, gil::view( dst ), gil::bmp_tag() );
+}
+
+void test_stream_2()
+{
+ std::filebuf in_buf;
+ if (!in_buf.open(bmp_filename.c_str(), std::ios::in | std::ios::binary))
+ {
+ BOOST_TEST(false);
+ }
+ std::istream in(&in_buf);
+
+ gil::rgb8_image_t img;
+ read_image(in, img, gil::bmp_tag());
+}
+
+void test_subimage()
+{
+ run_subimage_test<gil::rgb8_image_t, gil::bmp_tag>(
+ bmp_filename, gil::point_t(0, 0), gil::point_t(1000, 1));
+
+ run_subimage_test<gil::rgb8_image_t, gil::bmp_tag>(
+ bmp_filename, gil::point_t(39, 7), gil::point_t(50, 50));
+}
+
+void test_dynamic_image()
+{
+ using my_img_types = mp11::mp_list
+ <
+ gil::gray8_image_t,
+ gil::gray16_image_t,
+ gil::rgb8_image_t,
+ gil::rgba8_image_t
+ >;
+
+ gil::any_image<my_img_types> image;
+ gil::read_image(bmp_filename.c_str(), image, gil::bmp_tag());
+
+ gil::write_view(bmp_out + "dynamic_image_test.bmp", gil::view(image), gil::bmp_tag());
+}
+
+int main(int argc, char *argv[])
+{
+ try
+ {
+ test_read_image_info_using_string();
+ test_read_image();
+ test_read_and_convert_image();
+ test_read_view();
+ test_read_and_convert_view();
+ test_write_view();
+ test_stream();
+ test_stream_2();
+ test_subimage();
+ test_dynamic_image();
+ }
+ catch (std::exception const& e)
+ {
+ BOOST_ERROR(e.what());
+ }
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/io/bmp/bmp_write_test.cpp b/src/boost/libs/gil/test/extension/io/bmp/bmp_write_test.cpp
new file mode 100644
index 000000000..2dea9e514
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/bmp/bmp_write_test.cpp
@@ -0,0 +1,53 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/io/typedefs.hpp>
+#include <boost/gil/extension/io/bmp.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "cmp_view.hpp"
+#include "color_space_write_test.hpp"
+#include "mandel_view.hpp"
+#include "paths.hpp"
+
+namespace gil = boost::gil;
+
+void test_write_rgb8()
+{
+ gil::write_view(bmp_out + "rgb8_test.bmp", create_mandel_view(200, 200,
+ gil::rgb8_pixel_t(0, 0, 255), gil::rgb8_pixel_t(0, 255, 0)), gil::bmp_tag());
+}
+
+void test_write_rgba8()
+{
+ gil::write_view(bmp_out + "rgba8_test.bmp", create_mandel_view(200, 200,
+ gil::rgba8_pixel_t(0, 0, 255, 0), gil::rgba8_pixel_t(0, 255, 0, 0)), gil::bmp_tag());
+}
+
+void test_rgb_color_space_write()
+{
+ color_space_write_test<gil::bmp_tag>(
+ bmp_out + "rgb_color_space_test.bmp",
+ bmp_out + "bgr_color_space_test.bmp");
+}
+
+int main(int argc, char *argv[])
+{
+ try
+ {
+ test_write_rgb8();
+ test_write_rgba8();
+ test_rgb_color_space_write();
+ }
+ catch (std::exception const& e)
+ {
+ BOOST_ERROR(e.what());
+ }
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/io/cmp_view.hpp b/src/boost/libs/gil/test/extension/io/cmp_view.hpp
new file mode 100644
index 000000000..9141f55d4
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/cmp_view.hpp
@@ -0,0 +1,37 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifndef BOOST_GIL_IO_TEST_EXTENSION_IO_CMP_VIEW_HPP
+#define BOOST_GIL_IO_TEST_EXTENSION_IO_CMP_VIEW_HPP
+
+#include <boost/gil.hpp>
+
+#include <stdexcept>
+
+template <typename View1, typename View2>
+void cmp_view(View1 const& v1, View2 const& v2)
+{
+ if (v1.dimensions() != v2.dimensions())
+ throw std::runtime_error("Images are not equal.");
+
+ typename View1::x_coord_t width = v1.width();
+ typename View1::y_coord_t height = v1.height();
+
+ for (typename View1::y_coord_t y = 0; y < height; ++y)
+ {
+ typename View1::x_iterator const src_it = v1.row_begin(y);
+ typename View2::x_iterator const dst_it = v2.row_begin(y);
+
+ for (typename View1::x_coord_t x = 0; x < width; ++x)
+ {
+ if (*src_it != *dst_it)
+ throw std::runtime_error("Images are not equal.");
+ }
+ }
+}
+
+#endif // BOOST_GIL_IO_TEST_EXTENSION_IO_CMP_VIEW_HPP
diff --git a/src/boost/libs/gil/test/extension/io/color_space_write_test.hpp b/src/boost/libs/gil/test/extension/io/color_space_write_test.hpp
new file mode 100644
index 000000000..c7fb1577b
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/color_space_write_test.hpp
@@ -0,0 +1,52 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifndef BOOST_GIL_TEST_EXTENSION_IO_COLOR_SPACE_WRITE_TEST_HPP
+#define BOOST_GIL_TEST_EXTENSION_IO_COLOR_SPACE_WRITE_TEST_HPP
+
+#include <boost/gil.hpp>
+
+#ifndef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+#include <boost/core/ignore_unused.hpp>
+#endif
+#include <string>
+
+#include "cmp_view.hpp"
+
+template <typename Tag>
+void color_space_write_test(std::string const& file_name_1, std::string const& file_name_2)
+{
+ namespace gil = boost::gil;
+
+ gil::rgb8_image_t rgb(320, 200);
+ gil::bgr8_image_t bgr(320, 200);
+
+ gil::fill_pixels(gil::view(rgb), gil::rgb8_pixel_t(0, 0, 255));
+ gil::fill_pixels(gil::view(bgr), gil::bgr8_pixel_t(255, 0, 0));
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(file_name_1, gil::view(rgb), Tag());
+ gil::write_view(file_name_2, gil::view(bgr), Tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::rgb8_image_t rgb_1;
+ gil::rgb8_image_t rgb_2;
+
+ gil::read_image(file_name_1, rgb_1, Tag());
+ gil::read_image(file_name_2, rgb_2, Tag());
+
+ cmp_view(gil::view(rgb_1), gil::view(rgb_2));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+
+#ifndef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ boost::ignore_unused(file_name_1);
+ boost::ignore_unused(file_name_2);
+#endif
+}
+
+#endif // BOOST_GIL_TEST_EXTENSION_IO_COLOR_SPACE_WRITE_TEST_HPP
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g01bg.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g01bg.bmp
new file mode 100644
index 000000000..a72034764
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g01bg.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g01bw.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g01bw.bmp
new file mode 100644
index 000000000..06189a6c6
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g01bw.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g01p1.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g01p1.bmp
new file mode 100644
index 000000000..706b4a1dd
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g01p1.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g01wb.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g01wb.bmp
new file mode 100644
index 000000000..2f05b4366
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g01wb.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g04.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g04.bmp
new file mode 100644
index 000000000..a064f66a7
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g04.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g04p4.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g04p4.bmp
new file mode 100644
index 000000000..4c1096b5e
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g04p4.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g04rle.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g04rle.bmp
new file mode 100644
index 000000000..7239fa668
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g04rle.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08.bmp
new file mode 100644
index 000000000..3be9a2066
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08offs.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08offs.bmp
new file mode 100644
index 000000000..71def41c6
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08offs.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08os2.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08os2.bmp
new file mode 100644
index 000000000..f7f9f5795
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08os2.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08p256.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08p256.bmp
new file mode 100644
index 000000000..a129bbc34
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08p256.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08p64.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08p64.bmp
new file mode 100644
index 000000000..9d3affd66
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08p64.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08pi256.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08pi256.bmp
new file mode 100644
index 000000000..45df3f836
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08pi256.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08pi64.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08pi64.bmp
new file mode 100644
index 000000000..52baf9180
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08pi64.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08res11.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08res11.bmp
new file mode 100644
index 000000000..f03d0f3dc
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08res11.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08res21.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08res21.bmp
new file mode 100644
index 000000000..61198e562
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08res21.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08res22.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08res22.bmp
new file mode 100644
index 000000000..1af0ecce3
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08res22.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08rle.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08rle.bmp
new file mode 100644
index 000000000..082f7f481
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08rle.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08s0.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08s0.bmp
new file mode 100644
index 000000000..4b2c521d5
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08s0.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08w124.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08w124.bmp
new file mode 100644
index 000000000..18960354d
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08w124.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08w125.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08w125.bmp
new file mode 100644
index 000000000..b348a7c21
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08w125.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g08w126.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g08w126.bmp
new file mode 100644
index 000000000..3628d6665
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08w126.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g16bf555.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g16bf555.bmp
new file mode 100644
index 000000000..639a57f87
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g16bf555.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g16bf565.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g16bf565.bmp
new file mode 100644
index 000000000..cb0ea24f5
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g16bf565.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g16def555.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g16def555.bmp
new file mode 100644
index 000000000..a5a3195cc
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g16def555.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g24.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g24.bmp
new file mode 100644
index 000000000..d6d9e6afa
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g24.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g32bf.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g32bf.bmp
new file mode 100644
index 000000000..0f41534e1
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g32bf.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/g32def.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/g32def.bmp
new file mode 100644
index 000000000..9524f765b
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/g32def.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/readme.txt b/src/boost/libs/gil/test/extension/io/images/bmp/readme.txt
new file mode 100644
index 000000000..2478f5dd3
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/readme.txt
@@ -0,0 +1,5 @@
+# Copyright (C) 2013 Christian Henning
+# Distributed under the Boost Software License, Version 1.0.
+# See www.boost.org/LICENSE_1_0.txt
+
+Image were found at http://entropymine.com/jason/bmpsuite/ . \ No newline at end of file
diff --git a/src/boost/libs/gil/test/extension/io/images/bmp/test.bmp b/src/boost/libs/gil/test/extension/io/images/bmp/test.bmp
new file mode 100644
index 000000000..24d396d57
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/bmp/test.bmp
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/jpeg/EddDawson/36dpi.jpg b/src/boost/libs/gil/test/extension/io/images/jpeg/EddDawson/36dpi.jpg
new file mode 100644
index 000000000..793e31781
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/jpeg/EddDawson/36dpi.jpg
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/jpeg/test.jpg b/src/boost/libs/gil/test/extension/io/images/jpeg/test.jpg
new file mode 100644
index 000000000..d221c054d
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/jpeg/test.jpg
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/png/EddDawson/36dpi.png b/src/boost/libs/gil/test/extension/io/images/png/EddDawson/36dpi.png
new file mode 100644
index 000000000..bea4eb6f7
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/png/EddDawson/36dpi.png
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/png/PngSuite/readme.txt b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/readme.txt
new file mode 100644
index 000000000..46c5ccb79
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/readme.txt
@@ -0,0 +1,7 @@
+# Copyright (C) 2013 Christian Henning
+# Distributed under the Boost Software License, Version 1.0.
+# See www.boost.org/LICENSE_1_0.txt
+
+test images can be found at http://www.schaik.com/pngsuite/pngsuite.html
+
+if not available please send me an email at chhenning ** at ** gmail.com \ No newline at end of file
diff --git a/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbbn0g04.png b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbbn0g04.png
new file mode 100644
index 000000000..39a7050d2
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbbn0g04.png
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbbn2c16.png b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbbn2c16.png
new file mode 100644
index 000000000..dd3168e5c
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbbn2c16.png
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbbn3p08.png b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbbn3p08.png
new file mode 100644
index 000000000..0ede3574d
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbbn3p08.png
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbgn2c16.png b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbgn2c16.png
new file mode 100644
index 000000000..85cec395c
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbgn2c16.png
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbgn3p08.png b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbgn3p08.png
new file mode 100644
index 000000000..8cf2e6fb6
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbgn3p08.png
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbrn2c08.png b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbrn2c08.png
new file mode 100644
index 000000000..5cca0d621
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbrn2c08.png
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbwn0g16.png b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbwn0g16.png
new file mode 100644
index 000000000..99bdeed2b
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbwn0g16.png
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tm3n3p02.png b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tm3n3p02.png
new file mode 100644
index 000000000..fb3ef1d0c
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tm3n3p02.png
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tp1n3p08.png b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tp1n3p08.png
new file mode 100644
index 000000000..a6c9f35a8
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tp1n3p08.png
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/png/grayalpha-with-tRNS-chunk.png b/src/boost/libs/gil/test/extension/io/images/png/grayalpha-with-tRNS-chunk.png
new file mode 100644
index 000000000..c914fb4b8
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/png/grayalpha-with-tRNS-chunk.png
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/png/grayscale-with-tRNS-chunk.png b/src/boost/libs/gil/test/extension/io/images/png/grayscale-with-tRNS-chunk.png
new file mode 100644
index 000000000..9fae9a157
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/png/grayscale-with-tRNS-chunk.png
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/png/test.png b/src/boost/libs/gil/test/extension/io/images/png/test.png
new file mode 100644
index 000000000..bd731ed8f
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/png/test.png
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/pnm/p1.pnm b/src/boost/libs/gil/test/extension/io/images/pnm/p1.pnm
new file mode 100644
index 000000000..087e56b51
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/pnm/p1.pnm
@@ -0,0 +1,1203 @@
+P1
+# ASCII PBM file created by PBMA_WRITE.
+ 200 200
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 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 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 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 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 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 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 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 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 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 1 1 1 1 1 1 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 1 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 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 1 1 1 1 1 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 1
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 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 1 1 1 1 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 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 1 1 1 1 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 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 1 1 1 1 1 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 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 1 1 1 1
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 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 1 1 1
+ 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 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 1
+ 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 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
+ 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 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
+ 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 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
+ 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 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
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 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 1
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 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 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 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 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 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 1 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 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 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 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 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 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 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 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 1 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 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 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 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 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 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 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 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 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 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 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 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 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 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 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 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 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 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 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 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 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 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 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 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 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 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 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 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 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 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 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 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 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 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 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 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 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 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 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 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 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 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 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 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 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 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 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 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 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 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 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 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 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 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 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 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 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 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 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 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 1 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 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 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 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 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 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 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 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 1 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 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 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 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 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 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 1
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 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
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 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
+ 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 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
+ 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 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
+ 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 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 1
+ 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 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 1 1 1
+ 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 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 1 1 1 1
+ 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 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 1 1 1 1 1 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 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 1 1 1 1 1 1 1
+ 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 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 1 1 1 1 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 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 1 1 1 1 1 1 1 1 1 1
+ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 1
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 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 1 1 1 1 1 1 1 1
+ 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 1 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 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 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 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 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 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 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 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 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 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/src/boost/libs/gil/test/extension/io/images/pnm/p2.pnm b/src/boost/libs/gil/test/extension/io/images/pnm/p2.pnm
new file mode 100644
index 000000000..1673f5167
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/pnm/p2.pnm
@@ -0,0 +1,3004 @@
+P2
+# ASCII PGM file created by PGMA_WRITE.
+ 200 200
+ 199
+ 0 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 1 1 1 1
+ 0 0 2 2 2 2 2 2 2 2 2 2 2 2
+ 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+ 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+ 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+ 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+ 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+ 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+ 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+ 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+ 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+ 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+ 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+ 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+ 2 2 2 2 2 2 2 2 2 2 2 2 2 2
+ 2 2 2 2
+ 0 1 0 3 3 3 3 3 3 3 3 3 3 3
+ 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+ 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+ 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+ 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+ 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+ 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+ 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+ 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+ 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+ 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+ 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+ 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+ 3 3 3 3 3 3 3 3 3 3 3 3 3 3
+ 3 3 3 3
+ 0 0 1 0 4 4 4 4 4 4 4 4 4 4
+ 4 4 4 4 4 4 4 4 4 4 4 4 4 4
+ 4 4 4 4 4 4 4 4 4 4 4 4 4 4
+ 4 4 4 4 4 4 4 4 4 4 4 4 4 4
+ 4 4 4 4 4 4 4 4 4 4 4 4 4 4
+ 4 4 4 4 4 4 4 4 4 4 4 4 4 4
+ 4 4 4 4 4 4 4 4 4 4 4 4 4 4
+ 4 4 4 4 4 4 4 4 4 4 4 4 4 4
+ 4 4 4 4 4 4 4 4 4 4 4 4 4 4
+ 4 4 4 4 4 4 4 4 4 4 4 4 4 4
+ 4 4 4 4 4 4 4 4 4 4 4 4 4 4
+ 4 4 4 4 4 4 4 4 4 4 4 4 4 4
+ 4 4 4 4 4 4 4 4 4 4 4 4 4 4
+ 4 4 4 4 4 4 4 4 4 4 4 4 4 4
+ 4 4 4 4
+ 0 1 2 1 0 5 5 5 5 5 5 5 5 5
+ 5 5 5 5 5 5 5 5 5 5 5 5 5 5
+ 5 5 5 5 5 5 5 5 5 5 5 5 5 5
+ 5 5 5 5 5 5 5 5 5 5 5 5 5 5
+ 5 5 5 5 5 5 5 5 5 5 5 5 5 5
+ 5 5 5 5 5 5 5 5 5 5 5 5 5 5
+ 5 5 5 5 5 5 5 5 5 5 5 5 5 5
+ 5 5 5 5 5 5 5 5 5 5 5 5 5 5
+ 5 5 5 5 5 5 5 5 5 5 5 5 5 5
+ 5 5 5 5 5 5 5 5 5 5 5 5 5 5
+ 5 5 5 5 5 5 5 5 5 5 5 5 5 5
+ 5 5 5 5 5 5 5 5 5 5 5 5 5 5
+ 5 5 5 5 5 5 5 5 5 5 5 5 5 5
+ 5 5 5 5 5 5 5 5 5 5 5 5 5 5
+ 5 5 5 5
+ 0 0 0 2 1 0 6 6 6 6 6 6 6 6
+ 6 6 6 6 6 6 6 6 6 6 6 6 6 6
+ 6 6 6 6 6 6 6 6 6 6 6 6 6 6
+ 6 6 6 6 6 6 6 6 6 6 6 6 6 6
+ 6 6 6 6 6 6 6 6 6 6 6 6 6 6
+ 6 6 6 6 6 6 6 6 6 6 6 6 6 6
+ 6 6 6 6 6 6 6 6 6 6 6 6 6 6
+ 6 6 6 6 6 6 6 6 6 6 6 6 6 6
+ 6 6 6 6 6 6 6 6 6 6 6 6 6 6
+ 6 6 6 6 6 6 6 6 6 6 6 6 6 6
+ 6 6 6 6 6 6 6 6 6 6 6 6 6 6
+ 6 6 6 6 6 6 6 6 6 6 6 6 6 6
+ 6 6 6 6 6 6 6 6 6 6 6 6 6 6
+ 6 6 6 6 6 6 6 6 6 6 6 6 6 6
+ 6 6 6 6
+ 0 1 1 3 2 1 0 7 7 7 7 7 7 7
+ 7 7 7 7 7 7 7 7 7 7 7 7 7 7
+ 7 7 7 7 7 7 7 7 7 7 7 7 7 7
+ 7 7 7 7 7 7 7 7 7 7 7 7 7 7
+ 7 7 7 7 7 7 7 7 7 7 7 7 7 7
+ 7 7 7 7 7 7 7 7 7 7 7 7 7 7
+ 7 7 7 7 7 7 7 7 7 7 7 7 7 7
+ 7 7 7 7 7 7 7 7 7 7 7 7 7 7
+ 7 7 7 7 7 7 7 7 7 7 7 7 7 7
+ 7 7 7 7 7 7 7 7 7 7 7 7 7 7
+ 7 7 7 7 7 7 7 7 7 7 7 7 7 7
+ 7 7 7 7 7 7 7 7 7 7 7 7 7 7
+ 7 7 7 7 7 7 7 7 7 7 7 7 7 7
+ 7 7 7 7 7 7 7 7 7 7 7 7 7 7
+ 7 7 7 7
+ 0 0 2 0 3 2 1 0 8 8 8 8 8 8
+ 8 8 8 8 8 8 8 8 8 8 8 8 8 8
+ 8 8 8 8 8 8 8 8 8 8 8 8 8 8
+ 8 8 8 8 8 8 8 8 8 8 8 8 8 8
+ 8 8 8 8 8 8 8 8 8 8 8 8 8 8
+ 8 8 8 8 8 8 8 8 8 8 8 8 8 8
+ 8 8 8 8 8 8 8 8 8 8 8 8 8 8
+ 8 8 8 8 8 8 8 8 8 8 8 8 8 8
+ 8 8 8 8 8 8 8 8 8 8 8 8 8 8
+ 8 8 8 8 8 8 8 8 8 8 8 8 8 8
+ 8 8 8 8 8 8 8 8 8 8 8 8 8 8
+ 8 8 8 8 8 8 8 8 8 8 8 8 8 8
+ 8 8 8 8 8 8 8 8 8 8 8 8 8 8
+ 8 8 8 8 8 8 8 8 8 8 8 8 8 8
+ 8 8 8 8
+ 0 1 0 1 4 3 2 1 0 9 9 9 9 9
+ 9 9 9 9 9 9 9 9 9 9 9 9 9 9
+ 9 9 9 9 9 9 9 9 9 9 9 9 9 9
+ 9 9 9 9 9 9 9 9 9 9 9 9 9 9
+ 9 9 9 9 9 9 9 9 9 9 9 9 9 9
+ 9 9 9 9 9 9 9 9 9 9 9 9 9 9
+ 9 9 9 9 9 9 9 9 9 9 9 9 9 9
+ 9 9 9 9 9 9 9 9 9 9 9 9 9 9
+ 9 9 9 9 9 9 9 9 9 9 9 9 9 9
+ 9 9 9 9 9 9 9 9 9 9 9 9 9 9
+ 9 9 9 9 9 9 9 9 9 9 9 9 9 9
+ 9 9 9 9 9 9 9 9 9 9 9 9 9 9
+ 9 9 9 9 9 9 9 9 9 9 9 9 9 9
+ 9 9 9 9 9 9 9 9 9 9 9 9 9 9
+ 9 9 9 9
+ 0 0 1 2 0 4 3 2 1 0 10 10 10 10
+ 10 10 10 10 10 10 10 10 10 10 10 10 10 10
+ 10 10 10 10 10 10 10 10 10 10 10 10 10 10
+ 10 10 10 10 10 10 10 10 10 10 10 10 10 10
+ 10 10 10 10 10 10 10 10 10 10 10 10 10 10
+ 10 10 10 10 10 10 10 10 10 10 10 10 10 10
+ 10 10 10 10 10 10 10 10 10 10 10 10 10 10
+ 10 10 10 10 10 10 10 10 10 10 10 10 10 10
+ 10 10 10 10 10 10 10 10 10 10 10 10 10 10
+ 10 10 10 10 10 10 10 10 10 10 10 10 10 10
+ 10 10 10 10 10 10 10 10 10 10 10 10 10 10
+ 10 10 10 10 10 10 10 10 10 10 10 10 10 10
+ 10 10 10 10 10 10 10 10 10 10 10 10 10 10
+ 10 10 10 10 10 10 10 10 10 10 10 10 10 10
+ 10 10 10 10
+ 0 1 2 3 1 5 4 3 2 1 0 11 11 11
+ 11 11 11 11 11 11 11 11 11 11 11 11 11 11
+ 11 11 11 11 11 11 11 11 11 11 11 11 11 11
+ 11 11 11 11 11 11 11 11 11 11 11 11 11 11
+ 11 11 11 11 11 11 11 11 11 11 11 11 11 11
+ 11 11 11 11 11 11 11 11 11 11 11 11 11 11
+ 11 11 11 11 11 11 11 11 11 11 11 11 11 11
+ 11 11 11 11 11 11 11 11 11 11 11 11 11 11
+ 11 11 11 11 11 11 11 11 11 11 11 11 11 11
+ 11 11 11 11 11 11 11 11 11 11 11 11 11 11
+ 11 11 11 11 11 11 11 11 11 11 11 11 11 11
+ 11 11 11 11 11 11 11 11 11 11 11 11 11 11
+ 11 11 11 11 11 11 11 11 11 11 11 11 11 11
+ 11 11 11 11 11 11 11 11 11 11 11 11 11 11
+ 11 11 11 11
+ 0 0 0 0 2 0 5 4 3 2 1 0 12 12
+ 12 12 12 12 12 12 12 12 12 12 12 12 12 12
+ 12 12 12 12 12 12 12 12 12 12 12 12 12 12
+ 12 12 12 12 12 12 12 12 12 12 12 12 12 12
+ 12 12 12 12 12 12 12 12 12 12 12 12 12 12
+ 12 12 12 12 12 12 12 12 12 12 12 12 12 12
+ 12 12 12 12 12 12 12 12 12 12 12 12 12 12
+ 12 12 12 12 12 12 12 12 12 12 12 12 12 12
+ 12 12 12 12 12 12 12 12 12 12 12 12 12 12
+ 12 12 12 12 12 12 12 12 12 12 12 12 12 12
+ 12 12 12 12 12 12 12 12 12 12 12 12 12 12
+ 12 12 12 12 12 12 12 12 12 12 12 12 12 12
+ 12 12 12 12 12 12 12 12 12 12 12 12 12 12
+ 12 12 12 12 12 12 12 12 12 12 12 12 12 12
+ 12 12 12 12
+ 0 1 1 1 3 1 6 5 4 3 2 1 0 13
+ 13 13 13 13 13 13 13 13 13 13 13 13 13 13
+ 13 13 13 13 13 13 13 13 13 13 13 13 13 13
+ 13 13 13 13 13 13 13 13 13 13 13 13 13 13
+ 13 13 13 13 13 13 13 13 13 13 13 13 13 13
+ 13 13 13 13 13 13 13 13 13 13 13 13 13 13
+ 13 13 13 13 13 13 13 13 13 13 13 13 13 13
+ 13 13 13 13 13 13 13 13 13 13 13 13 13 13
+ 13 13 13 13 13 13 13 13 13 13 13 13 13 13
+ 13 13 13 13 13 13 13 13 13 13 13 13 13 13
+ 13 13 13 13 13 13 13 13 13 13 13 13 13 13
+ 13 13 13 13 13 13 13 13 13 13 13 13 13 13
+ 13 13 13 13 13 13 13 13 13 13 13 13 13 13
+ 13 13 13 13 13 13 13 13 13 13 13 13 13 13
+ 13 13 13 13
+ 0 0 2 2 4 2 0 6 5 4 3 2 1 0
+ 14 14 14 14 14 14 14 14 14 14 14 14 14 14
+ 14 14 14 14 14 14 14 14 14 14 14 14 14 14
+ 14 14 14 14 14 14 14 14 14 14 14 14 14 14
+ 14 14 14 14 14 14 14 14 14 14 14 14 14 14
+ 14 14 14 14 14 14 14 14 14 14 14 14 14 14
+ 14 14 14 14 14 14 14 14 14 14 14 14 14 14
+ 14 14 14 14 14 14 14 14 14 14 14 14 14 14
+ 14 14 14 14 14 14 14 14 14 14 14 14 14 14
+ 14 14 14 14 14 14 14 14 14 14 14 14 14 14
+ 14 14 14 14 14 14 14 14 14 14 14 14 14 14
+ 14 14 14 14 14 14 14 14 14 14 14 14 14 14
+ 14 14 14 14 14 14 14 14 14 14 14 14 14 14
+ 14 14 14 14 14 14 14 14 14 14 14 14 14 14
+ 14 14 14 14
+ 0 1 0 3 0 3 1 7 6 5 4 3 2 1
+ 0 15 15 15 15 15 15 15 15 15 15 15 15 15
+ 15 15 15 15 15 15 15 15 15 15 15 15 15 15
+ 15 15 15 15 15 15 15 15 15 15 15 15 15 15
+ 15 15 15 15 15 15 15 15 15 15 15 15 15 15
+ 15 15 15 15 15 15 15 15 15 15 15 15 15 15
+ 15 15 15 15 15 15 15 15 15 15 15 15 15 15
+ 15 15 15 15 15 15 15 15 15 15 15 15 15 15
+ 15 15 15 15 15 15 15 15 15 15 15 15 15 15
+ 15 15 15 15 15 15 15 15 15 15 15 15 15 15
+ 15 15 15 15 15 15 15 15 15 15 15 15 15 15
+ 15 15 15 15 15 15 15 15 15 15 15 15 15 15
+ 15 15 15 15 15 15 15 15 15 15 15 15 15 15
+ 15 15 15 15 15 15 15 15 15 15 15 15 15 15
+ 15 15 15 15
+ 0 0 1 0 1 4 2 0 7 6 5 4 3 2
+ 1 0 16 16 16 16 16 16 16 16 16 16 16 16
+ 16 16 16 16 16 16 16 16 16 16 16 16 16 16
+ 16 16 16 16 16 16 16 16 16 16 16 16 16 16
+ 16 16 16 16 16 16 16 16 16 16 16 16 16 16
+ 16 16 16 16 16 16 16 16 16 16 16 16 16 16
+ 16 16 16 16 16 16 16 16 16 16 16 16 16 16
+ 16 16 16 16 16 16 16 16 16 16 16 16 16 16
+ 16 16 16 16 16 16 16 16 16 16 16 16 16 16
+ 16 16 16 16 16 16 16 16 16 16 16 16 16 16
+ 16 16 16 16 16 16 16 16 16 16 16 16 16 16
+ 16 16 16 16 16 16 16 16 16 16 16 16 16 16
+ 16 16 16 16 16 16 16 16 16 16 16 16 16 16
+ 16 16 16 16 16 16 16 16 16 16 16 16 16 16
+ 16 16 16 16
+ 0 1 2 1 2 5 3 1 8 7 6 5 4 3
+ 2 1 0 17 17 17 17 17 17 17 17 17 17 17
+ 17 17 17 17 17 17 17 17 17 17 17 17 17 17
+ 17 17 17 17 17 17 17 17 17 17 17 17 17 17
+ 17 17 17 17 17 17 17 17 17 17 17 17 17 17
+ 17 17 17 17 17 17 17 17 17 17 17 17 17 17
+ 17 17 17 17 17 17 17 17 17 17 17 17 17 17
+ 17 17 17 17 17 17 17 17 17 17 17 17 17 17
+ 17 17 17 17 17 17 17 17 17 17 17 17 17 17
+ 17 17 17 17 17 17 17 17 17 17 17 17 17 17
+ 17 17 17 17 17 17 17 17 17 17 17 17 17 17
+ 17 17 17 17 17 17 17 17 17 17 17 17 17 17
+ 17 17 17 17 17 17 17 17 17 17 17 17 17 17
+ 17 17 17 17 17 17 17 17 17 17 17 17 17 17
+ 17 17 17 17
+ 0 0 0 2 3 0 4 2 0 8 7 6 5 4
+ 3 2 1 0 18 18 18 18 18 18 18 18 18 18
+ 18 18 18 18 18 18 18 18 18 18 18 18 18 18
+ 18 18 18 18 18 18 18 18 18 18 18 18 18 18
+ 18 18 18 18 18 18 18 18 18 18 18 18 18 18
+ 18 18 18 18 18 18 18 18 18 18 18 18 18 18
+ 18 18 18 18 18 18 18 18 18 18 18 18 18 18
+ 18 18 18 18 18 18 18 18 18 18 18 18 18 18
+ 18 18 18 18 18 18 18 18 18 18 18 18 18 18
+ 18 18 18 18 18 18 18 18 18 18 18 18 18 18
+ 18 18 18 18 18 18 18 18 18 18 18 18 18 18
+ 18 18 18 18 18 18 18 18 18 18 18 18 18 18
+ 18 18 18 18 18 18 18 18 18 18 18 18 18 18
+ 18 18 18 18 18 18 18 18 18 18 18 18 18 18
+ 18 18 18 18
+ 0 1 1 3 4 1 5 3 1 9 8 7 6 5
+ 4 3 2 1 0 19 19 19 19 19 19 19 19 19
+ 19 19 19 19 19 19 19 19 19 19 19 19 19 19
+ 19 19 19 19 19 19 19 19 19 19 19 19 19 19
+ 19 19 19 19 19 19 19 19 19 19 19 19 19 19
+ 19 19 19 19 19 19 19 19 19 19 19 19 19 19
+ 19 19 19 19 19 19 19 19 19 19 19 19 19 19
+ 19 19 19 19 19 19 19 19 19 19 19 19 19 19
+ 19 19 19 19 19 19 19 19 19 19 19 19 19 19
+ 19 19 19 19 19 19 19 19 19 19 19 19 19 19
+ 19 19 19 19 19 19 19 19 19 19 19 19 19 19
+ 19 19 19 19 19 19 19 19 19 19 19 19 19 19
+ 19 19 19 19 19 19 19 19 19 19 19 19 19 19
+ 19 19 19 19 19 19 19 19 19 19 19 19 19 19
+ 19 19 19 19
+ 0 0 2 0 0 2 6 4 2 0 9 8 7 6
+ 5 4 3 2 1 0 20 20 20 20 20 20 20 20
+ 20 20 20 20 20 20 20 20 20 20 20 20 20 20
+ 20 20 20 20 20 20 20 20 20 20 20 20 20 20
+ 20 20 20 20 20 20 20 20 20 20 20 20 20 20
+ 20 20 20 20 20 20 20 20 20 20 20 20 20 20
+ 20 20 20 20 20 20 20 20 20 20 20 20 20 20
+ 20 20 20 20 20 20 20 20 20 20 20 20 20 20
+ 20 20 20 20 20 20 20 20 20 20 20 20 20 20
+ 20 20 20 20 20 20 20 20 20 20 20 20 20 20
+ 20 20 20 20 20 20 20 20 20 20 20 20 20 20
+ 20 20 20 20 20 20 20 20 20 20 20 20 20 20
+ 20 20 20 20 20 20 20 20 20 20 20 20 20 20
+ 20 20 20 20 20 20 20 20 20 20 20 20 20 20
+ 20 20 20 20
+ 0 1 0 1 1 3 0 5 3 1 10 9 8 7
+ 6 5 4 3 2 1 0 21 21 21 21 21 21 21
+ 21 21 21 21 21 21 21 21 21 21 21 21 21 21
+ 21 21 21 21 21 21 21 21 21 21 21 21 21 21
+ 21 21 21 21 21 21 21 21 21 21 21 21 21 21
+ 21 21 21 21 21 21 21 21 21 21 21 21 21 21
+ 21 21 21 21 21 21 21 21 21 21 21 21 21 21
+ 21 21 21 21 21 21 21 21 21 21 21 21 21 21
+ 21 21 21 21 21 21 21 21 21 21 21 21 21 21
+ 21 21 21 21 21 21 21 21 21 21 21 21 21 21
+ 21 21 21 21 21 21 21 21 21 21 21 21 21 21
+ 21 21 21 21 21 21 21 21 21 21 21 21 21 21
+ 21 21 21 21 21 21 21 21 21 21 21 21 21 21
+ 21 21 21 21 21 21 21 21 21 21 21 21 21 21
+ 21 21 21 21
+ 0 0 1 2 2 4 1 6 4 2 0 10 9 8
+ 7 6 5 4 3 2 1 0 22 22 22 22 22 22
+ 22 22 22 22 22 22 22 22 22 22 22 22 22 22
+ 22 22 22 22 22 22 22 22 22 22 22 22 22 22
+ 22 22 22 22 22 22 22 22 22 22 22 22 22 22
+ 22 22 22 22 22 22 22 22 22 22 22 22 22 22
+ 22 22 22 22 22 22 22 22 22 22 22 22 22 22
+ 22 22 22 22 22 22 22 22 22 22 22 22 22 22
+ 22 22 22 22 22 22 22 22 22 22 22 22 22 22
+ 22 22 22 22 22 22 22 22 22 22 22 22 22 22
+ 22 22 22 22 22 22 22 22 22 22 22 22 22 22
+ 22 22 22 22 22 22 22 22 22 22 22 22 22 22
+ 22 22 22 22 22 22 22 22 22 22 22 22 22 22
+ 22 22 22 22 22 22 22 22 22 22 22 22 22 22
+ 22 22 22 22
+ 0 1 2 3 3 5 2 7 5 3 1 11 10 9
+ 8 7 6 5 4 3 2 1 0 23 23 23 23 23
+ 23 23 23 23 23 23 23 23 23 23 23 23 23 23
+ 23 23 23 23 23 23 23 23 23 23 23 23 23 23
+ 23 23 23 23 23 23 23 23 23 23 23 23 23 23
+ 23 23 23 23 23 23 23 23 23 23 23 23 23 23
+ 23 23 23 23 23 23 23 23 23 23 23 23 23 23
+ 23 23 23 23 23 23 23 23 23 23 23 23 23 23
+ 23 23 23 23 23 23 23 23 23 23 23 23 23 23
+ 23 23 23 23 23 23 23 23 23 23 23 23 23 23
+ 23 23 23 23 23 23 23 23 23 23 23 23 23 23
+ 23 23 23 23 23 23 23 23 23 23 23 23 23 23
+ 23 23 23 23 23 23 23 23 23 23 23 23 23 23
+ 23 23 23 23 23 23 23 23 23 23 23 23 23 23
+ 23 23 23 23
+ 0 0 0 0 4 0 3 0 6 4 2 0 11 10
+ 9 8 7 6 5 4 3 2 1 0 24 24 24 24
+ 24 24 24 24 24 24 24 24 24 24 24 24 24 24
+ 24 24 24 24 24 24 24 24 24 24 24 24 24 24
+ 24 24 24 24 24 24 24 24 24 24 24 24 24 24
+ 24 24 24 24 24 24 24 24 24 24 24 24 24 24
+ 24 24 24 24 24 24 24 24 24 24 24 24 24 24
+ 24 24 24 24 24 24 24 24 24 24 24 24 24 24
+ 24 24 24 24 24 24 24 24 24 24 24 24 24 24
+ 24 24 24 24 24 24 24 24 24 24 24 24 24 24
+ 24 24 24 24 24 24 24 24 24 24 24 24 24 24
+ 24 24 24 24 24 24 24 24 24 24 24 24 24 24
+ 24 24 24 24 24 24 24 24 24 24 24 24 24 24
+ 24 24 24 24 24 24 24 24 24 24 24 24 24 24
+ 24 24 24 24
+ 0 1 1 1 0 1 4 1 7 5 3 1 12 11
+ 10 9 8 7 6 5 4 3 2 1 0 25 25 25
+ 25 25 25 25 25 25 25 25 25 25 25 25 25 25
+ 25 25 25 25 25 25 25 25 25 25 25 25 25 25
+ 25 25 25 25 25 25 25 25 25 25 25 25 25 25
+ 25 25 25 25 25 25 25 25 25 25 25 25 25 25
+ 25 25 25 25 25 25 25 25 25 25 25 25 25 25
+ 25 25 25 25 25 25 25 25 25 25 25 25 25 25
+ 25 25 25 25 25 25 25 25 25 25 25 25 25 25
+ 25 25 25 25 25 25 25 25 25 25 25 25 25 25
+ 25 25 25 25 25 25 25 25 25 25 25 25 25 25
+ 25 25 25 25 25 25 25 25 25 25 25 25 25 25
+ 25 25 25 25 25 25 25 25 25 25 25 25 25 25
+ 25 25 25 25 25 25 25 25 25 25 25 25 25 25
+ 25 25 25 25
+ 0 0 2 2 1 2 5 2 8 6 4 2 0 12
+ 11 10 9 8 7 6 5 4 3 2 1 0 26 26
+ 26 26 26 26 26 26 26 26 26 26 26 26 26 26
+ 26 26 26 26 26 26 26 26 26 26 26 26 26 26
+ 26 26 26 26 26 26 26 26 26 26 26 26 26 26
+ 26 26 26 26 26 26 26 26 26 26 26 26 26 26
+ 26 26 26 26 26 26 26 26 26 26 26 26 26 26
+ 26 26 26 26 26 26 26 26 26 26 26 26 26 26
+ 26 26 26 26 26 26 26 26 26 26 26 26 26 26
+ 26 26 26 26 26 26 26 26 26 26 26 26 26 26
+ 26 26 26 26 26 26 26 26 26 26 26 26 26 26
+ 26 26 26 26 26 26 26 26 26 26 26 26 26 26
+ 26 26 26 26 26 26 26 26 26 26 26 26 26 26
+ 26 26 26 26 26 26 26 26 26 26 26 26 26 26
+ 26 26 26 26
+ 0 1 0 3 2 3 6 3 0 7 5 3 1 13
+ 12 11 10 9 8 7 6 5 4 3 2 1 0 27
+ 27 27 27 27 27 27 27 27 27 27 27 27 27 27
+ 27 27 27 27 27 27 27 27 27 27 27 27 27 27
+ 27 27 27 27 27 27 27 27 27 27 27 27 27 27
+ 27 27 27 27 27 27 27 27 27 27 27 27 27 27
+ 27 27 27 27 27 27 27 27 27 27 27 27 27 27
+ 27 27 27 27 27 27 27 27 27 27 27 27 27 27
+ 27 27 27 27 27 27 27 27 27 27 27 27 27 27
+ 27 27 27 27 27 27 27 27 27 27 27 27 27 27
+ 27 27 27 27 27 27 27 27 27 27 27 27 27 27
+ 27 27 27 27 27 27 27 27 27 27 27 27 27 27
+ 27 27 27 27 27 27 27 27 27 27 27 27 27 27
+ 27 27 27 27 27 27 27 27 27 27 27 27 27 27
+ 27 27 27 27
+ 0 0 1 0 3 4 0 4 1 8 6 4 2 0
+ 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ 28 28 28 28 28 28 28 28 28 28 28 28 28 28
+ 28 28 28 28 28 28 28 28 28 28 28 28 28 28
+ 28 28 28 28 28 28 28 28 28 28 28 28 28 28
+ 28 28 28 28 28 28 28 28 28 28 28 28 28 28
+ 28 28 28 28 28 28 28 28 28 28 28 28 28 28
+ 28 28 28 28 28 28 28 28 28 28 28 28 28 28
+ 28 28 28 28 28 28 28 28 28 28 28 28 28 28
+ 28 28 28 28 28 28 28 28 28 28 28 28 28 28
+ 28 28 28 28 28 28 28 28 28 28 28 28 28 28
+ 28 28 28 28 28 28 28 28 28 28 28 28 28 28
+ 28 28 28 28 28 28 28 28 28 28 28 28 28 28
+ 28 28 28 28 28 28 28 28 28 28 28 28 28 28
+ 28 28 28 28
+ 0 1 2 1 4 5 1 5 2 9 7 5 3 1
+ 14 13 12 11 10 9 8 7 6 5 4 3 2 1
+ 0 29 29 29 29 29 29 29 29 29 29 29 29 29
+ 29 29 29 29 29 29 29 29 29 29 29 29 29 29
+ 29 29 29 29 29 29 29 29 29 29 29 29 29 29
+ 29 29 29 29 29 29 29 29 29 29 29 29 29 29
+ 29 29 29 29 29 29 29 29 29 29 29 29 29 29
+ 29 29 29 29 29 29 29 29 29 29 29 29 29 29
+ 29 29 29 29 29 29 29 29 29 29 29 29 29 29
+ 29 29 29 29 29 29 29 29 29 29 29 29 29 29
+ 29 29 29 29 29 29 29 29 29 29 29 29 29 29
+ 29 29 29 29 29 29 29 29 29 29 29 29 29 29
+ 29 29 29 29 29 29 29 29 29 29 29 29 29 29
+ 29 29 29 29 29 29 29 29 29 29 29 29 29 29
+ 29 29 29 29
+ 0 0 0 2 0 0 2 6 3 0 8 6 4 2
+ 0 14 13 12 11 10 9 8 7 6 5 4 3 2
+ 1 0 30 30 30 30 30 30 30 30 30 30 30 30
+ 30 30 30 30 30 30 30 30 30 30 30 30 30 30
+ 30 30 30 30 30 30 30 30 30 30 30 30 30 30
+ 30 30 30 30 30 30 30 30 30 30 30 30 30 30
+ 30 30 30 30 30 30 30 30 30 30 30 30 30 30
+ 30 30 30 30 30 30 30 30 30 30 30 30 30 30
+ 30 30 30 30 30 30 30 30 30 30 30 30 30 30
+ 30 30 30 30 30 30 30 30 30 30 30 30 30 30
+ 30 30 30 30 30 30 30 30 30 30 30 30 30 30
+ 30 30 30 30 30 30 30 30 30 30 30 30 30 30
+ 30 30 30 30 30 30 30 30 30 30 30 30 30 30
+ 30 30 30 30 30 30 30 30 30 30 30 30 30 30
+ 30 30 30 30
+ 0 1 1 3 1 1 3 7 4 1 9 7 5 3
+ 1 15 14 13 12 11 10 9 8 7 6 5 4 3
+ 2 1 0 31 31 31 31 31 31 31 31 31 31 31
+ 31 31 31 31 31 31 31 31 31 31 31 31 31 31
+ 31 31 31 31 31 31 31 31 31 31 31 31 31 31
+ 31 31 31 31 31 31 31 31 31 31 31 31 31 31
+ 31 31 31 31 31 31 31 31 31 31 31 31 31 31
+ 31 31 31 31 31 31 31 31 31 31 31 31 31 31
+ 31 31 31 31 31 31 31 31 31 31 31 31 31 31
+ 31 31 31 31 31 31 31 31 31 31 31 31 31 31
+ 31 31 31 31 31 31 31 31 31 31 31 31 31 31
+ 31 31 31 31 31 31 31 31 31 31 31 31 31 31
+ 31 31 31 31 31 31 31 31 31 31 31 31 31 31
+ 31 31 31 31 31 31 31 31 31 31 31 31 31 31
+ 31 31 31 31
+ 0 0 2 0 2 2 4 0 5 2 10 8 6 4
+ 2 0 15 14 13 12 11 10 9 8 7 6 5 4
+ 3 2 1 0 32 32 32 32 32 32 32 32 32 32
+ 32 32 32 32 32 32 32 32 32 32 32 32 32 32
+ 32 32 32 32 32 32 32 32 32 32 32 32 32 32
+ 32 32 32 32 32 32 32 32 32 32 32 32 32 32
+ 32 32 32 32 32 32 32 32 32 32 32 32 32 32
+ 32 32 32 32 32 32 32 32 32 32 32 32 32 32
+ 32 32 32 32 32 32 32 32 32 32 32 32 32 32
+ 32 32 32 32 32 32 32 32 32 32 32 32 32 32
+ 32 32 32 32 32 32 32 32 32 32 32 32 32 32
+ 32 32 32 32 32 32 32 32 32 32 32 32 32 32
+ 32 32 32 32 32 32 32 32 32 32 32 32 32 32
+ 32 32 32 32 32 32 32 32 32 32 32 32 32 32
+ 32 32 32 32
+ 0 1 0 1 3 3 5 1 6 3 0 9 7 5
+ 3 1 16 15 14 13 12 11 10 9 8 7 6 5
+ 4 3 2 1 0 33 33 33 33 33 33 33 33 33
+ 33 33 33 33 33 33 33 33 33 33 33 33 33 33
+ 33 33 33 33 33 33 33 33 33 33 33 33 33 33
+ 33 33 33 33 33 33 33 33 33 33 33 33 33 33
+ 33 33 33 33 33 33 33 33 33 33 33 33 33 33
+ 33 33 33 33 33 33 33 33 33 33 33 33 33 33
+ 33 33 33 33 33 33 33 33 33 33 33 33 33 33
+ 33 33 33 33 33 33 33 33 33 33 33 33 33 33
+ 33 33 33 33 33 33 33 33 33 33 33 33 33 33
+ 33 33 33 33 33 33 33 33 33 33 33 33 33 33
+ 33 33 33 33 33 33 33 33 33 33 33 33 33 33
+ 33 33 33 33 33 33 33 33 33 33 33 33 33 33
+ 33 33 33 33
+ 0 0 1 2 4 4 6 2 7 4 1 10 8 6
+ 4 2 0 16 15 14 13 12 11 10 9 8 7 6
+ 5 4 3 2 1 0 34 34 34 34 34 34 34 34
+ 34 34 34 34 34 34 34 34 34 34 34 34 34 34
+ 34 34 34 34 34 34 34 34 34 34 34 34 34 34
+ 34 34 34 34 34 34 34 34 34 34 34 34 34 34
+ 34 34 34 34 34 34 34 34 34 34 34 34 34 34
+ 34 34 34 34 34 34 34 34 34 34 34 34 34 34
+ 34 34 34 34 34 34 34 34 34 34 34 34 34 34
+ 34 34 34 34 34 34 34 34 34 34 34 34 34 34
+ 34 34 34 34 34 34 34 34 34 34 34 34 34 34
+ 34 34 34 34 34 34 34 34 34 34 34 34 34 34
+ 34 34 34 34 34 34 34 34 34 34 34 34 34 34
+ 34 34 34 34 34 34 34 34 34 34 34 34 34 34
+ 34 34 34 34
+ 0 1 2 3 0 5 0 3 8 5 2 11 9 7
+ 5 3 1 17 16 15 14 13 12 11 10 9 8 7
+ 6 5 4 3 2 1 0 35 35 35 35 35 35 35
+ 35 35 35 35 35 35 35 35 35 35 35 35 35 35
+ 35 35 35 35 35 35 35 35 35 35 35 35 35 35
+ 35 35 35 35 35 35 35 35 35 35 35 35 35 35
+ 35 35 35 35 35 35 35 35 35 35 35 35 35 35
+ 35 35 35 35 35 35 35 35 35 35 35 35 35 35
+ 35 35 35 35 35 35 35 35 35 35 35 35 35 35
+ 35 35 35 35 35 35 35 35 35 35 35 35 35 35
+ 35 35 35 35 35 35 35 35 35 35 35 35 35 35
+ 35 35 35 35 35 35 35 35 35 35 35 35 35 35
+ 35 35 35 35 35 35 35 35 35 35 35 35 35 35
+ 35 35 35 35 35 35 35 35 35 35 35 35 35 35
+ 35 35 35 35
+ 0 0 0 0 1 0 1 4 0 6 3 0 10 8
+ 6 4 2 0 17 16 15 14 13 12 11 10 9 8
+ 7 6 5 4 3 2 1 0 36 36 36 36 36 36
+ 36 36 36 36 36 36 36 36 36 36 36 36 36 36
+ 36 36 36 36 36 36 36 36 36 36 36 36 36 36
+ 36 36 36 36 36 36 36 36 36 36 36 36 36 36
+ 36 36 36 36 36 36 36 36 36 36 36 36 36 36
+ 36 36 36 36 36 36 36 36 36 36 36 36 36 36
+ 36 36 36 36 36 36 36 36 36 36 36 36 36 36
+ 36 36 36 36 36 36 36 36 36 36 36 36 36 36
+ 36 36 36 36 36 36 36 36 36 36 36 36 36 36
+ 36 36 36 36 36 36 36 36 36 36 36 36 36 36
+ 36 36 36 36 36 36 36 36 36 36 36 36 36 36
+ 36 36 36 36 36 36 36 36 36 36 36 36 36 36
+ 36 36 36 36
+ 0 1 1 1 2 1 2 5 1 7 4 1 11 9
+ 7 5 3 1 18 17 16 15 14 13 12 11 10 9
+ 8 7 6 5 4 3 2 1 0 37 37 37 37 37
+ 37 37 37 37 37 37 37 37 37 37 37 37 37 37
+ 37 37 37 37 37 37 37 37 37 37 37 37 37 37
+ 37 37 37 37 37 37 37 37 37 37 37 37 37 37
+ 37 37 37 37 37 37 37 37 37 37 37 37 37 37
+ 37 37 37 37 37 37 37 37 37 37 37 37 37 37
+ 37 37 37 37 37 37 37 37 37 37 37 37 37 37
+ 37 37 37 37 37 37 37 37 37 37 37 37 37 37
+ 37 37 37 37 37 37 37 37 37 37 37 37 37 37
+ 37 37 37 37 37 37 37 37 37 37 37 37 37 37
+ 37 37 37 37 37 37 37 37 37 37 37 37 37 37
+ 37 37 37 37 37 37 37 37 37 37 37 37 37 37
+ 37 37 37 37
+ 0 0 2 2 3 2 3 6 2 8 5 2 12 10
+ 8 6 4 2 0 18 17 16 15 14 13 12 11 10
+ 9 8 7 6 5 4 3 2 1 0 38 38 38 38
+ 38 38 38 38 38 38 38 38 38 38 38 38 38 38
+ 38 38 38 38 38 38 38 38 38 38 38 38 38 38
+ 38 38 38 38 38 38 38 38 38 38 38 38 38 38
+ 38 38 38 38 38 38 38 38 38 38 38 38 38 38
+ 38 38 38 38 38 38 38 38 38 38 38 38 38 38
+ 38 38 38 38 38 38 38 38 38 38 38 38 38 38
+ 38 38 38 38 38 38 38 38 38 38 38 38 38 38
+ 38 38 38 38 38 38 38 38 38 38 38 38 38 38
+ 38 38 38 38 38 38 38 38 38 38 38 38 38 38
+ 38 38 38 38 38 38 38 38 38 38 38 38 38 38
+ 38 38 38 38 38 38 38 38 38 38 38 38 38 38
+ 38 38 38 38
+ 0 1 0 3 4 3 4 7 3 9 6 3 0 11
+ 9 7 5 3 1 19 18 17 16 15 14 13 12 11
+ 10 9 8 7 6 5 4 3 2 1 0 39 39 39
+ 39 39 39 39 39 39 39 39 39 39 39 39 39 39
+ 39 39 39 39 39 39 39 39 39 39 39 39 39 39
+ 39 39 39 39 39 39 39 39 39 39 39 39 39 39
+ 39 39 39 39 39 39 39 39 39 39 39 39 39 39
+ 39 39 39 39 39 39 39 39 39 39 39 39 39 39
+ 39 39 39 39 39 39 39 39 39 39 39 39 39 39
+ 39 39 39 39 39 39 39 39 39 39 39 39 39 39
+ 39 39 39 39 39 39 39 39 39 39 39 39 39 39
+ 39 39 39 39 39 39 39 39 39 39 39 39 39 39
+ 39 39 39 39 39 39 39 39 39 39 39 39 39 39
+ 39 39 39 39 39 39 39 39 39 39 39 39 39 39
+ 39 39 39 39
+ 0 0 1 0 0 4 5 0 4 0 7 4 1 12
+ 10 8 6 4 2 0 19 18 17 16 15 14 13 12
+ 11 10 9 8 7 6 5 4 3 2 1 0 40 40
+ 40 40 40 40 40 40 40 40 40 40 40 40 40 40
+ 40 40 40 40 40 40 40 40 40 40 40 40 40 40
+ 40 40 40 40 40 40 40 40 40 40 40 40 40 40
+ 40 40 40 40 40 40 40 40 40 40 40 40 40 40
+ 40 40 40 40 40 40 40 40 40 40 40 40 40 40
+ 40 40 40 40 40 40 40 40 40 40 40 40 40 40
+ 40 40 40 40 40 40 40 40 40 40 40 40 40 40
+ 40 40 40 40 40 40 40 40 40 40 40 40 40 40
+ 40 40 40 40 40 40 40 40 40 40 40 40 40 40
+ 40 40 40 40 40 40 40 40 40 40 40 40 40 40
+ 40 40 40 40 40 40 40 40 40 40 40 40 40 40
+ 40 40 40 40
+ 0 1 2 1 1 5 6 1 5 1 8 5 2 13
+ 11 9 7 5 3 1 20 19 18 17 16 15 14 13
+ 12 11 10 9 8 7 6 5 4 3 2 1 0 41
+ 41 41 41 41 41 41 41 41 41 41 41 41 41 41
+ 41 41 41 41 41 41 41 41 41 41 41 41 41 41
+ 41 41 41 41 41 41 41 41 41 41 41 41 41 41
+ 41 41 41 41 41 41 41 41 41 41 41 41 41 41
+ 41 41 41 41 41 41 41 41 41 41 41 41 41 41
+ 41 41 41 41 41 41 41 41 41 41 41 41 41 41
+ 41 41 41 41 41 41 41 41 41 41 41 41 41 41
+ 41 41 41 41 41 41 41 41 41 41 41 41 41 41
+ 41 41 41 41 41 41 41 41 41 41 41 41 41 41
+ 41 41 41 41 41 41 41 41 41 41 41 41 41 41
+ 41 41 41 41 41 41 41 41 41 41 41 41 41 41
+ 41 41 41 41
+ 0 0 0 2 2 0 0 2 6 2 9 6 3 0
+ 12 10 8 6 4 2 0 20 19 18 17 16 15 14
+ 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ 42 42 42 42 42 42 42 42 42 42 42 42 42 42
+ 42 42 42 42 42 42 42 42 42 42 42 42 42 42
+ 42 42 42 42 42 42 42 42 42 42 42 42 42 42
+ 42 42 42 42 42 42 42 42 42 42 42 42 42 42
+ 42 42 42 42 42 42 42 42 42 42 42 42 42 42
+ 42 42 42 42 42 42 42 42 42 42 42 42 42 42
+ 42 42 42 42 42 42 42 42 42 42 42 42 42 42
+ 42 42 42 42 42 42 42 42 42 42 42 42 42 42
+ 42 42 42 42 42 42 42 42 42 42 42 42 42 42
+ 42 42 42 42 42 42 42 42 42 42 42 42 42 42
+ 42 42 42 42 42 42 42 42 42 42 42 42 42 42
+ 42 42 42 42
+ 0 1 1 3 3 1 1 3 7 3 10 7 4 1
+ 13 11 9 7 5 3 1 21 20 19 18 17 16 15
+ 14 13 12 11 10 9 8 7 6 5 4 3 2 1
+ 0 43 43 43 43 43 43 43 43 43 43 43 43 43
+ 43 43 43 43 43 43 43 43 43 43 43 43 43 43
+ 43 43 43 43 43 43 43 43 43 43 43 43 43 43
+ 43 43 43 43 43 43 43 43 43 43 43 43 43 43
+ 43 43 43 43 43 43 43 43 43 43 43 43 43 43
+ 43 43 43 43 43 43 43 43 43 43 43 43 43 43
+ 43 43 43 43 43 43 43 43 43 43 43 43 43 43
+ 43 43 43 43 43 43 43 43 43 43 43 43 43 43
+ 43 43 43 43 43 43 43 43 43 43 43 43 43 43
+ 43 43 43 43 43 43 43 43 43 43 43 43 43 43
+ 43 43 43 43 43 43 43 43 43 43 43 43 43 43
+ 43 43 43 43
+ 0 0 2 0 4 2 2 4 8 4 0 8 5 2
+ 14 12 10 8 6 4 2 0 21 20 19 18 17 16
+ 15 14 13 12 11 10 9 8 7 6 5 4 3 2
+ 1 0 44 44 44 44 44 44 44 44 44 44 44 44
+ 44 44 44 44 44 44 44 44 44 44 44 44 44 44
+ 44 44 44 44 44 44 44 44 44 44 44 44 44 44
+ 44 44 44 44 44 44 44 44 44 44 44 44 44 44
+ 44 44 44 44 44 44 44 44 44 44 44 44 44 44
+ 44 44 44 44 44 44 44 44 44 44 44 44 44 44
+ 44 44 44 44 44 44 44 44 44 44 44 44 44 44
+ 44 44 44 44 44 44 44 44 44 44 44 44 44 44
+ 44 44 44 44 44 44 44 44 44 44 44 44 44 44
+ 44 44 44 44 44 44 44 44 44 44 44 44 44 44
+ 44 44 44 44 44 44 44 44 44 44 44 44 44 44
+ 44 44 44 44
+ 0 1 0 1 0 3 3 5 0 5 1 9 6 3
+ 0 13 11 9 7 5 3 1 22 21 20 19 18 17
+ 16 15 14 13 12 11 10 9 8 7 6 5 4 3
+ 2 1 0 45 45 45 45 45 45 45 45 45 45 45
+ 45 45 45 45 45 45 45 45 45 45 45 45 45 45
+ 45 45 45 45 45 45 45 45 45 45 45 45 45 45
+ 45 45 45 45 45 45 45 45 45 45 45 45 45 45
+ 45 45 45 45 45 45 45 45 45 45 45 45 45 45
+ 45 45 45 45 45 45 45 45 45 45 45 45 45 45
+ 45 45 45 45 45 45 45 45 45 45 45 45 45 45
+ 45 45 45 45 45 45 45 45 45 45 45 45 45 45
+ 45 45 45 45 45 45 45 45 45 45 45 45 45 45
+ 45 45 45 45 45 45 45 45 45 45 45 45 45 45
+ 45 45 45 45 45 45 45 45 45 45 45 45 45 45
+ 45 45 45 45
+ 0 0 1 2 1 4 4 6 1 6 2 10 7 4
+ 1 14 12 10 8 6 4 2 0 22 21 20 19 18
+ 17 16 15 14 13 12 11 10 9 8 7 6 5 4
+ 3 2 1 0 46 46 46 46 46 46 46 46 46 46
+ 46 46 46 46 46 46 46 46 46 46 46 46 46 46
+ 46 46 46 46 46 46 46 46 46 46 46 46 46 46
+ 46 46 46 46 46 46 46 46 46 46 46 46 46 46
+ 46 46 46 46 46 46 46 46 46 46 46 46 46 46
+ 46 46 46 46 46 46 46 46 46 46 46 46 46 46
+ 46 46 46 46 46 46 46 46 46 46 46 46 46 46
+ 46 46 46 46 46 46 46 46 46 46 46 46 46 46
+ 46 46 46 46 46 46 46 46 46 46 46 46 46 46
+ 46 46 46 46 46 46 46 46 46 46 46 46 46 46
+ 46 46 46 46 46 46 46 46 46 46 46 46 46 46
+ 46 46 46 46
+ 0 1 2 3 2 5 5 7 2 7 3 11 8 5
+ 2 15 13 11 9 7 5 3 1 23 22 21 20 19
+ 18 17 16 15 14 13 12 11 10 9 8 7 6 5
+ 4 3 2 1 0 47 47 47 47 47 47 47 47 47
+ 47 47 47 47 47 47 47 47 47 47 47 47 47 47
+ 47 47 47 47 47 47 47 47 47 47 47 47 47 47
+ 47 47 47 47 47 47 47 47 47 47 47 47 47 47
+ 47 47 47 47 47 47 47 47 47 47 47 47 47 47
+ 47 47 47 47 47 47 47 47 47 47 47 47 47 47
+ 47 47 47 47 47 47 47 47 47 47 47 47 47 47
+ 47 47 47 47 47 47 47 47 47 47 47 47 47 47
+ 47 47 47 47 47 47 47 47 47 47 47 47 47 47
+ 47 47 47 47 47 47 47 47 47 47 47 47 47 47
+ 47 47 47 47 47 47 47 47 47 47 47 47 47 47
+ 47 47 47 47
+ 0 0 0 0 3 0 6 0 3 8 4 0 9 6
+ 3 0 14 12 10 8 6 4 2 0 23 22 21 20
+ 19 18 17 16 15 14 13 12 11 10 9 8 7 6
+ 5 4 3 2 1 0 48 48 48 48 48 48 48 48
+ 48 48 48 48 48 48 48 48 48 48 48 48 48 48
+ 48 48 48 48 48 48 48 48 48 48 48 48 48 48
+ 48 48 48 48 48 48 48 48 48 48 48 48 48 48
+ 48 48 48 48 48 48 48 48 48 48 48 48 48 48
+ 48 48 48 48 48 48 48 48 48 48 48 48 48 48
+ 48 48 48 48 48 48 48 48 48 48 48 48 48 48
+ 48 48 48 48 48 48 48 48 48 48 48 48 48 48
+ 48 48 48 48 48 48 48 48 48 48 48 48 48 48
+ 48 48 48 48 48 48 48 48 48 48 48 48 48 48
+ 48 48 48 48 48 48 48 48 48 48 48 48 48 48
+ 48 48 48 48
+ 0 1 1 1 4 1 0 1 4 9 5 1 10 7
+ 4 1 15 13 11 9 7 5 3 1 24 23 22 21
+ 20 19 18 17 16 15 14 13 12 11 10 9 8 7
+ 6 5 4 3 2 1 0 49 49 49 49 49 49 49
+ 49 49 49 49 49 49 49 49 49 49 49 49 49 49
+ 49 49 49 49 49 49 49 49 49 49 49 49 49 49
+ 49 49 49 49 49 49 49 49 49 49 49 49 49 49
+ 49 49 49 49 49 49 49 49 49 49 49 49 49 49
+ 49 49 49 49 49 49 49 49 49 49 49 49 49 49
+ 49 49 49 49 49 49 49 49 49 49 49 49 49 49
+ 49 49 49 49 49 49 49 49 49 49 49 49 49 49
+ 49 49 49 49 49 49 49 49 49 49 49 49 49 49
+ 49 49 49 49 49 49 49 49 49 49 49 49 49 49
+ 49 49 49 49 49 49 49 49 49 49 49 49 49 49
+ 49 49 49 49
+ 0 0 2 2 0 2 1 2 5 0 6 2 11 8
+ 5 2 16 14 12 10 8 6 4 2 0 24 23 22
+ 21 20 19 18 17 16 15 14 13 12 11 10 9 8
+ 7 6 5 4 3 2 1 0 50 50 50 50 50 50
+ 50 50 50 50 50 50 50 50 50 50 50 50 50 50
+ 50 50 50 50 50 50 50 50 50 50 50 50 50 50
+ 50 50 50 50 50 50 50 50 50 50 50 50 50 50
+ 50 50 50 50 50 50 50 50 50 50 50 50 50 50
+ 50 50 50 50 50 50 50 50 50 50 50 50 50 50
+ 50 50 50 50 50 50 50 50 50 50 50 50 50 50
+ 50 50 50 50 50 50 50 50 50 50 50 50 50 50
+ 50 50 50 50 50 50 50 50 50 50 50 50 50 50
+ 50 50 50 50 50 50 50 50 50 50 50 50 50 50
+ 50 50 50 50 50 50 50 50 50 50 50 50 50 50
+ 50 50 50 50
+ 0 1 0 3 1 3 2 3 6 1 7 3 12 9
+ 6 3 0 15 13 11 9 7 5 3 1 25 24 23
+ 22 21 20 19 18 17 16 15 14 13 12 11 10 9
+ 8 7 6 5 4 3 2 1 0 51 51 51 51 51
+ 51 51 51 51 51 51 51 51 51 51 51 51 51 51
+ 51 51 51 51 51 51 51 51 51 51 51 51 51 51
+ 51 51 51 51 51 51 51 51 51 51 51 51 51 51
+ 51 51 51 51 51 51 51 51 51 51 51 51 51 51
+ 51 51 51 51 51 51 51 51 51 51 51 51 51 51
+ 51 51 51 51 51 51 51 51 51 51 51 51 51 51
+ 51 51 51 51 51 51 51 51 51 51 51 51 51 51
+ 51 51 51 51 51 51 51 51 51 51 51 51 51 51
+ 51 51 51 51 51 51 51 51 51 51 51 51 51 51
+ 51 51 51 51 51 51 51 51 51 51 51 51 51 51
+ 51 51 51 51
+ 0 0 1 0 2 4 3 4 7 2 8 4 0 10
+ 7 4 1 16 14 12 10 8 6 4 2 0 25 24
+ 23 22 21 20 19 18 17 16 15 14 13 12 11 10
+ 9 8 7 6 5 4 3 2 1 0 52 52 52 52
+ 52 52 52 52 52 52 52 52 52 52 52 52 52 52
+ 52 52 52 52 52 52 52 52 52 52 52 52 52 52
+ 52 52 52 52 52 52 52 52 52 52 52 52 52 52
+ 52 52 52 52 52 52 52 52 52 52 52 52 52 52
+ 52 52 52 52 52 52 52 52 52 52 52 52 52 52
+ 52 52 52 52 52 52 52 52 52 52 52 52 52 52
+ 52 52 52 52 52 52 52 52 52 52 52 52 52 52
+ 52 52 52 52 52 52 52 52 52 52 52 52 52 52
+ 52 52 52 52 52 52 52 52 52 52 52 52 52 52
+ 52 52 52 52 52 52 52 52 52 52 52 52 52 52
+ 52 52 52 52
+ 0 1 2 1 3 5 4 5 8 3 9 5 1 11
+ 8 5 2 17 15 13 11 9 7 5 3 1 26 25
+ 24 23 22 21 20 19 18 17 16 15 14 13 12 11
+ 10 9 8 7 6 5 4 3 2 1 0 53 53 53
+ 53 53 53 53 53 53 53 53 53 53 53 53 53 53
+ 53 53 53 53 53 53 53 53 53 53 53 53 53 53
+ 53 53 53 53 53 53 53 53 53 53 53 53 53 53
+ 53 53 53 53 53 53 53 53 53 53 53 53 53 53
+ 53 53 53 53 53 53 53 53 53 53 53 53 53 53
+ 53 53 53 53 53 53 53 53 53 53 53 53 53 53
+ 53 53 53 53 53 53 53 53 53 53 53 53 53 53
+ 53 53 53 53 53 53 53 53 53 53 53 53 53 53
+ 53 53 53 53 53 53 53 53 53 53 53 53 53 53
+ 53 53 53 53 53 53 53 53 53 53 53 53 53 53
+ 53 53 53 53
+ 0 0 0 2 4 0 5 6 0 4 10 6 2 12
+ 9 6 3 0 16 14 12 10 8 6 4 2 0 26
+ 25 24 23 22 21 20 19 18 17 16 15 14 13 12
+ 11 10 9 8 7 6 5 4 3 2 1 0 54 54
+ 54 54 54 54 54 54 54 54 54 54 54 54 54 54
+ 54 54 54 54 54 54 54 54 54 54 54 54 54 54
+ 54 54 54 54 54 54 54 54 54 54 54 54 54 54
+ 54 54 54 54 54 54 54 54 54 54 54 54 54 54
+ 54 54 54 54 54 54 54 54 54 54 54 54 54 54
+ 54 54 54 54 54 54 54 54 54 54 54 54 54 54
+ 54 54 54 54 54 54 54 54 54 54 54 54 54 54
+ 54 54 54 54 54 54 54 54 54 54 54 54 54 54
+ 54 54 54 54 54 54 54 54 54 54 54 54 54 54
+ 54 54 54 54 54 54 54 54 54 54 54 54 54 54
+ 54 54 54 54
+ 0 1 1 3 0 1 6 7 1 5 0 7 3 13
+ 10 7 4 1 17 15 13 11 9 7 5 3 1 27
+ 26 25 24 23 22 21 20 19 18 17 16 15 14 13
+ 12 11 10 9 8 7 6 5 4 3 2 1 0 55
+ 55 55 55 55 55 55 55 55 55 55 55 55 55 55
+ 55 55 55 55 55 55 55 55 55 55 55 55 55 55
+ 55 55 55 55 55 55 55 55 55 55 55 55 55 55
+ 55 55 55 55 55 55 55 55 55 55 55 55 55 55
+ 55 55 55 55 55 55 55 55 55 55 55 55 55 55
+ 55 55 55 55 55 55 55 55 55 55 55 55 55 55
+ 55 55 55 55 55 55 55 55 55 55 55 55 55 55
+ 55 55 55 55 55 55 55 55 55 55 55 55 55 55
+ 55 55 55 55 55 55 55 55 55 55 55 55 55 55
+ 55 55 55 55 55 55 55 55 55 55 55 55 55 55
+ 55 55 55 55
+ 0 0 2 0 1 2 0 0 2 6 1 8 4 0
+ 11 8 5 2 18 16 14 12 10 8 6 4 2 0
+ 27 26 25 24 23 22 21 20 19 18 17 16 15 14
+ 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ 56 56 56 56 56 56 56 56 56 56 56 56 56 56
+ 56 56 56 56 56 56 56 56 56 56 56 56 56 56
+ 56 56 56 56 56 56 56 56 56 56 56 56 56 56
+ 56 56 56 56 56 56 56 56 56 56 56 56 56 56
+ 56 56 56 56 56 56 56 56 56 56 56 56 56 56
+ 56 56 56 56 56 56 56 56 56 56 56 56 56 56
+ 56 56 56 56 56 56 56 56 56 56 56 56 56 56
+ 56 56 56 56 56 56 56 56 56 56 56 56 56 56
+ 56 56 56 56 56 56 56 56 56 56 56 56 56 56
+ 56 56 56 56 56 56 56 56 56 56 56 56 56 56
+ 56 56 56 56
+ 0 1 0 1 2 3 1 1 3 7 2 9 5 1
+ 12 9 6 3 0 17 15 13 11 9 7 5 3 1
+ 28 27 26 25 24 23 22 21 20 19 18 17 16 15
+ 14 13 12 11 10 9 8 7 6 5 4 3 2 1
+ 0 57 57 57 57 57 57 57 57 57 57 57 57 57
+ 57 57 57 57 57 57 57 57 57 57 57 57 57 57
+ 57 57 57 57 57 57 57 57 57 57 57 57 57 57
+ 57 57 57 57 57 57 57 57 57 57 57 57 57 57
+ 57 57 57 57 57 57 57 57 57 57 57 57 57 57
+ 57 57 57 57 57 57 57 57 57 57 57 57 57 57
+ 57 57 57 57 57 57 57 57 57 57 57 57 57 57
+ 57 57 57 57 57 57 57 57 57 57 57 57 57 57
+ 57 57 57 57 57 57 57 57 57 57 57 57 57 57
+ 57 57 57 57 57 57 57 57 57 57 57 57 57 57
+ 57 57 57 57
+ 0 0 1 2 3 4 2 2 4 8 3 10 6 2
+ 13 10 7 4 1 18 16 14 12 10 8 6 4 2
+ 0 28 27 26 25 24 23 22 21 20 19 18 17 16
+ 15 14 13 12 11 10 9 8 7 6 5 4 3 2
+ 1 0 58 58 58 58 58 58 58 58 58 58 58 58
+ 58 58 58 58 58 58 58 58 58 58 58 58 58 58
+ 58 58 58 58 58 58 58 58 58 58 58 58 58 58
+ 58 58 58 58 58 58 58 58 58 58 58 58 58 58
+ 58 58 58 58 58 58 58 58 58 58 58 58 58 58
+ 58 58 58 58 58 58 58 58 58 58 58 58 58 58
+ 58 58 58 58 58 58 58 58 58 58 58 58 58 58
+ 58 58 58 58 58 58 58 58 58 58 58 58 58 58
+ 58 58 58 58 58 58 58 58 58 58 58 58 58 58
+ 58 58 58 58 58 58 58 58 58 58 58 58 58 58
+ 58 58 58 58
+ 0 1 2 3 4 5 3 3 5 9 4 11 7 3
+ 14 11 8 5 2 19 17 15 13 11 9 7 5 3
+ 1 29 28 27 26 25 24 23 22 21 20 19 18 17
+ 16 15 14 13 12 11 10 9 8 7 6 5 4 3
+ 2 1 0 59 59 59 59 59 59 59 59 59 59 59
+ 59 59 59 59 59 59 59 59 59 59 59 59 59 59
+ 59 59 59 59 59 59 59 59 59 59 59 59 59 59
+ 59 59 59 59 59 59 59 59 59 59 59 59 59 59
+ 59 59 59 59 59 59 59 59 59 59 59 59 59 59
+ 59 59 59 59 59 59 59 59 59 59 59 59 59 59
+ 59 59 59 59 59 59 59 59 59 59 59 59 59 59
+ 59 59 59 59 59 59 59 59 59 59 59 59 59 59
+ 59 59 59 59 59 59 59 59 59 59 59 59 59 59
+ 59 59 59 59 59 59 59 59 59 59 59 59 59 59
+ 59 59 59 59
+ 0 0 0 0 0 0 4 4 6 0 5 0 8 4
+ 0 12 9 6 3 0 18 16 14 12 10 8 6 4
+ 2 0 29 28 27 26 25 24 23 22 21 20 19 18
+ 17 16 15 14 13 12 11 10 9 8 7 6 5 4
+ 3 2 1 0 60 60 60 60 60 60 60 60 60 60
+ 60 60 60 60 60 60 60 60 60 60 60 60 60 60
+ 60 60 60 60 60 60 60 60 60 60 60 60 60 60
+ 60 60 60 60 60 60 60 60 60 60 60 60 60 60
+ 60 60 60 60 60 60 60 60 60 60 60 60 60 60
+ 60 60 60 60 60 60 60 60 60 60 60 60 60 60
+ 60 60 60 60 60 60 60 60 60 60 60 60 60 60
+ 60 60 60 60 60 60 60 60 60 60 60 60 60 60
+ 60 60 60 60 60 60 60 60 60 60 60 60 60 60
+ 60 60 60 60 60 60 60 60 60 60 60 60 60 60
+ 60 60 60 60
+ 0 1 1 1 1 1 5 5 7 1 6 1 9 5
+ 1 13 10 7 4 1 19 17 15 13 11 9 7 5
+ 3 1 30 29 28 27 26 25 24 23 22 21 20 19
+ 18 17 16 15 14 13 12 11 10 9 8 7 6 5
+ 4 3 2 1 0 61 61 61 61 61 61 61 61 61
+ 61 61 61 61 61 61 61 61 61 61 61 61 61 61
+ 61 61 61 61 61 61 61 61 61 61 61 61 61 61
+ 61 61 61 61 61 61 61 61 61 61 61 61 61 61
+ 61 61 61 61 61 61 61 61 61 61 61 61 61 61
+ 61 61 61 61 61 61 61 61 61 61 61 61 61 61
+ 61 61 61 61 61 61 61 61 61 61 61 61 61 61
+ 61 61 61 61 61 61 61 61 61 61 61 61 61 61
+ 61 61 61 61 61 61 61 61 61 61 61 61 61 61
+ 61 61 61 61 61 61 61 61 61 61 61 61 61 61
+ 61 61 61 61
+ 0 0 2 2 2 2 6 6 8 2 7 2 10 6
+ 2 14 11 8 5 2 20 18 16 14 12 10 8 6
+ 4 2 0 30 29 28 27 26 25 24 23 22 21 20
+ 19 18 17 16 15 14 13 12 11 10 9 8 7 6
+ 5 4 3 2 1 0 62 62 62 62 62 62 62 62
+ 62 62 62 62 62 62 62 62 62 62 62 62 62 62
+ 62 62 62 62 62 62 62 62 62 62 62 62 62 62
+ 62 62 62 62 62 62 62 62 62 62 62 62 62 62
+ 62 62 62 62 62 62 62 62 62 62 62 62 62 62
+ 62 62 62 62 62 62 62 62 62 62 62 62 62 62
+ 62 62 62 62 62 62 62 62 62 62 62 62 62 62
+ 62 62 62 62 62 62 62 62 62 62 62 62 62 62
+ 62 62 62 62 62 62 62 62 62 62 62 62 62 62
+ 62 62 62 62 62 62 62 62 62 62 62 62 62 62
+ 62 62 62 62
+ 0 1 0 3 3 3 0 7 0 3 8 3 11 7
+ 3 15 12 9 6 3 0 19 17 15 13 11 9 7
+ 5 3 1 31 30 29 28 27 26 25 24 23 22 21
+ 20 19 18 17 16 15 14 13 12 11 10 9 8 7
+ 6 5 4 3 2 1 0 63 63 63 63 63 63 63
+ 63 63 63 63 63 63 63 63 63 63 63 63 63 63
+ 63 63 63 63 63 63 63 63 63 63 63 63 63 63
+ 63 63 63 63 63 63 63 63 63 63 63 63 63 63
+ 63 63 63 63 63 63 63 63 63 63 63 63 63 63
+ 63 63 63 63 63 63 63 63 63 63 63 63 63 63
+ 63 63 63 63 63 63 63 63 63 63 63 63 63 63
+ 63 63 63 63 63 63 63 63 63 63 63 63 63 63
+ 63 63 63 63 63 63 63 63 63 63 63 63 63 63
+ 63 63 63 63 63 63 63 63 63 63 63 63 63 63
+ 63 63 63 63
+ 0 0 1 0 4 4 1 0 1 4 9 4 12 8
+ 4 0 13 10 7 4 1 20 18 16 14 12 10 8
+ 6 4 2 0 31 30 29 28 27 26 25 24 23 22
+ 21 20 19 18 17 16 15 14 13 12 11 10 9 8
+ 7 6 5 4 3 2 1 0 64 64 64 64 64 64
+ 64 64 64 64 64 64 64 64 64 64 64 64 64 64
+ 64 64 64 64 64 64 64 64 64 64 64 64 64 64
+ 64 64 64 64 64 64 64 64 64 64 64 64 64 64
+ 64 64 64 64 64 64 64 64 64 64 64 64 64 64
+ 64 64 64 64 64 64 64 64 64 64 64 64 64 64
+ 64 64 64 64 64 64 64 64 64 64 64 64 64 64
+ 64 64 64 64 64 64 64 64 64 64 64 64 64 64
+ 64 64 64 64 64 64 64 64 64 64 64 64 64 64
+ 64 64 64 64 64 64 64 64 64 64 64 64 64 64
+ 64 64 64 64
+ 0 1 2 1 0 5 2 1 2 5 10 5 0 9
+ 5 1 14 11 8 5 2 21 19 17 15 13 11 9
+ 7 5 3 1 32 31 30 29 28 27 26 25 24 23
+ 22 21 20 19 18 17 16 15 14 13 12 11 10 9
+ 8 7 6 5 4 3 2 1 0 65 65 65 65 65
+ 65 65 65 65 65 65 65 65 65 65 65 65 65 65
+ 65 65 65 65 65 65 65 65 65 65 65 65 65 65
+ 65 65 65 65 65 65 65 65 65 65 65 65 65 65
+ 65 65 65 65 65 65 65 65 65 65 65 65 65 65
+ 65 65 65 65 65 65 65 65 65 65 65 65 65 65
+ 65 65 65 65 65 65 65 65 65 65 65 65 65 65
+ 65 65 65 65 65 65 65 65 65 65 65 65 65 65
+ 65 65 65 65 65 65 65 65 65 65 65 65 65 65
+ 65 65 65 65 65 65 65 65 65 65 65 65 65 65
+ 65 65 65 65
+ 0 0 0 2 1 0 3 2 3 6 0 6 1 10
+ 6 2 15 12 9 6 3 0 20 18 16 14 12 10
+ 8 6 4 2 0 32 31 30 29 28 27 26 25 24
+ 23 22 21 20 19 18 17 16 15 14 13 12 11 10
+ 9 8 7 6 5 4 3 2 1 0 66 66 66 66
+ 66 66 66 66 66 66 66 66 66 66 66 66 66 66
+ 66 66 66 66 66 66 66 66 66 66 66 66 66 66
+ 66 66 66 66 66 66 66 66 66 66 66 66 66 66
+ 66 66 66 66 66 66 66 66 66 66 66 66 66 66
+ 66 66 66 66 66 66 66 66 66 66 66 66 66 66
+ 66 66 66 66 66 66 66 66 66 66 66 66 66 66
+ 66 66 66 66 66 66 66 66 66 66 66 66 66 66
+ 66 66 66 66 66 66 66 66 66 66 66 66 66 66
+ 66 66 66 66 66 66 66 66 66 66 66 66 66 66
+ 66 66 66 66
+ 0 1 1 3 2 1 4 3 4 7 1 7 2 11
+ 7 3 16 13 10 7 4 1 21 19 17 15 13 11
+ 9 7 5 3 1 33 32 31 30 29 28 27 26 25
+ 24 23 22 21 20 19 18 17 16 15 14 13 12 11
+ 10 9 8 7 6 5 4 3 2 1 0 67 67 67
+ 67 67 67 67 67 67 67 67 67 67 67 67 67 67
+ 67 67 67 67 67 67 67 67 67 67 67 67 67 67
+ 67 67 67 67 67 67 67 67 67 67 67 67 67 67
+ 67 67 67 67 67 67 67 67 67 67 67 67 67 67
+ 67 67 67 67 67 67 67 67 67 67 67 67 67 67
+ 67 67 67 67 67 67 67 67 67 67 67 67 67 67
+ 67 67 67 67 67 67 67 67 67 67 67 67 67 67
+ 67 67 67 67 67 67 67 67 67 67 67 67 67 67
+ 67 67 67 67 67 67 67 67 67 67 67 67 67 67
+ 67 67 67 67
+ 0 0 2 0 3 2 5 4 5 8 2 8 3 12
+ 8 4 0 14 11 8 5 2 22 20 18 16 14 12
+ 10 8 6 4 2 0 33 32 31 30 29 28 27 26
+ 25 24 23 22 21 20 19 18 17 16 15 14 13 12
+ 11 10 9 8 7 6 5 4 3 2 1 0 68 68
+ 68 68 68 68 68 68 68 68 68 68 68 68 68 68
+ 68 68 68 68 68 68 68 68 68 68 68 68 68 68
+ 68 68 68 68 68 68 68 68 68 68 68 68 68 68
+ 68 68 68 68 68 68 68 68 68 68 68 68 68 68
+ 68 68 68 68 68 68 68 68 68 68 68 68 68 68
+ 68 68 68 68 68 68 68 68 68 68 68 68 68 68
+ 68 68 68 68 68 68 68 68 68 68 68 68 68 68
+ 68 68 68 68 68 68 68 68 68 68 68 68 68 68
+ 68 68 68 68 68 68 68 68 68 68 68 68 68 68
+ 68 68 68 68
+ 0 1 0 1 4 3 6 5 6 9 3 9 4 13
+ 9 5 1 15 12 9 6 3 0 21 19 17 15 13
+ 11 9 7 5 3 1 34 33 32 31 30 29 28 27
+ 26 25 24 23 22 21 20 19 18 17 16 15 14 13
+ 12 11 10 9 8 7 6 5 4 3 2 1 0 69
+ 69 69 69 69 69 69 69 69 69 69 69 69 69 69
+ 69 69 69 69 69 69 69 69 69 69 69 69 69 69
+ 69 69 69 69 69 69 69 69 69 69 69 69 69 69
+ 69 69 69 69 69 69 69 69 69 69 69 69 69 69
+ 69 69 69 69 69 69 69 69 69 69 69 69 69 69
+ 69 69 69 69 69 69 69 69 69 69 69 69 69 69
+ 69 69 69 69 69 69 69 69 69 69 69 69 69 69
+ 69 69 69 69 69 69 69 69 69 69 69 69 69 69
+ 69 69 69 69 69 69 69 69 69 69 69 69 69 69
+ 69 69 69 69
+ 0 0 1 2 0 4 0 6 7 0 4 10 5 0
+ 10 6 2 16 13 10 7 4 1 22 20 18 16 14
+ 12 10 8 6 4 2 0 34 33 32 31 30 29 28
+ 27 26 25 24 23 22 21 20 19 18 17 16 15 14
+ 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ 70 70 70 70 70 70 70 70 70 70 70 70 70 70
+ 70 70 70 70 70 70 70 70 70 70 70 70 70 70
+ 70 70 70 70 70 70 70 70 70 70 70 70 70 70
+ 70 70 70 70 70 70 70 70 70 70 70 70 70 70
+ 70 70 70 70 70 70 70 70 70 70 70 70 70 70
+ 70 70 70 70 70 70 70 70 70 70 70 70 70 70
+ 70 70 70 70 70 70 70 70 70 70 70 70 70 70
+ 70 70 70 70 70 70 70 70 70 70 70 70 70 70
+ 70 70 70 70 70 70 70 70 70 70 70 70 70 70
+ 70 70 70 70
+ 0 1 2 3 1 5 1 7 8 1 5 11 6 1
+ 11 7 3 17 14 11 8 5 2 23 21 19 17 15
+ 13 11 9 7 5 3 1 35 34 33 32 31 30 29
+ 28 27 26 25 24 23 22 21 20 19 18 17 16 15
+ 14 13 12 11 10 9 8 7 6 5 4 3 2 1
+ 0 71 71 71 71 71 71 71 71 71 71 71 71 71
+ 71 71 71 71 71 71 71 71 71 71 71 71 71 71
+ 71 71 71 71 71 71 71 71 71 71 71 71 71 71
+ 71 71 71 71 71 71 71 71 71 71 71 71 71 71
+ 71 71 71 71 71 71 71 71 71 71 71 71 71 71
+ 71 71 71 71 71 71 71 71 71 71 71 71 71 71
+ 71 71 71 71 71 71 71 71 71 71 71 71 71 71
+ 71 71 71 71 71 71 71 71 71 71 71 71 71 71
+ 71 71 71 71 71 71 71 71 71 71 71 71 71 71
+ 71 71 71 71
+ 0 0 0 0 2 0 2 0 0 2 6 0 7 2
+ 12 8 4 0 15 12 9 6 3 0 22 20 18 16
+ 14 12 10 8 6 4 2 0 35 34 33 32 31 30
+ 29 28 27 26 25 24 23 22 21 20 19 18 17 16
+ 15 14 13 12 11 10 9 8 7 6 5 4 3 2
+ 1 0 72 72 72 72 72 72 72 72 72 72 72 72
+ 72 72 72 72 72 72 72 72 72 72 72 72 72 72
+ 72 72 72 72 72 72 72 72 72 72 72 72 72 72
+ 72 72 72 72 72 72 72 72 72 72 72 72 72 72
+ 72 72 72 72 72 72 72 72 72 72 72 72 72 72
+ 72 72 72 72 72 72 72 72 72 72 72 72 72 72
+ 72 72 72 72 72 72 72 72 72 72 72 72 72 72
+ 72 72 72 72 72 72 72 72 72 72 72 72 72 72
+ 72 72 72 72 72 72 72 72 72 72 72 72 72 72
+ 72 72 72 72
+ 0 1 1 1 3 1 3 1 1 3 7 1 8 3
+ 13 9 5 1 16 13 10 7 4 1 23 21 19 17
+ 15 13 11 9 7 5 3 1 36 35 34 33 32 31
+ 30 29 28 27 26 25 24 23 22 21 20 19 18 17
+ 16 15 14 13 12 11 10 9 8 7 6 5 4 3
+ 2 1 0 73 73 73 73 73 73 73 73 73 73 73
+ 73 73 73 73 73 73 73 73 73 73 73 73 73 73
+ 73 73 73 73 73 73 73 73 73 73 73 73 73 73
+ 73 73 73 73 73 73 73 73 73 73 73 73 73 73
+ 73 73 73 73 73 73 73 73 73 73 73 73 73 73
+ 73 73 73 73 73 73 73 73 73 73 73 73 73 73
+ 73 73 73 73 73 73 73 73 73 73 73 73 73 73
+ 73 73 73 73 73 73 73 73 73 73 73 73 73 73
+ 73 73 73 73 73 73 73 73 73 73 73 73 73 73
+ 73 73 73 73
+ 0 0 2 2 4 2 4 2 2 4 8 2 9 4
+ 14 10 6 2 17 14 11 8 5 2 24 22 20 18
+ 16 14 12 10 8 6 4 2 0 36 35 34 33 32
+ 31 30 29 28 27 26 25 24 23 22 21 20 19 18
+ 17 16 15 14 13 12 11 10 9 8 7 6 5 4
+ 3 2 1 0 74 74 74 74 74 74 74 74 74 74
+ 74 74 74 74 74 74 74 74 74 74 74 74 74 74
+ 74 74 74 74 74 74 74 74 74 74 74 74 74 74
+ 74 74 74 74 74 74 74 74 74 74 74 74 74 74
+ 74 74 74 74 74 74 74 74 74 74 74 74 74 74
+ 74 74 74 74 74 74 74 74 74 74 74 74 74 74
+ 74 74 74 74 74 74 74 74 74 74 74 74 74 74
+ 74 74 74 74 74 74 74 74 74 74 74 74 74 74
+ 74 74 74 74 74 74 74 74 74 74 74 74 74 74
+ 74 74 74 74
+ 0 1 0 3 0 3 5 3 3 5 9 3 10 5
+ 0 11 7 3 18 15 12 9 6 3 0 23 21 19
+ 17 15 13 11 9 7 5 3 1 37 36 35 34 33
+ 32 31 30 29 28 27 26 25 24 23 22 21 20 19
+ 18 17 16 15 14 13 12 11 10 9 8 7 6 5
+ 4 3 2 1 0 75 75 75 75 75 75 75 75 75
+ 75 75 75 75 75 75 75 75 75 75 75 75 75 75
+ 75 75 75 75 75 75 75 75 75 75 75 75 75 75
+ 75 75 75 75 75 75 75 75 75 75 75 75 75 75
+ 75 75 75 75 75 75 75 75 75 75 75 75 75 75
+ 75 75 75 75 75 75 75 75 75 75 75 75 75 75
+ 75 75 75 75 75 75 75 75 75 75 75 75 75 75
+ 75 75 75 75 75 75 75 75 75 75 75 75 75 75
+ 75 75 75 75 75 75 75 75 75 75 75 75 75 75
+ 75 75 75 75
+ 0 0 1 0 1 4 6 4 4 6 10 4 11 6
+ 1 12 8 4 0 16 13 10 7 4 1 24 22 20
+ 18 16 14 12 10 8 6 4 2 0 37 36 35 34
+ 33 32 31 30 29 28 27 26 25 24 23 22 21 20
+ 19 18 17 16 15 14 13 12 11 10 9 8 7 6
+ 5 4 3 2 1 0 76 76 76 76 76 76 76 76
+ 76 76 76 76 76 76 76 76 76 76 76 76 76 76
+ 76 76 76 76 76 76 76 76 76 76 76 76 76 76
+ 76 76 76 76 76 76 76 76 76 76 76 76 76 76
+ 76 76 76 76 76 76 76 76 76 76 76 76 76 76
+ 76 76 76 76 76 76 76 76 76 76 76 76 76 76
+ 76 76 76 76 76 76 76 76 76 76 76 76 76 76
+ 76 76 76 76 76 76 76 76 76 76 76 76 76 76
+ 76 76 76 76 76 76 76 76 76 76 76 76 76 76
+ 76 76 76 76
+ 0 1 2 1 2 5 0 5 5 7 0 5 12 7
+ 2 13 9 5 1 17 14 11 8 5 2 25 23 21
+ 19 17 15 13 11 9 7 5 3 1 38 37 36 35
+ 34 33 32 31 30 29 28 27 26 25 24 23 22 21
+ 20 19 18 17 16 15 14 13 12 11 10 9 8 7
+ 6 5 4 3 2 1 0 77 77 77 77 77 77 77
+ 77 77 77 77 77 77 77 77 77 77 77 77 77 77
+ 77 77 77 77 77 77 77 77 77 77 77 77 77 77
+ 77 77 77 77 77 77 77 77 77 77 77 77 77 77
+ 77 77 77 77 77 77 77 77 77 77 77 77 77 77
+ 77 77 77 77 77 77 77 77 77 77 77 77 77 77
+ 77 77 77 77 77 77 77 77 77 77 77 77 77 77
+ 77 77 77 77 77 77 77 77 77 77 77 77 77 77
+ 77 77 77 77 77 77 77 77 77 77 77 77 77 77
+ 77 77 77 77
+ 0 0 0 2 3 0 1 6 6 8 1 6 0 8
+ 3 14 10 6 2 18 15 12 9 6 3 0 24 22
+ 20 18 16 14 12 10 8 6 4 2 0 38 37 36
+ 35 34 33 32 31 30 29 28 27 26 25 24 23 22
+ 21 20 19 18 17 16 15 14 13 12 11 10 9 8
+ 7 6 5 4 3 2 1 0 78 78 78 78 78 78
+ 78 78 78 78 78 78 78 78 78 78 78 78 78 78
+ 78 78 78 78 78 78 78 78 78 78 78 78 78 78
+ 78 78 78 78 78 78 78 78 78 78 78 78 78 78
+ 78 78 78 78 78 78 78 78 78 78 78 78 78 78
+ 78 78 78 78 78 78 78 78 78 78 78 78 78 78
+ 78 78 78 78 78 78 78 78 78 78 78 78 78 78
+ 78 78 78 78 78 78 78 78 78 78 78 78 78 78
+ 78 78 78 78 78 78 78 78 78 78 78 78 78 78
+ 78 78 78 78
+ 0 1 1 3 4 1 2 7 7 9 2 7 1 9
+ 4 15 11 7 3 19 16 13 10 7 4 1 25 23
+ 21 19 17 15 13 11 9 7 5 3 1 39 38 37
+ 36 35 34 33 32 31 30 29 28 27 26 25 24 23
+ 22 21 20 19 18 17 16 15 14 13 12 11 10 9
+ 8 7 6 5 4 3 2 1 0 79 79 79 79 79
+ 79 79 79 79 79 79 79 79 79 79 79 79 79 79
+ 79 79 79 79 79 79 79 79 79 79 79 79 79 79
+ 79 79 79 79 79 79 79 79 79 79 79 79 79 79
+ 79 79 79 79 79 79 79 79 79 79 79 79 79 79
+ 79 79 79 79 79 79 79 79 79 79 79 79 79 79
+ 79 79 79 79 79 79 79 79 79 79 79 79 79 79
+ 79 79 79 79 79 79 79 79 79 79 79 79 79 79
+ 79 79 79 79 79 79 79 79 79 79 79 79 79 79
+ 79 79 79 79
+ 0 0 2 0 0 2 3 0 8 0 3 8 2 10
+ 5 0 12 8 4 0 17 14 11 8 5 2 26 24
+ 22 20 18 16 14 12 10 8 6 4 2 0 39 38
+ 37 36 35 34 33 32 31 30 29 28 27 26 25 24
+ 23 22 21 20 19 18 17 16 15 14 13 12 11 10
+ 9 8 7 6 5 4 3 2 1 0 80 80 80 80
+ 80 80 80 80 80 80 80 80 80 80 80 80 80 80
+ 80 80 80 80 80 80 80 80 80 80 80 80 80 80
+ 80 80 80 80 80 80 80 80 80 80 80 80 80 80
+ 80 80 80 80 80 80 80 80 80 80 80 80 80 80
+ 80 80 80 80 80 80 80 80 80 80 80 80 80 80
+ 80 80 80 80 80 80 80 80 80 80 80 80 80 80
+ 80 80 80 80 80 80 80 80 80 80 80 80 80 80
+ 80 80 80 80 80 80 80 80 80 80 80 80 80 80
+ 80 80 80 80
+ 0 1 0 1 1 3 4 1 0 1 4 9 3 11
+ 6 1 13 9 5 1 18 15 12 9 6 3 0 25
+ 23 21 19 17 15 13 11 9 7 5 3 1 40 39
+ 38 37 36 35 34 33 32 31 30 29 28 27 26 25
+ 24 23 22 21 20 19 18 17 16 15 14 13 12 11
+ 10 9 8 7 6 5 4 3 2 1 0 81 81 81
+ 81 81 81 81 81 81 81 81 81 81 81 81 81 81
+ 81 81 81 81 81 81 81 81 81 81 81 81 81 81
+ 81 81 81 81 81 81 81 81 81 81 81 81 81 81
+ 81 81 81 81 81 81 81 81 81 81 81 81 81 81
+ 81 81 81 81 81 81 81 81 81 81 81 81 81 81
+ 81 81 81 81 81 81 81 81 81 81 81 81 81 81
+ 81 81 81 81 81 81 81 81 81 81 81 81 81 81
+ 81 81 81 81 81 81 81 81 81 81 81 81 81 81
+ 81 81 81 81
+ 0 0 1 2 2 4 5 2 1 2 5 10 4 12
+ 7 2 14 10 6 2 19 16 13 10 7 4 1 26
+ 24 22 20 18 16 14 12 10 8 6 4 2 0 40
+ 39 38 37 36 35 34 33 32 31 30 29 28 27 26
+ 25 24 23 22 21 20 19 18 17 16 15 14 13 12
+ 11 10 9 8 7 6 5 4 3 2 1 0 82 82
+ 82 82 82 82 82 82 82 82 82 82 82 82 82 82
+ 82 82 82 82 82 82 82 82 82 82 82 82 82 82
+ 82 82 82 82 82 82 82 82 82 82 82 82 82 82
+ 82 82 82 82 82 82 82 82 82 82 82 82 82 82
+ 82 82 82 82 82 82 82 82 82 82 82 82 82 82
+ 82 82 82 82 82 82 82 82 82 82 82 82 82 82
+ 82 82 82 82 82 82 82 82 82 82 82 82 82 82
+ 82 82 82 82 82 82 82 82 82 82 82 82 82 82
+ 82 82 82 82
+ 0 1 2 3 3 5 6 3 2 3 6 11 5 13
+ 8 3 15 11 7 3 20 17 14 11 8 5 2 27
+ 25 23 21 19 17 15 13 11 9 7 5 3 1 41
+ 40 39 38 37 36 35 34 33 32 31 30 29 28 27
+ 26 25 24 23 22 21 20 19 18 17 16 15 14 13
+ 12 11 10 9 8 7 6 5 4 3 2 1 0 83
+ 83 83 83 83 83 83 83 83 83 83 83 83 83 83
+ 83 83 83 83 83 83 83 83 83 83 83 83 83 83
+ 83 83 83 83 83 83 83 83 83 83 83 83 83 83
+ 83 83 83 83 83 83 83 83 83 83 83 83 83 83
+ 83 83 83 83 83 83 83 83 83 83 83 83 83 83
+ 83 83 83 83 83 83 83 83 83 83 83 83 83 83
+ 83 83 83 83 83 83 83 83 83 83 83 83 83 83
+ 83 83 83 83 83 83 83 83 83 83 83 83 83 83
+ 83 83 83 83
+ 0 0 0 0 4 0 0 4 3 4 7 0 6 0
+ 9 4 16 12 8 4 0 18 15 12 9 6 3 0
+ 26 24 22 20 18 16 14 12 10 8 6 4 2 0
+ 41 40 39 38 37 36 35 34 33 32 31 30 29 28
+ 27 26 25 24 23 22 21 20 19 18 17 16 15 14
+ 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ 84 84 84 84 84 84 84 84 84 84 84 84 84 84
+ 84 84 84 84 84 84 84 84 84 84 84 84 84 84
+ 84 84 84 84 84 84 84 84 84 84 84 84 84 84
+ 84 84 84 84 84 84 84 84 84 84 84 84 84 84
+ 84 84 84 84 84 84 84 84 84 84 84 84 84 84
+ 84 84 84 84 84 84 84 84 84 84 84 84 84 84
+ 84 84 84 84 84 84 84 84 84 84 84 84 84 84
+ 84 84 84 84 84 84 84 84 84 84 84 84 84 84
+ 84 84 84 84
+ 0 1 1 1 0 1 1 5 4 5 8 1 7 1
+ 10 5 0 13 9 5 1 19 16 13 10 7 4 1
+ 27 25 23 21 19 17 15 13 11 9 7 5 3 1
+ 42 41 40 39 38 37 36 35 34 33 32 31 30 29
+ 28 27 26 25 24 23 22 21 20 19 18 17 16 15
+ 14 13 12 11 10 9 8 7 6 5 4 3 2 1
+ 0 85 85 85 85 85 85 85 85 85 85 85 85 85
+ 85 85 85 85 85 85 85 85 85 85 85 85 85 85
+ 85 85 85 85 85 85 85 85 85 85 85 85 85 85
+ 85 85 85 85 85 85 85 85 85 85 85 85 85 85
+ 85 85 85 85 85 85 85 85 85 85 85 85 85 85
+ 85 85 85 85 85 85 85 85 85 85 85 85 85 85
+ 85 85 85 85 85 85 85 85 85 85 85 85 85 85
+ 85 85 85 85 85 85 85 85 85 85 85 85 85 85
+ 85 85 85 85
+ 0 0 2 2 1 2 2 6 5 6 9 2 8 2
+ 11 6 1 14 10 6 2 20 17 14 11 8 5 2
+ 28 26 24 22 20 18 16 14 12 10 8 6 4 2
+ 0 42 41 40 39 38 37 36 35 34 33 32 31 30
+ 29 28 27 26 25 24 23 22 21 20 19 18 17 16
+ 15 14 13 12 11 10 9 8 7 6 5 4 3 2
+ 1 0 86 86 86 86 86 86 86 86 86 86 86 86
+ 86 86 86 86 86 86 86 86 86 86 86 86 86 86
+ 86 86 86 86 86 86 86 86 86 86 86 86 86 86
+ 86 86 86 86 86 86 86 86 86 86 86 86 86 86
+ 86 86 86 86 86 86 86 86 86 86 86 86 86 86
+ 86 86 86 86 86 86 86 86 86 86 86 86 86 86
+ 86 86 86 86 86 86 86 86 86 86 86 86 86 86
+ 86 86 86 86 86 86 86 86 86 86 86 86 86 86
+ 86 86 86 86
+ 0 1 0 3 2 3 3 7 6 7 10 3 9 3
+ 12 7 2 15 11 7 3 21 18 15 12 9 6 3
+ 0 27 25 23 21 19 17 15 13 11 9 7 5 3
+ 1 43 42 41 40 39 38 37 36 35 34 33 32 31
+ 30 29 28 27 26 25 24 23 22 21 20 19 18 17
+ 16 15 14 13 12 11 10 9 8 7 6 5 4 3
+ 2 1 0 87 87 87 87 87 87 87 87 87 87 87
+ 87 87 87 87 87 87 87 87 87 87 87 87 87 87
+ 87 87 87 87 87 87 87 87 87 87 87 87 87 87
+ 87 87 87 87 87 87 87 87 87 87 87 87 87 87
+ 87 87 87 87 87 87 87 87 87 87 87 87 87 87
+ 87 87 87 87 87 87 87 87 87 87 87 87 87 87
+ 87 87 87 87 87 87 87 87 87 87 87 87 87 87
+ 87 87 87 87 87 87 87 87 87 87 87 87 87 87
+ 87 87 87 87
+ 0 0 1 0 3 4 4 0 7 8 0 4 10 4
+ 13 8 3 16 12 8 4 0 19 16 13 10 7 4
+ 1 28 26 24 22 20 18 16 14 12 10 8 6 4
+ 2 0 43 42 41 40 39 38 37 36 35 34 33 32
+ 31 30 29 28 27 26 25 24 23 22 21 20 19 18
+ 17 16 15 14 13 12 11 10 9 8 7 6 5 4
+ 3 2 1 0 88 88 88 88 88 88 88 88 88 88
+ 88 88 88 88 88 88 88 88 88 88 88 88 88 88
+ 88 88 88 88 88 88 88 88 88 88 88 88 88 88
+ 88 88 88 88 88 88 88 88 88 88 88 88 88 88
+ 88 88 88 88 88 88 88 88 88 88 88 88 88 88
+ 88 88 88 88 88 88 88 88 88 88 88 88 88 88
+ 88 88 88 88 88 88 88 88 88 88 88 88 88 88
+ 88 88 88 88 88 88 88 88 88 88 88 88 88 88
+ 88 88 88 88
+ 0 1 2 1 4 5 5 1 8 9 1 5 11 5
+ 14 9 4 17 13 9 5 1 20 17 14 11 8 5
+ 2 29 27 25 23 21 19 17 15 13 11 9 7 5
+ 3 1 44 43 42 41 40 39 38 37 36 35 34 33
+ 32 31 30 29 28 27 26 25 24 23 22 21 20 19
+ 18 17 16 15 14 13 12 11 10 9 8 7 6 5
+ 4 3 2 1 0 89 89 89 89 89 89 89 89 89
+ 89 89 89 89 89 89 89 89 89 89 89 89 89 89
+ 89 89 89 89 89 89 89 89 89 89 89 89 89 89
+ 89 89 89 89 89 89 89 89 89 89 89 89 89 89
+ 89 89 89 89 89 89 89 89 89 89 89 89 89 89
+ 89 89 89 89 89 89 89 89 89 89 89 89 89 89
+ 89 89 89 89 89 89 89 89 89 89 89 89 89 89
+ 89 89 89 89 89 89 89 89 89 89 89 89 89 89
+ 89 89 89 89
+ 0 0 0 2 0 0 6 2 0 0 2 6 12 6
+ 0 10 5 0 14 10 6 2 21 18 15 12 9 6
+ 3 0 28 26 24 22 20 18 16 14 12 10 8 6
+ 4 2 0 44 43 42 41 40 39 38 37 36 35 34
+ 33 32 31 30 29 28 27 26 25 24 23 22 21 20
+ 19 18 17 16 15 14 13 12 11 10 9 8 7 6
+ 5 4 3 2 1 0 90 90 90 90 90 90 90 90
+ 90 90 90 90 90 90 90 90 90 90 90 90 90 90
+ 90 90 90 90 90 90 90 90 90 90 90 90 90 90
+ 90 90 90 90 90 90 90 90 90 90 90 90 90 90
+ 90 90 90 90 90 90 90 90 90 90 90 90 90 90
+ 90 90 90 90 90 90 90 90 90 90 90 90 90 90
+ 90 90 90 90 90 90 90 90 90 90 90 90 90 90
+ 90 90 90 90 90 90 90 90 90 90 90 90 90 90
+ 90 90 90 90
+ 0 1 1 3 1 1 0 3 1 1 3 7 0 7
+ 1 11 6 1 15 11 7 3 22 19 16 13 10 7
+ 4 1 29 27 25 23 21 19 17 15 13 11 9 7
+ 5 3 1 45 44 43 42 41 40 39 38 37 36 35
+ 34 33 32 31 30 29 28 27 26 25 24 23 22 21
+ 20 19 18 17 16 15 14 13 12 11 10 9 8 7
+ 6 5 4 3 2 1 0 91 91 91 91 91 91 91
+ 91 91 91 91 91 91 91 91 91 91 91 91 91 91
+ 91 91 91 91 91 91 91 91 91 91 91 91 91 91
+ 91 91 91 91 91 91 91 91 91 91 91 91 91 91
+ 91 91 91 91 91 91 91 91 91 91 91 91 91 91
+ 91 91 91 91 91 91 91 91 91 91 91 91 91 91
+ 91 91 91 91 91 91 91 91 91 91 91 91 91 91
+ 91 91 91 91 91 91 91 91 91 91 91 91 91 91
+ 91 91 91 91
+ 0 0 2 0 2 2 1 4 2 2 4 8 1 8
+ 2 12 7 2 16 12 8 4 0 20 17 14 11 8
+ 5 2 30 28 26 24 22 20 18 16 14 12 10 8
+ 6 4 2 0 45 44 43 42 41 40 39 38 37 36
+ 35 34 33 32 31 30 29 28 27 26 25 24 23 22
+ 21 20 19 18 17 16 15 14 13 12 11 10 9 8
+ 7 6 5 4 3 2 1 0 92 92 92 92 92 92
+ 92 92 92 92 92 92 92 92 92 92 92 92 92 92
+ 92 92 92 92 92 92 92 92 92 92 92 92 92 92
+ 92 92 92 92 92 92 92 92 92 92 92 92 92 92
+ 92 92 92 92 92 92 92 92 92 92 92 92 92 92
+ 92 92 92 92 92 92 92 92 92 92 92 92 92 92
+ 92 92 92 92 92 92 92 92 92 92 92 92 92 92
+ 92 92 92 92 92 92 92 92 92 92 92 92 92 92
+ 92 92 92 92
+ 0 1 0 1 3 3 2 5 3 3 5 9 2 9
+ 3 13 8 3 17 13 9 5 1 21 18 15 12 9
+ 6 3 0 29 27 25 23 21 19 17 15 13 11 9
+ 7 5 3 1 46 45 44 43 42 41 40 39 38 37
+ 36 35 34 33 32 31 30 29 28 27 26 25 24 23
+ 22 21 20 19 18 17 16 15 14 13 12 11 10 9
+ 8 7 6 5 4 3 2 1 0 93 93 93 93 93
+ 93 93 93 93 93 93 93 93 93 93 93 93 93 93
+ 93 93 93 93 93 93 93 93 93 93 93 93 93 93
+ 93 93 93 93 93 93 93 93 93 93 93 93 93 93
+ 93 93 93 93 93 93 93 93 93 93 93 93 93 93
+ 93 93 93 93 93 93 93 93 93 93 93 93 93 93
+ 93 93 93 93 93 93 93 93 93 93 93 93 93 93
+ 93 93 93 93 93 93 93 93 93 93 93 93 93 93
+ 93 93 93 93
+ 0 0 1 2 4 4 3 6 4 4 6 10 3 10
+ 4 14 9 4 18 14 10 6 2 22 19 16 13 10
+ 7 4 1 30 28 26 24 22 20 18 16 14 12 10
+ 8 6 4 2 0 46 45 44 43 42 41 40 39 38
+ 37 36 35 34 33 32 31 30 29 28 27 26 25 24
+ 23 22 21 20 19 18 17 16 15 14 13 12 11 10
+ 9 8 7 6 5 4 3 2 1 0 94 94 94 94
+ 94 94 94 94 94 94 94 94 94 94 94 94 94 94
+ 94 94 94 94 94 94 94 94 94 94 94 94 94 94
+ 94 94 94 94 94 94 94 94 94 94 94 94 94 94
+ 94 94 94 94 94 94 94 94 94 94 94 94 94 94
+ 94 94 94 94 94 94 94 94 94 94 94 94 94 94
+ 94 94 94 94 94 94 94 94 94 94 94 94 94 94
+ 94 94 94 94 94 94 94 94 94 94 94 94 94 94
+ 94 94 94 94
+ 0 1 2 3 0 5 4 7 5 5 7 11 4 11
+ 5 15 10 5 0 15 11 7 3 23 20 17 14 11
+ 8 5 2 31 29 27 25 23 21 19 17 15 13 11
+ 9 7 5 3 1 47 46 45 44 43 42 41 40 39
+ 38 37 36 35 34 33 32 31 30 29 28 27 26 25
+ 24 23 22 21 20 19 18 17 16 15 14 13 12 11
+ 10 9 8 7 6 5 4 3 2 1 0 95 95 95
+ 95 95 95 95 95 95 95 95 95 95 95 95 95 95
+ 95 95 95 95 95 95 95 95 95 95 95 95 95 95
+ 95 95 95 95 95 95 95 95 95 95 95 95 95 95
+ 95 95 95 95 95 95 95 95 95 95 95 95 95 95
+ 95 95 95 95 95 95 95 95 95 95 95 95 95 95
+ 95 95 95 95 95 95 95 95 95 95 95 95 95 95
+ 95 95 95 95 95 95 95 95 95 95 95 95 95 95
+ 95 95 95 95
+ 0 0 0 0 1 0 5 0 6 6 8 0 5 12
+ 6 0 11 6 1 16 12 8 4 0 21 18 15 12
+ 9 6 3 0 30 28 26 24 22 20 18 16 14 12
+ 10 8 6 4 2 0 47 46 45 44 43 42 41 40
+ 39 38 37 36 35 34 33 32 31 30 29 28 27 26
+ 25 24 23 22 21 20 19 18 17 16 15 14 13 12
+ 11 10 9 8 7 6 5 4 3 2 1 0 96 96
+ 96 96 96 96 96 96 96 96 96 96 96 96 96 96
+ 96 96 96 96 96 96 96 96 96 96 96 96 96 96
+ 96 96 96 96 96 96 96 96 96 96 96 96 96 96
+ 96 96 96 96 96 96 96 96 96 96 96 96 96 96
+ 96 96 96 96 96 96 96 96 96 96 96 96 96 96
+ 96 96 96 96 96 96 96 96 96 96 96 96 96 96
+ 96 96 96 96 96 96 96 96 96 96 96 96 96 96
+ 96 96 96 96
+ 0 1 1 1 2 1 6 1 7 7 9 1 6 13
+ 7 1 12 7 2 17 13 9 5 1 22 19 16 13
+ 10 7 4 1 31 29 27 25 23 21 19 17 15 13
+ 11 9 7 5 3 1 48 47 46 45 44 43 42 41
+ 40 39 38 37 36 35 34 33 32 31 30 29 28 27
+ 26 25 24 23 22 21 20 19 18 17 16 15 14 13
+ 12 11 10 9 8 7 6 5 4 3 2 1 0 97
+ 97 97 97 97 97 97 97 97 97 97 97 97 97 97
+ 97 97 97 97 97 97 97 97 97 97 97 97 97 97
+ 97 97 97 97 97 97 97 97 97 97 97 97 97 97
+ 97 97 97 97 97 97 97 97 97 97 97 97 97 97
+ 97 97 97 97 97 97 97 97 97 97 97 97 97 97
+ 97 97 97 97 97 97 97 97 97 97 97 97 97 97
+ 97 97 97 97 97 97 97 97 97 97 97 97 97 97
+ 97 97 97 97
+ 0 0 2 2 3 2 0 2 8 8 10 2 7 0
+ 8 2 13 8 3 18 14 10 6 2 23 20 17 14
+ 11 8 5 2 32 30 28 26 24 22 20 18 16 14
+ 12 10 8 6 4 2 0 48 47 46 45 44 43 42
+ 41 40 39 38 37 36 35 34 33 32 31 30 29 28
+ 27 26 25 24 23 22 21 20 19 18 17 16 15 14
+ 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ 98 98 98 98 98 98 98 98 98 98 98 98 98 98
+ 98 98 98 98 98 98 98 98 98 98 98 98 98 98
+ 98 98 98 98 98 98 98 98 98 98 98 98 98 98
+ 98 98 98 98 98 98 98 98 98 98 98 98 98 98
+ 98 98 98 98 98 98 98 98 98 98 98 98 98 98
+ 98 98 98 98 98 98 98 98 98 98 98 98 98 98
+ 98 98 98 98 98 98 98 98 98 98 98 98 98 98
+ 98 98 98 98
+ 0 1 0 3 4 3 1 3 0 9 0 3 8 1
+ 9 3 14 9 4 19 15 11 7 3 24 21 18 15
+ 12 9 6 3 0 31 29 27 25 23 21 19 17 15
+ 13 11 9 7 5 3 1 49 48 47 46 45 44 43
+ 42 41 40 39 38 37 36 35 34 33 32 31 30 29
+ 28 27 26 25 24 23 22 21 20 19 18 17 16 15
+ 14 13 12 11 10 9 8 7 6 5 4 3 2 1
+ 0 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 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 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
+ 0 0 1 0 0 4 2 4 1 0 1 4 9 2
+ 10 4 15 10 5 0 16 12 8 4 0 22 19 16
+ 13 10 7 4 1 32 30 28 26 24 22 20 18 16
+ 14 12 10 8 6 4 2 0 49 48 47 46 45 44
+ 43 42 41 40 39 38 37 36 35 34 33 32 31 30
+ 29 28 27 26 25 24 23 22 21 20 19 18 17 16
+ 15 14 13 12 11 10 9 8 7 6 5 4 3 2
+ 1 0 100 100 100 100 100 100 100 100 100 100 100 100
+ 100 100 100 100 100 100 100 100 100 100 100 100 100 100
+ 100 100 100 100 100 100 100 100 100 100 100 100 100 100
+ 100 100 100 100 100 100 100 100 100 100 100 100 100 100
+ 100 100 100 100 100 100 100 100 100 100 100 100 100 100
+ 100 100 100 100 100 100 100 100 100 100 100 100 100 100
+ 100 100 100 100 100 100 100 100 100 100 100 100 100 100
+ 100 100 100 100
+ 0 1 2 1 1 5 3 5 2 1 2 5 10 3
+ 11 5 16 11 6 1 17 13 9 5 1 23 20 17
+ 14 11 8 5 2 33 31 29 27 25 23 21 19 17
+ 15 13 11 9 7 5 3 1 50 49 48 47 46 45
+ 44 43 42 41 40 39 38 37 36 35 34 33 32 31
+ 30 29 28 27 26 25 24 23 22 21 20 19 18 17
+ 16 15 14 13 12 11 10 9 8 7 6 5 4 3
+ 2 1 0 101 101 101 101 101 101 101 101 101 101 101
+ 101 101 101 101 101 101 101 101 101 101 101 101 101 101
+ 101 101 101 101 101 101 101 101 101 101 101 101 101 101
+ 101 101 101 101 101 101 101 101 101 101 101 101 101 101
+ 101 101 101 101 101 101 101 101 101 101 101 101 101 101
+ 101 101 101 101 101 101 101 101 101 101 101 101 101 101
+ 101 101 101 101 101 101 101 101 101 101 101 101 101 101
+ 101 101 101 101
+ 0 0 0 2 2 0 4 6 3 2 3 6 11 4
+ 12 6 0 12 7 2 18 14 10 6 2 24 21 18
+ 15 12 9 6 3 0 32 30 28 26 24 22 20 18
+ 16 14 12 10 8 6 4 2 0 50 49 48 47 46
+ 45 44 43 42 41 40 39 38 37 36 35 34 33 32
+ 31 30 29 28 27 26 25 24 23 22 21 20 19 18
+ 17 16 15 14 13 12 11 10 9 8 7 6 5 4
+ 3 2 1 0 102 102 102 102 102 102 102 102 102 102
+ 102 102 102 102 102 102 102 102 102 102 102 102 102 102
+ 102 102 102 102 102 102 102 102 102 102 102 102 102 102
+ 102 102 102 102 102 102 102 102 102 102 102 102 102 102
+ 102 102 102 102 102 102 102 102 102 102 102 102 102 102
+ 102 102 102 102 102 102 102 102 102 102 102 102 102 102
+ 102 102 102 102 102 102 102 102 102 102 102 102 102 102
+ 102 102 102 102
+ 0 1 1 3 3 1 5 7 4 3 4 7 12 5
+ 13 7 1 13 8 3 19 15 11 7 3 25 22 19
+ 16 13 10 7 4 1 33 31 29 27 25 23 21 19
+ 17 15 13 11 9 7 5 3 1 51 50 49 48 47
+ 46 45 44 43 42 41 40 39 38 37 36 35 34 33
+ 32 31 30 29 28 27 26 25 24 23 22 21 20 19
+ 18 17 16 15 14 13 12 11 10 9 8 7 6 5
+ 4 3 2 1 0 103 103 103 103 103 103 103 103 103
+ 103 103 103 103 103 103 103 103 103 103 103 103 103 103
+ 103 103 103 103 103 103 103 103 103 103 103 103 103 103
+ 103 103 103 103 103 103 103 103 103 103 103 103 103 103
+ 103 103 103 103 103 103 103 103 103 103 103 103 103 103
+ 103 103 103 103 103 103 103 103 103 103 103 103 103 103
+ 103 103 103 103 103 103 103 103 103 103 103 103 103 103
+ 103 103 103 103
+ 0 0 2 0 4 2 6 0 5 4 5 8 0 6
+ 14 8 2 14 9 4 20 16 12 8 4 0 23 20
+ 17 14 11 8 5 2 34 32 30 28 26 24 22 20
+ 18 16 14 12 10 8 6 4 2 0 51 50 49 48
+ 47 46 45 44 43 42 41 40 39 38 37 36 35 34
+ 33 32 31 30 29 28 27 26 25 24 23 22 21 20
+ 19 18 17 16 15 14 13 12 11 10 9 8 7 6
+ 5 4 3 2 1 0 104 104 104 104 104 104 104 104
+ 104 104 104 104 104 104 104 104 104 104 104 104 104 104
+ 104 104 104 104 104 104 104 104 104 104 104 104 104 104
+ 104 104 104 104 104 104 104 104 104 104 104 104 104 104
+ 104 104 104 104 104 104 104 104 104 104 104 104 104 104
+ 104 104 104 104 104 104 104 104 104 104 104 104 104 104
+ 104 104 104 104 104 104 104 104 104 104 104 104 104 104
+ 104 104 104 104
+ 0 1 0 1 0 3 0 1 6 5 6 9 1 7
+ 0 9 3 15 10 5 0 17 13 9 5 1 24 21
+ 18 15 12 9 6 3 0 33 31 29 27 25 23 21
+ 19 17 15 13 11 9 7 5 3 1 52 51 50 49
+ 48 47 46 45 44 43 42 41 40 39 38 37 36 35
+ 34 33 32 31 30 29 28 27 26 25 24 23 22 21
+ 20 19 18 17 16 15 14 13 12 11 10 9 8 7
+ 6 5 4 3 2 1 0 105 105 105 105 105 105 105
+ 105 105 105 105 105 105 105 105 105 105 105 105 105 105
+ 105 105 105 105 105 105 105 105 105 105 105 105 105 105
+ 105 105 105 105 105 105 105 105 105 105 105 105 105 105
+ 105 105 105 105 105 105 105 105 105 105 105 105 105 105
+ 105 105 105 105 105 105 105 105 105 105 105 105 105 105
+ 105 105 105 105 105 105 105 105 105 105 105 105 105 105
+ 105 105 105 105
+ 0 0 1 2 1 4 1 2 7 6 7 10 2 8
+ 1 10 4 16 11 6 1 18 14 10 6 2 25 22
+ 19 16 13 10 7 4 1 34 32 30 28 26 24 22
+ 20 18 16 14 12 10 8 6 4 2 0 52 51 50
+ 49 48 47 46 45 44 43 42 41 40 39 38 37 36
+ 35 34 33 32 31 30 29 28 27 26 25 24 23 22
+ 21 20 19 18 17 16 15 14 13 12 11 10 9 8
+ 7 6 5 4 3 2 1 0 106 106 106 106 106 106
+ 106 106 106 106 106 106 106 106 106 106 106 106 106 106
+ 106 106 106 106 106 106 106 106 106 106 106 106 106 106
+ 106 106 106 106 106 106 106 106 106 106 106 106 106 106
+ 106 106 106 106 106 106 106 106 106 106 106 106 106 106
+ 106 106 106 106 106 106 106 106 106 106 106 106 106 106
+ 106 106 106 106 106 106 106 106 106 106 106 106 106 106
+ 106 106 106 106
+ 0 1 2 3 2 5 2 3 8 7 8 11 3 9
+ 2 11 5 17 12 7 2 19 15 11 7 3 26 23
+ 20 17 14 11 8 5 2 35 33 31 29 27 25 23
+ 21 19 17 15 13 11 9 7 5 3 1 53 52 51
+ 50 49 48 47 46 45 44 43 42 41 40 39 38 37
+ 36 35 34 33 32 31 30 29 28 27 26 25 24 23
+ 22 21 20 19 18 17 16 15 14 13 12 11 10 9
+ 8 7 6 5 4 3 2 1 0 107 107 107 107 107
+ 107 107 107 107 107 107 107 107 107 107 107 107 107 107
+ 107 107 107 107 107 107 107 107 107 107 107 107 107 107
+ 107 107 107 107 107 107 107 107 107 107 107 107 107 107
+ 107 107 107 107 107 107 107 107 107 107 107 107 107 107
+ 107 107 107 107 107 107 107 107 107 107 107 107 107 107
+ 107 107 107 107 107 107 107 107 107 107 107 107 107 107
+ 107 107 107 107
+ 0 0 0 0 3 0 3 4 0 8 9 0 4 10
+ 3 12 6 0 13 8 3 20 16 12 8 4 0 24
+ 21 18 15 12 9 6 3 0 34 32 30 28 26 24
+ 22 20 18 16 14 12 10 8 6 4 2 0 53 52
+ 51 50 49 48 47 46 45 44 43 42 41 40 39 38
+ 37 36 35 34 33 32 31 30 29 28 27 26 25 24
+ 23 22 21 20 19 18 17 16 15 14 13 12 11 10
+ 9 8 7 6 5 4 3 2 1 0 108 108 108 108
+ 108 108 108 108 108 108 108 108 108 108 108 108 108 108
+ 108 108 108 108 108 108 108 108 108 108 108 108 108 108
+ 108 108 108 108 108 108 108 108 108 108 108 108 108 108
+ 108 108 108 108 108 108 108 108 108 108 108 108 108 108
+ 108 108 108 108 108 108 108 108 108 108 108 108 108 108
+ 108 108 108 108 108 108 108 108 108 108 108 108 108 108
+ 108 108 108 108
+ 0 1 1 1 4 1 4 5 1 9 10 1 5 11
+ 4 13 7 1 14 9 4 21 17 13 9 5 1 25
+ 22 19 16 13 10 7 4 1 35 33 31 29 27 25
+ 23 21 19 17 15 13 11 9 7 5 3 1 54 53
+ 52 51 50 49 48 47 46 45 44 43 42 41 40 39
+ 38 37 36 35 34 33 32 31 30 29 28 27 26 25
+ 24 23 22 21 20 19 18 17 16 15 14 13 12 11
+ 10 9 8 7 6 5 4 3 2 1 0 109 109 109
+ 109 109 109 109 109 109 109 109 109 109 109 109 109 109
+ 109 109 109 109 109 109 109 109 109 109 109 109 109 109
+ 109 109 109 109 109 109 109 109 109 109 109 109 109 109
+ 109 109 109 109 109 109 109 109 109 109 109 109 109 109
+ 109 109 109 109 109 109 109 109 109 109 109 109 109 109
+ 109 109 109 109 109 109 109 109 109 109 109 109 109 109
+ 109 109 109 109
+ 0 0 2 2 0 2 5 6 2 0 0 2 6 12
+ 5 14 8 2 15 10 5 0 18 14 10 6 2 26
+ 23 20 17 14 11 8 5 2 36 34 32 30 28 26
+ 24 22 20 18 16 14 12 10 8 6 4 2 0 54
+ 53 52 51 50 49 48 47 46 45 44 43 42 41 40
+ 39 38 37 36 35 34 33 32 31 30 29 28 27 26
+ 25 24 23 22 21 20 19 18 17 16 15 14 13 12
+ 11 10 9 8 7 6 5 4 3 2 1 0 110 110
+ 110 110 110 110 110 110 110 110 110 110 110 110 110 110
+ 110 110 110 110 110 110 110 110 110 110 110 110 110 110
+ 110 110 110 110 110 110 110 110 110 110 110 110 110 110
+ 110 110 110 110 110 110 110 110 110 110 110 110 110 110
+ 110 110 110 110 110 110 110 110 110 110 110 110 110 110
+ 110 110 110 110 110 110 110 110 110 110 110 110 110 110
+ 110 110 110 110
+ 0 1 0 3 1 3 6 7 3 1 1 3 7 13
+ 6 15 9 3 16 11 6 1 19 15 11 7 3 27
+ 24 21 18 15 12 9 6 3 0 35 33 31 29 27
+ 25 23 21 19 17 15 13 11 9 7 5 3 1 55
+ 54 53 52 51 50 49 48 47 46 45 44 43 42 41
+ 40 39 38 37 36 35 34 33 32 31 30 29 28 27
+ 26 25 24 23 22 21 20 19 18 17 16 15 14 13
+ 12 11 10 9 8 7 6 5 4 3 2 1 0 111
+ 111 111 111 111 111 111 111 111 111 111 111 111 111 111
+ 111 111 111 111 111 111 111 111 111 111 111 111 111 111
+ 111 111 111 111 111 111 111 111 111 111 111 111 111 111
+ 111 111 111 111 111 111 111 111 111 111 111 111 111 111
+ 111 111 111 111 111 111 111 111 111 111 111 111 111 111
+ 111 111 111 111 111 111 111 111 111 111 111 111 111 111
+ 111 111 111 111
+ 0 0 1 0 2 4 0 0 4 2 2 4 8 0
+ 7 0 10 4 17 12 7 2 20 16 12 8 4 0
+ 25 22 19 16 13 10 7 4 1 36 34 32 30 28
+ 26 24 22 20 18 16 14 12 10 8 6 4 2 0
+ 55 54 53 52 51 50 49 48 47 46 45 44 43 42
+ 41 40 39 38 37 36 35 34 33 32 31 30 29 28
+ 27 26 25 24 23 22 21 20 19 18 17 16 15 14
+ 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ 112 112 112 112 112 112 112 112 112 112 112 112 112 112
+ 112 112 112 112 112 112 112 112 112 112 112 112 112 112
+ 112 112 112 112 112 112 112 112 112 112 112 112 112 112
+ 112 112 112 112 112 112 112 112 112 112 112 112 112 112
+ 112 112 112 112 112 112 112 112 112 112 112 112 112 112
+ 112 112 112 112 112 112 112 112 112 112 112 112 112 112
+ 112 112 112 112
+ 0 1 2 1 3 5 1 1 5 3 3 5 9 1
+ 8 1 11 5 18 13 8 3 21 17 13 9 5 1
+ 26 23 20 17 14 11 8 5 2 37 35 33 31 29
+ 27 25 23 21 19 17 15 13 11 9 7 5 3 1
+ 56 55 54 53 52 51 50 49 48 47 46 45 44 43
+ 42 41 40 39 38 37 36 35 34 33 32 31 30 29
+ 28 27 26 25 24 23 22 21 20 19 18 17 16 15
+ 14 13 12 11 10 9 8 7 6 5 4 3 2 1
+ 0 113 113 113 113 113 113 113 113 113 113 113 113 113
+ 113 113 113 113 113 113 113 113 113 113 113 113 113 113
+ 113 113 113 113 113 113 113 113 113 113 113 113 113 113
+ 113 113 113 113 113 113 113 113 113 113 113 113 113 113
+ 113 113 113 113 113 113 113 113 113 113 113 113 113 113
+ 113 113 113 113 113 113 113 113 113 113 113 113 113 113
+ 113 113 113 113
+ 0 0 0 2 4 0 2 2 6 4 4 6 10 2
+ 9 2 12 6 0 14 9 4 22 18 14 10 6 2
+ 27 24 21 18 15 12 9 6 3 0 36 34 32 30
+ 28 26 24 22 20 18 16 14 12 10 8 6 4 2
+ 0 56 55 54 53 52 51 50 49 48 47 46 45 44
+ 43 42 41 40 39 38 37 36 35 34 33 32 31 30
+ 29 28 27 26 25 24 23 22 21 20 19 18 17 16
+ 15 14 13 12 11 10 9 8 7 6 5 4 3 2
+ 1 0 114 114 114 114 114 114 114 114 114 114 114 114
+ 114 114 114 114 114 114 114 114 114 114 114 114 114 114
+ 114 114 114 114 114 114 114 114 114 114 114 114 114 114
+ 114 114 114 114 114 114 114 114 114 114 114 114 114 114
+ 114 114 114 114 114 114 114 114 114 114 114 114 114 114
+ 114 114 114 114 114 114 114 114 114 114 114 114 114 114
+ 114 114 114 114
+ 0 1 1 3 0 1 3 3 7 5 5 7 11 3
+ 10 3 13 7 1 15 10 5 0 19 15 11 7 3
+ 28 25 22 19 16 13 10 7 4 1 37 35 33 31
+ 29 27 25 23 21 19 17 15 13 11 9 7 5 3
+ 1 57 56 55 54 53 52 51 50 49 48 47 46 45
+ 44 43 42 41 40 39 38 37 36 35 34 33 32 31
+ 30 29 28 27 26 25 24 23 22 21 20 19 18 17
+ 16 15 14 13 12 11 10 9 8 7 6 5 4 3
+ 2 1 0 115 115 115 115 115 115 115 115 115 115 115
+ 115 115 115 115 115 115 115 115 115 115 115 115 115 115
+ 115 115 115 115 115 115 115 115 115 115 115 115 115 115
+ 115 115 115 115 115 115 115 115 115 115 115 115 115 115
+ 115 115 115 115 115 115 115 115 115 115 115 115 115 115
+ 115 115 115 115 115 115 115 115 115 115 115 115 115 115
+ 115 115 115 115
+ 0 0 2 0 1 2 4 4 8 6 6 8 12 4
+ 11 4 14 8 2 16 11 6 1 20 16 12 8 4
+ 0 26 23 20 17 14 11 8 5 2 38 36 34 32
+ 30 28 26 24 22 20 18 16 14 12 10 8 6 4
+ 2 0 57 56 55 54 53 52 51 50 49 48 47 46
+ 45 44 43 42 41 40 39 38 37 36 35 34 33 32
+ 31 30 29 28 27 26 25 24 23 22 21 20 19 18
+ 17 16 15 14 13 12 11 10 9 8 7 6 5 4
+ 3 2 1 0 116 116 116 116 116 116 116 116 116 116
+ 116 116 116 116 116 116 116 116 116 116 116 116 116 116
+ 116 116 116 116 116 116 116 116 116 116 116 116 116 116
+ 116 116 116 116 116 116 116 116 116 116 116 116 116 116
+ 116 116 116 116 116 116 116 116 116 116 116 116 116 116
+ 116 116 116 116 116 116 116 116 116 116 116 116 116 116
+ 116 116 116 116
+ 0 1 0 1 2 3 5 5 0 7 7 9 0 5
+ 12 5 15 9 3 17 12 7 2 21 17 13 9 5
+ 1 27 24 21 18 15 12 9 6 3 0 37 35 33
+ 31 29 27 25 23 21 19 17 15 13 11 9 7 5
+ 3 1 58 57 56 55 54 53 52 51 50 49 48 47
+ 46 45 44 43 42 41 40 39 38 37 36 35 34 33
+ 32 31 30 29 28 27 26 25 24 23 22 21 20 19
+ 18 17 16 15 14 13 12 11 10 9 8 7 6 5
+ 4 3 2 1 0 117 117 117 117 117 117 117 117 117
+ 117 117 117 117 117 117 117 117 117 117 117 117 117 117
+ 117 117 117 117 117 117 117 117 117 117 117 117 117 117
+ 117 117 117 117 117 117 117 117 117 117 117 117 117 117
+ 117 117 117 117 117 117 117 117 117 117 117 117 117 117
+ 117 117 117 117 117 117 117 117 117 117 117 117 117 117
+ 117 117 117 117
+ 0 0 1 2 3 4 6 6 1 8 8 10 1 6
+ 13 6 16 10 4 18 13 8 3 22 18 14 10 6
+ 2 28 25 22 19 16 13 10 7 4 1 38 36 34
+ 32 30 28 26 24 22 20 18 16 14 12 10 8 6
+ 4 2 0 58 57 56 55 54 53 52 51 50 49 48
+ 47 46 45 44 43 42 41 40 39 38 37 36 35 34
+ 33 32 31 30 29 28 27 26 25 24 23 22 21 20
+ 19 18 17 16 15 14 13 12 11 10 9 8 7 6
+ 5 4 3 2 1 0 118 118 118 118 118 118 118 118
+ 118 118 118 118 118 118 118 118 118 118 118 118 118 118
+ 118 118 118 118 118 118 118 118 118 118 118 118 118 118
+ 118 118 118 118 118 118 118 118 118 118 118 118 118 118
+ 118 118 118 118 118 118 118 118 118 118 118 118 118 118
+ 118 118 118 118 118 118 118 118 118 118 118 118 118 118
+ 118 118 118 118
+ 0 1 2 3 4 5 0 7 2 9 9 11 2 7
+ 14 7 0 11 5 19 14 9 4 23 19 15 11 7
+ 3 29 26 23 20 17 14 11 8 5 2 39 37 35
+ 33 31 29 27 25 23 21 19 17 15 13 11 9 7
+ 5 3 1 59 58 57 56 55 54 53 52 51 50 49
+ 48 47 46 45 44 43 42 41 40 39 38 37 36 35
+ 34 33 32 31 30 29 28 27 26 25 24 23 22 21
+ 20 19 18 17 16 15 14 13 12 11 10 9 8 7
+ 6 5 4 3 2 1 0 119 119 119 119 119 119 119
+ 119 119 119 119 119 119 119 119 119 119 119 119 119 119
+ 119 119 119 119 119 119 119 119 119 119 119 119 119 119
+ 119 119 119 119 119 119 119 119 119 119 119 119 119 119
+ 119 119 119 119 119 119 119 119 119 119 119 119 119 119
+ 119 119 119 119 119 119 119 119 119 119 119 119 119 119
+ 119 119 119 119
+ 0 0 0 0 0 0 1 0 3 0 10 0 3 8
+ 0 8 1 12 6 0 15 10 5 0 20 16 12 8
+ 4 0 27 24 21 18 15 12 9 6 3 0 38 36
+ 34 32 30 28 26 24 22 20 18 16 14 12 10 8
+ 6 4 2 0 59 58 57 56 55 54 53 52 51 50
+ 49 48 47 46 45 44 43 42 41 40 39 38 37 36
+ 35 34 33 32 31 30 29 28 27 26 25 24 23 22
+ 21 20 19 18 17 16 15 14 13 12 11 10 9 8
+ 7 6 5 4 3 2 1 0 120 120 120 120 120 120
+ 120 120 120 120 120 120 120 120 120 120 120 120 120 120
+ 120 120 120 120 120 120 120 120 120 120 120 120 120 120
+ 120 120 120 120 120 120 120 120 120 120 120 120 120 120
+ 120 120 120 120 120 120 120 120 120 120 120 120 120 120
+ 120 120 120 120 120 120 120 120 120 120 120 120 120 120
+ 120 120 120 120
+ 0 1 1 1 1 1 2 1 4 1 0 1 4 9
+ 1 9 2 13 7 1 16 11 6 1 21 17 13 9
+ 5 1 28 25 22 19 16 13 10 7 4 1 39 37
+ 35 33 31 29 27 25 23 21 19 17 15 13 11 9
+ 7 5 3 1 60 59 58 57 56 55 54 53 52 51
+ 50 49 48 47 46 45 44 43 42 41 40 39 38 37
+ 36 35 34 33 32 31 30 29 28 27 26 25 24 23
+ 22 21 20 19 18 17 16 15 14 13 12 11 10 9
+ 8 7 6 5 4 3 2 1 0 121 121 121 121 121
+ 121 121 121 121 121 121 121 121 121 121 121 121 121 121
+ 121 121 121 121 121 121 121 121 121 121 121 121 121 121
+ 121 121 121 121 121 121 121 121 121 121 121 121 121 121
+ 121 121 121 121 121 121 121 121 121 121 121 121 121 121
+ 121 121 121 121 121 121 121 121 121 121 121 121 121 121
+ 121 121 121 121
+ 0 0 2 2 2 2 3 2 5 2 1 2 5 10
+ 2 10 3 14 8 2 17 12 7 2 22 18 14 10
+ 6 2 29 26 23 20 17 14 11 8 5 2 40 38
+ 36 34 32 30 28 26 24 22 20 18 16 14 12 10
+ 8 6 4 2 0 60 59 58 57 56 55 54 53 52
+ 51 50 49 48 47 46 45 44 43 42 41 40 39 38
+ 37 36 35 34 33 32 31 30 29 28 27 26 25 24
+ 23 22 21 20 19 18 17 16 15 14 13 12 11 10
+ 9 8 7 6 5 4 3 2 1 0 122 122 122 122
+ 122 122 122 122 122 122 122 122 122 122 122 122 122 122
+ 122 122 122 122 122 122 122 122 122 122 122 122 122 122
+ 122 122 122 122 122 122 122 122 122 122 122 122 122 122
+ 122 122 122 122 122 122 122 122 122 122 122 122 122 122
+ 122 122 122 122 122 122 122 122 122 122 122 122 122 122
+ 122 122 122 122
+ 0 1 0 3 3 3 4 3 6 3 2 3 6 11
+ 3 11 4 15 9 3 18 13 8 3 23 19 15 11
+ 7 3 30 27 24 21 18 15 12 9 6 3 0 39
+ 37 35 33 31 29 27 25 23 21 19 17 15 13 11
+ 9 7 5 3 1 61 60 59 58 57 56 55 54 53
+ 52 51 50 49 48 47 46 45 44 43 42 41 40 39
+ 38 37 36 35 34 33 32 31 30 29 28 27 26 25
+ 24 23 22 21 20 19 18 17 16 15 14 13 12 11
+ 10 9 8 7 6 5 4 3 2 1 0 123 123 123
+ 123 123 123 123 123 123 123 123 123 123 123 123 123 123
+ 123 123 123 123 123 123 123 123 123 123 123 123 123 123
+ 123 123 123 123 123 123 123 123 123 123 123 123 123 123
+ 123 123 123 123 123 123 123 123 123 123 123 123 123 123
+ 123 123 123 123 123 123 123 123 123 123 123 123 123 123
+ 123 123 123 123
+ 0 0 1 0 4 4 5 4 7 4 3 4 7 12
+ 4 12 5 16 10 4 19 14 9 4 24 20 16 12
+ 8 4 0 28 25 22 19 16 13 10 7 4 1 40
+ 38 36 34 32 30 28 26 24 22 20 18 16 14 12
+ 10 8 6 4 2 0 61 60 59 58 57 56 55 54
+ 53 52 51 50 49 48 47 46 45 44 43 42 41 40
+ 39 38 37 36 35 34 33 32 31 30 29 28 27 26
+ 25 24 23 22 21 20 19 18 17 16 15 14 13 12
+ 11 10 9 8 7 6 5 4 3 2 1 0 124 124
+ 124 124 124 124 124 124 124 124 124 124 124 124 124 124
+ 124 124 124 124 124 124 124 124 124 124 124 124 124 124
+ 124 124 124 124 124 124 124 124 124 124 124 124 124 124
+ 124 124 124 124 124 124 124 124 124 124 124 124 124 124
+ 124 124 124 124 124 124 124 124 124 124 124 124 124 124
+ 124 124 124 124
+ 0 1 2 1 0 5 6 5 8 5 4 5 8 13
+ 5 13 6 17 11 5 20 15 10 5 0 21 17 13
+ 9 5 1 29 26 23 20 17 14 11 8 5 2 41
+ 39 37 35 33 31 29 27 25 23 21 19 17 15 13
+ 11 9 7 5 3 1 62 61 60 59 58 57 56 55
+ 54 53 52 51 50 49 48 47 46 45 44 43 42 41
+ 40 39 38 37 36 35 34 33 32 31 30 29 28 27
+ 26 25 24 23 22 21 20 19 18 17 16 15 14 13
+ 12 11 10 9 8 7 6 5 4 3 2 1 0 125
+ 125 125 125 125 125 125 125 125 125 125 125 125 125 125
+ 125 125 125 125 125 125 125 125 125 125 125 125 125 125
+ 125 125 125 125 125 125 125 125 125 125 125 125 125 125
+ 125 125 125 125 125 125 125 125 125 125 125 125 125 125
+ 125 125 125 125 125 125 125 125 125 125 125 125 125 125
+ 125 125 125 125
+ 0 0 0 2 1 0 0 6 0 6 5 6 9 0
+ 6 14 7 0 12 6 0 16 11 6 1 22 18 14
+ 10 6 2 30 27 24 21 18 15 12 9 6 3 0
+ 40 38 36 34 32 30 28 26 24 22 20 18 16 14
+ 12 10 8 6 4 2 0 62 61 60 59 58 57 56
+ 55 54 53 52 51 50 49 48 47 46 45 44 43 42
+ 41 40 39 38 37 36 35 34 33 32 31 30 29 28
+ 27 26 25 24 23 22 21 20 19 18 17 16 15 14
+ 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ 126 126 126 126 126 126 126 126 126 126 126 126 126 126
+ 126 126 126 126 126 126 126 126 126 126 126 126 126 126
+ 126 126 126 126 126 126 126 126 126 126 126 126 126 126
+ 126 126 126 126 126 126 126 126 126 126 126 126 126 126
+ 126 126 126 126 126 126 126 126 126 126 126 126 126 126
+ 126 126 126 126
+ 0 1 1 3 2 1 1 7 1 7 6 7 10 1
+ 7 15 8 1 13 7 1 17 12 7 2 23 19 15
+ 11 7 3 31 28 25 22 19 16 13 10 7 4 1
+ 41 39 37 35 33 31 29 27 25 23 21 19 17 15
+ 13 11 9 7 5 3 1 63 62 61 60 59 58 57
+ 56 55 54 53 52 51 50 49 48 47 46 45 44 43
+ 42 41 40 39 38 37 36 35 34 33 32 31 30 29
+ 28 27 26 25 24 23 22 21 20 19 18 17 16 15
+ 14 13 12 11 10 9 8 7 6 5 4 3 2 1
+ 0 127 127 127 127 127 127 127 127 127 127 127 127 127
+ 127 127 127 127 127 127 127 127 127 127 127 127 127 127
+ 127 127 127 127 127 127 127 127 127 127 127 127 127 127
+ 127 127 127 127 127 127 127 127 127 127 127 127 127 127
+ 127 127 127 127 127 127 127 127 127 127 127 127 127 127
+ 127 127 127 127
+ 0 0 2 0 3 2 2 0 2 8 7 8 11 2
+ 8 0 9 2 14 8 2 18 13 8 3 24 20 16
+ 12 8 4 0 29 26 23 20 17 14 11 8 5 2
+ 42 40 38 36 34 32 30 28 26 24 22 20 18 16
+ 14 12 10 8 6 4 2 0 63 62 61 60 59 58
+ 57 56 55 54 53 52 51 50 49 48 47 46 45 44
+ 43 42 41 40 39 38 37 36 35 34 33 32 31 30
+ 29 28 27 26 25 24 23 22 21 20 19 18 17 16
+ 15 14 13 12 11 10 9 8 7 6 5 4 3 2
+ 1 0 128 128 128 128 128 128 128 128 128 128 128 128
+ 128 128 128 128 128 128 128 128 128 128 128 128 128 128
+ 128 128 128 128 128 128 128 128 128 128 128 128 128 128
+ 128 128 128 128 128 128 128 128 128 128 128 128 128 128
+ 128 128 128 128 128 128 128 128 128 128 128 128 128 128
+ 128 128 128 128
+ 0 1 0 1 4 3 3 1 3 9 8 9 12 3
+ 9 1 10 3 15 9 3 19 14 9 4 25 21 17
+ 13 9 5 1 30 27 24 21 18 15 12 9 6 3
+ 0 41 39 37 35 33 31 29 27 25 23 21 19 17
+ 15 13 11 9 7 5 3 1 64 63 62 61 60 59
+ 58 57 56 55 54 53 52 51 50 49 48 47 46 45
+ 44 43 42 41 40 39 38 37 36 35 34 33 32 31
+ 30 29 28 27 26 25 24 23 22 21 20 19 18 17
+ 16 15 14 13 12 11 10 9 8 7 6 5 4 3
+ 2 1 0 129 129 129 129 129 129 129 129 129 129 129
+ 129 129 129 129 129 129 129 129 129 129 129 129 129 129
+ 129 129 129 129 129 129 129 129 129 129 129 129 129 129
+ 129 129 129 129 129 129 129 129 129 129 129 129 129 129
+ 129 129 129 129 129 129 129 129 129 129 129 129 129 129
+ 129 129 129 129
+ 0 0 1 2 0 4 4 2 4 0 9 10 0 4
+ 10 2 11 4 16 10 4 20 15 10 5 0 22 18
+ 14 10 6 2 31 28 25 22 19 16 13 10 7 4
+ 1 42 40 38 36 34 32 30 28 26 24 22 20 18
+ 16 14 12 10 8 6 4 2 0 64 63 62 61 60
+ 59 58 57 56 55 54 53 52 51 50 49 48 47 46
+ 45 44 43 42 41 40 39 38 37 36 35 34 33 32
+ 31 30 29 28 27 26 25 24 23 22 21 20 19 18
+ 17 16 15 14 13 12 11 10 9 8 7 6 5 4
+ 3 2 1 0 130 130 130 130 130 130 130 130 130 130
+ 130 130 130 130 130 130 130 130 130 130 130 130 130 130
+ 130 130 130 130 130 130 130 130 130 130 130 130 130 130
+ 130 130 130 130 130 130 130 130 130 130 130 130 130 130
+ 130 130 130 130 130 130 130 130 130 130 130 130 130 130
+ 130 130 130 130
+ 0 1 2 3 1 5 5 3 5 1 10 11 1 5
+ 11 3 12 5 17 11 5 21 16 11 6 1 23 19
+ 15 11 7 3 32 29 26 23 20 17 14 11 8 5
+ 2 43 41 39 37 35 33 31 29 27 25 23 21 19
+ 17 15 13 11 9 7 5 3 1 65 64 63 62 61
+ 60 59 58 57 56 55 54 53 52 51 50 49 48 47
+ 46 45 44 43 42 41 40 39 38 37 36 35 34 33
+ 32 31 30 29 28 27 26 25 24 23 22 21 20 19
+ 18 17 16 15 14 13 12 11 10 9 8 7 6 5
+ 4 3 2 1 0 131 131 131 131 131 131 131 131 131
+ 131 131 131 131 131 131 131 131 131 131 131 131 131 131
+ 131 131 131 131 131 131 131 131 131 131 131 131 131 131
+ 131 131 131 131 131 131 131 131 131 131 131 131 131 131
+ 131 131 131 131 131 131 131 131 131 131 131 131 131 131
+ 131 131 131 131
+ 0 0 0 0 2 0 6 4 6 2 0 0 2 6
+ 12 4 13 6 18 12 6 0 17 12 7 2 24 20
+ 16 12 8 4 0 30 27 24 21 18 15 12 9 6
+ 3 0 42 40 38 36 34 32 30 28 26 24 22 20
+ 18 16 14 12 10 8 6 4 2 0 65 64 63 62
+ 61 60 59 58 57 56 55 54 53 52 51 50 49 48
+ 47 46 45 44 43 42 41 40 39 38 37 36 35 34
+ 33 32 31 30 29 28 27 26 25 24 23 22 21 20
+ 19 18 17 16 15 14 13 12 11 10 9 8 7 6
+ 5 4 3 2 1 0 132 132 132 132 132 132 132 132
+ 132 132 132 132 132 132 132 132 132 132 132 132 132 132
+ 132 132 132 132 132 132 132 132 132 132 132 132 132 132
+ 132 132 132 132 132 132 132 132 132 132 132 132 132 132
+ 132 132 132 132 132 132 132 132 132 132 132 132 132 132
+ 132 132 132 132
+ 0 1 1 1 3 1 0 5 7 3 1 1 3 7
+ 13 5 14 7 0 13 7 1 18 13 8 3 25 21
+ 17 13 9 5 1 31 28 25 22 19 16 13 10 7
+ 4 1 43 41 39 37 35 33 31 29 27 25 23 21
+ 19 17 15 13 11 9 7 5 3 1 66 65 64 63
+ 62 61 60 59 58 57 56 55 54 53 52 51 50 49
+ 48 47 46 45 44 43 42 41 40 39 38 37 36 35
+ 34 33 32 31 30 29 28 27 26 25 24 23 22 21
+ 20 19 18 17 16 15 14 13 12 11 10 9 8 7
+ 6 5 4 3 2 1 0 133 133 133 133 133 133 133
+ 133 133 133 133 133 133 133 133 133 133 133 133 133 133
+ 133 133 133 133 133 133 133 133 133 133 133 133 133 133
+ 133 133 133 133 133 133 133 133 133 133 133 133 133 133
+ 133 133 133 133 133 133 133 133 133 133 133 133 133 133
+ 133 133 133 133
+ 0 0 2 2 4 2 1 6 8 4 2 2 4 8
+ 14 6 15 8 1 14 8 2 19 14 9 4 26 22
+ 18 14 10 6 2 32 29 26 23 20 17 14 11 8
+ 5 2 44 42 40 38 36 34 32 30 28 26 24 22
+ 20 18 16 14 12 10 8 6 4 2 0 66 65 64
+ 63 62 61 60 59 58 57 56 55 54 53 52 51 50
+ 49 48 47 46 45 44 43 42 41 40 39 38 37 36
+ 35 34 33 32 31 30 29 28 27 26 25 24 23 22
+ 21 20 19 18 17 16 15 14 13 12 11 10 9 8
+ 7 6 5 4 3 2 1 0 134 134 134 134 134 134
+ 134 134 134 134 134 134 134 134 134 134 134 134 134 134
+ 134 134 134 134 134 134 134 134 134 134 134 134 134 134
+ 134 134 134 134 134 134 134 134 134 134 134 134 134 134
+ 134 134 134 134 134 134 134 134 134 134 134 134 134 134
+ 134 134 134 134
+ 0 1 0 3 0 3 2 7 0 5 3 3 5 9
+ 0 7 16 9 2 15 9 3 20 15 10 5 0 23
+ 19 15 11 7 3 33 30 27 24 21 18 15 12 9
+ 6 3 0 43 41 39 37 35 33 31 29 27 25 23
+ 21 19 17 15 13 11 9 7 5 3 1 67 66 65
+ 64 63 62 61 60 59 58 57 56 55 54 53 52 51
+ 50 49 48 47 46 45 44 43 42 41 40 39 38 37
+ 36 35 34 33 32 31 30 29 28 27 26 25 24 23
+ 22 21 20 19 18 17 16 15 14 13 12 11 10 9
+ 8 7 6 5 4 3 2 1 0 135 135 135 135 135
+ 135 135 135 135 135 135 135 135 135 135 135 135 135 135
+ 135 135 135 135 135 135 135 135 135 135 135 135 135 135
+ 135 135 135 135 135 135 135 135 135 135 135 135 135 135
+ 135 135 135 135 135 135 135 135 135 135 135 135 135 135
+ 135 135 135 135
+ 0 0 1 0 1 4 3 0 1 6 4 4 6 10
+ 1 8 0 10 3 16 10 4 21 16 11 6 1 24
+ 20 16 12 8 4 0 31 28 25 22 19 16 13 10
+ 7 4 1 44 42 40 38 36 34 32 30 28 26 24
+ 22 20 18 16 14 12 10 8 6 4 2 0 67 66
+ 65 64 63 62 61 60 59 58 57 56 55 54 53 52
+ 51 50 49 48 47 46 45 44 43 42 41 40 39 38
+ 37 36 35 34 33 32 31 30 29 28 27 26 25 24
+ 23 22 21 20 19 18 17 16 15 14 13 12 11 10
+ 9 8 7 6 5 4 3 2 1 0 136 136 136 136
+ 136 136 136 136 136 136 136 136 136 136 136 136 136 136
+ 136 136 136 136 136 136 136 136 136 136 136 136 136 136
+ 136 136 136 136 136 136 136 136 136 136 136 136 136 136
+ 136 136 136 136 136 136 136 136 136 136 136 136 136 136
+ 136 136 136 136
+ 0 1 2 1 2 5 4 1 2 7 5 5 7 11
+ 2 9 1 11 4 17 11 5 22 17 12 7 2 25
+ 21 17 13 9 5 1 32 29 26 23 20 17 14 11
+ 8 5 2 45 43 41 39 37 35 33 31 29 27 25
+ 23 21 19 17 15 13 11 9 7 5 3 1 68 67
+ 66 65 64 63 62 61 60 59 58 57 56 55 54 53
+ 52 51 50 49 48 47 46 45 44 43 42 41 40 39
+ 38 37 36 35 34 33 32 31 30 29 28 27 26 25
+ 24 23 22 21 20 19 18 17 16 15 14 13 12 11
+ 10 9 8 7 6 5 4 3 2 1 0 137 137 137
+ 137 137 137 137 137 137 137 137 137 137 137 137 137 137
+ 137 137 137 137 137 137 137 137 137 137 137 137 137 137
+ 137 137 137 137 137 137 137 137 137 137 137 137 137 137
+ 137 137 137 137 137 137 137 137 137 137 137 137 137 137
+ 137 137 137 137
+ 0 0 0 2 3 0 5 2 3 8 6 6 8 12
+ 3 10 2 12 5 18 12 6 0 18 13 8 3 26
+ 22 18 14 10 6 2 33 30 27 24 21 18 15 12
+ 9 6 3 0 44 42 40 38 36 34 32 30 28 26
+ 24 22 20 18 16 14 12 10 8 6 4 2 0 68
+ 67 66 65 64 63 62 61 60 59 58 57 56 55 54
+ 53 52 51 50 49 48 47 46 45 44 43 42 41 40
+ 39 38 37 36 35 34 33 32 31 30 29 28 27 26
+ 25 24 23 22 21 20 19 18 17 16 15 14 13 12
+ 11 10 9 8 7 6 5 4 3 2 1 0 138 138
+ 138 138 138 138 138 138 138 138 138 138 138 138 138 138
+ 138 138 138 138 138 138 138 138 138 138 138 138 138 138
+ 138 138 138 138 138 138 138 138 138 138 138 138 138 138
+ 138 138 138 138 138 138 138 138 138 138 138 138 138 138
+ 138 138 138 138
+ 0 1 1 3 4 1 6 3 4 9 7 7 9 13
+ 4 11 3 13 6 19 13 7 1 19 14 9 4 27
+ 23 19 15 11 7 3 34 31 28 25 22 19 16 13
+ 10 7 4 1 45 43 41 39 37 35 33 31 29 27
+ 25 23 21 19 17 15 13 11 9 7 5 3 1 69
+ 68 67 66 65 64 63 62 61 60 59 58 57 56 55
+ 54 53 52 51 50 49 48 47 46 45 44 43 42 41
+ 40 39 38 37 36 35 34 33 32 31 30 29 28 27
+ 26 25 24 23 22 21 20 19 18 17 16 15 14 13
+ 12 11 10 9 8 7 6 5 4 3 2 1 0 139
+ 139 139 139 139 139 139 139 139 139 139 139 139 139 139
+ 139 139 139 139 139 139 139 139 139 139 139 139 139 139
+ 139 139 139 139 139 139 139 139 139 139 139 139 139 139
+ 139 139 139 139 139 139 139 139 139 139 139 139 139 139
+ 139 139 139 139
+ 0 0 2 0 0 2 0 4 5 0 8 8 10 0
+ 5 12 4 14 7 0 14 8 2 20 15 10 5 0
+ 24 20 16 12 8 4 0 32 29 26 23 20 17 14
+ 11 8 5 2 46 44 42 40 38 36 34 32 30 28
+ 26 24 22 20 18 16 14 12 10 8 6 4 2 0
+ 69 68 67 66 65 64 63 62 61 60 59 58 57 56
+ 55 54 53 52 51 50 49 48 47 46 45 44 43 42
+ 41 40 39 38 37 36 35 34 33 32 31 30 29 28
+ 27 26 25 24 23 22 21 20 19 18 17 16 15 14
+ 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ 140 140 140 140 140 140 140 140 140 140 140 140 140 140
+ 140 140 140 140 140 140 140 140 140 140 140 140 140 140
+ 140 140 140 140 140 140 140 140 140 140 140 140 140 140
+ 140 140 140 140 140 140 140 140 140 140 140 140 140 140
+ 140 140 140 140
+ 0 1 0 1 1 3 1 5 6 1 9 9 11 1
+ 6 13 5 15 8 1 15 9 3 21 16 11 6 1
+ 25 21 17 13 9 5 1 33 30 27 24 21 18 15
+ 12 9 6 3 0 45 43 41 39 37 35 33 31 29
+ 27 25 23 21 19 17 15 13 11 9 7 5 3 1
+ 70 69 68 67 66 65 64 63 62 61 60 59 58 57
+ 56 55 54 53 52 51 50 49 48 47 46 45 44 43
+ 42 41 40 39 38 37 36 35 34 33 32 31 30 29
+ 28 27 26 25 24 23 22 21 20 19 18 17 16 15
+ 14 13 12 11 10 9 8 7 6 5 4 3 2 1
+ 0 141 141 141 141 141 141 141 141 141 141 141 141 141
+ 141 141 141 141 141 141 141 141 141 141 141 141 141 141
+ 141 141 141 141 141 141 141 141 141 141 141 141 141 141
+ 141 141 141 141 141 141 141 141 141 141 141 141 141 141
+ 141 141 141 141
+ 0 0 1 2 2 4 2 6 7 2 10 10 12 2
+ 7 14 6 16 9 2 16 10 4 22 17 12 7 2
+ 26 22 18 14 10 6 2 34 31 28 25 22 19 16
+ 13 10 7 4 1 46 44 42 40 38 36 34 32 30
+ 28 26 24 22 20 18 16 14 12 10 8 6 4 2
+ 0 70 69 68 67 66 65 64 63 62 61 60 59 58
+ 57 56 55 54 53 52 51 50 49 48 47 46 45 44
+ 43 42 41 40 39 38 37 36 35 34 33 32 31 30
+ 29 28 27 26 25 24 23 22 21 20 19 18 17 16
+ 15 14 13 12 11 10 9 8 7 6 5 4 3 2
+ 1 0 142 142 142 142 142 142 142 142 142 142 142 142
+ 142 142 142 142 142 142 142 142 142 142 142 142 142 142
+ 142 142 142 142 142 142 142 142 142 142 142 142 142 142
+ 142 142 142 142 142 142 142 142 142 142 142 142 142 142
+ 142 142 142 142
+ 0 1 2 3 3 5 3 7 8 3 0 11 0 3
+ 8 15 7 17 10 3 17 11 5 23 18 13 8 3
+ 27 23 19 15 11 7 3 35 32 29 26 23 20 17
+ 14 11 8 5 2 47 45 43 41 39 37 35 33 31
+ 29 27 25 23 21 19 17 15 13 11 9 7 5 3
+ 1 71 70 69 68 67 66 65 64 63 62 61 60 59
+ 58 57 56 55 54 53 52 51 50 49 48 47 46 45
+ 44 43 42 41 40 39 38 37 36 35 34 33 32 31
+ 30 29 28 27 26 25 24 23 22 21 20 19 18 17
+ 16 15 14 13 12 11 10 9 8 7 6 5 4 3
+ 2 1 0 143 143 143 143 143 143 143 143 143 143 143
+ 143 143 143 143 143 143 143 143 143 143 143 143 143 143
+ 143 143 143 143 143 143 143 143 143 143 143 143 143 143
+ 143 143 143 143 143 143 143 143 143 143 143 143 143 143
+ 143 143 143 143
+ 0 0 0 0 4 0 4 0 0 4 1 0 1 4
+ 9 0 8 0 11 4 18 12 6 0 19 14 9 4
+ 28 24 20 16 12 8 4 0 33 30 27 24 21 18
+ 15 12 9 6 3 0 46 44 42 40 38 36 34 32
+ 30 28 26 24 22 20 18 16 14 12 10 8 6 4
+ 2 0 71 70 69 68 67 66 65 64 63 62 61 60
+ 59 58 57 56 55 54 53 52 51 50 49 48 47 46
+ 45 44 43 42 41 40 39 38 37 36 35 34 33 32
+ 31 30 29 28 27 26 25 24 23 22 21 20 19 18
+ 17 16 15 14 13 12 11 10 9 8 7 6 5 4
+ 3 2 1 0 144 144 144 144 144 144 144 144 144 144
+ 144 144 144 144 144 144 144 144 144 144 144 144 144 144
+ 144 144 144 144 144 144 144 144 144 144 144 144 144 144
+ 144 144 144 144 144 144 144 144 144 144 144 144 144 144
+ 144 144 144 144
+ 0 1 1 1 0 1 5 1 1 5 2 1 2 5
+ 10 1 9 1 12 5 19 13 7 1 20 15 10 5
+ 0 25 21 17 13 9 5 1 34 31 28 25 22 19
+ 16 13 10 7 4 1 47 45 43 41 39 37 35 33
+ 31 29 27 25 23 21 19 17 15 13 11 9 7 5
+ 3 1 72 71 70 69 68 67 66 65 64 63 62 61
+ 60 59 58 57 56 55 54 53 52 51 50 49 48 47
+ 46 45 44 43 42 41 40 39 38 37 36 35 34 33
+ 32 31 30 29 28 27 26 25 24 23 22 21 20 19
+ 18 17 16 15 14 13 12 11 10 9 8 7 6 5
+ 4 3 2 1 0 145 145 145 145 145 145 145 145 145
+ 145 145 145 145 145 145 145 145 145 145 145 145 145 145
+ 145 145 145 145 145 145 145 145 145 145 145 145 145 145
+ 145 145 145 145 145 145 145 145 145 145 145 145 145 145
+ 145 145 145 145
+ 0 0 2 2 1 2 6 2 2 6 3 2 3 6
+ 11 2 10 2 13 6 20 14 8 2 21 16 11 6
+ 1 26 22 18 14 10 6 2 35 32 29 26 23 20
+ 17 14 11 8 5 2 48 46 44 42 40 38 36 34
+ 32 30 28 26 24 22 20 18 16 14 12 10 8 6
+ 4 2 0 72 71 70 69 68 67 66 65 64 63 62
+ 61 60 59 58 57 56 55 54 53 52 51 50 49 48
+ 47 46 45 44 43 42 41 40 39 38 37 36 35 34
+ 33 32 31 30 29 28 27 26 25 24 23 22 21 20
+ 19 18 17 16 15 14 13 12 11 10 9 8 7 6
+ 5 4 3 2 1 0 146 146 146 146 146 146 146 146
+ 146 146 146 146 146 146 146 146 146 146 146 146 146 146
+ 146 146 146 146 146 146 146 146 146 146 146 146 146 146
+ 146 146 146 146 146 146 146 146 146 146 146 146 146 146
+ 146 146 146 146
+ 0 1 0 3 2 3 0 3 3 7 4 3 4 7
+ 12 3 11 3 14 7 0 15 9 3 22 17 12 7
+ 2 27 23 19 15 11 7 3 36 33 30 27 24 21
+ 18 15 12 9 6 3 0 47 45 43 41 39 37 35
+ 33 31 29 27 25 23 21 19 17 15 13 11 9 7
+ 5 3 1 73 72 71 70 69 68 67 66 65 64 63
+ 62 61 60 59 58 57 56 55 54 53 52 51 50 49
+ 48 47 46 45 44 43 42 41 40 39 38 37 36 35
+ 34 33 32 31 30 29 28 27 26 25 24 23 22 21
+ 20 19 18 17 16 15 14 13 12 11 10 9 8 7
+ 6 5 4 3 2 1 0 147 147 147 147 147 147 147
+ 147 147 147 147 147 147 147 147 147 147 147 147 147 147
+ 147 147 147 147 147 147 147 147 147 147 147 147 147 147
+ 147 147 147 147 147 147 147 147 147 147 147 147 147 147
+ 147 147 147 147
+ 0 0 1 0 3 4 1 4 4 8 5 4 5 8
+ 13 4 12 4 15 8 1 16 10 4 23 18 13 8
+ 3 28 24 20 16 12 8 4 0 34 31 28 25 22
+ 19 16 13 10 7 4 1 48 46 44 42 40 38 36
+ 34 32 30 28 26 24 22 20 18 16 14 12 10 8
+ 6 4 2 0 73 72 71 70 69 68 67 66 65 64
+ 63 62 61 60 59 58 57 56 55 54 53 52 51 50
+ 49 48 47 46 45 44 43 42 41 40 39 38 37 36
+ 35 34 33 32 31 30 29 28 27 26 25 24 23 22
+ 21 20 19 18 17 16 15 14 13 12 11 10 9 8
+ 7 6 5 4 3 2 1 0 148 148 148 148 148 148
+ 148 148 148 148 148 148 148 148 148 148 148 148 148 148
+ 148 148 148 148 148 148 148 148 148 148 148 148 148 148
+ 148 148 148 148 148 148 148 148 148 148 148 148 148 148
+ 148 148 148 148
+ 0 1 2 1 4 5 2 5 5 9 6 5 6 9
+ 14 5 13 5 16 9 2 17 11 5 24 19 14 9
+ 4 29 25 21 17 13 9 5 1 35 32 29 26 23
+ 20 17 14 11 8 5 2 49 47 45 43 41 39 37
+ 35 33 31 29 27 25 23 21 19 17 15 13 11 9
+ 7 5 3 1 74 73 72 71 70 69 68 67 66 65
+ 64 63 62 61 60 59 58 57 56 55 54 53 52 51
+ 50 49 48 47 46 45 44 43 42 41 40 39 38 37
+ 36 35 34 33 32 31 30 29 28 27 26 25 24 23
+ 22 21 20 19 18 17 16 15 14 13 12 11 10 9
+ 8 7 6 5 4 3 2 1 0 149 149 149 149 149
+ 149 149 149 149 149 149 149 149 149 149 149 149 149 149
+ 149 149 149 149 149 149 149 149 149 149 149 149 149 149
+ 149 149 149 149 149 149 149 149 149 149 149 149 149 149
+ 149 149 149 149
+ 0 0 0 2 0 0 3 6 6 0 7 6 7 10
+ 0 6 14 6 17 10 3 18 12 6 0 20 15 10
+ 5 0 26 22 18 14 10 6 2 36 33 30 27 24
+ 21 18 15 12 9 6 3 0 48 46 44 42 40 38
+ 36 34 32 30 28 26 24 22 20 18 16 14 12 10
+ 8 6 4 2 0 74 73 72 71 70 69 68 67 66
+ 65 64 63 62 61 60 59 58 57 56 55 54 53 52
+ 51 50 49 48 47 46 45 44 43 42 41 40 39 38
+ 37 36 35 34 33 32 31 30 29 28 27 26 25 24
+ 23 22 21 20 19 18 17 16 15 14 13 12 11 10
+ 9 8 7 6 5 4 3 2 1 0 150 150 150 150
+ 150 150 150 150 150 150 150 150 150 150 150 150 150 150
+ 150 150 150 150 150 150 150 150 150 150 150 150 150 150
+ 150 150 150 150 150 150 150 150 150 150 150 150 150 150
+ 150 150 150 150
+ 0 1 1 3 1 1 4 7 7 1 8 7 8 11
+ 1 7 15 7 18 11 4 19 13 7 1 21 16 11
+ 6 1 27 23 19 15 11 7 3 37 34 31 28 25
+ 22 19 16 13 10 7 4 1 49 47 45 43 41 39
+ 37 35 33 31 29 27 25 23 21 19 17 15 13 11
+ 9 7 5 3 1 75 74 73 72 71 70 69 68 67
+ 66 65 64 63 62 61 60 59 58 57 56 55 54 53
+ 52 51 50 49 48 47 46 45 44 43 42 41 40 39
+ 38 37 36 35 34 33 32 31 30 29 28 27 26 25
+ 24 23 22 21 20 19 18 17 16 15 14 13 12 11
+ 10 9 8 7 6 5 4 3 2 1 0 151 151 151
+ 151 151 151 151 151 151 151 151 151 151 151 151 151 151
+ 151 151 151 151 151 151 151 151 151 151 151 151 151 151
+ 151 151 151 151 151 151 151 151 151 151 151 151 151 151
+ 151 151 151 151
+ 0 0 2 0 2 2 5 0 8 2 9 8 9 12
+ 2 8 16 8 0 12 5 20 14 8 2 22 17 12
+ 7 2 28 24 20 16 12 8 4 0 35 32 29 26
+ 23 20 17 14 11 8 5 2 50 48 46 44 42 40
+ 38 36 34 32 30 28 26 24 22 20 18 16 14 12
+ 10 8 6 4 2 0 75 74 73 72 71 70 69 68
+ 67 66 65 64 63 62 61 60 59 58 57 56 55 54
+ 53 52 51 50 49 48 47 46 45 44 43 42 41 40
+ 39 38 37 36 35 34 33 32 31 30 29 28 27 26
+ 25 24 23 22 21 20 19 18 17 16 15 14 13 12
+ 11 10 9 8 7 6 5 4 3 2 1 0 152 152
+ 152 152 152 152 152 152 152 152 152 152 152 152 152 152
+ 152 152 152 152 152 152 152 152 152 152 152 152 152 152
+ 152 152 152 152 152 152 152 152 152 152 152 152 152 152
+ 152 152 152 152
+ 0 1 0 1 3 3 6 1 0 3 10 9 10 13
+ 3 9 0 9 1 13 6 21 15 9 3 23 18 13
+ 8 3 29 25 21 17 13 9 5 1 36 33 30 27
+ 24 21 18 15 12 9 6 3 0 49 47 45 43 41
+ 39 37 35 33 31 29 27 25 23 21 19 17 15 13
+ 11 9 7 5 3 1 76 75 74 73 72 71 70 69
+ 68 67 66 65 64 63 62 61 60 59 58 57 56 55
+ 54 53 52 51 50 49 48 47 46 45 44 43 42 41
+ 40 39 38 37 36 35 34 33 32 31 30 29 28 27
+ 26 25 24 23 22 21 20 19 18 17 16 15 14 13
+ 12 11 10 9 8 7 6 5 4 3 2 1 0 153
+ 153 153 153 153 153 153 153 153 153 153 153 153 153 153
+ 153 153 153 153 153 153 153 153 153 153 153 153 153 153
+ 153 153 153 153 153 153 153 153 153 153 153 153 153 153
+ 153 153 153 153
+ 0 0 1 2 4 4 0 2 1 4 0 10 11 0
+ 4 10 1 10 2 14 7 0 16 10 4 24 19 14
+ 9 4 30 26 22 18 14 10 6 2 37 34 31 28
+ 25 22 19 16 13 10 7 4 1 50 48 46 44 42
+ 40 38 36 34 32 30 28 26 24 22 20 18 16 14
+ 12 10 8 6 4 2 0 76 75 74 73 72 71 70
+ 69 68 67 66 65 64 63 62 61 60 59 58 57 56
+ 55 54 53 52 51 50 49 48 47 46 45 44 43 42
+ 41 40 39 38 37 36 35 34 33 32 31 30 29 28
+ 27 26 25 24 23 22 21 20 19 18 17 16 15 14
+ 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ 154 154 154 154 154 154 154 154 154 154 154 154 154 154
+ 154 154 154 154 154 154 154 154 154 154 154 154 154 154
+ 154 154 154 154 154 154 154 154 154 154 154 154 154 154
+ 154 154 154 154
+ 0 1 2 3 0 5 1 3 2 5 1 11 12 1
+ 5 11 2 11 3 15 8 1 17 11 5 25 20 15
+ 10 5 0 27 23 19 15 11 7 3 38 35 32 29
+ 26 23 20 17 14 11 8 5 2 51 49 47 45 43
+ 41 39 37 35 33 31 29 27 25 23 21 19 17 15
+ 13 11 9 7 5 3 1 77 76 75 74 73 72 71
+ 70 69 68 67 66 65 64 63 62 61 60 59 58 57
+ 56 55 54 53 52 51 50 49 48 47 46 45 44 43
+ 42 41 40 39 38 37 36 35 34 33 32 31 30 29
+ 28 27 26 25 24 23 22 21 20 19 18 17 16 15
+ 14 13 12 11 10 9 8 7 6 5 4 3 2 1
+ 0 155 155 155 155 155 155 155 155 155 155 155 155 155
+ 155 155 155 155 155 155 155 155 155 155 155 155 155 155
+ 155 155 155 155 155 155 155 155 155 155 155 155 155 155
+ 155 155 155 155
+ 0 0 0 0 1 0 2 4 3 6 2 0 0 2
+ 6 12 3 12 4 16 9 2 18 12 6 0 21 16
+ 11 6 1 28 24 20 16 12 8 4 0 36 33 30
+ 27 24 21 18 15 12 9 6 3 0 50 48 46 44
+ 42 40 38 36 34 32 30 28 26 24 22 20 18 16
+ 14 12 10 8 6 4 2 0 77 76 75 74 73 72
+ 71 70 69 68 67 66 65 64 63 62 61 60 59 58
+ 57 56 55 54 53 52 51 50 49 48 47 46 45 44
+ 43 42 41 40 39 38 37 36 35 34 33 32 31 30
+ 29 28 27 26 25 24 23 22 21 20 19 18 17 16
+ 15 14 13 12 11 10 9 8 7 6 5 4 3 2
+ 1 0 156 156 156 156 156 156 156 156 156 156 156 156
+ 156 156 156 156 156 156 156 156 156 156 156 156 156 156
+ 156 156 156 156 156 156 156 156 156 156 156 156 156 156
+ 156 156 156 156
+ 0 1 1 1 2 1 3 5 4 7 3 1 1 3
+ 7 13 4 13 5 17 10 3 19 13 7 1 22 17
+ 12 7 2 29 25 21 17 13 9 5 1 37 34 31
+ 28 25 22 19 16 13 10 7 4 1 51 49 47 45
+ 43 41 39 37 35 33 31 29 27 25 23 21 19 17
+ 15 13 11 9 7 5 3 1 78 77 76 75 74 73
+ 72 71 70 69 68 67 66 65 64 63 62 61 60 59
+ 58 57 56 55 54 53 52 51 50 49 48 47 46 45
+ 44 43 42 41 40 39 38 37 36 35 34 33 32 31
+ 30 29 28 27 26 25 24 23 22 21 20 19 18 17
+ 16 15 14 13 12 11 10 9 8 7 6 5 4 3
+ 2 1 0 157 157 157 157 157 157 157 157 157 157 157
+ 157 157 157 157 157 157 157 157 157 157 157 157 157 157
+ 157 157 157 157 157 157 157 157 157 157 157 157 157 157
+ 157 157 157 157
+ 0 0 2 2 3 2 4 6 5 8 4 2 2 4
+ 8 14 5 14 6 18 11 4 20 14 8 2 23 18
+ 13 8 3 30 26 22 18 14 10 6 2 38 35 32
+ 29 26 23 20 17 14 11 8 5 2 52 50 48 46
+ 44 42 40 38 36 34 32 30 28 26 24 22 20 18
+ 16 14 12 10 8 6 4 2 0 78 77 76 75 74
+ 73 72 71 70 69 68 67 66 65 64 63 62 61 60
+ 59 58 57 56 55 54 53 52 51 50 49 48 47 46
+ 45 44 43 42 41 40 39 38 37 36 35 34 33 32
+ 31 30 29 28 27 26 25 24 23 22 21 20 19 18
+ 17 16 15 14 13 12 11 10 9 8 7 6 5 4
+ 3 2 1 0 158 158 158 158 158 158 158 158 158 158
+ 158 158 158 158 158 158 158 158 158 158 158 158 158 158
+ 158 158 158 158 158 158 158 158 158 158 158 158 158 158
+ 158 158 158 158
+ 0 1 0 3 4 3 5 7 6 9 5 3 3 5
+ 9 15 6 15 7 19 12 5 21 15 9 3 24 19
+ 14 9 4 31 27 23 19 15 11 7 3 39 36 33
+ 30 27 24 21 18 15 12 9 6 3 0 51 49 47
+ 45 43 41 39 37 35 33 31 29 27 25 23 21 19
+ 17 15 13 11 9 7 5 3 1 79 78 77 76 75
+ 74 73 72 71 70 69 68 67 66 65 64 63 62 61
+ 60 59 58 57 56 55 54 53 52 51 50 49 48 47
+ 46 45 44 43 42 41 40 39 38 37 36 35 34 33
+ 32 31 30 29 28 27 26 25 24 23 22 21 20 19
+ 18 17 16 15 14 13 12 11 10 9 8 7 6 5
+ 4 3 2 1 0 159 159 159 159 159 159 159 159 159
+ 159 159 159 159 159 159 159 159 159 159 159 159 159 159
+ 159 159 159 159 159 159 159 159 159 159 159 159 159 159
+ 159 159 159 159
+ 0 0 1 0 0 4 6 0 7 0 6 4 4 6
+ 10 0 7 16 8 0 13 6 22 16 10 4 25 20
+ 15 10 5 0 28 24 20 16 12 8 4 0 37 34
+ 31 28 25 22 19 16 13 10 7 4 1 52 50 48
+ 46 44 42 40 38 36 34 32 30 28 26 24 22 20
+ 18 16 14 12 10 8 6 4 2 0 79 78 77 76
+ 75 74 73 72 71 70 69 68 67 66 65 64 63 62
+ 61 60 59 58 57 56 55 54 53 52 51 50 49 48
+ 47 46 45 44 43 42 41 40 39 38 37 36 35 34
+ 33 32 31 30 29 28 27 26 25 24 23 22 21 20
+ 19 18 17 16 15 14 13 12 11 10 9 8 7 6
+ 5 4 3 2 1 0 160 160 160 160 160 160 160 160
+ 160 160 160 160 160 160 160 160 160 160 160 160 160 160
+ 160 160 160 160 160 160 160 160 160 160 160 160 160 160
+ 160 160 160 160
+ 0 1 2 1 1 5 0 1 8 1 7 5 5 7
+ 11 1 8 17 9 1 14 7 0 17 11 5 26 21
+ 16 11 6 1 29 25 21 17 13 9 5 1 38 35
+ 32 29 26 23 20 17 14 11 8 5 2 53 51 49
+ 47 45 43 41 39 37 35 33 31 29 27 25 23 21
+ 19 17 15 13 11 9 7 5 3 1 80 79 78 77
+ 76 75 74 73 72 71 70 69 68 67 66 65 64 63
+ 62 61 60 59 58 57 56 55 54 53 52 51 50 49
+ 48 47 46 45 44 43 42 41 40 39 38 37 36 35
+ 34 33 32 31 30 29 28 27 26 25 24 23 22 21
+ 20 19 18 17 16 15 14 13 12 11 10 9 8 7
+ 6 5 4 3 2 1 0 161 161 161 161 161 161 161
+ 161 161 161 161 161 161 161 161 161 161 161 161 161 161
+ 161 161 161 161 161 161 161 161 161 161 161 161 161 161
+ 161 161 161 161
+ 0 0 0 2 2 0 1 2 0 2 8 6 6 8
+ 12 2 9 0 10 2 15 8 1 18 12 6 0 22
+ 17 12 7 2 30 26 22 18 14 10 6 2 39 36
+ 33 30 27 24 21 18 15 12 9 6 3 0 52 50
+ 48 46 44 42 40 38 36 34 32 30 28 26 24 22
+ 20 18 16 14 12 10 8 6 4 2 0 80 79 78
+ 77 76 75 74 73 72 71 70 69 68 67 66 65 64
+ 63 62 61 60 59 58 57 56 55 54 53 52 51 50
+ 49 48 47 46 45 44 43 42 41 40 39 38 37 36
+ 35 34 33 32 31 30 29 28 27 26 25 24 23 22
+ 21 20 19 18 17 16 15 14 13 12 11 10 9 8
+ 7 6 5 4 3 2 1 0 162 162 162 162 162 162
+ 162 162 162 162 162 162 162 162 162 162 162 162 162 162
+ 162 162 162 162 162 162 162 162 162 162 162 162 162 162
+ 162 162 162 162
+ 0 1 1 3 3 1 2 3 1 3 9 7 7 9
+ 13 3 10 1 11 3 16 9 2 19 13 7 1 23
+ 18 13 8 3 31 27 23 19 15 11 7 3 40 37
+ 34 31 28 25 22 19 16 13 10 7 4 1 53 51
+ 49 47 45 43 41 39 37 35 33 31 29 27 25 23
+ 21 19 17 15 13 11 9 7 5 3 1 81 80 79
+ 78 77 76 75 74 73 72 71 70 69 68 67 66 65
+ 64 63 62 61 60 59 58 57 56 55 54 53 52 51
+ 50 49 48 47 46 45 44 43 42 41 40 39 38 37
+ 36 35 34 33 32 31 30 29 28 27 26 25 24 23
+ 22 21 20 19 18 17 16 15 14 13 12 11 10 9
+ 8 7 6 5 4 3 2 1 0 163 163 163 163 163
+ 163 163 163 163 163 163 163 163 163 163 163 163 163 163
+ 163 163 163 163 163 163 163 163 163 163 163 163 163 163
+ 163 163 163 163
+ 0 0 2 0 4 2 3 4 2 4 10 8 8 10
+ 14 4 11 2 12 4 17 10 3 20 14 8 2 24
+ 19 14 9 4 32 28 24 20 16 12 8 4 0 38
+ 35 32 29 26 23 20 17 14 11 8 5 2 54 52
+ 50 48 46 44 42 40 38 36 34 32 30 28 26 24
+ 22 20 18 16 14 12 10 8 6 4 2 0 81 80
+ 79 78 77 76 75 74 73 72 71 70 69 68 67 66
+ 65 64 63 62 61 60 59 58 57 56 55 54 53 52
+ 51 50 49 48 47 46 45 44 43 42 41 40 39 38
+ 37 36 35 34 33 32 31 30 29 28 27 26 25 24
+ 23 22 21 20 19 18 17 16 15 14 13 12 11 10
+ 9 8 7 6 5 4 3 2 1 0 164 164 164 164
+ 164 164 164 164 164 164 164 164 164 164 164 164 164 164
+ 164 164 164 164 164 164 164 164 164 164 164 164 164 164
+ 164 164 164 164
+ 0 1 0 1 0 3 4 5 3 5 0 9 9 11
+ 0 5 12 3 13 5 18 11 4 21 15 9 3 25
+ 20 15 10 5 0 29 25 21 17 13 9 5 1 39
+ 36 33 30 27 24 21 18 15 12 9 6 3 0 53
+ 51 49 47 45 43 41 39 37 35 33 31 29 27 25
+ 23 21 19 17 15 13 11 9 7 5 3 1 82 81
+ 80 79 78 77 76 75 74 73 72 71 70 69 68 67
+ 66 65 64 63 62 61 60 59 58 57 56 55 54 53
+ 52 51 50 49 48 47 46 45 44 43 42 41 40 39
+ 38 37 36 35 34 33 32 31 30 29 28 27 26 25
+ 24 23 22 21 20 19 18 17 16 15 14 13 12 11
+ 10 9 8 7 6 5 4 3 2 1 0 165 165 165
+ 165 165 165 165 165 165 165 165 165 165 165 165 165 165
+ 165 165 165 165 165 165 165 165 165 165 165 165 165 165
+ 165 165 165 165
+ 0 0 1 2 1 4 5 6 4 6 1 10 10 12
+ 1 6 13 4 14 6 19 12 5 22 16 10 4 26
+ 21 16 11 6 1 30 26 22 18 14 10 6 2 40
+ 37 34 31 28 25 22 19 16 13 10 7 4 1 54
+ 52 50 48 46 44 42 40 38 36 34 32 30 28 26
+ 24 22 20 18 16 14 12 10 8 6 4 2 0 82
+ 81 80 79 78 77 76 75 74 73 72 71 70 69 68
+ 67 66 65 64 63 62 61 60 59 58 57 56 55 54
+ 53 52 51 50 49 48 47 46 45 44 43 42 41 40
+ 39 38 37 36 35 34 33 32 31 30 29 28 27 26
+ 25 24 23 22 21 20 19 18 17 16 15 14 13 12
+ 11 10 9 8 7 6 5 4 3 2 1 0 166 166
+ 166 166 166 166 166 166 166 166 166 166 166 166 166 166
+ 166 166 166 166 166 166 166 166 166 166 166 166 166 166
+ 166 166 166 166
+ 0 1 2 3 2 5 6 7 5 7 2 11 11 13
+ 2 7 14 5 15 7 20 13 6 23 17 11 5 27
+ 22 17 12 7 2 31 27 23 19 15 11 7 3 41
+ 38 35 32 29 26 23 20 17 14 11 8 5 2 55
+ 53 51 49 47 45 43 41 39 37 35 33 31 29 27
+ 25 23 21 19 17 15 13 11 9 7 5 3 1 83
+ 82 81 80 79 78 77 76 75 74 73 72 71 70 69
+ 68 67 66 65 64 63 62 61 60 59 58 57 56 55
+ 54 53 52 51 50 49 48 47 46 45 44 43 42 41
+ 40 39 38 37 36 35 34 33 32 31 30 29 28 27
+ 26 25 24 23 22 21 20 19 18 17 16 15 14 13
+ 12 11 10 9 8 7 6 5 4 3 2 1 0 167
+ 167 167 167 167 167 167 167 167 167 167 167 167 167 167
+ 167 167 167 167 167 167 167 167 167 167 167 167 167 167
+ 167 167 167 167
+ 0 0 0 0 3 0 0 0 6 8 3 0 12 0
+ 3 8 15 6 16 8 0 14 7 0 18 12 6 0
+ 23 18 13 8 3 32 28 24 20 16 12 8 4 0
+ 39 36 33 30 27 24 21 18 15 12 9 6 3 0
+ 54 52 50 48 46 44 42 40 38 36 34 32 30 28
+ 26 24 22 20 18 16 14 12 10 8 6 4 2 0
+ 83 82 81 80 79 78 77 76 75 74 73 72 71 70
+ 69 68 67 66 65 64 63 62 61 60 59 58 57 56
+ 55 54 53 52 51 50 49 48 47 46 45 44 43 42
+ 41 40 39 38 37 36 35 34 33 32 31 30 29 28
+ 27 26 25 24 23 22 21 20 19 18 17 16 15 14
+ 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ 168 168 168 168 168 168 168 168 168 168 168 168 168 168
+ 168 168 168 168 168 168 168 168 168 168 168 168 168 168
+ 168 168 168 168
+ 0 1 1 1 4 1 1 1 7 9 4 1 0 1
+ 4 9 16 7 17 9 1 15 8 1 19 13 7 1
+ 24 19 14 9 4 33 29 25 21 17 13 9 5 1
+ 40 37 34 31 28 25 22 19 16 13 10 7 4 1
+ 55 53 51 49 47 45 43 41 39 37 35 33 31 29
+ 27 25 23 21 19 17 15 13 11 9 7 5 3 1
+ 84 83 82 81 80 79 78 77 76 75 74 73 72 71
+ 70 69 68 67 66 65 64 63 62 61 60 59 58 57
+ 56 55 54 53 52 51 50 49 48 47 46 45 44 43
+ 42 41 40 39 38 37 36 35 34 33 32 31 30 29
+ 28 27 26 25 24 23 22 21 20 19 18 17 16 15
+ 14 13 12 11 10 9 8 7 6 5 4 3 2 1
+ 0 169 169 169 169 169 169 169 169 169 169 169 169 169
+ 169 169 169 169 169 169 169 169 169 169 169 169 169 169
+ 169 169 169 169
+ 0 0 2 2 0 2 2 2 8 0 5 2 1 2
+ 5 10 0 8 18 10 2 16 9 2 20 14 8 2
+ 25 20 15 10 5 0 30 26 22 18 14 10 6 2
+ 41 38 35 32 29 26 23 20 17 14 11 8 5 2
+ 56 54 52 50 48 46 44 42 40 38 36 34 32 30
+ 28 26 24 22 20 18 16 14 12 10 8 6 4 2
+ 0 84 83 82 81 80 79 78 77 76 75 74 73 72
+ 71 70 69 68 67 66 65 64 63 62 61 60 59 58
+ 57 56 55 54 53 52 51 50 49 48 47 46 45 44
+ 43 42 41 40 39 38 37 36 35 34 33 32 31 30
+ 29 28 27 26 25 24 23 22 21 20 19 18 17 16
+ 15 14 13 12 11 10 9 8 7 6 5 4 3 2
+ 1 0 170 170 170 170 170 170 170 170 170 170 170 170
+ 170 170 170 170 170 170 170 170 170 170 170 170 170 170
+ 170 170 170 170
+ 0 1 0 3 1 3 3 3 0 1 6 3 2 3
+ 6 11 1 9 0 11 3 17 10 3 21 15 9 3
+ 26 21 16 11 6 1 31 27 23 19 15 11 7 3
+ 42 39 36 33 30 27 24 21 18 15 12 9 6 3
+ 0 55 53 51 49 47 45 43 41 39 37 35 33 31
+ 29 27 25 23 21 19 17 15 13 11 9 7 5 3
+ 1 85 84 83 82 81 80 79 78 77 76 75 74 73
+ 72 71 70 69 68 67 66 65 64 63 62 61 60 59
+ 58 57 56 55 54 53 52 51 50 49 48 47 46 45
+ 44 43 42 41 40 39 38 37 36 35 34 33 32 31
+ 30 29 28 27 26 25 24 23 22 21 20 19 18 17
+ 16 15 14 13 12 11 10 9 8 7 6 5 4 3
+ 2 1 0 171 171 171 171 171 171 171 171 171 171 171
+ 171 171 171 171 171 171 171 171 171 171 171 171 171 171
+ 171 171 171 171
+ 0 0 1 0 2 4 4 4 1 2 7 4 3 4
+ 7 12 2 10 1 12 4 18 11 4 22 16 10 4
+ 27 22 17 12 7 2 32 28 24 20 16 12 8 4
+ 0 40 37 34 31 28 25 22 19 16 13 10 7 4
+ 1 56 54 52 50 48 46 44 42 40 38 36 34 32
+ 30 28 26 24 22 20 18 16 14 12 10 8 6 4
+ 2 0 85 84 83 82 81 80 79 78 77 76 75 74
+ 73 72 71 70 69 68 67 66 65 64 63 62 61 60
+ 59 58 57 56 55 54 53 52 51 50 49 48 47 46
+ 45 44 43 42 41 40 39 38 37 36 35 34 33 32
+ 31 30 29 28 27 26 25 24 23 22 21 20 19 18
+ 17 16 15 14 13 12 11 10 9 8 7 6 5 4
+ 3 2 1 0 172 172 172 172 172 172 172 172 172 172
+ 172 172 172 172 172 172 172 172 172 172 172 172 172 172
+ 172 172 172 172
+ 0 1 2 1 3 5 5 5 2 3 8 5 4 5
+ 8 13 3 11 2 13 5 19 12 5 23 17 11 5
+ 28 23 18 13 8 3 33 29 25 21 17 13 9 5
+ 1 41 38 35 32 29 26 23 20 17 14 11 8 5
+ 2 57 55 53 51 49 47 45 43 41 39 37 35 33
+ 31 29 27 25 23 21 19 17 15 13 11 9 7 5
+ 3 1 86 85 84 83 82 81 80 79 78 77 76 75
+ 74 73 72 71 70 69 68 67 66 65 64 63 62 61
+ 60 59 58 57 56 55 54 53 52 51 50 49 48 47
+ 46 45 44 43 42 41 40 39 38 37 36 35 34 33
+ 32 31 30 29 28 27 26 25 24 23 22 21 20 19
+ 18 17 16 15 14 13 12 11 10 9 8 7 6 5
+ 4 3 2 1 0 173 173 173 173 173 173 173 173 173
+ 173 173 173 173 173 173 173 173 173 173 173 173 173 173
+ 173 173 173 173
+ 0 0 0 2 4 0 6 6 3 4 9 6 5 6
+ 9 14 4 12 3 14 6 20 13 6 24 18 12 6
+ 0 24 19 14 9 4 34 30 26 22 18 14 10 6
+ 2 42 39 36 33 30 27 24 21 18 15 12 9 6
+ 3 0 56 54 52 50 48 46 44 42 40 38 36 34
+ 32 30 28 26 24 22 20 18 16 14 12 10 8 6
+ 4 2 0 86 85 84 83 82 81 80 79 78 77 76
+ 75 74 73 72 71 70 69 68 67 66 65 64 63 62
+ 61 60 59 58 57 56 55 54 53 52 51 50 49 48
+ 47 46 45 44 43 42 41 40 39 38 37 36 35 34
+ 33 32 31 30 29 28 27 26 25 24 23 22 21 20
+ 19 18 17 16 15 14 13 12 11 10 9 8 7 6
+ 5 4 3 2 1 0 174 174 174 174 174 174 174 174
+ 174 174 174 174 174 174 174 174 174 174 174 174 174 174
+ 174 174 174 174
+ 0 1 1 3 0 1 0 7 4 5 10 7 6 7
+ 10 15 5 13 4 15 7 21 14 7 0 19 13 7
+ 1 25 20 15 10 5 0 31 27 23 19 15 11 7
+ 3 43 40 37 34 31 28 25 22 19 16 13 10 7
+ 4 1 57 55 53 51 49 47 45 43 41 39 37 35
+ 33 31 29 27 25 23 21 19 17 15 13 11 9 7
+ 5 3 1 87 86 85 84 83 82 81 80 79 78 77
+ 76 75 74 73 72 71 70 69 68 67 66 65 64 63
+ 62 61 60 59 58 57 56 55 54 53 52 51 50 49
+ 48 47 46 45 44 43 42 41 40 39 38 37 36 35
+ 34 33 32 31 30 29 28 27 26 25 24 23 22 21
+ 20 19 18 17 16 15 14 13 12 11 10 9 8 7
+ 6 5 4 3 2 1 0 175 175 175 175 175 175 175
+ 175 175 175 175 175 175 175 175 175 175 175 175 175 175
+ 175 175 175 175
+ 0 0 2 0 1 2 1 0 5 6 0 8 7 8
+ 11 0 6 14 5 16 8 0 15 8 1 20 14 8
+ 2 26 21 16 11 6 1 32 28 24 20 16 12 8
+ 4 0 41 38 35 32 29 26 23 20 17 14 11 8
+ 5 2 58 56 54 52 50 48 46 44 42 40 38 36
+ 34 32 30 28 26 24 22 20 18 16 14 12 10 8
+ 6 4 2 0 87 86 85 84 83 82 81 80 79 78
+ 77 76 75 74 73 72 71 70 69 68 67 66 65 64
+ 63 62 61 60 59 58 57 56 55 54 53 52 51 50
+ 49 48 47 46 45 44 43 42 41 40 39 38 37 36
+ 35 34 33 32 31 30 29 28 27 26 25 24 23 22
+ 21 20 19 18 17 16 15 14 13 12 11 10 9 8
+ 7 6 5 4 3 2 1 0 176 176 176 176 176 176
+ 176 176 176 176 176 176 176 176 176 176 176 176 176 176
+ 176 176 176 176
+ 0 1 0 1 2 3 2 1 6 7 1 9 8 9
+ 12 1 7 15 6 17 9 1 16 9 2 21 15 9
+ 3 27 22 17 12 7 2 33 29 25 21 17 13 9
+ 5 1 42 39 36 33 30 27 24 21 18 15 12 9
+ 6 3 0 57 55 53 51 49 47 45 43 41 39 37
+ 35 33 31 29 27 25 23 21 19 17 15 13 11 9
+ 7 5 3 1 88 87 86 85 84 83 82 81 80 79
+ 78 77 76 75 74 73 72 71 70 69 68 67 66 65
+ 64 63 62 61 60 59 58 57 56 55 54 53 52 51
+ 50 49 48 47 46 45 44 43 42 41 40 39 38 37
+ 36 35 34 33 32 31 30 29 28 27 26 25 24 23
+ 22 21 20 19 18 17 16 15 14 13 12 11 10 9
+ 8 7 6 5 4 3 2 1 0 177 177 177 177 177
+ 177 177 177 177 177 177 177 177 177 177 177 177 177 177
+ 177 177 177 177
+ 0 0 1 2 3 4 3 2 7 8 2 10 9 10
+ 13 2 8 16 7 18 10 2 17 10 3 22 16 10
+ 4 28 23 18 13 8 3 34 30 26 22 18 14 10
+ 6 2 43 40 37 34 31 28 25 22 19 16 13 10
+ 7 4 1 58 56 54 52 50 48 46 44 42 40 38
+ 36 34 32 30 28 26 24 22 20 18 16 14 12 10
+ 8 6 4 2 0 88 87 86 85 84 83 82 81 80
+ 79 78 77 76 75 74 73 72 71 70 69 68 67 66
+ 65 64 63 62 61 60 59 58 57 56 55 54 53 52
+ 51 50 49 48 47 46 45 44 43 42 41 40 39 38
+ 37 36 35 34 33 32 31 30 29 28 27 26 25 24
+ 23 22 21 20 19 18 17 16 15 14 13 12 11 10
+ 9 8 7 6 5 4 3 2 1 0 178 178 178 178
+ 178 178 178 178 178 178 178 178 178 178 178 178 178 178
+ 178 178 178 178
+ 0 1 2 3 4 5 4 3 8 9 3 11 10 11
+ 14 3 9 17 8 19 11 3 18 11 4 23 17 11
+ 5 29 24 19 14 9 4 35 31 27 23 19 15 11
+ 7 3 44 41 38 35 32 29 26 23 20 17 14 11
+ 8 5 2 59 57 55 53 51 49 47 45 43 41 39
+ 37 35 33 31 29 27 25 23 21 19 17 15 13 11
+ 9 7 5 3 1 89 88 87 86 85 84 83 82 81
+ 80 79 78 77 76 75 74 73 72 71 70 69 68 67
+ 66 65 64 63 62 61 60 59 58 57 56 55 54 53
+ 52 51 50 49 48 47 46 45 44 43 42 41 40 39
+ 38 37 36 35 34 33 32 31 30 29 28 27 26 25
+ 24 23 22 21 20 19 18 17 16 15 14 13 12 11
+ 10 9 8 7 6 5 4 3 2 1 0 179 179 179
+ 179 179 179 179 179 179 179 179 179 179 179 179 179 179
+ 179 179 179 179
+ 0 0 0 0 0 0 5 4 0 0 4 0 11 12
+ 0 4 10 0 9 0 12 4 19 12 5 24 18 12
+ 6 0 25 20 15 10 5 0 32 28 24 20 16 12
+ 8 4 0 42 39 36 33 30 27 24 21 18 15 12
+ 9 6 3 0 58 56 54 52 50 48 46 44 42 40
+ 38 36 34 32 30 28 26 24 22 20 18 16 14 12
+ 10 8 6 4 2 0 89 88 87 86 85 84 83 82
+ 81 80 79 78 77 76 75 74 73 72 71 70 69 68
+ 67 66 65 64 63 62 61 60 59 58 57 56 55 54
+ 53 52 51 50 49 48 47 46 45 44 43 42 41 40
+ 39 38 37 36 35 34 33 32 31 30 29 28 27 26
+ 25 24 23 22 21 20 19 18 17 16 15 14 13 12
+ 11 10 9 8 7 6 5 4 3 2 1 0 180 180
+ 180 180 180 180 180 180 180 180 180 180 180 180 180 180
+ 180 180 180 180
+ 0 1 1 1 1 1 6 5 1 1 5 1 12 13
+ 1 5 11 1 10 1 13 5 20 13 6 25 19 13
+ 7 1 26 21 16 11 6 1 33 29 25 21 17 13
+ 9 5 1 43 40 37 34 31 28 25 22 19 16 13
+ 10 7 4 1 59 57 55 53 51 49 47 45 43 41
+ 39 37 35 33 31 29 27 25 23 21 19 17 15 13
+ 11 9 7 5 3 1 90 89 88 87 86 85 84 83
+ 82 81 80 79 78 77 76 75 74 73 72 71 70 69
+ 68 67 66 65 64 63 62 61 60 59 58 57 56 55
+ 54 53 52 51 50 49 48 47 46 45 44 43 42 41
+ 40 39 38 37 36 35 34 33 32 31 30 29 28 27
+ 26 25 24 23 22 21 20 19 18 17 16 15 14 13
+ 12 11 10 9 8 7 6 5 4 3 2 1 0 181
+ 181 181 181 181 181 181 181 181 181 181 181 181 181 181
+ 181 181 181 181
+ 0 0 2 2 2 2 0 6 2 2 6 2 0 0
+ 2 6 12 2 11 2 14 6 21 14 7 0 20 14
+ 8 2 27 22 17 12 7 2 34 30 26 22 18 14
+ 10 6 2 44 41 38 35 32 29 26 23 20 17 14
+ 11 8 5 2 60 58 56 54 52 50 48 46 44 42
+ 40 38 36 34 32 30 28 26 24 22 20 18 16 14
+ 12 10 8 6 4 2 0 90 89 88 87 86 85 84
+ 83 82 81 80 79 78 77 76 75 74 73 72 71 70
+ 69 68 67 66 65 64 63 62 61 60 59 58 57 56
+ 55 54 53 52 51 50 49 48 47 46 45 44 43 42
+ 41 40 39 38 37 36 35 34 33 32 31 30 29 28
+ 27 26 25 24 23 22 21 20 19 18 17 16 15 14
+ 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ 182 182 182 182 182 182 182 182 182 182 182 182 182 182
+ 182 182 182 182
+ 0 1 0 3 3 3 1 7 3 3 7 3 1 1
+ 3 7 13 3 12 3 15 7 22 15 8 1 21 15
+ 9 3 28 23 18 13 8 3 35 31 27 23 19 15
+ 11 7 3 45 42 39 36 33 30 27 24 21 18 15
+ 12 9 6 3 0 59 57 55 53 51 49 47 45 43
+ 41 39 37 35 33 31 29 27 25 23 21 19 17 15
+ 13 11 9 7 5 3 1 91 90 89 88 87 86 85
+ 84 83 82 81 80 79 78 77 76 75 74 73 72 71
+ 70 69 68 67 66 65 64 63 62 61 60 59 58 57
+ 56 55 54 53 52 51 50 49 48 47 46 45 44 43
+ 42 41 40 39 38 37 36 35 34 33 32 31 30 29
+ 28 27 26 25 24 23 22 21 20 19 18 17 16 15
+ 14 13 12 11 10 9 8 7 6 5 4 3 2 1
+ 0 183 183 183 183 183 183 183 183 183 183 183 183 183
+ 183 183 183 183
+ 0 0 1 0 4 4 2 0 4 4 8 4 2 2
+ 4 8 14 4 13 4 16 8 0 16 9 2 22 16
+ 10 4 29 24 19 14 9 4 36 32 28 24 20 16
+ 12 8 4 0 43 40 37 34 31 28 25 22 19 16
+ 13 10 7 4 1 60 58 56 54 52 50 48 46 44
+ 42 40 38 36 34 32 30 28 26 24 22 20 18 16
+ 14 12 10 8 6 4 2 0 91 90 89 88 87 86
+ 85 84 83 82 81 80 79 78 77 76 75 74 73 72
+ 71 70 69 68 67 66 65 64 63 62 61 60 59 58
+ 57 56 55 54 53 52 51 50 49 48 47 46 45 44
+ 43 42 41 40 39 38 37 36 35 34 33 32 31 30
+ 29 28 27 26 25 24 23 22 21 20 19 18 17 16
+ 15 14 13 12 11 10 9 8 7 6 5 4 3 2
+ 1 0 184 184 184 184 184 184 184 184 184 184 184 184
+ 184 184 184 184
+ 0 1 2 1 0 5 3 1 5 5 9 5 3 3
+ 5 9 15 5 14 5 17 9 1 17 10 3 23 17
+ 11 5 30 25 20 15 10 5 0 33 29 25 21 17
+ 13 9 5 1 44 41 38 35 32 29 26 23 20 17
+ 14 11 8 5 2 61 59 57 55 53 51 49 47 45
+ 43 41 39 37 35 33 31 29 27 25 23 21 19 17
+ 15 13 11 9 7 5 3 1 92 91 90 89 88 87
+ 86 85 84 83 82 81 80 79 78 77 76 75 74 73
+ 72 71 70 69 68 67 66 65 64 63 62 61 60 59
+ 58 57 56 55 54 53 52 51 50 49 48 47 46 45
+ 44 43 42 41 40 39 38 37 36 35 34 33 32 31
+ 30 29 28 27 26 25 24 23 22 21 20 19 18 17
+ 16 15 14 13 12 11 10 9 8 7 6 5 4 3
+ 2 1 0 185 185 185 185 185 185 185 185 185 185 185
+ 185 185 185 185
+ 0 0 0 2 1 0 4 2 6 6 10 6 4 4
+ 6 10 16 6 15 6 18 10 2 18 11 4 24 18
+ 12 6 0 26 21 16 11 6 1 34 30 26 22 18
+ 14 10 6 2 45 42 39 36 33 30 27 24 21 18
+ 15 12 9 6 3 0 60 58 56 54 52 50 48 46
+ 44 42 40 38 36 34 32 30 28 26 24 22 20 18
+ 16 14 12 10 8 6 4 2 0 92 91 90 89 88
+ 87 86 85 84 83 82 81 80 79 78 77 76 75 74
+ 73 72 71 70 69 68 67 66 65 64 63 62 61 60
+ 59 58 57 56 55 54 53 52 51 50 49 48 47 46
+ 45 44 43 42 41 40 39 38 37 36 35 34 33 32
+ 31 30 29 28 27 26 25 24 23 22 21 20 19 18
+ 17 16 15 14 13 12 11 10 9 8 7 6 5 4
+ 3 2 1 0 186 186 186 186 186 186 186 186 186 186
+ 186 186 186 186
+ 0 1 1 3 2 1 5 3 7 7 0 7 5 5
+ 7 11 0 7 16 7 19 11 3 19 12 5 25 19
+ 13 7 1 27 22 17 12 7 2 35 31 27 23 19
+ 15 11 7 3 46 43 40 37 34 31 28 25 22 19
+ 16 13 10 7 4 1 61 59 57 55 53 51 49 47
+ 45 43 41 39 37 35 33 31 29 27 25 23 21 19
+ 17 15 13 11 9 7 5 3 1 93 92 91 90 89
+ 88 87 86 85 84 83 82 81 80 79 78 77 76 75
+ 74 73 72 71 70 69 68 67 66 65 64 63 62 61
+ 60 59 58 57 56 55 54 53 52 51 50 49 48 47
+ 46 45 44 43 42 41 40 39 38 37 36 35 34 33
+ 32 31 30 29 28 27 26 25 24 23 22 21 20 19
+ 18 17 16 15 14 13 12 11 10 9 8 7 6 5
+ 4 3 2 1 0 187 187 187 187 187 187 187 187 187
+ 187 187 187 187
+ 0 0 2 0 3 2 6 4 8 8 1 8 6 6
+ 8 12 1 8 17 8 20 12 4 20 13 6 26 20
+ 14 8 2 28 23 18 13 8 3 36 32 28 24 20
+ 16 12 8 4 0 44 41 38 35 32 29 26 23 20
+ 17 14 11 8 5 2 62 60 58 56 54 52 50 48
+ 46 44 42 40 38 36 34 32 30 28 26 24 22 20
+ 18 16 14 12 10 8 6 4 2 0 93 92 91 90
+ 89 88 87 86 85 84 83 82 81 80 79 78 77 76
+ 75 74 73 72 71 70 69 68 67 66 65 64 63 62
+ 61 60 59 58 57 56 55 54 53 52 51 50 49 48
+ 47 46 45 44 43 42 41 40 39 38 37 36 35 34
+ 33 32 31 30 29 28 27 26 25 24 23 22 21 20
+ 19 18 17 16 15 14 13 12 11 10 9 8 7 6
+ 5 4 3 2 1 0 188 188 188 188 188 188 188 188
+ 188 188 188 188
+ 0 1 0 1 4 3 0 5 0 9 2 9 7 7
+ 9 13 2 9 18 9 0 13 5 21 14 7 0 21
+ 15 9 3 29 24 19 14 9 4 37 33 29 25 21
+ 17 13 9 5 1 45 42 39 36 33 30 27 24 21
+ 18 15 12 9 6 3 0 61 59 57 55 53 51 49
+ 47 45 43 41 39 37 35 33 31 29 27 25 23 21
+ 19 17 15 13 11 9 7 5 3 1 94 93 92 91
+ 90 89 88 87 86 85 84 83 82 81 80 79 78 77
+ 76 75 74 73 72 71 70 69 68 67 66 65 64 63
+ 62 61 60 59 58 57 56 55 54 53 52 51 50 49
+ 48 47 46 45 44 43 42 41 40 39 38 37 36 35
+ 34 33 32 31 30 29 28 27 26 25 24 23 22 21
+ 20 19 18 17 16 15 14 13 12 11 10 9 8 7
+ 6 5 4 3 2 1 0 189 189 189 189 189 189 189
+ 189 189 189 189
+ 0 0 1 2 0 4 1 6 1 0 3 10 8 8
+ 10 14 3 10 0 10 1 14 6 22 15 8 1 22
+ 16 10 4 30 25 20 15 10 5 0 34 30 26 22
+ 18 14 10 6 2 46 43 40 37 34 31 28 25 22
+ 19 16 13 10 7 4 1 62 60 58 56 54 52 50
+ 48 46 44 42 40 38 36 34 32 30 28 26 24 22
+ 20 18 16 14 12 10 8 6 4 2 0 94 93 92
+ 91 90 89 88 87 86 85 84 83 82 81 80 79 78
+ 77 76 75 74 73 72 71 70 69 68 67 66 65 64
+ 63 62 61 60 59 58 57 56 55 54 53 52 51 50
+ 49 48 47 46 45 44 43 42 41 40 39 38 37 36
+ 35 34 33 32 31 30 29 28 27 26 25 24 23 22
+ 21 20 19 18 17 16 15 14 13 12 11 10 9 8
+ 7 6 5 4 3 2 1 0 190 190 190 190 190 190
+ 190 190 190 190
+ 0 1 2 3 1 5 2 7 2 1 4 11 9 9
+ 11 15 4 11 1 11 2 15 7 23 16 9 2 23
+ 17 11 5 31 26 21 16 11 6 1 35 31 27 23
+ 19 15 11 7 3 47 44 41 38 35 32 29 26 23
+ 20 17 14 11 8 5 2 63 61 59 57 55 53 51
+ 49 47 45 43 41 39 37 35 33 31 29 27 25 23
+ 21 19 17 15 13 11 9 7 5 3 1 95 94 93
+ 92 91 90 89 88 87 86 85 84 83 82 81 80 79
+ 78 77 76 75 74 73 72 71 70 69 68 67 66 65
+ 64 63 62 61 60 59 58 57 56 55 54 53 52 51
+ 50 49 48 47 46 45 44 43 42 41 40 39 38 37
+ 36 35 34 33 32 31 30 29 28 27 26 25 24 23
+ 22 21 20 19 18 17 16 15 14 13 12 11 10 9
+ 8 7 6 5 4 3 2 1 0 191 191 191 191 191
+ 191 191 191 191
+ 0 0 0 0 2 0 3 0 3 2 5 0 10 10
+ 12 0 5 12 2 12 3 16 8 0 17 10 3 24
+ 18 12 6 0 27 22 17 12 7 2 36 32 28 24
+ 20 16 12 8 4 0 45 42 39 36 33 30 27 24
+ 21 18 15 12 9 6 3 0 62 60 58 56 54 52
+ 50 48 46 44 42 40 38 36 34 32 30 28 26 24
+ 22 20 18 16 14 12 10 8 6 4 2 0 95 94
+ 93 92 91 90 89 88 87 86 85 84 83 82 81 80
+ 79 78 77 76 75 74 73 72 71 70 69 68 67 66
+ 65 64 63 62 61 60 59 58 57 56 55 54 53 52
+ 51 50 49 48 47 46 45 44 43 42 41 40 39 38
+ 37 36 35 34 33 32 31 30 29 28 27 26 25 24
+ 23 22 21 20 19 18 17 16 15 14 13 12 11 10
+ 9 8 7 6 5 4 3 2 1 0 192 192 192 192
+ 192 192 192 192
+ 0 1 1 1 3 1 4 1 4 3 6 1 11 11
+ 13 1 6 13 3 13 4 17 9 1 18 11 4 25
+ 19 13 7 1 28 23 18 13 8 3 37 33 29 25
+ 21 17 13 9 5 1 46 43 40 37 34 31 28 25
+ 22 19 16 13 10 7 4 1 63 61 59 57 55 53
+ 51 49 47 45 43 41 39 37 35 33 31 29 27 25
+ 23 21 19 17 15 13 11 9 7 5 3 1 96 95
+ 94 93 92 91 90 89 88 87 86 85 84 83 82 81
+ 80 79 78 77 76 75 74 73 72 71 70 69 68 67
+ 66 65 64 63 62 61 60 59 58 57 56 55 54 53
+ 52 51 50 49 48 47 46 45 44 43 42 41 40 39
+ 38 37 36 35 34 33 32 31 30 29 28 27 26 25
+ 24 23 22 21 20 19 18 17 16 15 14 13 12 11
+ 10 9 8 7 6 5 4 3 2 1 0 193 193 193
+ 193 193 193 193
+ 0 0 2 2 4 2 5 2 5 4 7 2 12 12
+ 14 2 7 14 4 14 5 18 10 2 19 12 5 26
+ 20 14 8 2 29 24 19 14 9 4 38 34 30 26
+ 22 18 14 10 6 2 47 44 41 38 35 32 29 26
+ 23 20 17 14 11 8 5 2 64 62 60 58 56 54
+ 52 50 48 46 44 42 40 38 36 34 32 30 28 26
+ 24 22 20 18 16 14 12 10 8 6 4 2 0 96
+ 95 94 93 92 91 90 89 88 87 86 85 84 83 82
+ 81 80 79 78 77 76 75 74 73 72 71 70 69 68
+ 67 66 65 64 63 62 61 60 59 58 57 56 55 54
+ 53 52 51 50 49 48 47 46 45 44 43 42 41 40
+ 39 38 37 36 35 34 33 32 31 30 29 28 27 26
+ 25 24 23 22 21 20 19 18 17 16 15 14 13 12
+ 11 10 9 8 7 6 5 4 3 2 1 0 194 194
+ 194 194 194 194
+ 0 1 0 3 0 3 6 3 6 5 8 3 0 13
+ 0 3 8 15 5 15 6 19 11 3 20 13 6 27
+ 21 15 9 3 30 25 20 15 10 5 0 35 31 27
+ 23 19 15 11 7 3 48 45 42 39 36 33 30 27
+ 24 21 18 15 12 9 6 3 0 63 61 59 57 55
+ 53 51 49 47 45 43 41 39 37 35 33 31 29 27
+ 25 23 21 19 17 15 13 11 9 7 5 3 1 97
+ 96 95 94 93 92 91 90 89 88 87 86 85 84 83
+ 82 81 80 79 78 77 76 75 74 73 72 71 70 69
+ 68 67 66 65 64 63 62 61 60 59 58 57 56 55
+ 54 53 52 51 50 49 48 47 46 45 44 43 42 41
+ 40 39 38 37 36 35 34 33 32 31 30 29 28 27
+ 26 25 24 23 22 21 20 19 18 17 16 15 14 13
+ 12 11 10 9 8 7 6 5 4 3 2 1 0 195
+ 195 195 195 195
+ 0 0 1 0 1 4 0 4 7 6 9 4 1 0
+ 1 4 9 16 6 16 7 20 12 4 21 14 7 0
+ 22 16 10 4 31 26 21 16 11 6 1 36 32 28
+ 24 20 16 12 8 4 0 46 43 40 37 34 31 28
+ 25 22 19 16 13 10 7 4 1 64 62 60 58 56
+ 54 52 50 48 46 44 42 40 38 36 34 32 30 28
+ 26 24 22 20 18 16 14 12 10 8 6 4 2 0
+ 97 96 95 94 93 92 91 90 89 88 87 86 85 84
+ 83 82 81 80 79 78 77 76 75 74 73 72 71 70
+ 69 68 67 66 65 64 63 62 61 60 59 58 57 56
+ 55 54 53 52 51 50 49 48 47 46 45 44 43 42
+ 41 40 39 38 37 36 35 34 33 32 31 30 29 28
+ 27 26 25 24 23 22 21 20 19 18 17 16 15 14
+ 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ 196 196 196 196
+ 0 1 2 1 2 5 1 5 8 7 10 5 2 1
+ 2 5 10 17 7 17 8 21 13 5 22 15 8 1
+ 23 17 11 5 32 27 22 17 12 7 2 37 33 29
+ 25 21 17 13 9 5 1 47 44 41 38 35 32 29
+ 26 23 20 17 14 11 8 5 2 65 63 61 59 57
+ 55 53 51 49 47 45 43 41 39 37 35 33 31 29
+ 27 25 23 21 19 17 15 13 11 9 7 5 3 1
+ 98 97 96 95 94 93 92 91 90 89 88 87 86 85
+ 84 83 82 81 80 79 78 77 76 75 74 73 72 71
+ 70 69 68 67 66 65 64 63 62 61 60 59 58 57
+ 56 55 54 53 52 51 50 49 48 47 46 45 44 43
+ 42 41 40 39 38 37 36 35 34 33 32 31 30 29
+ 28 27 26 25 24 23 22 21 20 19 18 17 16 15
+ 14 13 12 11 10 9 8 7 6 5 4 3 2 1
+ 0 197 197 197
+ 0 0 0 2 3 0 2 6 0 8 0 6 3 2
+ 3 6 11 0 8 18 9 0 14 6 23 16 9 2
+ 24 18 12 6 0 28 23 18 13 8 3 38 34 30
+ 26 22 18 14 10 6 2 48 45 42 39 36 33 30
+ 27 24 21 18 15 12 9 6 3 0 64 62 60 58
+ 56 54 52 50 48 46 44 42 40 38 36 34 32 30
+ 28 26 24 22 20 18 16 14 12 10 8 6 4 2
+ 0 98 97 96 95 94 93 92 91 90 89 88 87 86
+ 85 84 83 82 81 80 79 78 77 76 75 74 73 72
+ 71 70 69 68 67 66 65 64 63 62 61 60 59 58
+ 57 56 55 54 53 52 51 50 49 48 47 46 45 44
+ 43 42 41 40 39 38 37 36 35 34 33 32 31 30
+ 29 28 27 26 25 24 23 22 21 20 19 18 17 16
+ 15 14 13 12 11 10 9 8 7 6 5 4 3 2
+ 1 0 198 198
+ 0 1 1 3 4 1 3 7 1 9 1 7 4 3
+ 4 7 12 1 9 19 10 1 15 7 24 17 10 3
+ 25 19 13 7 1 29 24 19 14 9 4 39 35 31
+ 27 23 19 15 11 7 3 49 46 43 40 37 34 31
+ 28 25 22 19 16 13 10 7 4 1 65 63 61 59
+ 57 55 53 51 49 47 45 43 41 39 37 35 33 31
+ 29 27 25 23 21 19 17 15 13 11 9 7 5 3
+ 1 99 98 97 96 95 94 93 92 91 90 89 88 87
+ 86 85 84 83 82 81 80 79 78 77 76 75 74 73
+ 72 71 70 69 68 67 66 65 64 63 62 61 60 59
+ 58 57 56 55 54 53 52 51 50 49 48 47 46 45
+ 44 43 42 41 40 39 38 37 36 35 34 33 32 31
+ 30 29 28 27 26 25 24 23 22 21 20 19 18 17
+ 16 15 14 13 12 11 10 9 8 7 6 5 4 3
+ 2 1 0 199
+ 0 0 2 0 0 2 4 0 2 0 2 8 5 4
+ 5 8 13 2 10 0 11 2 16 8 0 18 11 4
+ 26 20 14 8 2 30 25 20 15 10 5 0 36 32
+ 28 24 20 16 12 8 4 0 47 44 41 38 35 32
+ 29 26 23 20 17 14 11 8 5 2 66 64 62 60
+ 58 56 54 52 50 48 46 44 42 40 38 36 34 32
+ 30 28 26 24 22 20 18 16 14 12 10 8 6 4
+ 2 0 99 98 97 96 95 94 93 92 91 90 89 88
+ 87 86 85 84 83 82 81 80 79 78 77 76 75 74
+ 73 72 71 70 69 68 67 66 65 64 63 62 61 60
+ 59 58 57 56 55 54 53 52 51 50 49 48 47 46
+ 45 44 43 42 41 40 39 38 37 36 35 34 33 32
+ 31 30 29 28 27 26 25 24 23 22 21 20 19 18
+ 17 16 15 14 13 12 11 10 9 8 7 6 5 4
+ 3 2 1 0
diff --git a/src/boost/libs/gil/test/extension/io/images/pnm/p3.pnm b/src/boost/libs/gil/test/extension/io/images/pnm/p3.pnm
new file mode 100644
index 000000000..5c2320cd6
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/pnm/p3.pnm
@@ -0,0 +1,16388 @@
+P3
+# snail.ppm
+256 256
+255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 246 234
+255 248 232 255 244 232 255 249 232 255 246 235
+251 244 228 252 244 233 253 245 233 255 249 239
+255 251 239 248 239 232 221 202 179 211 191 167
+220 206 157 254 246 225 255 250 243 254 243 241
+237 223 214 233 208 164 238 218 179 247 241 211
+255 250 236 253 249 238 255 250 245 248 242 233
+240 224 215 252 247 232 250 246 232 253 244 234
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 245 233 255 255 255 255 255 255
+255 248 236 255 252 244 253 243 234 240 229 220
+206 190 156 223 201 165 249 233 191 255 252 228
+255 253 244 251 245 235 236 221 189 230 212 162
+250 237 194 255 252 236 255 251 240 255 251 242
+255 250 244 255 244 241 227 210 195 237 217 171
+249 229 188 255 248 240 255 247 234 255 245 234
+249 243 229 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 252 244
+248 238 228 223 201 175 217 208 160 227 208 176
+255 247 214 255 251 241 255 247 238 255 245 233
+250 241 221 253 237 190 255 250 235 255 250 234
+255 250 242 255 249 242 255 248 239 245 225 216
+227 212 170 232 212 176 249 236 186 255 252 239
+255 251 238 255 248 232 255 246 232 255 247 234
+255 245 232 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 252 236 227 230 213 191 220 194 161
+228 208 173 253 237 204 250 245 216 234 219 201
+243 222 193 255 248 236 255 247 234 255 247 231
+255 247 231 255 246 237 255 247 233 255 245 239
+253 248 229 231 209 187 236 214 169 250 235 189
+255 252 230 255 252 236 255 249 241 255 248 233
+255 236 224 255 249 235 255 246 232 255 246 227
+255 246 234 255 246 229 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 253 243 236 228 226 237 218 205
+212 196 181 219 194 144 247 232 200 254 247 221
+236 224 203 230 209 177 239 215 168 246 238 204
+255 244 224 255 247 238 255 255 255 255 255 255
+255 255 255 255 255 246 255 245 233 255 245 235
+255 246 225 255 247 216 255 248 226 255 249 242
+255 244 238 255 246 236 255 246 236 255 246 231
+255 247 236 255 250 234 255 247 233 255 246 234
+255 248 235 255 246 234 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 249 236 255 253 243 255 246 238
+233 220 197 226 208 190 227 204 154 234 214 173
+242 229 199 245 241 222 231 219 196 220 200 166
+242 225 182 255 244 217 255 251 234 254 245 238
+253 239 232 255 255 255 156 152 178 87 63 0
+127 102 95 197 189 192 255 255 255 255 246 235
+255 247 234 255 245 234 255 247 235 255 246 232
+255 250 233 255 246 236 255 244 229 255 249 232
+255 244 236 255 246 225 255 248 235 255 246 232
+255 250 234 255 246 232 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 239 219 197 206 182 151
+225 204 156 248 224 192 249 238 220 252 239 233
+249 241 237 239 228 187 255 248 222 255 247 219
+255 251 241 252 246 233 249 242 229 252 238 230
+255 248 232 172 188 225 198 115 0 137 153 0
+94 72 0 65 63 0 255 239 247 255 248 236
+255 246 231 255 245 233 255 244 228 255 246 235
+255 246 232 255 246 231 255 247 232 255 246 232
+255 244 233 255 246 231 255 246 232 255 242 230
+255 246 230 255 246 232 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 245 236 224 241 220 201
+212 196 165 225 198 160 226 210 157 255 243 220
+255 245 236 249 238 226 244 224 181 245 235 209
+248 239 230 250 241 234 255 248 236 255 245 233
+252 245 231 253 245 233 248 244 225 255 243 235
+255 255 255 86 129 65 242 191 44 240 229 229
+249 195 0 174 165 0 149 112 105 255 255 255
+255 246 232 255 245 233 255 247 233 255 246 232
+255 247 233 255 245 234 255 245 236 255 247 232
+255 247 236 255 248 232 255 246 232 255 245 232
+255 247 234 255 247 234 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 247 233 255 255 255 255 251 240 253 241 226
+245 228 217 210 193 153 218 188 158 211 194 164
+238 228 186 255 245 232 251 243 229 236 218 182
+244 233 202 249 240 217 254 245 236 255 245 237
+246 243 229 249 241 227 253 245 230 251 244 231
+246 238 227 250 240 229 247 242 224 254 241 237
+255 255 255 65 0 0 58 0 0 204 199 0
+212 182 0 0 43 0 218 158 143 255 254 246
+255 247 229 255 245 231 255 245 228 255 246 236
+248 242 227 248 245 230 252 244 229 249 240 225
+255 244 233 255 245 229 255 247 232 255 245 232
+255 244 233 250 243 227 251 241 230 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 244 232
+255 250 239 255 253 238 255 243 234 217 194 167
+208 185 147 230 220 176 254 246 223 255 250 242
+238 230 215 230 213 177 243 228 190 255 251 229
+253 247 237 250 242 232 253 244 235 251 244 230
+251 241 229 247 237 227 252 244 231 250 242 231
+244 239 227 253 244 232 252 246 229 255 255 255
+37 66 93 168 65 0 197 194 0 54 0 0
+0 0 0 97 2 0 255 255 255 246 239 235
+253 246 230 255 246 233 253 244 231 249 241 229
+246 239 230 250 241 229 252 245 234 249 242 228
+251 241 234 248 244 229 255 247 234 255 245 234
+248 243 229 247 242 231 246 239 228 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 247 235 255 250 242 255 250 244
+242 228 212 229 205 171 208 179 152 237 220 175
+255 255 128 248 243 242 240 223 198 230 214 192
+240 227 179 252 242 232 251 245 236 255 247 232
+255 245 234 255 246 236 248 243 232 251 244 231
+250 240 230 246 238 228 250 244 227 252 246 231
+250 241 228 252 239 229 255 250 238 204 234 255
+129 22 0 233 191 0 181 134 0 0 0 0
+180 154 0 255 255 209 254 247 249 248 240 231
+248 242 230 255 244 231 252 245 231 250 241 232
+250 245 229 252 246 233 255 246 235 249 241 227
+248 240 230 249 240 226 255 247 233 255 246 232
+248 241 230 247 243 230 251 244 231 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 251 237 225 240 223 207 211 191 150
+216 190 163 228 216 166 255 248 240 249 238 235
+243 226 205 246 227 188 247 237 200 255 247 236
+252 248 238 249 240 229 249 241 228 255 249 237
+253 243 233 243 233 221 239 223 210 247 238 230
+243 237 224 244 236 224 254 247 230 253 243 231
+253 243 228 255 244 234 255 255 255 85 0 0
+249 198 0 178 158 0 25 0 0 255 239 131
+255 255 255 255 250 246 254 243 232 249 239 230
+246 239 228 255 247 232 252 245 230 247 239 228
+249 245 230 255 243 232 255 246 232 251 246 232
+250 240 232 252 245 229 255 247 234 255 246 232
+247 241 229 250 243 232 254 246 232 255 247 233
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 247 233
+255 255 255 255 255 255 255 255 255 255 255 255
+222 200 186 200 180 154 216 189 155 239 213 180
+255 252 244 255 244 237 241 220 189 237 219 172
+255 241 216 255 250 235 255 248 239 255 245 238
+250 243 229 249 243 235 246 239 233 240 225 197
+242 222 189 238 222 181 246 239 216 252 243 235
+248 238 228 248 240 229 252 243 228 251 244 230
+255 241 236 255 255 255 77 73 81 236 174 109
+162 129 0 53 24 0 224 190 105 255 255 255
+255 245 236 255 247 235 253 246 232 250 238 230
+249 246 230 255 244 233 252 245 232 253 241 231
+249 245 230 255 246 234 255 246 234 251 241 229
+249 240 231 254 247 233 255 247 233 255 245 236
+251 245 233 247 242 229 255 246 233 255 247 234
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 244 232 255 250 239
+255 253 238 255 243 234 212 194 160 199 182 153
+222 201 157 252 242 220 254 246 240 252 243 235
+240 221 190 242 226 188 248 232 215 255 246 239
+252 244 234 250 241 225 255 246 235 251 243 232
+244 237 231 239 220 183 243 235 205 251 241 218
+248 242 231 253 242 236 251 241 230 251 244 230
+248 240 226 247 241 229 250 241 226 254 240 230
+255 255 255 59 42 28 194 119 0 228 190 0
+0 0 0 162 82 0 255 255 255 255 245 232
+252 245 231 253 246 230 248 240 226 246 238 229
+248 245 226 255 243 232 251 243 231 244 235 225
+248 242 226 255 246 234 255 246 233 249 242 228
+248 239 230 248 243 227 255 247 233 255 246 232
+249 241 229 246 243 228 254 244 229 255 246 231
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 247 235 255 250 242 255 250 244 242 228 212
+229 205 171 202 180 150 236 217 174 245 231 211
+255 252 243 254 243 233 253 242 237 247 232 196
+246 236 221 254 243 234 252 244 235 251 240 231
+252 245 230 246 239 226 247 238 227 248 239 229
+251 244 229 253 242 226 253 242 233 250 242 229
+246 238 227 248 238 228 252 240 230 248 240 227
+247 236 227 249 238 225 253 239 233 255 255 255
+86 97 140 199 126 0 231 190 0 96 112 0
+186 140 15 255 255 255 255 242 235 249 242 231
+249 239 230 245 237 228 249 242 230 252 241 233
+255 246 233 254 242 231 254 243 232 236 228 216
+236 231 209 252 246 232 253 244 231 248 243 229
+249 238 234 250 241 229 255 246 233 253 244 233
+248 241 231 250 241 228 252 245 232 249 240 227
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+251 237 225 240 223 207 211 191 150 216 190 163
+228 216 166 255 253 237 249 238 235 252 242 233
+230 214 191 252 242 233 252 241 231 252 239 232
+252 241 230 251 242 230 252 240 231 248 237 228
+249 237 226 251 241 227 253 244 231 251 242 231
+251 242 230 250 240 229 253 244 228 250 241 228
+253 245 230 253 243 230 251 239 229 251 243 232
+252 245 228 253 241 231 255 255 255 137 161 194
+140 14 0 255 233 0 161 170 0 87 11 0
+255 255 255 255 248 241 255 245 230 255 248 232
+255 246 233 251 244 229 255 246 231 255 246 232
+255 247 232 255 246 233 252 244 231 255 246 232
+253 245 232 253 246 233 255 245 235 255 246 231
+255 244 233 253 248 230 252 243 229 254 243 229
+255 246 233 251 246 229 255 245 231 255 248 236
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 222 200 186
+200 180 154 216 189 155 239 213 180 255 252 244
+255 244 237 244 232 220 230 202 166 227 207 162
+253 233 216 254 242 233 249 240 228 253 241 232
+251 241 228 249 240 227 251 242 231 253 243 232
+249 230 193 255 246 233 255 245 231 255 246 231
+251 241 226 255 244 228 250 245 228 255 245 228
+255 243 228 255 244 228 251 242 229 252 244 230
+255 243 231 255 255 255 111 129 163 150 49 0
+226 208 0 172 152 0 41 0 0 255 255 255
+255 249 242 253 242 229 255 245 235 255 245 229
+255 245 233 255 247 233 255 247 232 255 245 234
+255 245 230 255 245 232 255 245 230 255 245 233
+255 247 232 255 245 234 255 247 232 255 247 231
+255 245 235 255 246 228 255 249 234 255 246 229
+255 247 233 255 247 231 255 245 231 255 245 231
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 244 234 255 249 233 255 248 239
+255 255 255 212 194 160 199 182 153 222 201 157
+252 242 220 254 246 240 252 243 235 240 221 190
+242 226 188 248 232 215 255 246 239 254 239 234
+247 242 228 253 243 234 255 247 238 250 240 230
+237 222 186 232 211 181 248 232 196 254 244 230
+255 240 233 255 244 226 254 245 229 255 239 231
+253 244 226 255 241 230 255 245 231 255 247 229
+254 241 230 254 242 227 255 244 230 254 239 228
+255 255 255 157 190 197 119 0 0 215 178 0
+248 241 0 0 0 0 230 208 135 255 255 255
+250 242 229 251 243 227 251 239 228 255 247 230
+255 243 233 253 245 229 255 247 230 255 247 234
+255 245 230 255 245 234 255 247 232 255 247 232
+255 245 232 255 247 234 241 227 217 255 249 231
+255 245 232 255 244 233 255 246 233 255 247 231
+255 244 231 255 247 229 255 245 232 253 243 227
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+254 242 230 255 249 243 253 242 230 238 219 200
+202 180 150 236 217 174 245 231 211 255 252 243
+254 243 233 253 242 237 247 232 196 246 236 221
+254 243 234 252 244 235 251 240 231 254 241 232
+253 244 234 242 228 218 231 214 183 236 222 183
+250 238 215 254 243 231 254 242 233 252 239 229
+255 243 228 251 242 228 255 243 231 252 242 231
+254 246 228 252 242 228 250 243 230 251 245 227
+255 245 229 255 243 234 255 243 231 255 254 245
+214 241 251 91 0 0 249 237 0 232 202 168
+44 22 0 243 215 155 255 255 244 255 239 234
+250 239 226 250 243 230 253 240 229 254 244 226
+255 244 232 255 243 229 255 245 233 255 245 234
+255 247 232 255 245 232 255 244 230 255 247 233
+255 245 230 255 247 232 255 247 237 255 247 227
+255 245 233 255 247 233 255 245 228 255 243 232
+255 246 232 253 245 230 253 243 227 255 245 232
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 228 204 187 171 151 121 205 186 127
+255 253 237 255 255 255 252 242 233 230 214 191
+252 242 233 252 241 231 252 239 232 252 241 230
+251 242 230 252 240 231 248 237 228 246 235 226
+241 229 203 241 231 200 254 240 219 252 242 234
+250 242 232 251 240 231 251 241 228 250 243 230
+252 240 230 252 242 226 255 245 227 255 242 231
+252 242 228 251 240 228 249 242 228 253 242 230
+253 245 230 254 239 229 255 255 255 156 192 192
+79 0 0 218 164 0 207 169 0 142 126 0
+142 76 0 255 255 255 250 240 230 246 239 227
+249 243 226 254 244 231 255 241 234 255 246 230
+253 244 232 255 246 230 255 245 233 255 245 232
+255 245 233 255 245 233 255 247 231 255 246 234
+255 246 236 255 247 232 255 245 233 255 243 226
+255 245 234 255 248 230 255 248 237 255 247 233
+252 242 232 255 245 234 255 247 233 255 247 232
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 212 193 174
+197 175 146 225 199 152 255 251 233 255 247 237
+244 232 220 230 202 166 227 207 162 253 233 216
+254 242 233 249 240 228 253 241 232 251 241 228
+249 240 227 251 242 231 253 243 232 247 235 212
+250 241 226 252 240 233 250 239 231 249 240 226
+253 238 228 252 239 228 253 243 228 252 241 228
+254 241 228 250 240 228 255 246 230 253 238 229
+250 239 228 253 241 228 252 243 228 249 242 224
+254 240 229 255 253 234 206 230 254 80 0 0
+219 188 0 255 231 0 163 168 0 32 0 0
+255 255 246 255 247 241 250 244 226 252 239 229
+252 244 227 255 245 230 255 244 229 255 246 230
+253 244 230 255 243 228 255 246 229 255 243 231
+255 246 229 255 246 233 255 248 237 255 236 227
+253 237 219 255 246 234 255 245 231 255 246 226
+255 246 238 250 233 224 254 242 212 254 237 206
+252 242 210 255 248 237 255 247 229 255 246 234
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 202 181 144 225 207 174
+250 235 211 252 243 245 234 221 199 228 208 170
+239 220 180 255 245 230 255 245 236 253 244 230
+253 242 232 252 242 233 253 241 233 252 238 230
+251 241 228 251 240 229 247 238 226 250 239 230
+250 238 228 252 242 231 253 243 231 252 245 232
+254 243 227 252 243 230 250 240 228 255 241 230
+251 243 228 251 238 228 250 244 229 253 245 231
+251 243 230 252 241 228 250 242 230 252 241 231
+255 251 244 255 255 255 67 0 0 223 188 0
+255 206 140 186 167 0 38 0 0 235 220 134
+255 255 255 253 242 232 249 245 228 251 241 230
+252 241 231 253 245 232 255 244 234 255 245 229
+255 246 234 255 245 231 255 245 233 255 246 235
+255 247 237 246 231 217 240 224 199 246 225 177
+255 249 233 255 247 238 255 245 233 255 246 229
+255 241 216 250 237 205 255 250 233 255 247 236
+254 242 236 240 230 194 255 244 232 255 247 235
+255 246 231 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 210 199 170
+197 175 132 223 199 172 255 247 227 251 246 244
+239 229 222 229 205 170 241 224 198 252 242 230
+252 248 238 253 242 230 253 243 231 255 244 234
+253 243 233 248 239 230 232 212 187 249 232 201
+251 241 230 252 242 232 251 238 227 253 240 230
+251 244 229 248 241 231 252 243 227 254 242 227
+251 243 230 252 238 228 252 243 228 251 243 228
+255 240 230 252 243 228 251 244 230 249 239 229
+250 240 228 246 239 229 251 241 230 255 255 246
+189 219 226 42 0 0 217 148 0 255 231 134
+251 212 0 70 77 0 249 212 148 255 255 255
+252 242 230 253 241 230 251 242 228 251 239 228
+253 245 229 249 239 228 255 246 232 255 247 231
+255 245 232 255 248 234 255 245 233 255 244 237
+245 237 201 255 239 200 255 249 231 255 254 245
+249 236 222 248 237 214 255 246 234 255 245 229
+255 246 232 255 248 236 251 237 216 255 244 226
+255 246 218 255 248 228 255 248 234 255 246 232
+255 247 234 255 244 231 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 211 189 168 207 182 144 241 221 197
+255 247 241 255 252 245 234 223 212 229 215 170
+241 224 185 251 243 233 253 244 234 249 241 230
+252 244 233 255 242 236 250 242 237 236 222 206
+229 203 165 236 216 177 255 242 230 255 244 234
+255 243 230 255 243 231 252 243 231 254 242 229
+252 241 229 254 239 229 255 241 232 251 243 228
+255 243 228 252 241 228 252 243 228 254 242 228
+253 245 230 252 242 226 254 243 228 251 236 228
+250 242 227 251 240 229 255 251 246 222 244 242
+87 0 0 209 158 0 227 189 0 250 215 0
+136 141 0 112 27 0 255 255 255 255 241 232
+253 242 229 251 241 228 251 245 228 251 239 228
+251 241 228 253 240 232 254 240 234 254 243 229
+245 234 220 243 224 196 255 248 234 255 246 235
+255 249 236 255 242 239 243 228 216 238 220 182
+254 243 209 255 249 230 255 248 235 255 245 228
+254 242 230 250 238 203 255 245 222 255 247 237
+255 248 237 255 246 234 255 248 233 255 246 230
+255 244 232 255 247 233 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+208 183 120 239 222 196 254 242 222 255 255 255
+234 221 208 218 199 176 225 204 173 254 245 234
+253 243 234 253 238 231 255 242 231 255 245 236
+242 236 225 229 211 187 221 204 167 237 222 185
+255 245 236 251 245 233 252 241 230 255 239 228
+255 245 228 251 241 229 252 242 229 252 235 228
+252 242 228 252 240 228 254 240 228 252 239 224
+253 242 231 252 239 226 251 241 229 253 243 229
+254 241 229 252 241 227 255 243 227 252 241 229
+253 240 230 255 252 234 245 255 255 62 0 0
+196 150 0 245 200 154 221 193 0 203 201 12
+26 0 0 255 255 237 255 249 240 252 241 230
+250 242 226 252 241 231 250 243 228 251 239 230
+253 245 231 253 240 235 235 220 189 239 224 183
+249 235 195 255 247 229 255 246 235 251 241 228
+251 235 217 246 233 179 253 240 204 255 250 242
+249 237 230 241 223 204 255 246 234 255 246 232
+255 244 235 255 246 236 254 249 237 245 232 198
+255 240 224 255 249 235 255 246 236 255 247 233
+255 245 233 255 249 230 255 249 235 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 245 230 255 255 255
+255 255 255 255 255 255 209 181 134 233 211 182
+255 248 233 255 249 244 254 244 237 217 194 157
+234 219 185 249 238 210 254 244 237 248 243 227
+249 240 226 254 243 237 241 231 216 217 198 177
+222 198 154 250 235 210 255 242 233 254 244 233
+253 241 228 252 240 229 254 240 229 253 240 227
+253 239 227 252 240 228 252 242 228 254 240 229
+252 242 226 252 240 227 252 240 227 252 242 227
+254 240 229 253 243 229 248 240 227 249 238 225
+250 239 226 247 239 224 255 241 228 253 241 228
+255 255 255 168 180 152 67 0 0 199 127 0
+232 216 0 224 189 0 238 230 0 39 0 0
+237 194 138 255 255 255 250 237 225 248 237 228
+246 237 225 252 242 230 250 245 232 245 235 228
+239 224 200 251 237 214 251 242 212 255 247 239
+253 244 239 252 243 231 252 237 213 249 237 205
+255 247 229 255 246 241 242 228 209 241 223 188
+247 231 194 255 245 221 255 247 236 255 246 232
+253 241 229 255 244 227 255 245 224 255 248 223
+250 236 222 251 239 221 248 231 195 255 252 240
+255 252 241 243 231 226 255 242 222 255 247 238
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 220 202 170
+198 177 132 234 208 179 255 250 235 255 251 244
+255 244 233 234 212 182 234 219 178 248 237 214
+254 241 237 250 240 230 252 241 230 253 242 236
+244 237 219 222 198 189 216 200 150 245 227 199
+255 246 238 253 243 234 251 243 230 253 240 228
+252 239 225 252 238 229 254 241 227 252 238 225
+251 241 225 252 239 229 252 240 229 252 241 227
+252 240 229 252 240 224 252 240 230 253 243 226
+249 235 226 251 236 224 246 238 227 247 238 227
+248 238 225 246 238 223 254 242 231 255 255 255
+198 223 214 90 0 0 218 157 0 203 147 0
+244 218 134 232 208 0 19 0 0 228 191 128
+255 255 236 253 241 229 252 245 227 250 241 227
+253 241 231 243 235 220 236 219 196 227 214 170
+255 244 218 255 246 234 255 242 237 237 225 206
+239 226 198 253 242 234 255 245 231 254 245 238
+249 238 221 238 215 168 251 239 207 255 248 235
+255 247 243 249 236 225 244 229 202 251 235 199
+255 244 222 255 248 234 255 247 234 255 247 231
+255 241 199 255 250 239 255 251 244 232 219 205
+233 207 169 255 233 196 255 253 241 244 227 220
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 253 243 235 254 248 237 255 246 237
+255 247 242 255 251 240 255 252 241 255 254 242
+255 254 246 255 255 237 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 245 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 229 218 192 207 174 150 226 204 161
+246 231 203 255 255 255 249 237 228 228 215 192
+221 198 153 255 243 222 255 246 234 250 242 231
+248 241 232 255 244 235 243 235 225 213 196 169
+217 193 150 233 211 189 255 249 239 254 243 232
+250 241 228 252 240 227 249 238 229 251 241 225
+251 239 230 253 241 229 252 237 229 252 241 229
+255 241 227 250 237 227 253 240 228 250 237 225
+251 241 228 253 240 230 253 239 228 250 237 222
+249 237 227 248 237 227 247 237 223 245 237 223
+249 240 228 248 242 232 255 255 241 223 242 220
+51 0 0 163 90 0 215 182 19 250 217 137
+217 178 0 142 130 0 147 66 0 255 255 255
+252 243 233 254 239 227 252 241 227 251 238 231
+245 236 226 232 220 180 248 239 213 255 245 237
+253 242 235 247 238 226 234 213 175 255 240 210
+255 246 231 252 242 237 234 221 210 248 239 227
+252 243 232 255 250 240 254 242 235 250 235 222
+246 231 186 250 239 206 255 244 238 244 232 201
+247 231 206 255 248 228 255 250 237 255 246 238
+250 235 232 237 221 204 232 215 172 254 245 212
+249 237 225 238 225 219 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 251 243 229
+251 239 227 251 243 231 255 251 242 255 250 245
+255 255 246 255 255 255 255 255 255 255 245 243
+251 227 237 247 217 203 255 229 216 255 223 197
+243 222 184 233 207 181 220 184 180 185 151 163
+176 152 161 144 103 95 85 49 39 77 1 0
+48 0 0 89 25 0 90 16 0 145 96 37
+171 148 107 213 174 152 255 247 221 255 255 255
+255 255 246 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+192 172 149 208 173 132 248 243 212 255 250 244
+255 248 241 231 214 186 225 196 148 242 221 193
+255 245 234 253 242 231 251 239 231 253 242 232
+239 229 217 219 206 186 213 190 139 248 237 206
+250 244 234 255 242 235 249 238 227 250 238 228
+251 241 229 252 241 227 252 241 227 253 241 226
+251 239 226 251 241 225 251 238 228 253 237 225
+252 241 227 251 240 229 251 236 223 253 238 227
+249 237 222 251 242 226 253 235 226 248 238 223
+247 235 225 248 235 223 247 238 224 246 233 224
+252 238 230 255 255 255 121 149 128 46 0 0
+223 129 0 192 179 0 251 213 217 239 209 67
+153 174 0 30 0 0 255 255 245 255 247 238
+252 239 225 254 243 232 245 236 221 249 239 227
+248 239 225 251 241 235 250 244 233 240 227 219
+248 237 202 250 239 221 255 246 243 243 237 226
+230 217 210 223 205 154 249 237 210 254 241 233
+245 237 227 250 234 217 241 232 186 255 248 232
+245 235 228 235 213 197 243 227 188 255 246 217
+255 247 240 255 243 235 230 217 196 235 214 184
+255 243 204 253 248 227 242 234 223 207 197 180
+219 194 163 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+248 241 231 255 246 238 255 251 247 255 255 255
+255 255 255 255 255 240 253 237 166 238 214 152
+225 168 111 210 172 16 217 128 0 224 176 0
+187 111 0 199 134 0 205 162 0 186 147 0
+227 166 0 194 147 0 236 197 0 237 198 0
+225 216 0 167 175 0 137 122 0 122 103 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 133 34 0
+176 154 125 255 255 227 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 209 185 161 209 179 131
+252 231 206 254 246 223 255 243 233 238 223 197
+229 210 163 243 218 193 255 245 235 255 245 230
+253 242 226 252 240 232 243 235 221 219 195 169
+215 190 154 233 216 179 253 241 232 250 239 234
+251 239 226 249 239 226 249 239 227 250 236 226
+245 238 226 249 236 224 249 237 226 250 238 225
+250 238 226 252 242 230 252 238 225 248 237 226
+253 239 225 249 237 229 251 238 225 251 238 226
+250 238 225 249 239 226 253 242 226 252 242 227
+251 239 227 248 237 226 246 240 222 255 241 236
+255 255 255 89 136 127 111 0 0 189 117 0
+218 168 0 222 173 54 224 196 55 218 181 0
+12 0 0 191 149 24 255 255 255 255 243 235
+254 244 235 225 206 176 246 225 202 254 241 231
+253 240 232 246 236 222 233 227 187 245 229 195
+255 248 237 252 242 236 228 215 205 226 206 159
+235 223 188 255 248 237 249 242 234 241 227 214
+245 228 190 255 248 240 244 231 217 219 198 158
+251 236 187 255 248 224 255 250 244 243 233 218
+224 209 177 250 235 190 255 249 225 255 252 244
+225 216 209 205 182 163 213 196 150 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 246 239 255 255 255
+255 255 255 252 243 187 235 216 148 197 169 110
+141 47 0 173 0 0 15 0 0 124 0 0
+31 0 0 2 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 22 0 0
+27 0 0 168 39 0 251 207 0 255 233 0
+255 255 0 193 178 0 118 90 0 0 0 0
+27 0 0 0 0 0 1 0 0 0 0 0
+1 0 0 0 0 0 152 130 19 255 249 231
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 243 228 255 249 237 255 255 255 255 255 255
+210 177 146 203 178 139 237 219 189 255 251 236
+255 245 237 254 243 231 254 242 228 251 239 209
+255 242 226 255 247 233 255 243 230 252 240 227
+255 245 233 222 218 197 212 182 147 236 223 184
+253 243 236 250 240 231 249 238 228 248 239 225
+246 237 223 248 237 227 248 237 223 248 239 227
+249 238 226 249 238 227 248 243 227 250 238 223
+249 236 227 247 238 226 250 238 226 254 242 226
+252 241 225 253 239 229 251 240 229 249 236 226
+252 238 226 250 240 226 250 236 225 247 237 223
+248 238 228 251 239 227 255 255 255 250 254 235
+57 86 56 131 0 0 197 121 0 202 176 0
+245 217 2 207 193 80 235 184 0 66 55 0
+161 100 0 255 255 255 255 247 243 225 211 183
+216 193 152 247 226 188 255 247 239 250 237 229
+242 228 202 252 239 209 255 246 228 252 240 239
+228 216 193 222 206 158 249 235 212 255 249 238
+255 245 243 237 224 209 243 224 182 255 244 218
+253 240 242 240 219 180 244 234 191 255 254 242
+244 239 231 237 213 198 255 252 239 255 245 218
+255 254 228 249 237 240 226 209 189 212 197 173
+230 213 163 250 244 215 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 253 247 243
+255 255 255 255 255 246 255 229 175 239 220 97
+133 48 0 40 0 0 49 0 0 31 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+131 0 0 249 202 0 255 246 0 255 247 0
+130 133 0 58 0 0 0 0 0 197 0 0
+94 0 0 127 0 0 38 0 0 0 0 0
+153 91 0 255 255 255 255 253 246 255 254 242
+255 254 245 255 255 255 255 255 255 255 255 255
+255 255 255 249 249 239 203 198 177 215 196 165
+231 223 196 247 244 227 251 245 253 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 241 255 252 243 255 255 244
+255 247 239 253 245 216 253 242 228 255 249 238
+250 241 231 249 241 228 246 238 225 250 240 227
+249 238 224 249 236 228 246 237 223 249 239 227
+246 239 227 244 235 225 244 235 223 247 235 224
+249 237 227 248 239 227 253 239 226 249 238 226
+253 240 228 253 238 229 253 240 227 252 238 226
+253 238 227 247 239 227 252 238 226 251 239 227
+255 246 238 255 255 255 198 228 198 0 0 0
+103 0 0 241 212 0 191 143 0 208 173 0
+203 173 156 231 201 104 144 122 0 0 0 0
+255 255 233 244 232 224 231 204 173 248 225 183
+255 248 231 255 243 239 238 223 189 235 217 185
+255 255 255 253 250 255 255 255 255 245 235 199
+244 235 204 255 246 235 250 243 242 233 222 194
+239 227 190 255 244 214 255 250 239 255 251 241
+243 233 184 255 245 241 251 238 233 231 216 189
+247 232 195 255 247 206 255 242 241 232 218 204
+214 198 189 214 191 151 227 225 176 245 236 206
+253 249 237 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+247 240 234 255 248 246 255 255 255 255 242 192
+217 196 134 81 8 0 0 0 0 0 0 0
+0 0 0 99 0 0 0 0 0 0 0 0
+2 14 0 0 0 0 160 33 0 146 101 0
+146 75 0 169 104 0 205 143 0 229 140 0
+225 160 0 235 150 0 232 154 0 231 130 0
+231 130 0 223 116 0 219 119 0 190 101 0
+193 85 0 150 29 0 40 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 221 172 0
+255 222 0 255 247 0 206 208 0 0 0 0
+16 0 0 41 0 0 147 0 0 83 4 0
+0 0 0 0 0 0 231 187 136 222 202 168
+185 159 153 169 144 122 116 95 0 132 111 60
+101 38 0 123 45 0 92 53 0 110 41 0
+95 2 0 113 75 0 137 108 0 97 53 0
+158 148 103 142 130 113 119 91 36 158 145 142
+169 159 119 214 189 168 198 197 180 161 155 147
+237 239 217 236 237 217 255 255 255 220 229 214
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 250 244 255 251 238 255 251 241
+255 249 237 253 242 232 249 241 230 251 239 228
+247 238 225 246 235 225 249 237 226 249 238 226
+250 238 224 252 237 228 254 241 228 250 239 227
+252 242 228 255 245 235 255 247 238 255 255 255
+214 221 196 113 130 111 10 0 0 118 0 0
+180 111 0 146 88 0 234 202 0 251 231 227
+204 161 0 187 152 0 127 164 0 191 148 9
+255 255 255 238 221 161 255 245 234 253 244 235
+233 218 197 242 221 184 255 249 235 255 255 255
+95 61 55 81 37 0 35 21 0 255 255 255
+254 244 239 232 219 208 233 210 183 245 237 213
+239 228 224 233 217 183 255 248 234 255 244 238
+238 227 217 239 219 185 241 229 197 255 253 231
+238 224 223 223 203 194 199 180 146 232 215 172
+237 225 172 255 250 234 255 247 239 251 242 236
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 251 244 233 255 255 255
+255 255 224 253 240 176 132 70 0 0 0 0
+0 0 0 34 0 0 0 0 0 16 0 0
+107 65 0 72 0 0 158 97 0 182 108 0
+233 177 0 227 145 0 240 186 0 245 189 0
+255 202 0 248 207 0 230 196 0 228 182 0
+239 213 0 246 216 0 236 217 0 237 205 0
+252 225 0 242 211 0 245 211 0 244 215 0
+240 206 0 249 218 0 255 213 0 253 203 0
+230 149 0 196 140 0 128 71 0 169 1 0
+242 215 0 236 191 0 249 204 0 234 225 0
+138 150 0 76 0 0 0 0 0 128 0 0
+62 0 0 155 24 0 0 0 0 0 0 0
+203 67 0 175 117 0 188 136 0 0 0 0
+205 169 0 107 17 0 94 20 0 114 16 0
+35 0 0 133 68 0 125 59 0 118 53 0
+93 0 0 92 25 0 158 75 0 99 45 0
+0 0 0 0 0 0 112 16 0 166 112 0
+42 0 0 0 0 0 95 23 0 90 6 0
+50 33 0 31 0 0 93 90 14 85 66 4
+142 138 112 193 187 169 214 226 208 182 193 171
+204 207 197 245 243 233 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 224 232 214 213 219 205 0 26 0
+81 0 0 74 0 0 177 69 0 138 2 0
+162 87 0 173 143 0 204 193 166 187 155 30
+255 236 15 38 0 0 0 0 0 255 255 255
+254 240 232 248 240 238 241 228 217 234 220 178
+245 233 200 255 248 245 209 221 239 64 19 0
+255 246 194 255 246 214 168 191 0 188 154 172
+253 251 238 237 219 178 229 221 202 230 206 163
+245 233 198 253 245 240 228 215 201 219 201 170
+244 233 197 247 239 236 238 219 213 202 192 165
+216 195 155 218 210 170 255 243 209 255 251 238
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 239 214 194 110
+23 0 0 0 0 0 0 0 0 63 0 0
+0 0 0 146 164 0 106 0 0 126 0 0
+219 144 0 237 187 0 245 191 0 244 205 0
+226 183 0 238 214 0 239 220 97 246 229 0
+238 212 0 222 189 0 249 231 0 239 229 0
+232 198 0 239 201 0 241 219 0 233 208 0
+248 206 0 247 227 0 236 205 0 242 217 0
+239 216 0 235 193 0 243 216 0 251 216 0
+238 211 0 245 203 0 255 223 0 216 187 0
+241 199 0 245 202 0 243 205 0 246 197 0
+249 215 0 230 242 0 0 0 0 0 0 0
+113 0 0 196 206 0 101 0 0 0 0 0
+45 0 0 239 141 0 101 38 0 178 25 0
+195 105 0 173 69 0 137 14 0 99 0 0
+139 12 0 107 0 0 113 0 0 76 0 0
+96 0 0 116 0 0 59 0 0 122 0 0
+154 0 0 61 0 0 88 0 0 0 0 0
+75 0 0 40 0 0 73 0 0 79 0 0
+21 0 0 41 0 0 44 0 0 130 34 0
+113 37 0 42 0 0 79 0 0 39 0 0
+72 24 0 35 0 0 0 0 0 62 0 0
+95 67 0 119 105 42 96 78 38 141 128 116
+121 112 85 88 68 0 111 103 89 76 65 0
+0 0 0 39 0 0 128 0 0 81 0 0
+148 0 0 165 90 0 184 114 0 186 139 0
+222 179 0 182 147 0 216 186 0 216 155 0
+176 97 0 0 0 0 216 177 116 255 255 255
+245 238 221 231 211 178 236 224 191 255 247 240
+255 255 255 185 199 236 127 62 0 255 248 136
+207 190 102 140 84 0 11 9 0 244 192 194
+242 232 217 234 217 185 249 234 199 242 234 228
+230 214 194 215 198 160 244 227 187 243 234 220
+227 214 204 203 179 133 204 188 157 245 229 186
+253 247 235 247 239 229 255 246 235 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 154 140 0 14 0 0 0 0 0
+0 0 0 79 0 0 37 35 0 135 0 0
+174 146 0 200 92 0 251 218 0 244 208 0
+233 211 0 235 215 137 251 233 187 249 237 130
+236 223 36 220 199 0 248 213 47 245 232 0
+247 228 33 239 223 26 249 228 0 245 227 41
+243 230 0 244 214 0 241 223 0 249 228 0
+249 221 0 251 228 0 242 224 0 244 218 0
+249 223 0 243 220 0 243 218 0 246 218 0
+241 215 0 243 210 0 238 205 0 238 207 0
+227 189 0 242 193 0 247 211 0 237 190 0
+238 194 0 255 203 0 248 234 0 114 139 0
+0 0 0 134 0 0 191 120 0 190 54 0
+0 0 0 0 0 0 238 183 0 130 102 0
+138 22 0 142 53 0 183 121 0 138 44 0
+188 149 0 162 43 0 101 0 0 192 149 0
+128 0 0 156 86 0 160 60 0 150 7 0
+182 155 0 160 64 0 132 0 0 174 35 0
+143 41 0 73 0 0 124 0 0 164 64 0
+179 101 0 116 41 0 166 59 0 137 55 0
+81 0 0 169 78 0 147 39 0 144 48 0
+112 0 0 128 0 0 204 106 0 31 0 0
+140 40 0 108 0 0 85 10 0 60 0 0
+30 0 0 20 0 0 121 0 0 76 0 0
+165 75 0 154 36 0 182 85 0 138 28 0
+218 171 0 189 130 0 201 138 0 190 151 0
+199 164 0 185 147 0 219 204 73 225 147 23
+59 13 0 131 43 0 255 255 255 250 241 229
+248 237 219 252 241 228 255 255 255 218 221 239
+127 103 130 175 126 0 201 201 184 134 101 0
+6 0 0 86 0 0 164 125 0 240 241 223
+244 235 209 255 248 242 225 214 198 228 203 173
+233 221 183 248 229 219 208 198 178 204 182 136
+220 212 175 243 237 207 251 244 228 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 247 244 216 131
+0 0 0 0 0 0 0 0 0 93 0 0
+47 0 0 146 0 0 205 129 0 243 198 0
+247 209 0 241 210 19 233 206 0 229 204 90
+243 226 139 239 219 100 247 224 139 251 238 110
+249 233 132 249 232 3 242 222 0 255 243 82
+254 239 44 255 248 124 255 244 0 255 255 56
+255 253 51 255 244 0 255 237 0 255 231 0
+255 214 0 236 202 0 255 219 0 255 227 0
+255 226 0 255 232 0 255 250 0 255 252 0
+255 246 0 255 241 0 255 243 0 239 206 0
+248 215 0 240 209 0 238 201 0 245 206 0
+240 196 0 237 199 0 241 196 0 255 223 0
+184 196 0 0 0 0 88 0 0 255 255 127
+134 41 0 153 97 0 0 0 0 239 193 0
+240 157 0 230 189 0 132 79 0 194 106 0
+205 128 0 217 193 0 105 0 0 224 172 0
+226 184 0 90 9 0 187 126 0 222 166 0
+203 134 0 187 146 0 144 52 0 190 159 0
+201 139 0 206 164 0 193 164 0 129 0 0
+213 153 0 204 152 0 189 137 0 164 70 0
+110 9 0 163 81 0 151 105 0 172 69 0
+174 95 0 147 59 0 136 37 0 91 0 0
+131 27 0 111 0 0 183 86 0 170 96 0
+166 39 0 165 38 0 190 111 0 190 98 0
+172 99 0 201 139 0 137 75 0 168 76 0
+206 158 0 178 104 0 181 157 0 220 161 0
+213 195 0 219 189 47 229 196 136 242 206 57
+57 0 0 217 211 206 255 255 255 255 253 246
+255 255 255 236 235 252 129 106 115 167 104 0
+222 223 74 95 10 0 56 0 0 178 145 12
+251 249 177 255 251 199 255 255 255 251 239 231
+216 204 181 212 192 163 241 226 196 232 220 209
+212 195 170 209 186 148 229 215 176 243 233 201
+247 241 228 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 246 236 208 67 0 0 0 0 0
+0 0 0 35 0 0 91 0 0 147 22 0
+255 179 0 244 207 0 234 206 0 236 209 0
+238 216 0 253 232 93 249 240 128 247 231 129
+252 238 157 250 242 156 253 241 164 253 234 136
+255 245 130 255 239 146 255 226 0 253 188 14
+218 197 0 176 139 0 125 110 0 71 0 0
+156 13 0 0 0 0 0 0 0 6 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 42 0 0 15 0 0 104 0 0
+114 0 0 171 67 0 185 48 0 227 143 0
+247 171 0 255 197 0 247 220 0 244 205 0
+247 208 0 244 209 0 235 192 0 230 191 0
+255 221 0 149 181 0 0 0 0 250 186 52
+255 238 227 218 176 31 55 50 0 160 137 0
+154 148 0 100 0 0 189 142 0 171 130 0
+131 37 0 160 119 0 196 149 0 97 0 0
+193 172 0 194 150 0 153 108 0 193 120 0
+170 101 0 200 137 0 187 133 0 171 101 0
+145 54 0 188 113 0 178 130 0 211 167 0
+82 0 0 149 79 0 149 79 0 166 87 0
+173 112 0 154 81 0 186 109 0 177 117 0
+196 133 0 186 141 0 103 0 0 222 172 0
+172 115 0 195 145 0 92 0 0 170 139 0
+197 127 0 165 139 0 130 20 0 179 99 0
+203 159 0 204 161 0 214 164 0 131 13 0
+231 183 0 197 147 0 255 251 255 173 116 0
+180 135 0 188 140 0 232 191 47 214 193 184
+124 91 0 139 46 0 152 142 154 140 119 130
+113 65 0 127 92 0 255 241 163 139 94 17
+36 0 0 176 148 0 255 255 255 246 237 246
+229 209 189 246 237 232 231 218 211 215 194 156
+244 227 201 243 231 215 206 188 166 213 198 158
+236 218 185 243 237 209 254 245 236 249 241 236
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+185 151 121 0 0 0 0 0 0 0 0 0
+94 0 0 215 132 0 253 206 0 247 216 0
+235 210 0 246 220 34 250 234 75 246 228 67
+241 219 37 246 224 130 252 242 163 254 244 156
+255 238 132 255 241 107 255 218 194 232 221 0
+147 76 0 139 67 0 169 139 0 0 0 0
+101 0 0 8 0 0 115 0 0 69 0 0
+0 0 0 169 80 0 0 0 0 29 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+24 0 0 70 0 0 182 0 0 221 126 0
+242 146 0 246 209 0 244 219 0 237 209 0
+235 190 0 255 219 0 220 241 0 71 0 0
+255 240 161 226 189 143 255 238 161 32 0 0
+76 0 0 222 153 0 228 157 0 199 161 0
+130 0 0 158 66 0 152 87 0 141 17 0
+224 159 0 227 185 0 137 104 0 161 73 0
+169 102 0 222 167 0 205 153 0 95 48 0
+254 203 0 149 87 0 160 64 0 207 162 0
+118 8 0 209 177 0 196 154 0 116 49 0
+213 159 0 174 127 0 167 65 0 178 110 0
+159 86 0 196 139 0 63 0 0 143 68 0
+151 67 0 86 0 0 123 10 0 197 127 0
+144 45 0 138 70 0 179 115 0 205 151 0
+192 142 0 192 140 0 194 126 0 150 58 0
+180 127 0 201 162 0 182 103 0 155 70 0
+189 127 0 148 68 0 214 189 0 139 53 0
+105 0 0 25 0 0 135 61 0 233 229 74
+254 234 210 165 125 6 98 68 0 46 0 0
+237 216 136 254 241 249 225 211 183 241 218 179
+230 224 197 212 184 147 235 219 176 245 237 235
+212 195 171 201 187 162 236 222 185 252 245 232
+252 242 235 249 244 233 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 29 0 0
+0 0 0 0 0 0 45 0 0 201 80 0
+249 195 0 241 204 0 243 217 53 244 217 0
+241 223 45 242 217 0 249 226 94 247 239 152
+251 246 147 255 248 208 255 237 114 255 226 109
+237 209 0 89 0 0 80 82 0 103 3 0
+60 103 0 0 0 0 111 0 0 180 205 0
+44 0 0 143 0 0 50 0 0 78 0 0
+30 0 0 0 0 0 177 26 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 37 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+48 0 0 181 0 0 210 0 0 226 133 0
+235 179 0 244 210 0 255 208 0 208 219 0
+90 0 0 255 229 181 243 208 174 169 131 0
+93 0 0 169 52 0 138 48 0 163 100 0
+209 174 0 195 132 0 198 164 0 204 158 0
+153 83 0 213 149 0 169 88 0 198 186 0
+154 98 0 184 123 0 138 92 0 219 180 0
+139 84 0 209 138 0 197 169 0 197 142 0
+200 149 0 177 109 0 188 154 0 214 150 0
+207 148 0 159 96 0 197 127 0 156 105 0
+207 113 0 161 129 0 209 181 0 146 102 0
+206 151 0 189 157 0 175 109 0 165 92 0
+197 157 0 146 39 0 167 112 0 157 82 0
+204 137 0 154 101 0 162 57 0 220 183 0
+200 176 112 136 109 0 244 202 222 174 174 0
+219 174 0 192 166 0 217 143 0 138 130 0
+160 97 0 111 70 0 138 67 0 117 13 0
+157 138 0 95 0 0 39 0 0 255 255 214
+240 229 215 235 217 181 240 233 219 214 190 169
+235 213 182 246 237 220 226 217 201 211 184 150
+232 226 183 249 238 216 255 243 239 247 241 228
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 0 0 0 0 0 0
+0 0 0 126 0 0 255 220 0 250 220 0
+241 231 68 240 216 0 242 222 30 248 223 23
+247 232 55 252 233 57 254 244 153 255 244 146
+255 241 0 191 157 0 146 65 0 82 0 0
+68 0 0 0 0 0 87 0 0 76 0 0
+173 24 0 118 118 0 111 0 0 97 0 0
+147 134 0 40 0 0 134 0 0 86 0 0
+145 1 0 100 0 0 33 0 0 135 41 0
+118 4 0 113 64 0 123 0 0 134 39 0
+140 74 0 91 0 0 73 0 0 93 0 0
+0 0 0 67 0 0 5 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 152 0 0
+213 0 0 239 176 0 244 203 0 255 212 0
+120 162 0 71 0 0 255 255 255 230 202 125
+255 210 61 0 0 0 198 160 0 156 99 0
+198 159 0 160 124 0 152 109 0 217 182 3
+235 206 145 227 183 0 191 159 0 255 225 255
+230 214 0 228 191 0 187 124 0 255 237 255
+216 183 0 211 191 0 159 68 0 232 207 174
+212 185 0 192 178 0 134 30 0 237 220 137
+217 176 0 162 121 0 147 97 0 186 101 0
+191 147 0 166 105 0 181 116 0 135 79 0
+140 80 0 167 90 0 144 92 0 176 128 0
+198 129 0 147 117 0 224 169 0 163 134 0
+133 40 0 204 137 0 161 140 0 197 139 0
+192 128 0 164 76 0 189 150 0 126 0 0
+203 160 0 103 0 0 212 185 0 144 110 0
+153 44 0 213 183 0 137 60 0 189 87 0
+89 0 0 164 54 0 22 0 0 255 255 246
+243 235 206 220 198 190 222 200 160 244 226 192
+222 206 201 210 187 147 225 211 158 254 243 233
+255 246 238 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 248 235 226 255 255 255
+196 186 159 14 0 0 0 0 0 54 0 0
+198 100 0 249 205 0 239 212 0 238 207 0
+251 230 71 247 231 35 248 231 67 252 237 62
+252 239 154 255 247 168 255 215 0 140 108 0
+27 0 0 150 0 0 0 0 0 28 0 0
+130 4 0 125 0 0 142 4 0 182 162 0
+102 0 0 117 0 0 125 131 0 154 61 0
+174 128 0 190 166 23 226 218 120 243 230 39
+248 232 54 255 240 81 255 255 62 255 249 10
+255 246 0 255 233 0 255 245 0 255 251 0
+255 236 0 253 236 0 255 219 0 249 214 0
+255 220 0 229 179 0 226 165 0 180 42 0
+156 0 0 145 0 0 82 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 220 0 0 238 96 0 246 221 0
+255 220 0 123 156 0 211 159 182 252 228 176
+246 208 141 158 134 0 117 46 0 142 81 0
+177 100 0 255 221 0 225 204 0 149 67 0
+244 228 219 220 178 0 175 172 0 100 0 0
+194 145 80 222 185 0 94 0 0 198 139 80
+219 184 0 183 156 0 158 85 0 125 35 0
+203 174 220 229 195 0 190 132 0 132 107 121
+214 177 0 225 182 0 208 192 0 154 63 0
+210 180 250 226 207 0 242 195 0 224 190 0
+209 140 0 255 255 255 223 185 0 232 186 0
+192 158 0 217 164 90 215 181 0 223 190 0
+213 170 0 203 141 0 186 99 0 139 90 0
+181 136 0 175 128 0 204 162 0 200 150 0
+161 127 0 180 112 0 173 116 0 122 0 0
+143 149 0 152 82 0 140 34 0 100 0 0
+65 0 0 166 61 0 0 0 0 255 255 245
+244 230 217 235 219 182 227 208 193 205 184 161
+230 210 157 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 252 240 227 255 255 255 204 206 181
+10 0 0 0 0 0 119 0 0 255 191 0
+246 223 0 236 222 0 236 215 0 230 199 0
+231 214 6 244 231 19 244 232 107 255 249 91
+255 210 0 209 165 0 0 0 0 148 38 0
+56 108 0 0 0 0 151 0 0 56 0 0
+108 0 0 86 0 0 131 10 0 137 48 0
+188 189 41 240 228 158 255 255 212 255 255 216
+255 254 221 255 248 197 252 240 204 253 244 164
+255 243 113 255 250 165 255 246 129 255 245 157
+255 248 59 255 252 73 255 244 1 255 243 0
+255 246 12 255 230 0 252 223 0 255 225 0
+249 228 0 255 231 0 248 227 0 255 240 0
+247 231 0 255 226 0 255 212 0 245 176 0
+238 152 0 178 79 0 124 0 0 15 0 0
+0 0 0 0 0 0 74 0 0 244 6 0
+251 226 0 255 236 0 32 41 0 255 255 255
+243 213 164 233 220 105 52 0 0 152 159 0
+175 142 0 138 99 0 208 166 0 186 138 0
+151 132 0 139 4 0 255 255 131 221 184 0
+249 221 0 170 78 0 255 255 230 254 229 0
+106 30 0 255 255 255 241 231 0 255 241 0
+126 97 0 208 154 202 255 240 0 232 201 0
+172 158 0 212 177 80 189 165 0 180 142 0
+201 154 0 178 129 0 197 177 0 192 161 0
+96 6 0 107 48 0 247 204 0 206 171 0
+144 74 0 172 103 78 187 149 154 181 122 0
+239 217 0 172 90 0 172 83 0 250 242 168
+203 166 0 225 174 0 176 109 0 151 78 0
+169 94 0 164 104 0 173 124 0 170 86 0
+122 3 0 125 24 0 170 72 0 136 56 0
+98 0 0 40 0 0 119 0 0 127 106 0
+255 245 255 209 191 166 219 204 163 248 236 208
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 240 227 255 255 255 226 221 193 10 0 0
+0 0 0 144 0 0 255 227 0 251 227 47
+249 236 83 243 231 66 249 230 81 246 228 0
+246 235 151 251 239 94 255 242 24 171 114 0
+0 0 0 0 0 0 44 0 0 0 0 0
+62 0 0 173 103 0 68 0 0 97 0 0
+169 124 0 223 203 121 246 229 153 255 255 224
+255 252 209 255 244 196 248 239 193 254 244 191
+255 249 207 255 250 200 255 255 230 255 255 174
+251 224 57 216 193 83 212 192 16 212 168 51
+160 132 0 182 104 0 169 123 0 175 123 0
+178 137 0 160 133 0 184 151 0 193 158 0
+215 177 0 245 191 0 249 210 0 255 230 0
+255 249 0 255 236 0 255 232 0 254 227 0
+250 225 0 255 229 0 241 206 0 246 148 0
+228 129 0 129 0 0 46 0 0 0 0 0
+255 152 0 251 207 0 210 210 0 174 118 141
+255 255 255 254 223 197 168 154 0 36 0 0
+144 0 0 81 0 0 205 163 0 255 251 202
+228 185 0 123 77 0 204 157 188 201 180 145
+191 165 0 168 152 0 117 22 0 142 66 0
+219 213 0 95 0 0 131 67 0 154 92 0
+133 116 0 143 43 0 123 104 0 187 146 0
+172 167 0 135 2 0 194 195 26 192 145 0
+235 216 0 102 0 0 177 166 154 207 211 0
+132 27 0 255 255 255 221 203 0 168 141 0
+164 65 0 227 222 0 206 151 0 230 193 0
+159 125 0 186 142 0 146 103 0 195 128 0
+222 190 0 197 157 0 181 105 72 214 211 101
+223 188 0 228 176 0 135 111 0 166 108 0
+142 78 0 138 0 0 171 139 0 132 52 0
+154 29 0 102 5 0 120 0 0 0 0 0
+188 149 57 255 250 228 251 246 237 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 156 137 97 0 0 0 0 0 0
+194 27 0 242 205 0 244 221 0 238 213 0
+245 218 0 243 226 5 247 229 29 245 229 2
+255 231 77 224 156 0 82 0 0 0 0 0
+167 118 0 0 0 0 8 0 0 206 80 0
+39 0 0 107 0 0 208 204 120 255 255 171
+255 252 208 254 250 220 253 241 196 244 236 200
+255 248 201 255 255 214 255 255 222 255 236 187
+220 192 160 183 198 100 82 0 0 126 66 0
+0 0 0 70 7 0 18 0 0 0 0 0
+110 0 0 0 0 0 78 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+87 0 0 147 52 0 181 148 0 248 193 0
+255 230 0 255 242 0 249 210 0 235 208 0
+255 222 0 235 180 0 255 198 0 204 100 0
+193 54 0 226 127 0 255 250 0 55 73 0
+255 216 240 255 255 255 227 206 43 93 7 0
+218 146 0 144 118 0 94 0 0 154 116 0
+121 59 0 172 124 0 193 169 0 110 0 0
+90 0 0 172 91 0 52 0 0 132 9 0
+145 73 0 131 87 0 15 0 0 221 208 5
+152 64 0 99 61 0 151 36 0 139 73 0
+140 23 0 63 0 0 128 52 0 200 188 0
+156 105 0 29 0 0 159 58 0 144 53 0
+45 0 0 131 15 0 173 114 0 122 85 0
+102 0 0 194 180 26 171 107 0 180 180 0
+166 41 0 249 255 184 228 196 0 157 143 0
+226 190 0 248 213 0 228 202 0 134 102 0
+205 133 0 199 175 0 183 165 0 179 93 0
+227 220 0 187 192 0 117 0 0 126 77 0
+130 74 0 121 0 0 141 0 0 75 0 0
+0 0 0 255 255 255 251 242 232 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+181 177 140 16 0 0 0 0 0 137 0 0
+255 244 0 243 221 0 249 234 49 250 230 57
+245 228 86 242 226 0 253 234 89 255 227 0
+191 146 0 12 0 0 0 0 0 12 0 0
+53 0 0 98 0 0 102 3 0 141 69 0
+217 210 162 255 255 228 255 250 211 249 243 202
+250 241 192 252 243 208 255 248 209 255 255 230
+218 216 173 163 164 101 84 21 0 0 0 0
+0 0 0 116 0 0 46 81 0 0 0 0
+165 118 0 111 0 0 0 0 0 0 0 0
+2 0 0 22 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 50 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 156 86 0 228 181 0 255 229 0
+251 221 0 240 208 0 241 190 0 250 220 0
+237 207 0 246 194 0 220 180 0 238 228 0
+101 49 0 255 241 255 255 245 254 156 112 0
+130 0 0 13 0 0 121 0 0 217 183 0
+167 122 0 208 149 0 0 0 0 255 255 255
+171 136 0 186 110 0 0 0 0 223 221 184
+186 193 0 96 0 0 0 0 0 205 221 165
+125 29 0 71 0 0 193 185 168 146 121 0
+141 0 0 0 0 0 178 134 79 100 84 0
+129 0 0 0 0 0 234 233 220 116 6 0
+62 0 0 36 0 0 152 103 104 86 0 0
+169 80 0 0 0 0 255 255 206 105 0 0
+180 140 0 94 0 0 172 160 0 100 0 0
+84 0 0 161 135 86 214 153 0 66 0 0
+225 179 104 213 236 0 198 144 0 242 224 0
+185 140 0 208 204 0 154 99 0 248 229 140
+147 113 0 119 0 0 107 0 0 76 0 0
+7 0 0 193 186 154 255 255 244 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 231 246 194
+40 0 0 0 0 0 145 0 0 247 211 0
+242 221 0 239 215 0 243 213 0 248 228 35
+249 230 72 252 243 98 255 201 0 152 111 0
+0 0 0 141 0 0 77 37 0 16 0 0
+50 0 0 55 0 0 241 227 159 255 255 216
+255 251 203 254 239 184 248 237 192 255 243 202
+255 255 224 226 214 176 189 206 119 60 0 0
+40 0 0 119 14 0 75 0 0 170 0 0
+75 0 0 0 0 0 196 120 0 0 0 0
+90 0 0 0 0 0 97 0 0 0 0 0
+0 0 0 53 0 0 0 0 0 84 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 33 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+163 1 0 255 204 0 252 224 0 240 203 0
+250 205 0 255 204 0 144 122 0 255 229 0
+100 129 0 232 193 149 252 229 223 238 211 50
+0 0 0 130 0 0 126 42 0 128 34 0
+179 191 0 138 10 0 13 0 0 160 106 0
+10 0 0 63 0 0 120 0 0 100 0 0
+127 0 0 69 0 0 175 0 0 23 0 0
+166 110 0 125 0 0 40 0 0 100 0 0
+157 137 0 50 0 0 0 0 0 227 194 37
+133 0 0 0 0 0 143 21 0 144 99 0
+148 28 0 0 0 0 184 123 0 118 0 0
+160 0 0 0 0 0 155 76 0 143 12 0
+5 0 0 117 0 0 120 80 0 97 0 0
+195 223 140 114 32 0 200 163 0 70 0 0
+92 0 0 85 0 0 129 27 0 206 185 96
+214 158 0 110 60 0 247 213 0 226 195 0
+180 163 0 203 123 0 206 145 0 82 0 0
+115 0 0 68 7 0 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 212 211 120 5 0 0
+0 0 0 193 0 0 244 190 0 255 250 49
+249 230 0 250 229 39 252 232 79 248 231 0
+255 242 24 233 189 0 0 0 0 68 0 0
+97 0 0 25 0 0 134 83 0 81 0 0
+203 178 87 255 255 194 255 249 203 250 238 160
+251 238 181 255 247 197 255 254 194 215 220 170
+110 56 0 0 0 0 135 0 0 144 0 0
+64 0 0 146 0 0 15 47 0 37 0 0
+141 63 0 39 0 0 64 0 0 198 109 0
+132 0 0 150 137 0 109 90 0 220 183 0
+184 167 0 208 199 82 238 185 0 225 197 0
+237 174 0 233 204 0 200 139 0 209 139 0
+191 145 0 188 113 0 156 117 0 107 11 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 30 0 0 153 0 0 250 207 0
+250 209 0 241 202 0 250 205 0 245 201 0
+220 208 0 189 137 17 241 188 200 255 243 170
+93 0 0 123 61 0 0 0 0 139 0 0
+0 0 0 132 0 0 197 182 0 103 0 0
+120 12 0 215 197 104 168 114 0 186 66 0
+0 0 0 255 255 232 163 132 0 65 0 0
+181 157 60 151 129 0 177 97 0 39 0 0
+170 184 96 80 0 0 0 0 0 129 63 0
+115 28 0 87 0 0 98 0 0 16 0 0
+237 251 140 84 0 0 207 234 232 82 0 0
+155 0 0 0 0 0 144 106 4 120 41 0
+0 0 0 229 203 80 125 69 0 18 0 0
+101 0 0 166 178 0 127 5 0 25 0 0
+98 0 0 253 251 222 128 59 0 72 0 0
+142 120 0 121 0 0 66 0 0 195 145 0
+114 0 0 246 253 38 157 109 0 222 169 0
+130 0 0 0 0 0 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 0 0 0 0 0 0
+81 0 0 255 236 0 240 220 0 245 216 0
+242 212 0 250 228 25 247 233 116 255 236 0
+233 179 0 160 127 0 110 0 0 0 0 0
+19 0 0 25 0 0 73 3 0 255 247 186
+255 255 202 254 242 179 251 240 195 255 244 190
+255 255 217 204 215 134 0 0 0 96 0 0
+99 0 0 191 40 0 129 89 0 125 0 0
+111 0 0 49 0 0 161 124 0 85 0 0
+167 41 0 208 143 0 248 219 80 241 210 124
+255 245 130 255 250 177 255 255 185 255 251 149
+255 254 207 255 250 169 255 247 0 255 250 95
+255 244 0 255 227 0 255 239 0 255 243 0
+255 232 0 255 242 0 255 230 0 255 245 0
+255 237 0 255 216 0 232 207 0 140 115 0
+99 9 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 163 0 0
+254 196 0 246 191 0 241 202 0 239 201 0
+255 213 0 83 53 0 204 152 58 251 222 184
+175 147 0 118 16 0 64 28 0 173 0 0
+101 105 0 120 0 0 147 127 0 209 237 0
+52 0 0 147 40 0 41 0 0 85 0 0
+173 100 0 79 0 0 0 0 0 172 123 0
+91 0 0 102 0 0 0 0 0 193 189 0
+119 0 0 208 93 0 0 0 0 143 0 0
+170 177 0 177 91 0 0 0 0 99 0 0
+195 187 0 86 0 0 119 0 0 197 125 0
+173 127 0 97 0 0 170 55 0 188 79 0
+34 0 0 118 0 0 113 0 0 21 0 0
+70 0 0 152 54 0 57 0 0 118 0 0
+214 191 0 114 40 0 186 116 0 130 71 0
+107 51 0 92 3 0 124 56 0 125 62 0
+175 100 0 85 0 0 114 0 0 170 195 0
+87 0 0 0 0 0 255 255 244 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 143 130 0 0 0 0 0 0 0
+252 149 0 253 237 0 250 234 43 248 231 9
+250 233 83 249 229 0 255 255 20 146 92 0
+0 0 0 20 0 0 72 0 0 33 0 0
+118 0 0 214 197 56 255 255 196 255 247 161
+249 240 186 253 242 178 255 255 239 197 203 124
+82 8 0 98 0 0 148 104 0 124 0 0
+163 0 0 97 116 0 145 0 0 82 1 0
+111 0 0 179 165 84 216 193 149 255 255 181
+255 255 218 255 251 210 255 251 193 255 249 187
+255 247 187 255 252 155 255 253 187 255 255 150
+255 228 112 255 241 98 254 234 0 250 214 25
+226 194 0 234 205 0 221 172 0 215 174 0
+237 192 0 242 193 0 255 232 0 253 201 0
+255 244 0 255 242 0 255 249 0 255 237 0
+255 255 0 255 246 0 183 170 0 136 111 0
+0 0 0 0 0 0 0 0 0 0 0 0
+146 0 0 246 171 0 244 200 0 244 202 0
+255 218 0 109 139 0 211 170 46 220 161 137
+202 149 0 13 0 0 192 106 0 69 0 0
+126 0 0 104 44 0 209 125 0 56 0 0
+97 0 0 183 164 0 157 28 0 104 10 0
+188 164 0 218 153 0 0 0 0 178 159 89
+237 209 105 177 179 0 19 0 0 111 40 0
+207 155 0 106 14 0 44 0 0 113 0 0
+84 0 0 144 151 0 120 0 0 49 0 0
+78 0 0 114 0 0 77 0 0 136 138 70
+121 0 0 0 0 0 185 191 0 108 7 0
+0 0 0 155 0 0 255 255 198 0 0 0
+181 0 0 150 87 0 150 0 0 33 0 0
+173 132 61 0 0 0 129 0 0 204 200 0
+0 0 0 252 255 38 84 0 0 127 0 0
+143 33 0 103 0 0 205 116 0 34 0 0
+123 0 0 0 0 0 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 186 0 0 0 0 0 0 207 48 0
+238 203 0 249 228 18 245 218 0 247 230 60
+249 232 27 255 254 0 221 165 0 0 0 0
+100 0 0 0 0 0 25 0 0 0 0 0
+235 216 66 255 254 168 251 234 167 249 238 160
+255 248 198 253 255 204 112 66 0 66 8 0
+167 101 0 121 0 0 158 0 0 204 134 0
+59 0 0 135 1 0 93 34 0 217 213 136
+255 255 213 255 255 209 255 245 188 255 244 192
+255 246 192 255 252 202 255 255 193 249 250 180
+215 200 131 194 159 0 127 116 0 103 0 0
+106 75 0 0 0 0 32 0 0 0 0 0
+0 0 0 20 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+31 0 0 87 0 0 135 52 0 208 153 0
+226 137 0 255 237 0 255 241 0 255 255 0
+254 234 0 142 137 0 69 24 0 0 0 0
+0 0 0 26 0 0 255 224 0 245 204 0
+246 207 0 211 204 0 188 149 65 203 139 0
+222 116 0 2 0 0 40 0 0 229 163 0
+0 0 0 97 0 0 242 248 134 162 99 0
+0 0 0 179 134 70 192 188 0 103 23 0
+13 0 0 169 101 0 221 148 0 131 88 0
+58 0 0 166 129 0 220 156 0 115 11 0
+0 0 0 248 198 0 222 199 0 54 14 0
+194 167 0 173 85 0 114 59 0 98 0 0
+202 182 0 193 131 0 78 0 0 173 131 0
+173 98 0 110 0 0 196 170 0 166 90 0
+212 112 0 96 0 0 135 32 0 125 0 0
+159 82 0 155 68 0 28 0 0 19 0 0
+209 194 61 171 100 0 56 0 0 152 18 0
+92 0 0 114 0 0 0 0 0 165 16 0
+160 42 0 179 171 0 193 184 0 146 0 0
+72 0 0 0 0 0 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 251 241 188
+103 0 0 0 0 0 202 29 0 235 199 0
+249 230 0 244 226 19 244 228 85 247 232 51
+255 240 61 226 184 0 0 0 0 0 0 0
+0 0 0 70 0 0 47 0 0 252 212 51
+255 255 173 244 228 128 245 228 132 255 246 150
+176 192 116 94 0 0 145 138 0 179 57 0
+164 143 0 162 56 0 151 75 0 25 0 0
+158 71 0 246 247 185 255 255 223 255 251 198
+249 237 184 251 241 193 255 255 194 255 252 211
+225 222 135 168 195 75 80 0 0 129 0 0
+39 0 0 0 0 0 168 69 0 0 0 0
+44 0 0 98 12 0 0 0 0 140 12 0
+0 0 0 0 0 0 0 0 0 0 0 0
+60 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 151 39 0 187 135 0
+255 241 0 255 227 0 255 255 0 208 196 0
+0 0 0 0 0 0 184 53 0 253 218 0
+239 192 0 255 238 0 86 0 0 255 219 203
+184 169 0 116 16 0 87 0 0 97 0 0
+233 183 0 141 71 0 170 146 0 224 168 0
+0 0 0 210 178 0 208 132 0 251 181 0
+0 0 0 211 126 0 140 71 0 237 192 0
+10 0 0 149 95 0 128 27 0 163 96 0
+151 73 0 107 0 0 181 106 0 186 156 0
+85 0 0 176 135 0 130 60 0 52 0 0
+170 140 0 184 106 0 63 0 0 216 201 138
+139 61 0 87 0 0 139 90 0 108 0 0
+122 74 0 106 0 0 219 240 4 203 172 0
+101 5 0 186 158 0 185 65 0 61 0 0
+117 0 0 125 0 0 98 0 0 199 217 0
+170 121 0 134 0 0 196 172 0 141 0 0
+89 0 0 167 33 0 91 0 0 186 198 0
+75 0 0 7 0 0 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 105 113 0
+0 0 0 76 0 0 255 212 0 240 216 0
+236 217 0 241 225 56 245 229 123 255 249 36
+190 183 0 0 0 0 23 0 0 0 0 0
+29 0 0 37 0 0 255 255 182 251 242 155
+247 234 159 246 234 140 255 255 223 190 172 0
+55 26 0 36 0 0 87 0 0 139 0 0
+157 0 0 92 0 0 111 0 0 209 190 2
+255 255 228 252 246 174 248 235 184 255 244 188
+255 255 210 240 234 207 167 138 58 94 86 0
+82 0 0 159 21 0 124 0 0 74 0 0
+173 12 0 11 0 0 0 0 0 217 112 0
+0 0 0 5 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 71 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+73 0 0 232 117 0 250 183 0 255 221 0
+255 237 0 192 200 0 33 0 0 255 232 0
+238 194 0 255 235 0 0 0 0 211 128 0
+215 163 0 85 0 0 83 0 0 35 0 0
+134 99 0 0 0 0 153 73 0 185 105 0
+174 195 0 116 0 0 167 111 0 132 75 0
+224 178 0 168 112 0 198 139 0 177 135 0
+227 172 0 222 183 0 180 121 0 197 167 0
+233 179 4 155 134 0 205 152 0 210 166 0
+63 0 0 204 140 0 164 135 0 151 2 0
+186 129 0 201 141 0 105 44 0 244 237 183
+206 163 0 162 124 0 207 152 0 197 172 0
+193 126 0 173 151 0 107 2 0 211 179 0
+69 0 0 190 106 0 177 196 0 115 0 0
+172 123 0 182 170 0 160 86 0 136 33 0
+168 49 0 128 35 0 239 229 216 0 0 0
+186 71 0 172 175 0 98 0 0 74 60 0
+24 0 0 214 195 169 255 255 240 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 193 52 0 0
+0 0 0 231 88 0 255 239 0 247 230 46
+246 230 78 242 228 47 252 233 77 255 243 0
+3 0 0 31 0 0 0 0 0 65 0 0
+3 0 0 255 223 136 246 233 103 238 216 87
+242 224 118 255 248 140 155 144 0 0 0 0
+155 0 0 131 0 0 170 38 0 142 0 0
+89 0 0 212 175 64 255 255 215 255 251 175
+243 231 176 253 243 178 255 254 196 229 218 197
+114 59 0 125 100 0 96 0 0 172 0 0
+193 140 0 57 0 0 174 70 0 113 0 0
+0 0 0 79 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 81 0 0 94 0 0
+95 0 0 147 0 0 70 0 0 116 0 0
+50 0 0 85 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 90 0 0 227 140 0
+255 214 0 244 202 0 255 225 0 240 202 0
+239 192 0 255 226 0 97 143 0 99 0 0
+209 121 0 96 0 0 0 0 0 41 0 0
+95 0 0 49 0 0 234 192 0 166 151 0
+210 137 0 207 151 0 201 216 38 207 146 0
+182 143 0 231 186 80 172 138 0 176 148 0
+216 171 49 145 136 79 175 89 0 208 154 0
+149 97 0 176 124 0 192 136 0 126 92 0
+191 120 0 167 162 26 179 106 0 185 133 0
+162 77 0 206 134 0 175 123 0 221 199 242
+152 109 0 148 77 0 139 68 0 159 106 0
+178 116 0 162 107 0 141 99 0 135 89 0
+151 111 0 131 60 0 128 83 0 193 160 0
+177 102 0 89 0 0 170 107 0 194 137 0
+127 39 0 169 69 0 131 10 0 105 0 0
+85 0 0 105 13 0 106 0 0 123 29 0
+0 0 0 255 255 255 248 244 231 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 96 98 0 0 0 0
+0 0 0 255 227 0 249 226 0 244 217 0
+243 224 78 245 230 36 255 255 37 89 0 0
+3 0 0 0 0 0 90 0 0 58 0 0
+224 162 0 255 255 198 249 236 173 252 237 145
+255 255 240 60 62 0 21 0 0 116 0 0
+110 0 0 112 0 0 100 0 0 174 120 0
+242 232 154 255 255 171 253 239 175 250 239 148
+255 254 217 228 222 163 145 120 30 127 139 0
+101 0 0 67 0 0 153 4 0 93 0 0
+97 0 0 80 0 0 0 0 0 39 0 0
+23 0 0 132 69 0 210 168 0 217 179 0
+244 232 0 245 220 0 252 227 0 255 255 0
+255 245 0 255 245 0 255 247 0 249 236 0
+255 228 0 253 212 0 250 219 0 246 226 0
+200 146 0 192 182 0 73 11 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+224 33 0 229 177 0 235 197 0 243 192 0
+238 189 0 255 213 0 143 171 0 99 0 0
+178 49 0 93 0 0 0 0 0 70 0 0
+96 0 0 116 44 0 186 139 0 191 141 0
+229 180 0 209 185 0 77 0 0 203 152 0
+203 163 0 201 162 114 188 147 0 140 69 0
+210 148 0 204 159 0 155 112 0 200 150 0
+205 167 0 153 89 0 209 154 0 221 170 0
+189 142 0 201 148 0 223 184 0 186 144 0
+199 147 0 212 165 0 165 125 0 148 69 0
+220 160 0 173 119 0 174 124 0 124 56 0
+224 180 0 148 105 0 148 75 0 205 177 0
+131 66 0 127 66 0 91 0 0 210 165 0
+163 136 0 170 115 0 172 131 0 154 99 0
+176 137 0 94 0 0 96 0 0 183 142 0
+143 8 0 93 0 0 213 193 0 204 144 0
+0 0 0 255 255 255 247 240 228 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+249 236 234 255 255 208 0 0 0 0 0 0
+217 68 0 251 224 0 245 229 0 243 225 0
+246 232 104 255 236 0 191 164 0 35 0 0
+0 0 0 48 0 0 45 0 0 255 215 0
+251 223 88 235 218 1 238 215 84 255 239 33
+122 115 0 61 0 0 103 0 0 124 0 0
+96 0 0 77 0 0 187 132 0 255 255 201
+255 249 175 250 231 154 255 242 188 255 255 196
+163 141 0 0 0 0 85 0 0 153 13 0
+175 97 12 180 142 0 125 0 0 139 8 0
+28 0 0 134 42 0 182 174 14 223 213 46
+255 255 116 255 255 147 255 243 0 250 227 0
+248 221 0 246 218 0 241 222 0 241 196 0
+245 220 0 218 196 0 245 217 0 241 218 0
+238 200 0 229 196 0 246 218 0 227 183 0
+240 212 0 255 214 0 255 246 0 255 234 0
+247 235 0 218 179 0 108 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 161 0 0 251 200 0 222 175 0
+243 193 0 251 199 0 197 214 0 71 0 0
+157 3 0 73 0 0 56 0 0 70 0 0
+29 0 0 168 62 0 181 121 0 169 118 0
+110 23 0 154 83 0 219 190 0 57 0 0
+176 185 0 114 57 0 240 191 0 105 0 0
+130 68 0 199 144 0 123 31 0 194 160 0
+103 16 0 171 94 0 172 108 0 107 38 0
+213 214 0 143 54 0 116 15 0 166 85 0
+130 76 0 236 212 0 43 0 0 212 170 0
+172 115 0 165 145 0 110 0 0 198 153 0
+128 112 0 186 118 0 233 184 0 137 14 0
+212 217 0 85 0 0 112 0 0 58 0 0
+96 0 0 128 44 0 165 103 0 154 82 0
+159 113 0 141 0 0 200 211 0 113 0 0
+86 0 0 95 0 0 170 132 0 206 177 33
+200 191 0 185 164 190 255 255 246 248 238 225
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 251 241 201 197 0 0 0 0 155 0 0
+245 210 0 253 245 76 249 232 68 249 225 0
+255 240 94 228 210 0 1 0 0 14 0 0
+37 0 0 87 0 0 168 82 0 255 255 194
+250 235 147 250 230 102 255 252 162 202 198 0
+0 0 0 133 0 0 107 0 0 140 0 0
+76 0 0 211 171 0 255 243 138 248 230 117
+247 227 145 255 241 145 223 234 153 48 0 0
+75 0 0 120 83 0 119 0 0 184 0 0
+197 130 0 80 0 0 11 0 0 157 138 0
+238 212 107 255 255 125 255 245 121 255 240 142
+249 230 0 237 200 0 250 222 0 230 197 0
+246 217 0 231 193 0 248 229 0 231 205 0
+248 206 0 241 221 0 246 195 0 252 229 0
+224 186 0 239 214 0 233 197 0 216 189 0
+252 221 0 238 203 0 245 200 0 241 211 0
+255 222 0 246 211 0 255 222 0 255 249 0
+242 215 0 46 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 220 30 0 252 221 0
+242 206 0 250 198 0 237 224 0 0 0 0
+66 0 0 67 0 0 43 0 0 189 212 0
+104 0 0 44 0 0 40 0 0 171 124 0
+160 97 0 55 0 0 214 200 0 113 0 0
+217 166 0 19 0 0 2 0 0 0 0 0
+123 0 0 44 0 0 25 0 0 9 0 0
+102 0 0 117 0 0 38 0 0 160 9 0
+44 0 0 81 0 0 57 0 0 92 0 0
+14 0 0 137 0 0 40 0 0 29 0 0
+76 0 0 81 0 0 79 0 0 45 0 0
+77 0 0 29 0 0 128 37 0 61 0 0
+149 60 0 120 65 0 128 27 0 82 0 0
+76 0 0 125 26 0 132 32 0 188 146 0
+210 178 0 120 12 0 106 0 0 71 0 0
+86 0 0 160 31 0 189 128 0 162 129 0
+255 255 255 30 37 0 255 255 255 250 242 236
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 244 239
+255 254 187 67 0 0 0 0 0 253 153 0
+242 223 0 244 221 0 243 215 0 246 220 0
+255 255 0 0 0 0 46 0 0 80 0 0
+35 0 0 53 0 0 255 240 4 247 226 75
+245 224 121 255 242 49 179 163 0 0 0 0
+95 0 0 90 0 0 121 0 0 67 0 0
+255 241 67 255 248 172 250 238 158 251 233 131
+255 255 208 188 182 0 82 0 0 97 0 0
+98 26 0 201 1 0 197 77 0 119 0 0
+69 0 0 152 136 0 255 255 169 255 255 116
+255 240 107 248 224 113 248 235 50 237 212 62
+255 235 58 248 226 35 231 194 0 254 240 0
+235 195 0 221 193 0 255 220 0 238 209 0
+235 189 0 255 240 0 205 155 0 255 221 0
+219 187 0 253 228 0 217 173 0 215 199 0
+248 203 0 233 204 0 232 196 0 233 209 0
+237 185 0 229 192 0 215 172 0 249 223 0
+245 189 0 235 217 0 255 226 0 151 130 0
+0 0 0 0 0 0 0 0 0 255 120 0
+246 203 0 247 194 0 254 234 0 0 0 0
+24 0 0 170 12 0 17 0 0 76 0 0
+49 0 0 134 0 0 16 0 0 40 0 0
+137 0 0 79 6 0 103 0 0 55 0 0
+0 0 0 45 0 0 35 0 0 42 0 0
+31 0 0 28 0 0 19 0 0 32 0 0
+12 0 0 0 0 0 110 0 0 39 0 0
+104 0 0 4 0 0 136 2 0 167 114 0
+105 14 0 42 0 0 165 54 0 185 121 0
+79 0 0 173 85 0 120 0 0 174 55 0
+33 0 0 173 40 0 119 0 0 78 9 0
+123 0 0 75 0 0 30 0 0 3 0 0
+78 0 0 89 0 0 112 16 0 151 94 0
+220 163 0 212 200 0 109 2 0 47 0 0
+127 19 0 105 42 0 71 0 0 124 38 0
+213 171 0 251 235 56 117 69 78 255 247 255
+255 247 238 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 252 241 228 255 255 255
+187 164 0 0 0 0 90 0 0 255 232 0
+242 213 0 247 229 0 249 233 69 255 251 3
+177 171 0 41 0 0 34 0 0 77 0 0
+86 0 0 194 113 0 255 252 172 248 228 101
+255 235 147 255 255 72 0 0 0 3 0 0
+130 0 0 123 0 0 66 0 0 255 223 35
+243 236 90 240 221 67 250 216 94 233 242 104
+143 110 0 0 0 0 137 0 0 112 0 0
+212 65 0 155 0 0 75 0 0 111 68 0
+255 255 174 255 253 137 250 236 129 252 231 76
+251 235 59 234 215 0 251 215 0 249 240 94
+230 188 0 255 241 101 252 231 20 253 219 0
+255 247 168 255 250 0 255 211 12 248 237 0
+211 189 0 232 218 0 174 174 0 198 182 0
+207 198 0 224 194 0 180 159 0 229 234 0
+255 236 0 255 245 0 235 201 0 247 230 0
+242 193 0 222 197 0 211 169 0 239 202 0
+221 167 0 249 212 0 244 203 0 255 231 0
+207 137 0 206 181 0 0 0 0 35 0 0
+255 190 0 243 195 0 255 237 0 0 0 0
+98 0 0 120 0 0 0 0 0 85 0 0
+0 0 0 0 0 0 0 0 0 48 0 0
+0 0 0 2 0 0 0 0 0 114 0 0
+103 0 0 147 0 0 0 0 0 149 0 0
+179 103 0 139 57 0 100 69 0 178 66 0
+222 171 0 166 137 0 146 95 0 255 240 0
+246 216 0 139 110 0 134 103 0 255 225 0
+255 224 0 224 230 0 118 97 0 255 250 131
+255 255 205 43 20 0 252 252 77 247 228 59
+205 220 0 190 126 0 243 196 0 249 245 0
+29 0 0 218 183 0 200 145 0 0 0 0
+10 0 0 26 0 0 121 0 0 91 4 0
+217 173 0 253 222 26 193 217 0 21 0 0
+255 255 255 255 255 255 225 245 141 41 0 0
+82 0 0 210 162 0 170 191 0 65 12 0
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 245 237 255 255 229
+0 0 0 0 0 0 231 107 0 255 254 0
+249 235 50 246 222 0 242 210 0 255 245 0
+16 0 0 15 0 0 72 0 0 19 0 0
+214 104 0 246 227 0 235 208 44 240 208 0
+255 247 0 123 0 0 5 0 0 118 0 0
+160 0 0 105 0 0 226 175 0 255 255 200
+252 239 151 253 242 131 255 255 206 48 0 0
+0 0 0 98 0 0 145 0 0 173 0 0
+128 0 0 61 0 0 202 171 25 255 255 161
+254 242 159 247 231 116 250 234 114 231 200 0
+248 209 0 250 237 16 223 188 0 252 213 31
+255 255 106 253 217 5 209 192 17 129 93 0
+84 33 0 55 0 0 0 0 0 74 0 0
+49 0 0 47 0 0 42 0 0 74 0 0
+114 0 0 85 0 0 86 0 0 68 0 0
+73 0 0 83 0 0 108 61 0 144 125 0
+169 150 0 255 244 0 215 192 0 255 233 0
+225 185 0 240 209 0 249 210 0 228 190 0
+224 195 0 255 210 0 234 190 0 9 0 0
+238 167 0 250 204 0 255 223 0 0 8 0
+37 0 0 132 0 0 0 0 0 68 0 0
+0 0 0 0 0 0 146 0 0 0 0 0
+100 0 0 153 0 0 112 22 0 68 0 0
+210 139 0 203 123 0 165 139 0 93 0 0
+222 217 0 250 223 40 255 243 151 36 19 0
+185 152 0 234 218 220 0 0 0 135 76 0
+180 172 170 170 132 0 98 104 0 142 110 57
+148 129 126 159 113 0 41 0 0 100 49 0
+123 61 0 98 61 0 116 83 0 118 65 0
+120 87 0 84 30 0 98 48 0 151 107 0
+95 62 0 57 0 0 162 140 0 32 0 0
+0 0 0 0 0 0 32 0 0 74 0 0
+105 31 0 234 199 0 255 250 215 14 17 0
+255 255 255 250 243 236 255 244 255 247 253 229
+161 164 0 53 0 0 239 194 0 222 208 0
+235 217 185 0 0 0 253 250 255 255 255 255
+245 235 199 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 254 241 226 255 248 252 255 239 142
+0 0 0 0 0 0 255 226 0 240 218 0
+235 197 0 234 200 0 255 222 0 206 212 0
+12 0 0 4 0 0 72 0 0 75 0 0
+255 255 0 250 237 71 251 237 149 255 242 60
+222 217 0 12 0 0 100 0 0 111 0 0
+106 0 0 201 160 0 236 210 0 240 210 0
+245 216 73 255 255 174 0 0 0 71 0 0
+124 0 0 131 0 0 172 0 0 114 0 0
+86 0 0 255 255 167 255 248 141 249 238 98
+246 215 101 236 223 23 236 196 0 254 239 108
+226 203 0 255 255 223 233 225 9 169 164 0
+82 10 0 11 0 0 3 0 0 57 0 0
+152 14 0 114 0 0 146 0 0 157 0 0
+180 24 0 156 0 0 167 187 0 180 0 0
+202 140 0 184 69 0 155 57 0 187 1 0
+165 0 0 189 8 0 171 38 0 162 0 0
+128 0 0 6 0 0 91 23 0 157 136 0
+211 164 0 255 238 0 244 209 0 208 153 0
+240 213 0 235 177 0 206 155 0 255 230 0
+233 183 0 243 201 0 255 228 0 19 42 0
+70 0 0 0 0 0 9 0 0 161 101 0
+80 60 0 139 0 0 200 138 0 161 89 0
+0 0 0 183 82 0 204 134 0 172 145 0
+136 66 0 235 223 163 223 175 0 99 114 0
+118 72 13 110 83 0 133 103 29 142 124 20
+145 130 56 204 163 147 228 211 146 227 202 189
+154 133 85 214 188 161 228 204 168 206 183 135
+177 154 121 223 198 161 255 255 239 255 241 207
+253 245 233 255 251 248 255 241 208 245 230 186
+252 237 216 255 255 237 254 241 228 237 234 193
+255 240 224 255 255 232 253 246 247 255 255 199
+255 253 197 66 18 0 0 0 0 19 0 0
+106 0 0 193 160 0 224 174 27 201 216 154
+205 150 164 255 255 255 247 239 229 253 242 240
+255 255 255 165 183 52 63 0 0 0 0 0
+255 255 0 95 61 55 81 37 0 35 21 0
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 250 238 227 255 255 255 152 135 0
+0 0 0 117 0 0 255 255 0 235 203 0
+248 223 0 253 241 3 244 247 0 13 0 0
+61 0 0 75 0 0 43 0 0 187 73 0
+255 255 89 242 229 49 255 239 115 231 245 0
+49 0 0 17 0 0 93 0 0 125 0 0
+97 0 0 255 255 81 249 234 12 246 231 41
+246 234 34 70 14 0 59 0 0 149 0 0
+146 0 0 175 0 0 56 0 0 96 0 0
+255 255 175 250 236 112 241 222 38 248 229 0
+235 215 33 232 200 0 242 209 0 255 249 211
+252 248 159 83 54 0 25 0 0 90 0 0
+108 0 0 188 94 0 165 63 0 180 88 0
+222 195 38 218 206 0 255 244 102 245 236 29
+248 241 43 252 238 68 255 232 181 246 242 33
+255 239 184 255 248 133 255 252 155 245 238 74
+244 236 0 245 233 17 205 150 0 197 113 0
+188 80 0 181 0 0 143 0 0 121 0 0
+41 0 0 69 0 0 138 138 0 255 247 0
+237 191 0 238 193 0 217 175 0 232 196 0
+242 191 0 243 196 0 255 228 0 95 84 0
+13 0 0 19 0 0 0 0 0 160 0 0
+145 8 0 0 0 0 217 160 0 223 187 93
+142 110 0 104 15 0 191 170 29 168 144 152
+92 79 0 141 100 0 195 170 164 222 200 150
+221 199 179 252 246 225 204 195 184 244 217 209
+230 223 208 230 207 196 202 187 152 208 190 173
+245 230 213 211 205 184 225 197 192 219 210 172
+255 248 243 255 249 243 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 125 125 0 0 0 0
+122 0 0 93 30 0 185 142 0 255 255 255
+0 19 0 214 191 201 255 253 246 248 238 231
+251 240 231 255 255 255 202 219 135 0 0 0
+64 19 0 255 246 194 255 246 214 168 191 0
+188 154 172 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 250 241 229 255 255 223 0 0 0
+0 0 0 184 104 0 255 251 0 246 234 0
+244 227 11 255 252 10 62 40 0 113 0 0
+61 0 0 107 0 0 77 0 0 255 238 0
+233 209 0 228 202 0 255 233 40 80 22 0
+70 0 0 72 0 0 108 0 0 103 0 0
+255 245 0 244 229 0 241 226 28 255 255 119
+0 0 0 33 0 0 146 0 0 129 0 0
+195 0 0 1 0 0 189 131 0 255 255 128
+246 236 91 233 216 0 241 214 38 228 203 0
+251 217 28 255 240 204 236 238 182 66 0 0
+0 0 0 140 0 0 165 0 0 198 115 0
+216 162 0 244 205 36 255 242 135 249 230 101
+254 248 145 255 253 195 255 254 185 255 250 219
+255 255 235 255 255 255 248 236 216 251 252 222
+254 251 229 245 246 209 254 255 223 255 255 255
+255 255 216 255 255 209 255 251 104 255 239 23
+255 230 5 243 221 0 200 161 0 193 116 0
+155 0 0 119 0 0 84 0 0 0 0 0
+206 164 0 255 241 0 229 185 0 247 199 0
+240 189 0 245 207 0 255 237 0 0 0 0
+59 0 0 0 0 0 0 0 0 239 137 0
+226 176 0 118 97 0 47 0 0 127 120 0
+177 142 137 199 178 133 229 215 200 231 212 187
+240 225 212 226 207 209 235 206 195 209 201 166
+204 181 165 194 182 152 206 171 147 193 179 155
+228 203 174 211 188 174 216 194 155 242 220 193
+187 176 154 227 200 164 238 221 196 254 248 235
+250 238 230 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 212 231 104
+0 0 0 104 0 0 157 107 0 202 154 42
+234 242 214 0 0 0 255 255 255 246 238 227
+246 238 224 249 238 230 255 249 255 236 245 190
+255 248 136 207 190 102 140 84 0 11 9 0
+244 192 194 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+254 242 230 252 243 236 255 250 165 0 0 0
+69 0 0 255 227 0 234 207 0 242 214 0
+234 203 0 255 248 0 1 0 0 116 0 0
+38 0 0 77 0 0 126 0 0 255 255 0
+245 230 66 255 235 40 233 243 0 50 0 0
+52 0 0 66 0 0 110 0 0 153 24 0
+246 237 0 228 207 0 255 220 0 136 148 0
+33 0 0 110 0 0 140 0 0 174 0 0
+0 0 0 184 60 0 255 235 85 240 225 63
+237 215 41 235 204 0 237 209 0 246 223 38
+255 246 209 167 169 0 0 0 0 152 0 0
+147 0 0 221 186 0 224 181 0 245 227 62
+255 251 198 249 241 146 251 244 164 255 250 215
+247 255 200 235 229 199 193 161 118 185 146 72
+160 108 0 165 55 0 156 80 0 168 0 0
+137 87 0 140 0 0 159 34 0 173 72 0
+161 102 1 213 168 97 231 211 86 254 249 116
+255 249 142 255 255 182 253 239 93 255 244 100
+233 207 0 194 151 0 193 45 0 172 0 0
+0 0 0 62 0 0 252 206 0 249 211 0
+242 195 0 245 193 0 255 245 0 0 0 0
+0 0 0 0 0 0 0 0 0 79 0 0
+79 45 0 178 164 113 219 218 177 212 203 197
+216 199 160 242 215 206 229 215 179 221 197 173
+227 222 182 216 187 150 234 221 203 220 190 173
+201 186 166 231 215 191 229 225 199 205 183 154
+214 196 156 253 238 235 212 203 175 206 185 147
+241 230 206 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 0 0 0 61 0 0 198 154 0
+255 244 255 152 173 78 206 173 177 255 255 255
+246 237 227 248 239 226 246 240 228 255 248 245
+134 101 0 6 0 0 86 0 0 164 125 0
+240 241 223 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 246 231 255 244 229 224 202 41 0 0 0
+190 84 0 235 204 0 239 219 4 245 229 0
+255 240 36 183 195 0 31 0 0 49 0 0
+70 0 0 45 0 0 255 218 0 247 238 0
+248 232 81 255 255 50 124 73 0 56 0 0
+5 0 0 88 0 0 86 0 0 255 233 0
+246 236 0 252 230 0 243 255 0 9 0 0
+121 0 0 152 0 0 187 0 0 0 0 0
+148 35 0 255 255 33 238 221 75 238 219 5
+235 211 28 228 208 0 248 208 164 255 255 188
+0 0 0 60 0 0 162 0 0 224 215 46
+205 159 0 254 226 106 249 242 191 247 240 146
+253 245 198 253 249 220 230 228 192 192 186 118
+141 0 0 148 0 0 165 75 0 127 0 0
+167 13 0 165 0 0 165 46 0 158 92 0
+154 8 0 132 0 0 183 51 0 139 0 0
+165 30 0 164 0 0 149 0 0 138 0 0
+155 20 0 231 222 78 243 233 70 255 255 200
+255 243 168 255 234 143 252 224 0 205 161 0
+141 0 0 115 0 0 0 0 0 255 228 0
+255 217 0 253 198 0 232 224 0 0 0 0
+0 0 0 0 0 0 0 0 0 253 249 187
+238 234 203 240 211 188 221 201 160 241 223 211
+213 200 166 219 182 160 229 227 202 201 179 152
+233 204 193 198 179 138 233 207 190 215 205 168
+247 227 222 230 226 201 222 189 154 239 236 223
+235 227 215 207 187 163 233 218 184 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 0 0 0 114 10 0
+220 168 0 255 255 255 0 0 0 255 255 255
+250 240 229 245 234 226 249 242 229 249 237 230
+250 242 235 249 241 232 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 250 237 226
+255 244 237 255 245 206 117 115 0 0 0 0
+241 176 0 246 224 0 240 222 51 244 229 28
+255 255 3 0 0 0 45 0 0 13 0 0
+71 0 0 202 146 0 245 223 0 232 205 0
+239 207 13 255 240 0 8 0 0 66 0 0
+37 0 0 71 0 0 228 185 0 247 227 0
+243 224 0 254 255 0 61 0 0 0 0 0
+175 0 0 148 0 0 64 0 0 170 17 0
+255 241 0 253 237 100 235 217 0 241 212 0
+247 226 4 255 233 170 237 226 101 0 0 0
+157 0 0 209 219 167 189 91 0 248 226 106
+249 239 205 247 236 144 252 240 181 255 255 247
+209 224 169 115 0 0 164 64 0 128 0 0
+153 101 0 110 0 0 140 35 0 201 200 39
+204 185 116 239 232 164 240 226 153 255 244 203
+244 241 147 247 241 150 234 228 137 219 237 139
+228 202 156 188 173 0 187 112 0 181 21 0
+157 0 0 162 0 0 134 0 0 177 152 0
+255 246 70 255 249 152 255 249 220 255 240 176
+211 203 0 170 49 0 139 0 0 0 0 0
+197 155 0 255 237 0 202 203 0 0 0 0
+0 0 0 0 0 0 197 143 82 246 228 201
+223 205 191 225 201 170 249 231 210 207 187 158
+237 220 190 186 167 150 238 214 181 238 225 209
+239 225 192 218 201 164 234 210 198 244 240 220
+213 193 164 229 217 200 250 241 229 215 196 183
+209 193 148 248 236 227 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 241 255 158 0 0 0
+149 112 0 237 188 77 191 202 56 157 127 126
+255 255 255 252 243 231 248 240 228 248 241 228
+248 238 229 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 253 241 229
+255 243 238 255 250 168 29 0 0 0 0 0
+255 230 0 247 231 0 249 234 18 245 225 0
+255 255 0 0 0 0 62 0 0 66 0 0
+0 0 0 255 233 0 249 228 0 248 231 0
+255 230 0 173 181 0 75 0 0 39 0 0
+78 0 0 80 0 0 255 254 0 236 206 0
+255 224 0 88 98 0 0 0 0 171 0 0
+157 0 0 154 0 0 36 0 0 255 255 0
+248 229 125 245 219 0 253 237 112 246 231 0
+255 235 131 188 191 77 0 0 0 169 0 0
+162 0 0 227 162 0 255 251 168 250 240 148
+247 235 200 255 253 224 235 240 185 116 86 0
+153 0 0 180 148 0 149 0 0 171 101 0
+224 191 183 252 252 198 255 255 244 255 252 216
+255 254 214 255 251 209 255 253 210 255 252 217
+255 252 206 255 254 224 255 253 213 255 254 216
+255 255 220 255 255 233 255 255 246 248 255 175
+236 229 112 198 151 0 179 86 0 161 0 0
+143 0 0 184 170 0 255 234 136 255 248 130
+255 246 230 253 244 0 177 90 0 114 0 0
+0 0 0 252 184 0 40 89 0 0 0 0
+0 0 0 0 0 0 248 186 176 228 210 179
+215 199 169 235 217 205 187 172 128 246 217 214
+232 221 197 236 207 175 241 220 210 221 201 157
+244 225 195 248 240 226 228 210 176 233 214 187
+254 247 242 237 231 218 212 188 143 245 231 214
+255 246 232 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 191 219 110
+0 0 0 144 47 0 255 255 255 0 0 0
+246 216 227 255 252 242 248 241 229 248 238 231
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 254 241 229
+255 255 255 233 217 93 0 0 0 92 0 0
+255 255 0 247 229 0 239 205 0 250 219 0
+207 216 0 31 0 0 55 0 0 6 0 0
+78 0 0 255 255 0 249 232 0 252 233 0
+255 249 0 21 0 0 91 0 0 60 0 0
+49 0 0 247 165 0 255 248 0 255 228 0
+255 255 4 0 0 0 69 0 0 125 0 0
+179 0 0 20 0 0 254 167 0 254 244 109
+249 236 163 247 224 19 243 218 36 255 241 165
+215 220 173 0 0 0 137 0 0 127 0 0
+255 253 0 254 247 156 251 242 196 251 242 218
+255 255 255 140 143 0 104 0 0 166 29 0
+150 0 0 183 122 80 243 238 207 255 255 230
+255 250 220 255 248 203 255 250 223 255 254 211
+255 255 232 255 255 219 255 248 180 251 227 150
+250 217 121 248 211 111 254 214 139 250 223 109
+249 219 118 254 223 134 255 240 173 255 251 220
+255 255 222 255 255 255 244 236 122 240 231 29
+153 90 0 157 0 0 120 0 0 196 170 0
+255 255 190 255 251 208 252 239 0 191 121 0
+164 0 0 43 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 253 230 193 255 240 227
+207 187 161 234 207 182 238 231 202 212 185 158
+235 219 184 238 222 193 237 213 181 251 236 202
+245 222 204 244 220 179 255 245 226 252 242 229
+213 195 161 217 194 160 253 246 227 253 243 235
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+88 104 0 0 0 0 212 175 0 250 248 195
+0 0 0 255 255 255 250 245 226 249 242 228
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 250 239 228
+255 255 255 185 165 0 0 0 0 140 0 0
+255 242 0 236 206 0 242 224 0 255 246 122
+95 108 0 63 0 0 39 0 0 47 0 0
+146 0 0 255 239 0 234 206 0 250 214 0
+173 165 0 14 0 0 130 0 0 65 0 0
+56 0 0 255 217 0 236 203 0 255 222 0
+154 180 0 44 0 0 132 0 0 194 0 0
+59 0 0 118 0 0 255 255 0 238 220 0
+236 204 0 248 231 0 255 234 178 255 255 192
+0 0 0 128 0 0 155 90 0 251 226 60
+254 253 151 249 235 150 255 251 226 249 236 151
+148 101 0 176 119 0 134 37 0 130 2 0
+245 241 198 255 255 225 255 247 209 255 246 209
+255 249 226 255 255 222 245 218 176 203 174 50
+197 124 0 135 28 0 155 0 0 136 59 0
+188 27 0 133 0 0 178 61 0 182 0 0
+164 0 0 186 48 0 186 45 0 213 118 0
+202 129 0 255 234 168 255 245 170 255 252 243
+255 255 199 208 199 0 138 30 0 137 0 0
+182 131 0 252 238 139 255 255 195 245 215 0
+201 162 0 200 0 0 66 0 0 0 0 0
+0 0 0 189 69 0 247 235 221 229 203 181
+232 214 176 226 202 176 236 221 185 226 194 168
+242 223 197 240 222 180 246 223 217 240 226 195
+255 241 227 255 247 238 235 222 196 210 187 155
+246 237 213 255 244 233 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 136 150 0 2 0 0 255 255 208
+181 207 0 160 99 126 255 255 255 253 241 232
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 246 239 231
+255 249 241 173 159 0 0 0 0 208 121 0
+251 230 0 247 228 0 248 225 0 255 253 69
+1 0 0 66 0 0 49 0 0 23 0 0
+234 142 0 248 241 66 241 224 10 255 254 0
+45 0 0 65 0 0 114 0 0 35 0 0
+116 0 0 255 255 0 247 231 0 255 255 0
+0 0 0 99 0 0 132 0 0 130 0 0
+71 0 0 252 217 0 244 219 53 250 230 5
+246 230 72 254 230 36 255 255 255 32 0 0
+65 0 0 155 102 0 231 156 0 255 255 203
+251 236 148 253 242 166 255 255 177 118 0 0
+179 23 0 106 0 0 209 154 58 255 254 232
+255 251 210 253 240 209 255 249 214 255 253 229
+217 207 118 203 115 0 187 122 0 173 0 0
+160 0 0 206 70 0 144 0 0 181 118 0
+181 18 0 169 91 0 166 72 0 198 112 0
+168 62 0 166 0 0 179 51 0 174 0 0
+132 0 0 164 0 0 196 103 0 217 146 0
+255 231 180 253 245 193 255 255 170 192 177 0
+134 0 0 144 0 0 255 244 8 255 248 234
+255 236 0 162 118 0 140 0 0 68 0 0
+0 0 0 255 202 209 228 215 170 239 216 200
+212 185 157 223 208 183 243 222 205 240 220 187
+255 246 231 235 224 192 249 223 199 255 247 232
+244 236 217 210 182 151 227 203 161 255 246 234
+253 240 234 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 33 29 0 118 42 0
+255 203 229 32 58 0 255 245 255 250 245 235
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 246 235 223 246 237 228
+255 255 222 31 0 0 0 0 0 254 187 0
+248 228 0 246 226 0 250 219 0 187 192 0
+7 0 0 85 0 0 49 0 0 0 0 0
+255 225 0 252 243 69 251 231 36 255 250 0
+0 0 0 101 0 0 118 0 0 62 0 0
+204 103 0 246 226 0 240 201 0 232 223 0
+21 0 0 87 0 0 120 0 0 123 0 0
+208 146 0 237 221 0 239 208 60 247 222 29
+247 228 45 255 255 255 64 5 0 21 0 0
+132 0 0 205 139 0 255 243 93 250 238 134
+253 238 174 255 255 210 128 11 0 154 0 0
+151 0 0 212 191 91 255 255 234 255 246 210
+254 243 200 255 250 218 255 236 185 190 148 0
+165 0 0 167 4 0 151 0 0 166 80 0
+194 156 0 232 199 160 252 247 169 255 255 220
+255 255 216 255 255 203 255 255 230 255 255 215
+254 250 191 245 249 190 228 214 128 208 195 81
+187 154 0 127 59 0 160 0 0 151 0 0
+196 0 0 247 212 6 255 239 188 255 250 157
+183 187 0 162 0 0 146 7 0 255 255 141
+250 234 156 252 247 0 169 15 0 146 0 0
+0 0 0 255 255 235 221 193 155 219 193 172
+248 236 211 250 231 207 223 207 171 252 242 225
+234 211 182 254 236 208 249 240 229 229 217 186
+207 185 137 251 237 212 255 247 242 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 0 0 0
+188 147 0 240 219 141 98 35 0 255 255 255
+251 246 233 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 252 240 227 249 240 235
+255 255 203 0 0 0 10 0 0 255 192 0
+231 206 0 233 200 0 255 229 0 136 160 0
+55 0 0 10 0 0 49 0 0 61 0 0
+255 237 0 228 193 0 235 205 0 206 202 0
+23 0 0 97 0 0 108 0 0 70 0 0
+255 226 0 252 232 0 255 230 0 148 171 0
+0 0 0 152 0 0 156 0 0 0 0 0
+255 240 0 235 218 0 237 219 54 233 211 0
+235 206 0 241 255 255 16 0 0 147 0 0
+118 0 0 255 255 119 245 231 127 247 236 120
+255 238 209 173 137 0 160 76 0 157 0 0
+174 96 0 255 255 255 247 241 192 251 244 213
+255 255 236 191 138 0 140 103 0 157 0 0
+146 0 0 180 120 27 239 250 200 255 255 245
+255 255 223 252 247 207 250 240 177 252 240 172
+254 241 212 239 223 93 249 236 200 247 237 166
+255 242 189 255 244 204 254 247 180 255 248 219
+255 254 230 255 255 226 204 204 114 148 133 0
+138 0 0 188 0 0 226 91 0 254 229 137
+255 253 180 239 254 0 121 0 0 153 63 0
+250 227 17 255 255 219 219 230 0 207 83 0
+17 0 0 255 255 228 242 233 199 225 197 176
+239 224 193 253 242 224 238 222 198 237 220 186
+255 243 234 237 226 206 217 185 150 222 200 168
+251 237 231 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 150 178 0
+0 0 0 255 228 190 137 164 0 75 4 0
+255 255 255 249 242 231 250 241 228 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 251 242 240
+255 255 196 0 0 0 0 0 0 255 234 0
+240 213 0 245 225 0 255 255 0 32 0 0
+11 0 0 50 0 0 115 0 0 163 0 0
+255 255 12 247 229 0 255 239 0 123 117 0
+39 0 0 59 0 0 59 0 0 164 0 0
+244 231 0 234 203 0 255 243 0 0 0 0
+110 0 0 122 0 0 141 0 0 153 0 0
+237 244 0 234 196 0 241 213 84 248 232 40
+255 255 223 15 0 0 172 0 0 88 0 0
+250 197 0 250 247 161 241 228 130 255 255 189
+169 146 0 160 0 0 169 90 0 182 94 58
+255 255 228 251 245 210 244 234 196 253 228 183
+197 183 2 147 59 0 176 0 0 169 53 0
+249 234 192 255 255 236 244 237 174 244 228 173
+247 240 198 238 223 132 248 241 206 243 233 148
+248 239 220 246 232 139 243 222 156 242 231 190
+243 218 141 255 242 206 238 206 75 246 235 166
+248 225 144 255 248 199 255 251 221 255 255 191
+211 230 0 127 0 0 139 0 0 208 0 0
+255 233 0 255 254 195 206 247 0 157 0 0
+102 0 0 255 255 39 255 226 114 209 220 0
+182 0 0 102 48 0 243 250 238 239 217 193
+251 248 233 227 212 178 248 236 215 254 239 231
+212 201 179 205 179 137 251 236 213 255 253 240
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+126 158 0 88 0 0 255 238 100 100 121 0
+231 194 231 255 253 244 248 247 229 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 249 238 240
+255 250 138 0 0 0 30 0 0 255 255 0
+239 221 0 243 223 0 255 255 0 61 0 0
+27 0 0 104 0 0 8 0 0 216 80 0
+251 236 0 231 203 0 255 244 0 0 0 0
+144 0 0 10 0 0 22 0 0 212 164 0
+249 235 0 255 245 0 202 208 0 0 0 0
+128 0 0 160 0 0 87 0 0 239 171 0
+242 237 0 238 222 0 243 220 31 247 221 84
+234 241 189 16 0 0 154 0 0 154 0 0
+255 254 66 245 236 130 245 227 130 255 255 167
+139 1 0 170 75 0 130 15 0 255 255 255
+250 241 200 251 244 218 242 206 114 233 204 0
+141 0 0 176 0 0 169 107 0 255 255 255
+255 253 215 253 241 204 247 240 199 241 227 148
+253 233 184 246 233 165 245 231 192 251 241 198
+233 210 113 248 239 175 236 206 59 246 235 215
+247 221 151 253 235 215 241 216 83 245 226 144
+248 220 138 245 234 136 248 222 159 248 238 119
+255 237 156 229 247 49 151 147 0 136 0 0
+158 0 0 244 188 0 255 255 163 179 183 0
+159 0 0 197 111 0 255 249 99 255 247 50
+186 67 0 16 0 0 182 170 110 255 251 243
+219 197 170 247 236 222 243 232 215 194 171 136
+223 199 163 254 246 232 255 243 235 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 12 0 0 230 200 48 255 255 255
+54 31 0 255 255 255 255 250 239 248 239 229
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 245 247
+255 245 112 0 0 0 44 0 0 255 255 0
+241 227 0 239 213 0 255 238 0 0 0 0
+30 0 0 75 0 0 33 0 0 229 181 0
+253 233 45 248 228 31 255 255 0 0 0 0
+122 0 0 42 0 0 59 0 0 240 190 0
+240 217 0 255 216 0 117 133 0 0 0 0
+139 0 0 168 0 0 0 0 0 255 235 0
+229 199 0 234 210 0 249 228 29 255 255 255
+76 120 0 96 0 0 83 0 0 219 128 0
+250 251 112 243 230 109 255 246 161 117 96 0
+181 49 0 150 0 0 222 191 148 250 248 219
+245 238 206 254 239 227 222 181 0 121 0 0
+210 170 0 176 102 0 255 245 238 255 251 211
+251 236 171 244 228 154 246 233 182 252 242 207
+242 233 146 248 218 180 238 225 136 253 235 116
+221 215 79 255 235 162 250 229 4 242 215 68
+242 220 0 254 220 92 233 200 0 244 219 41
+242 204 94 236 222 68 249 234 142 241 223 99
+251 227 108 248 233 138 255 255 144 137 125 0
+169 0 0 165 0 0 250 229 127 255 255 127
+189 208 0 128 0 0 255 245 0 252 235 91
+198 214 0 138 0 0 59 0 0 255 255 239
+238 228 214 224 206 178 202 184 153 245 229 207
+253 246 234 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 67 0 0 190 147 5
+239 246 197 57 14 0 255 249 255 255 249 242
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 253 245 247
+251 234 97 0 0 0 0 0 0 255 255 0
+228 192 0 238 204 0 238 245 0 105 0 0
+39 0 0 29 0 0 75 0 0 255 219 31
+255 247 119 247 227 55 241 239 0 7 0 0
+116 0 0 64 0 0 1 0 0 255 240 0
+233 210 0 255 255 0 0 0 0 13 0 0
+136 0 0 114 0 0 38 0 0 255 255 0
+241 223 0 246 230 33 248 231 75 235 240 208
+0 0 0 186 0 0 128 0 0 255 245 0
+247 238 155 246 230 123 253 255 174 142 8 0
+173 62 0 154 0 0 255 255 210 247 238 208
+250 242 217 243 203 0 152 65 0 205 86 0
+118 5 0 255 255 255 244 241 191 249 228 156
+254 231 189 251 241 194 231 220 127 244 217 131
+255 241 173 227 214 0 212 180 82 182 141 0
+152 110 0 129 87 0 120 62 0 103 93 0
+149 107 0 139 96 0 182 142 0 244 206 4
+241 207 51 227 192 0 254 233 161 240 210 13
+252 242 161 232 199 0 255 232 133 255 255 177
+185 164 0 181 20 0 149 0 0 255 242 0
+255 255 85 147 27 0 154 53 0 255 238 69
+255 255 0 176 58 0 101 34 0 237 235 237
+207 185 164 209 188 142 253 241 223 255 245 234
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 19 0 0 80 24 0
+255 213 238 203 204 0 0 2 0 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 247 244
+227 234 128 0 0 0 73 0 0 255 238 0
+253 221 0 251 225 0 204 203 0 39 0 0
+22 0 0 50 0 0 88 0 0 255 224 64
+243 221 39 246 207 0 196 213 0 37 0 0
+88 0 0 67 0 0 32 0 0 255 255 0
+251 227 0 255 255 0 8 0 0 54 0 0
+154 0 0 30 0 0 143 9 0 255 240 0
+238 204 0 243 211 0 251 218 6 149 167 9
+0 0 0 131 0 0 215 129 0 253 249 44
+251 235 146 255 243 148 186 201 0 144 0 0
+180 0 0 203 151 19 255 255 216 254 239 167
+255 243 200 196 147 0 180 27 0 113 0 0
+255 255 227 255 246 187 248 233 185 255 242 222
+246 223 77 245 220 80 255 247 137 252 230 57
+152 127 0 125 79 0 152 129 59 212 186 165
+250 245 188 255 255 255 255 253 229 255 255 255
+252 244 221 229 216 133 163 159 121 109 65 0
+129 112 0 220 191 175 228 195 0 255 233 133
+248 232 44 248 220 136 251 233 148 244 210 4
+250 237 96 186 172 0 145 0 0 234 130 0
+255 228 1 217 231 0 130 0 0 204 172 0
+255 255 123 166 130 0 201 28 0 122 98 0
+255 237 238 255 248 228 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 55 0 0
+164 136 0 251 202 187 255 255 186 22 18 0
+255 255 255 255 246 236 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 246 247
+245 242 117 0 0 0 121 0 0 255 255 0
+233 197 0 241 199 0 194 204 0 63 0 0
+45 0 0 53 0 0 183 37 0 250 217 0
+250 226 3 242 206 0 148 153 0 54 0 0
+83 0 0 121 0 0 48 0 0 255 255 0
+241 206 0 255 233 0 0 0 0 103 0 0
+153 0 0 0 0 0 234 173 0 255 250 0
+247 233 1 247 231 0 255 255 204 0 0 0
+52 0 0 160 0 0 255 242 52 251 237 26
+253 233 138 255 253 62 29 11 0 202 0 0
+109 0 0 255 248 221 255 246 195 253 235 181
+251 226 0 166 0 0 166 71 0 208 151 63
+255 255 168 252 233 141 246 232 128 243 219 118
+251 234 100 255 244 109 189 191 85 92 28 0
+210 174 172 255 255 255 255 255 244 252 220 201
+228 180 140 208 125 0 230 172 105 223 144 87
+223 143 76 248 187 155 255 231 216 255 255 255
+255 250 209 125 128 0 119 81 0 239 217 201
+251 231 0 243 218 29 242 215 39 246 236 112
+249 217 68 255 255 74 149 0 0 162 0 0
+236 161 0 255 255 151 133 13 0 150 0 0
+255 255 40 242 241 0 164 0 0 64 0 0
+255 255 255 249 238 224 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 0 0 0
+167 131 0 255 227 181 255 255 255 187 201 0
+131 102 112 255 255 244 250 237 229 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 243 230 255 255 255
+229 233 137 0 0 0 96 0 0 255 251 0
+246 216 0 255 246 0 139 158 0 33 0 0
+100 0 0 32 0 0 221 70 0 246 219 0
+242 209 0 255 237 0 77 101 0 69 0 0
+94 0 0 13 0 0 173 122 0 255 249 0
+255 235 0 211 222 0 0 0 0 103 0 0
+148 0 0 0 0 0 255 197 0 245 221 0
+245 219 0 251 222 0 255 255 200 0 0 0
+140 0 0 141 0 0 255 255 120 249 236 81
+255 239 140 177 206 0 117 0 0 179 0 0
+160 77 0 255 255 231 253 242 177 253 224 30
+191 152 0 151 0 0 221 129 0 255 255 204
+244 230 105 249 229 126 251 233 148 247 226 77
+255 236 108 191 186 37 136 84 56 255 252 0
+255 255 200 212 159 36 208 104 0 212 167 0
+234 176 34 239 211 100 247 207 167 244 231 194
+246 215 173 244 217 97 233 162 0 223 124 0
+241 178 168 255 255 255 211 217 125 63 36 0
+220 182 99 248 221 47 238 210 35 246 225 25
+255 239 180 255 233 100 184 230 0 173 0 0
+187 0 0 255 255 113 194 214 0 67 0 0
+249 229 12 255 235 28 173 151 0 34 0 0
+255 255 255 246 236 223 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 83 120 0
+106 29 0 213 199 0 0 0 0 221 216 0
+83 71 31 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 248 243 233 246 232 210 216 189 169
+235 206 87 0 0 0 53 0 0 255 253 0
+245 216 0 255 223 0 86 97 0 71 0 0
+44 0 0 24 0 0 222 126 0 245 223 0
+246 211 0 255 227 0 0 19 0 130 0 0
+76 0 0 20 0 0 199 103 0 253 234 0
+250 212 0 188 199 0 0 0 0 151 0 0
+104 0 0 128 0 0 249 213 0 242 220 0
+242 217 0 250 220 0 228 233 129 17 0 0
+128 0 0 193 0 0 255 255 142 251 232 110
+255 255 155 81 100 0 167 0 0 165 0 0
+240 214 188 249 244 160 255 247 177 234 191 0
+186 77 0 155 0 0 255 251 145 245 230 107
+244 224 62 255 236 199 247 233 119 255 245 102
+81 96 0 141 73 14 255 255 0 227 198 0
+182 66 0 235 157 0 251 229 0 255 255 255
+253 253 173 255 252 202 255 255 217 255 244 225
+255 255 255 255 253 224 252 247 174 251 216 0
+239 185 0 229 140 0 255 206 205 255 255 236
+49 65 0 254 212 169 255 244 163 236 211 5
+243 208 0 247 220 67 255 255 154 107 0 0
+135 0 0 237 151 0 255 255 131 115 102 0
+193 97 0 255 255 122 203 217 0 102 0 0
+255 239 228 251 243 230 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 235 248 198
+27 0 0 155 111 0 167 153 0 0 0 0
+247 215 211 255 249 238 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+252 247 239 233 221 187 186 163 132 223 194 170
+255 254 143 0 0 0 94 0 0 255 250 0
+233 198 0 252 217 0 141 137 0 11 0 0
+58 0 0 73 0 0 241 159 0 238 209 0
+251 228 0 255 244 0 0 0 0 125 0 0
+52 0 0 18 0 0 206 149 0 237 210 0
+254 217 0 179 191 0 0 0 0 153 0 0
+88 0 0 120 0 0 254 243 0 242 222 0
+243 225 0 255 234 0 169 197 86 44 0 0
+115 0 0 228 131 0 254 252 120 244 225 85
+255 255 55 0 0 0 172 0 0 146 0 0
+255 253 135 245 225 109 255 245 80 185 125 0
+152 0 0 166 0 0 255 255 143 247 236 140
+244 232 95 247 227 103 255 239 134 190 209 96
+184 88 0 255 250 0 215 190 0 226 132 104
+242 218 0 253 235 73 253 242 68 245 226 0
+216 155 6 219 148 0 225 163 44 236 169 104
+217 143 14 225 161 52 242 186 121 255 244 255
+255 251 223 251 223 114 217 134 0 237 173 175
+255 255 172 4 10 0 238 194 150 253 230 24
+245 220 2 247 218 140 254 233 3 164 190 0
+145 0 0 195 0 0 255 255 150 189 208 0
+135 0 0 255 255 113 244 249 77 123 0 0
+210 201 180 255 251 240 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+180 203 99 110 62 0 46 16 0 203 169 117
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 245 236 220
+227 205 180 184 165 145 246 230 219 255 244 247
+255 247 124 0 0 0 113 0 0 254 233 0
+238 200 0 255 242 0 20 64 0 29 0 0
+57 0 0 34 0 0 227 144 0 236 209 0
+239 203 0 233 241 0 0 0 0 168 0 0
+95 0 0 37 0 0 216 128 0 248 235 0
+255 240 0 121 146 0 0 0 0 123 0 0
+124 0 0 178 44 0 250 232 0 235 219 0
+243 223 0 255 235 0 130 174 24 111 0 0
+122 0 0 218 120 0 244 228 16 242 225 87
+255 255 69 112 0 0 183 0 0 152 0 0
+255 255 153 247 237 108 255 233 0 148 0 0
+174 0 0 221 174 0 245 232 42 236 216 67
+249 231 161 248 231 137 255 255 164 51 0 0
+255 255 0 241 215 0 218 114 0 245 226 0
+252 241 60 251 241 137 205 148 0 211 129 0
+230 187 130 246 227 162 247 234 218 245 231 187
+251 238 204 237 207 115 227 192 0 233 155 0
+245 190 167 255 245 255 247 224 29 208 124 0
+255 194 212 246 252 19 20 0 0 255 255 176
+241 203 0 241 218 3 254 233 87 222 235 8
+100 0 0 159 0 0 255 254 95 255 255 0
+56 0 0 255 240 71 255 254 66 128 0 0
+153 135 76 255 254 246 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 240 255 255 240 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 245 234 204 192 170 144
+199 180 158 255 246 243 255 246 234 250 243 247
+255 243 105 0 0 0 58 0 0 255 250 0
+243 205 0 255 217 0 104 98 0 46 0 0
+34 0 0 56 0 0 242 174 0 243 214 0
+243 221 0 204 213 0 43 0 0 142 0 0
+38 0 0 56 0 0 193 149 0 251 234 0
+255 235 0 58 115 0 56 0 0 113 0 0
+39 0 0 163 95 0 246 237 0 242 215 0
+243 223 0 255 240 16 86 146 0 84 0 0
+121 0 0 247 209 17 245 243 155 245 228 144
+238 250 29 99 0 0 171 0 0 175 8 0
+255 255 77 245 223 14 223 226 0 171 0 0
+144 0 0 246 219 94 246 242 110 247 232 114
+239 229 170 255 236 144 161 181 71 208 139 0
+250 218 0 216 142 0 242 193 0 244 234 50
+241 222 0 207 105 0 237 208 170 240 218 185
+231 225 163 236 199 122 237 210 113 215 189 48
+236 198 135 225 177 97 252 225 206 232 205 63
+226 175 0 221 143 0 255 247 255 255 255 196
+207 92 0 255 239 255 196 204 5 208 137 144
+250 221 0 244 217 0 244 221 0 255 243 129
+165 207 0 128 0 0 226 151 0 255 255 83
+85 0 0 245 197 54 255 255 131 164 20 0
+119 83 3 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 253 243 240 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+247 240 221 230 215 192 198 166 112 246 230 234
+255 244 234 239 222 191 246 236 223 253 245 247
+255 255 170 0 0 0 0 0 0 255 252 0
+234 194 0 255 250 0 23 38 0 69 0 0
+60 0 0 23 0 0 255 182 0 234 210 0
+235 198 0 211 217 0 5 0 0 162 0 0
+118 0 0 1 0 0 212 161 0 247 221 0
+255 232 0 100 121 0 0 0 0 126 0 0
+4 0 0 209 119 0 247 225 0 240 216 0
+248 227 0 255 245 76 81 127 0 104 0 0
+109 0 0 255 240 91 250 238 86 253 233 95
+204 236 0 120 0 0 178 0 0 198 90 0
+253 249 45 244 225 0 206 198 0 172 0 0
+142 0 0 251 249 33 236 215 12 240 218 99
+250 236 176 255 246 185 10 0 0 255 246 0
+219 166 0 223 140 0 255 248 168 236 230 0
+191 103 0 233 204 160 250 236 204 246 234 187
+197 151 0 168 98 0 172 119 0 185 147 118
+152 116 0 201 143 0 170 101 0 235 165 11
+246 225 171 235 208 0 203 124 0 255 233 202
+236 212 25 225 98 0 255 255 255 0 0 0
+255 255 171 244 210 0 249 234 0 250 220 19
+231 252 92 113 0 0 196 59 0 255 255 92
+77 18 0 234 138 0 255 255 157 172 51 0
+112 53 0 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 248 238 235 248 239 222
+206 186 146 200 179 148 253 243 240 242 235 211
+223 206 169 239 238 226 253 242 232 255 255 255
+101 35 0 52 0 0 0 0 0 255 243 0
+243 214 0 255 242 0 65 18 0 72 0 0
+55 0 0 10 0 0 253 186 0 235 208 0
+244 220 0 205 219 0 6 0 0 150 0 0
+71 0 0 0 0 0 242 164 0 227 213 0
+255 225 0 45 112 0 93 0 0 127 0 0
+38 0 0 207 137 0 247 235 0 241 223 0
+239 223 0 255 252 0 16 81 0 121 0 0
+76 0 0 255 233 31 244 223 0 255 231 113
+164 205 0 128 0 0 179 0 0 217 160 0
+243 231 0 242 220 0 181 174 0 193 0 0
+98 0 0 255 255 118 236 224 39 237 224 128
+248 230 158 169 200 0 135 0 0 255 252 0
+208 98 0 232 187 0 253 248 0 190 96 0
+233 190 146 246 229 209 239 225 158 159 121 0
+206 168 203 255 255 246 255 255 255 255 252 245
+255 255 255 255 255 255 253 249 243 184 146 3
+162 86 0 255 246 246 220 179 0 191 89 0
+255 255 255 179 71 0 255 213 218 143 181 15
+236 177 141 244 218 4 239 207 0 238 206 0
+255 255 13 83 0 0 193 0 0 255 234 0
+113 114 0 212 117 0 255 255 154 143 70 0
+102 40 0 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 246 245 241 238 202 207 177 156
+227 211 181 255 243 245 241 233 204 235 215 182
+254 243 232 255 255 255 232 243 213 60 15 0
+251 155 0 0 0 0 30 0 0 255 240 0
+224 189 0 255 226 0 79 69 0 53 0 0
+36 0 0 54 0 0 252 176 0 244 225 0
+245 214 0 206 214 0 62 0 0 118 0 0
+73 0 0 5 0 0 237 179 0 250 235 0
+250 217 0 115 166 0 114 0 0 161 0 0
+49 0 0 207 154 0 248 225 0 239 210 0
+245 215 0 255 245 0 18 50 0 122 0 0
+81 0 0 255 255 139 244 230 0 252 223 51
+145 171 0 124 0 0 179 0 0 236 199 0
+247 242 112 250 234 0 184 148 0 183 0 0
+152 0 0 254 255 127 236 221 92 245 237 193
+255 246 164 75 81 0 239 178 0 249 227 0
+224 113 0 247 221 0 236 225 0 196 77 0
+242 219 145 241 228 178 138 84 0 238 198 188
+255 252 192 241 219 0 248 218 0 246 221 0
+251 230 0 254 235 137 255 252 226 255 255 255
+243 245 176 125 36 0 255 246 219 187 170 0
+240 180 151 220 191 0 218 98 0 255 255 255
+126 43 0 255 247 51 254 241 17 254 235 84
+255 255 160 79 0 0 157 0 0 255 213 47
+152 171 0 161 0 0 255 248 132 206 136 0
+89 54 0 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 249 234
+255 249 230 217 197 171 207 177 144 243 228 220
+255 251 232 239 219 181 243 221 195 255 247 239
+255 246 236 255 255 255 66 0 0 193 118 0
+223 145 0 106 110 0 0 0 0 255 233 0
+226 178 0 255 232 0 98 88 0 36 0 0
+0 0 0 29 0 0 250 159 0 242 213 0
+241 199 0 231 226 0 31 0 0 116 0 0
+33 0 0 0 0 0 190 68 0 249 228 0
+255 219 0 129 155 0 115 0 0 128 0 0
+46 0 0 190 140 0 246 215 0 240 205 0
+243 215 0 255 253 46 5 74 0 108 0 0
+102 0 0 254 229 0 245 218 0 255 243 109
+155 190 0 119 0 0 159 0 0 244 181 0
+253 245 79 255 244 37 159 110 0 179 0 0
+161 82 0 255 255 134 248 235 115 246 234 171
+255 255 171 0 0 0 252 172 0 234 222 0
+229 132 0 248 221 0 213 125 0 234 211 32
+246 214 148 196 184 0 242 187 116 255 246 0
+247 218 0 243 200 0 225 178 0 238 202 0
+233 182 0 237 201 0 247 219 0 252 243 172
+255 251 255 139 158 0 236 183 162 249 229 130
+234 129 0 232 234 53 204 58 0 255 255 255
+38 0 0 250 211 0 241 207 0 233 202 0
+255 247 56 116 0 0 178 0 0 255 223 76
+153 170 0 168 0 0 255 237 120 175 105 0
+133 62 19 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 244 237 255 246 232
+211 184 141 230 202 188 255 244 233 255 250 237
+215 195 152 246 222 209 255 247 233 255 241 228
+255 255 255 21 0 0 194 69 0 211 162 0
+192 108 0 151 155 0 0 0 0 227 172 0
+242 209 0 255 208 0 97 112 0 66 0 0
+0 0 0 27 0 0 251 159 0 235 208 0
+250 209 0 214 221 0 6 0 0 74 0 0
+52 0 0 10 0 0 169 41 0 251 234 0
+254 216 0 151 195 0 102 0 0 157 0 0
+38 0 0 156 77 0 255 249 0 248 224 0
+247 225 0 255 247 105 82 117 0 107 0 0
+94 0 0 255 241 0 249 236 0 255 244 80
+128 178 0 120 0 0 113 0 0 236 146 0
+250 234 8 251 227 0 170 109 0 183 0 0
+211 82 0 249 248 54 245 222 98 248 234 169
+255 255 186 40 0 0 251 205 0 219 177 0
+226 156 0 252 229 0 190 86 0 246 214 52
+251 225 115 123 62 0 255 246 94 248 232 0
+240 209 0 233 190 0 239 199 0 188 155 0
+192 136 0 229 187 0 226 177 0 252 226 0
+255 245 232 255 248 202 128 55 0 255 252 171
+183 106 0 246 227 102 177 79 0 255 255 255
+36 57 0 238 187 4 255 233 0 247 223 0
+255 241 0 113 59 0 135 0 0 255 209 138
+158 175 0 189 26 0 255 247 162 184 133 0
+91 53 0 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 243 231 255 248 238 235 222 192 205 181 145
+231 210 189 255 245 235 255 248 238 229 214 172
+252 237 228 255 246 233 255 248 234 255 253 242
+156 205 136 73 0 0 211 160 0 184 124 0
+210 151 0 205 147 0 0 0 0 211 158 0
+243 204 0 255 215 0 146 153 0 28 0 0
+24 0 0 0 0 0 239 122 0 238 203 0
+232 198 0 255 225 0 41 90 0 113 0 0
+18 0 0 60 0 0 91 0 0 255 255 0
+244 205 0 223 230 0 0 0 0 143 0 0
+56 0 0 92 0 0 249 224 0 242 214 0
+240 210 0 255 230 0 14 101 0 123 0 0
+79 0 0 255 219 0 251 238 75 255 240 65
+149 192 0 134 0 0 107 0 0 203 134 0
+254 242 26 255 234 62 134 139 0 186 0 0
+167 18 0 255 255 31 242 232 165 246 235 160
+255 255 201 0 0 0 255 203 0 223 180 0
+228 166 0 245 223 0 202 81 0 237 220 0
+254 223 133 130 75 0 255 229 0 247 216 0
+241 211 0 229 175 0 123 114 0 186 138 161
+176 174 173 78 74 0 219 173 9 239 194 0
+248 231 0 255 254 235 133 87 0 247 178 155
+212 176 0 255 224 161 203 142 0 255 214 195
+75 109 3 212 156 0 235 206 0 248 214 0
+255 234 0 124 127 0 105 0 0 234 185 110
+170 168 0 173 0 0 255 244 162 144 129 0
+118 74 41 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 247 242 238 225 192 202 176 142 242 223 213
+254 245 237 253 243 230 255 243 229 255 245 231
+255 246 230 255 243 229 255 255 246 184 214 140
+106 0 0 167 142 0 213 129 0 223 191 0
+176 113 0 255 247 0 62 0 0 190 125 0
+242 221 0 242 201 0 196 186 0 0 0 0
+27 0 0 6 0 0 210 76 0 244 202 0
+242 209 0 250 218 0 129 160 0 84 0 0
+68 0 0 47 0 0 102 0 0 255 243 0
+245 218 0 255 254 0 3 0 0 170 0 0
+105 0 0 0 0 0 255 223 0 244 218 0
+233 199 0 255 229 0 121 166 0 82 0 0
+79 0 0 255 228 0 241 218 25 249 219 7
+211 215 0 107 0 0 134 0 0 195 145 0
+248 237 0 255 230 17 182 169 0 178 0 0
+148 0 0 255 255 68 242 229 186 243 227 170
+255 255 192 42 0 0 244 201 0 214 165 0
+212 120 0 241 232 0 171 17 0 245 233 0
+247 221 31 169 83 0 255 231 0 249 230 0
+255 217 0 122 145 5 217 141 174 255 255 255
+255 233 226 255 255 255 21 1 0 255 221 0
+239 199 0 255 246 168 169 154 0 219 157 187
+229 204 0 241 195 57 212 152 0 255 206 173
+137 156 112 188 97 0 248 228 0 234 198 0
+255 213 0 126 168 0 133 0 0 238 199 9
+177 166 0 190 41 0 255 255 170 125 43 0
+173 143 144 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 253 241 227
+226 206 174 202 177 148 255 246 239 255 245 233
+250 242 226 253 240 229 252 240 230 253 241 233
+252 238 217 255 251 244 228 255 228 14 0 0
+205 80 0 147 95 0 227 183 0 154 87 0
+235 205 0 178 110 0 132 131 0 79 0 0
+255 242 0 229 183 0 209 222 0 3 0 0
+17 0 0 0 0 0 182 0 0 245 208 0
+241 214 0 234 194 0 202 210 0 0 0 0
+86 0 0 99 0 0 0 0 0 255 242 0
+244 204 0 250 243 0 33 0 0 146 0 0
+92 0 0 0 0 0 255 193 0 241 213 0
+224 190 0 246 199 0 180 211 38 107 0 0
+73 0 0 223 158 0 250 240 51 248 234 90
+236 231 0 97 0 0 128 0 0 173 30 0
+248 244 0 230 199 0 206 207 0 150 0 0
+157 0 0 247 249 0 243 227 172 241 234 170
+255 243 158 32 56 0 234 152 0 219 184 0
+226 150 0 233 208 0 200 104 0 255 251 102
+255 247 146 116 51 0 253 220 0 234 185 0
+255 248 74 75 64 0 254 212 190 255 254 243
+212 194 100 255 247 246 110 123 0 198 147 0
+246 205 0 249 224 0 162 118 0 198 123 35
+237 218 0 245 190 114 208 182 0 255 197 154
+126 158 108 201 122 15 255 239 0 253 227 0
+255 234 0 76 130 0 118 0 0 247 191 0
+190 139 0 194 64 0 255 255 176 95 0 0
+221 201 184 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 239 218 188 178 141
+207 175 152 246 240 237 251 240 227 253 239 225
+244 237 226 252 241 234 254 243 233 237 220 183
+246 237 223 255 255 255 30 0 0 227 153 0
+182 126 0 221 180 0 164 102 0 227 185 0
+142 83 0 191 170 0 204 167 0 0 0 0
+255 238 0 228 187 0 232 233 0 31 0 0
+98 0 0 0 0 0 99 0 0 248 203 0
+234 200 0 237 210 0 244 243 0 6 0 0
+79 0 0 0 0 0 22 0 0 255 199 0
+227 198 0 255 254 0 29 0 0 104 0 0
+89 0 0 0 0 0 173 93 0 233 202 0
+222 185 0 238 206 0 203 231 153 23 0 0
+119 0 0 207 146 0 239 224 0 236 211 0
+254 255 118 68 0 0 174 0 0 70 0 0
+254 254 0 237 216 0 220 224 0 145 0 0
+152 0 0 249 254 33 228 199 0 232 210 65
+251 224 140 92 138 47 172 55 0 235 207 0
+201 116 0 249 218 0 173 76 0 254 244 150
+255 255 255 84 46 0 225 165 0 228 182 0
+255 244 56 183 208 177 26 0 0 113 81 0
+182 115 141 255 233 0 98 113 0 201 123 0
+250 230 0 202 186 0 143 87 0 235 165 51
+232 197 0 234 183 0 221 158 0 255 226 213
+109 119 11 170 85 0 249 228 0 236 201 0
+255 236 0 55 112 0 134 0 0 253 190 0
+137 94 0 224 94 0 255 255 163 16 0 0
+249 242 221 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 246 234 209 195 169 133 238 219 206
+255 244 245 246 239 207 224 207 182 252 241 233
+250 241 232 245 235 207 234 215 188 243 238 228
+255 249 233 195 229 199 132 0 0 237 176 0
+141 104 0 224 157 0 107 65 0 208 168 0
+212 145 0 215 172 0 255 225 0 0 0 0
+255 233 0 224 188 0 255 248 0 0 0 0
+0 0 0 0 0 0 54 0 0 244 162 0
+243 215 0 228 199 0 255 221 0 15 0 0
+26 0 0 25 0 0 85 0 0 191 123 0
+245 216 0 254 219 0 115 136 0 27 0 0
+132 0 0 8 0 0 122 0 0 255 248 0
+226 200 0 232 199 0 255 244 118 52 0 0
+120 0 0 158 4 0 251 250 0 238 219 26
+253 234 0 8 0 0 173 0 0 48 0 0
+255 255 0 233 212 0 231 221 0 176 23 0
+141 0 0 216 183 0 235 220 25 233 213 83
+239 218 119 207 235 207 16 0 0 241 225 0
+196 65 0 238 193 0 183 158 0 250 209 136
+255 248 245 150 177 0 170 77 0 236 187 0
+234 213 0 255 249 255 237 245 200 207 202 197
+255 238 168 255 229 0 53 23 0 248 204 0
+250 222 0 225 221 0 0 0 0 242 212 0
+191 178 0 252 200 50 187 131 0 255 228 200
+54 108 0 223 141 107 246 224 0 249 222 0
+255 241 0 9 79 0 170 0 0 255 229 0
+147 34 0 238 165 0 255 255 173 40 0 0
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+223 202 162 201 176 143 244 223 208 255 250 237
+240 227 202 225 205 182 248 246 238 253 240 231
+240 233 212 240 225 203 248 240 232 254 246 238
+254 250 241 74 16 0 221 148 0 174 123 0
+223 159 0 151 144 0 243 204 0 160 124 0
+199 128 0 215 186 0 255 193 0 0 0 0
+239 199 0 237 197 0 255 221 0 23 0 0
+0 0 0 0 0 0 0 0 0 226 118 0
+243 218 0 221 184 0 255 236 0 0 10 0
+84 0 0 5 0 0 91 0 0 110 0 0
+247 242 0 237 197 0 208 223 0 0 0 0
+142 0 0 63 0 0 0 0 0 255 251 0
+227 193 0 222 185 0 255 243 0 0 0 0
+128 0 0 120 0 0 255 255 0 230 208 0
+248 220 4 119 156 0 143 0 0 84 0 0
+238 193 0 238 227 0 255 238 12 130 96 0
+149 0 0 181 69 0 244 246 75 233 209 52
+229 209 0 255 229 246 12 112 0 172 60 0
+227 201 0 197 89 0 228 232 0 215 89 0
+255 241 184 255 250 135 33 0 0 136 37 0
+233 196 0 246 224 0 251 230 172 255 244 185
+242 202 0 186 196 0 43 0 0 255 255 0
+219 191 0 208 161 0 72 0 0 255 234 0
+141 140 0 255 232 0 181 115 0 255 246 197
+19 0 0 231 188 172 239 210 0 237 205 0
+255 245 0 0 8 0 171 0 0 255 245 0
+100 0 0 250 216 91 237 255 144 42 0 0
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 217 198 164
+209 181 166 255 240 236 253 244 224 226 201 167
+241 218 206 246 244 234 253 241 232 241 229 192
+238 223 204 255 240 233 250 241 230 255 255 255
+46 17 0 185 86 0 165 101 0 220 158 0
+194 168 0 176 83 0 173 140 0 221 171 0
+147 136 0 169 86 0 216 161 0 122 136 0
+149 20 0 235 224 0 245 183 0 132 169 0
+14 0 0 0 0 0 0 0 0 189 0 0
+251 237 0 227 200 0 231 179 0 138 200 0
+82 0 0 18 0 0 83 0 0 22 0 0
+240 196 0 246 221 0 253 242 0 19 31 0
+163 0 0 0 0 0 0 0 0 255 201 0
+233 204 0 227 191 0 251 203 0 87 143 0
+66 0 0 71 0 0 255 216 0 231 214 0
+234 204 0 187 184 0 40 0 0 118 0 0
+168 122 0 252 233 0 222 196 0 212 208 0
+146 0 0 117 0 0 247 244 0 231 210 26
+221 196 0 242 216 191 226 238 209 0 0 0
+248 208 0 153 64 0 233 194 0 188 114 0
+213 107 0 248 238 196 239 241 193 155 172 0
+55 0 0 198 139 0 182 131 0 176 146 0
+118 72 0 65 0 0 252 241 0 230 194 0
+229 203 0 58 0 0 209 173 3 255 251 0
+106 58 0 255 255 12 92 0 0 255 255 221
+36 0 0 253 222 79 244 217 0 250 219 0
+255 255 79 0 0 0 216 0 0 251 255 0
+103 0 0 255 255 127 164 181 42 90 33 0
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 223 199 170 204 184 156
+255 251 245 242 227 211 229 204 159 255 239 234
+255 246 237 255 249 239 240 220 185 247 227 198
+255 247 234 250 239 230 255 249 236 247 255 255
+146 0 0 199 144 0 215 154 0 158 127 0
+198 123 0 170 158 0 231 175 0 223 188 0
+181 92 0 177 152 0 220 159 0 242 222 0
+0 0 0 255 232 0 237 200 0 255 253 0
+0 0 0 0 0 0 54 0 0 64 0 0
+255 217 0 230 193 0 239 209 0 218 222 0
+13 0 0 19 0 0 54 0 0 0 0 0
+180 61 0 243 221 0 238 186 0 153 193 0
+25 0 0 79 0 0 0 0 0 196 62 0
+238 213 0 229 203 0 243 203 0 197 212 65
+0 0 0 95 0 0 255 159 0 230 211 0
+188 142 0 254 233 0 89 82 0 75 0 0
+0 0 0 255 213 0 247 236 0 236 207 0
+157 142 0 59 0 0 249 214 0 247 224 43
+250 242 181 223 200 0 255 232 206 20 107 0
+180 44 0 223 199 0 212 103 0 205 167 0
+196 107 0 212 147 0 255 233 153 255 242 208
+208 216 157 163 153 99 143 117 50 136 94 0
+229 199 148 255 233 0 240 207 0 219 202 0
+96 39 0 34 0 0 255 255 69 253 237 0
+126 0 0 225 243 0 163 11 0 228 253 47
+106 0 0 244 237 0 234 206 0 233 197 0
+255 248 36 41 0 0 240 141 0 200 218 0
+168 0 0 255 255 189 144 127 0 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 210 186 151 255 242 245
+224 211 160 228 201 170 255 246 240 255 248 237
+253 243 229 234 205 161 252 239 232 255 246 232
+255 243 228 254 241 229 255 255 255 27 0 0
+201 102 0 150 35 0 240 212 0 176 91 0
+228 201 0 146 103 0 209 147 0 195 171 0
+221 168 0 227 204 0 126 64 0 230 177 0
+0 0 0 200 106 0 254 219 0 255 204 0
+100 132 0 0 0 0 3 0 0 0 0 0
+254 180 0 230 205 0 212 171 0 255 255 0
+30 0 0 13 0 0 46 0 0 82 0 0
+73 0 0 255 233 0 245 219 0 228 232 0
+0 0 0 162 0 0 0 0 0 43 0 0
+255 247 0 215 172 0 210 177 0 255 247 255
+0 62 0 90 0 0 149 0 0 231 221 0
+230 205 0 228 169 0 219 199 0 0 0 0
+61 0 0 78 0 0 252 243 0 236 212 70
+226 243 0 90 0 0 149 0 0 253 235 81
+233 204 0 245 218 60 218 196 0 255 255 186
+0 0 0 94 0 0 221 172 0 210 129 0
+185 158 0 179 96 0 180 92 0 227 156 0
+238 217 139 247 209 120 238 207 48 249 229 0
+228 200 0 231 181 0 171 179 0 122 0 0
+0 0 0 252 240 173 237 201 0 206 206 0
+209 119 0 167 163 0 153 69 0 222 221 0
+179 108 0 243 224 0 223 196 0 236 196 0
+251 254 97 65 0 0 248 154 0 145 123 0
+166 70 0 243 255 52 63 0 0 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+194 170 132 233 211 196 255 248 237 216 188 147
+243 221 202 255 244 234 255 248 237 238 223 181
+233 209 180 253 242 227 253 241 233 255 243 227
+255 244 229 255 242 238 247 255 205 107 0 0
+155 112 0 135 95 0 197 157 0 173 81 0
+199 167 0 227 182 0 197 138 0 181 125 0
+184 114 0 172 133 0 198 151 0 237 197 0
+179 169 0 0 0 0 253 231 0 251 205 0
+207 222 0 0 0 0 36 0 0 15 0 0
+239 146 0 225 200 0 234 208 0 237 188 0
+94 152 0 21 0 0 67 0 0 50 0 0
+0 0 0 255 246 0 225 198 0 255 243 0
+0 0 0 101 0 0 110 0 0 0 0 0
+255 229 0 239 219 0 242 223 0 233 203 173
+198 212 74 56 0 0 108 0 0 249 194 0
+199 179 0 220 191 0 253 241 0 105 0 0
+124 0 0 0 0 0 255 208 0 230 205 0
+243 197 0 153 185 0 134 0 0 166 49 0
+255 255 179 235 205 0 247 227 190 233 195 62
+251 246 171 0 50 0 70 0 0 218 128 0
+158 71 0 211 124 0 203 173 0 210 143 0
+210 151 0 203 184 0 199 135 0 184 152 0
+210 149 0 166 151 0 77 0 0 0 0 0
+171 111 52 255 232 51 255 231 0 79 72 0
+255 243 0 31 0 0 255 252 55 67 94 0
+255 205 0 238 211 0 243 217 0 252 209 0
+157 196 0 108 0 0 254 255 26 109 0 0
+255 221 0 202 168 0 5 0 0 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+237 218 204 253 242 231 215 194 148 245 222 214
+255 249 240 255 249 241 241 222 187 244 226 208
+255 245 241 255 250 235 252 240 227 255 243 226
+255 246 232 255 255 255 83 116 0 121 0 0
+251 181 0 173 155 0 202 145 0 142 118 0
+216 138 0 215 181 0 168 103 0 228 174 0
+167 164 0 235 159 0 136 132 0 202 145 0
+234 158 0 0 0 0 251 194 0 224 204 0
+255 230 0 0 0 0 0 0 0 28 0 0
+136 0 0 243 227 0 220 180 0 242 213 0
+217 221 0 23 0 0 46 0 0 36 0 0
+22 0 0 191 95 0 255 232 0 248 206 0
+194 216 0 0 0 0 91 0 0 0 0 0
+178 0 0 255 242 0 212 179 0 212 167 0
+255 255 255 0 0 0 113 0 0 164 0 0
+232 230 0 205 171 0 236 193 0 199 211 0
+116 0 0 44 0 0 47 0 0 255 253 0
+239 203 0 255 244 0 92 0 0 114 0 0
+217 166 0 255 253 126 234 205 29 243 234 177
+238 196 107 255 255 255 151 177 0 0 0 0
+95 0 0 131 38 0 154 51 0 163 104 0
+159 109 0 199 164 0 98 0 0 116 0 0
+25 0 0 12 0 0 27 0 0 255 240 233
+255 240 217 254 226 0 144 148 0 109 0 0
+251 255 0 107 0 0 255 255 31 33 0 0
+255 255 0 228 196 0 216 179 0 255 212 0
+21 64 0 200 0 0 207 230 0 97 0 0
+255 255 0 126 0 0 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 254 231 211 182 147 237 218 202 255 251 241
+254 244 231 237 223 187 245 216 202 255 251 239
+254 240 232 247 236 206 250 234 217 253 242 229
+255 255 255 171 190 115 84 0 0 175 137 0
+187 117 0 138 81 0 231 204 0 189 127 0
+169 150 0 174 94 0 156 74 0 223 201 0
+142 73 0 221 168 0 189 166 0 154 79 0
+196 118 0 193 170 0 140 0 0 225 208 0
+254 200 0 104 155 0 0 0 0 28 0 0
+72 0 0 251 190 0 242 214 0 217 186 0
+248 195 0 157 199 0 0 0 0 122 0 0
+0 0 0 11 0 0 253 227 0 223 183 0
+255 240 0 0 0 0 49 0 0 0 0 0
+0 0 0 221 136 0 241 211 0 218 192 0
+255 217 96 79 152 0 112 0 0 65 0 0
+188 136 0 237 220 0 168 150 0 247 203 0
+119 97 0 120 0 0 0 0 0 251 188 0
+239 214 0 222 194 0 216 220 0 85 0 0
+68 0 0 245 212 0 255 245 118 229 201 0
+239 232 154 226 210 51 247 224 167 227 229 97
+137 154 0 0 0 0 0 0 0 0 0 0
+28 0 0 0 0 0 0 0 0 0 0 0
+131 30 0 186 163 44 255 255 177 243 219 35
+234 201 0 238 229 0 82 0 0 255 233 0
+88 84 0 234 182 0 187 184 0 176 89 0
+247 222 0 225 196 0 240 197 0 238 231 0
+0 0 0 255 167 0 129 67 0 112 0 0
+255 255 0 0 0 0 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+211 184 131 247 235 232 253 242 236 255 247 235
+216 198 154 236 213 189 255 246 238 255 244 237
+236 222 191 241 220 198 250 241 232 254 241 230
+255 255 255 0 0 0 175 33 0 192 128 0
+209 169 0 172 143 0 110 27 0 244 215 0
+135 92 0 236 189 0 137 104 0 166 94 0
+212 186 0 144 65 0 192 111 0 192 115 0
+153 111 0 198 31 0 0 0 0 255 221 0
+227 186 0 255 242 0 0 0 0 0 0 0
+0 0 0 241 132 0 223 177 0 223 200 0
+227 192 0 255 222 0 0 0 0 25 0 0
+22 0 0 70 0 0 205 125 0 244 224 0
+244 195 0 187 224 0 0 0 0 117 0 0
+0 0 0 68 0 0 241 221 0 232 205 0
+224 206 0 251 219 205 0 0 0 118 0 0
+224 110 0 170 163 0 195 115 0 179 156 0
+247 242 0 157 67 0 94 0 0 0 0 0
+197 118 0 237 192 0 231 214 80 216 202 0
+79 0 0 77 0 0 197 119 0 255 246 84
+243 235 72 224 197 0 227 210 0 232 212 54
+255 222 151 255 242 63 226 230 181 230 214 132
+187 181 0 204 175 62 190 178 0 255 238 180
+255 255 167 250 216 75 242 227 44 234 202 0
+250 227 0 11 0 0 226 171 0 249 234 0
+0 0 0 255 253 0 0 0 0 255 229 0
+210 168 0 226 177 0 248 207 0 102 126 0
+59 0 0 255 248 0 0 0 0 236 201 0
+124 127 0 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+240 229 217 252 246 236 252 245 239 226 206 167
+241 226 212 251 245 240 251 242 233 236 221 185
+234 227 207 253 248 238 244 236 228 255 244 233
+238 255 251 108 0 0 102 17 0 234 200 0
+182 118 0 197 186 0 181 155 0 158 79 0
+154 93 0 182 143 0 186 144 0 176 76 0
+208 178 0 206 143 0 187 151 0 178 63 0
+164 69 0 210 140 0 140 93 0 158 84 0
+227 201 0 255 246 0 0 0 0 0 0 0
+0 0 0 132 0 0 235 184 0 220 203 0
+216 165 0 255 237 0 39 48 0 0 0 0
+62 0 0 73 0 0 15 0 0 241 194 0
+230 207 0 241 206 0 125 184 0 1 0 0
+108 0 0 0 0 0 255 206 0 219 194 0
+208 171 0 237 200 0 113 158 0 0 0 0
+136 0 0 214 141 0 189 180 0 189 108 0
+180 119 0 243 231 0 144 0 0 15 0 0
+0 0 0 211 140 0 221 181 0 227 211 0
+237 241 0 67 0 0 30 0 0 139 6 0
+255 238 0 246 238 0 229 208 38 227 192 0
+233 209 97 245 220 81 234 202 17 242 237 172
+247 213 103 241 216 162 252 243 186 235 210 107
+240 214 125 244 221 0 241 211 0 187 208 0
+74 0 0 185 86 0 255 255 0 0 0 0
+222 233 0 99 73 0 162 36 0 255 247 0
+204 166 0 221 167 0 255 224 0 0 0 0
+192 0 0 204 249 0 62 0 0 255 255 0
+0 0 0 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 249 241 246 235 221 220 203 170 248 229 218
+251 244 237 249 239 229 234 215 174 249 240 235
+249 238 230 253 244 228 247 238 228 255 255 255
+52 74 0 178 81 0 216 197 0 105 17 0
+243 201 0 158 121 0 232 189 0 211 176 0
+190 175 0 169 104 0 218 181 0 120 111 0
+151 45 0 186 150 0 131 0 0 184 128 0
+181 141 0 123 19 0 233 141 0 0 0 0
+228 132 0 241 201 0 203 193 0 0 0 0
+0 0 0 0 0 0 190 0 0 205 205 0
+230 203 0 218 170 0 234 246 0 0 0 0
+0 0 0 81 0 0 0 0 0 172 26 0
+251 238 0 230 207 0 255 249 0 0 0 0
+76 0 0 61 0 0 59 0 0 250 220 0
+218 192 0 208 167 0 255 239 238 63 90 0
+79 0 0 116 0 0 240 224 0 148 94 0
+237 202 0 213 181 0 255 248 0 46 0 0
+0 0 0 0 0 0 202 61 0 194 160 0
+236 226 0 219 232 148 191 140 0 96 0 0
+73 0 0 114 0 0 224 224 0 241 217 0
+227 223 40 243 214 70 228 198 0 248 234 171
+243 221 0 198 162 0 245 204 55 250 230 0
+219 217 0 204 190 0 103 14 0 154 0 0
+250 190 0 255 255 0 0 0 0 139 0 0
+178 145 0 81 0 0 250 220 0 233 211 0
+198 155 0 223 180 0 203 182 0 26 0 0
+253 153 0 0 0 0 239 159 0 210 187 0
+0 0 0 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+250 245 229 220 198 161 244 229 218 255 246 240
+233 224 195 223 202 161 252 241 238 246 238 226
+244 237 228 249 239 225 242 233 230 255 255 255
+98 15 0 120 0 0 226 207 0 179 147 0
+97 6 0 164 60 0 175 133 0 147 101 0
+177 134 0 140 85 0 95 44 0 197 124 0
+142 104 0 148 28 0 129 31 0 201 148 0
+137 0 0 161 62 0 190 122 0 242 194 0
+0 0 0 255 242 0 231 211 0 168 171 0
+0 0 0 44 0 0 0 0 0 242 173 0
+211 173 0 238 208 0 255 206 0 0 0 0
+0 0 0 79 0 0 58 0 0 0 0 0
+255 210 0 223 188 0 240 185 0 173 225 0
+0 0 0 112 0 0 0 0 0 184 86 0
+229 197 0 199 168 0 198 151 0 255 255 134
+0 0 0 148 0 0 68 0 0 220 202 0
+195 141 0 183 138 0 233 206 0 240 199 0
+165 124 0 0 0 0 0 0 0 84 0 0
+181 98 0 163 132 0 231 224 0 238 239 0
+194 178 0 118 34 0 65 0 0 121 0 0
+120 0 0 172 137 0 180 139 0 201 169 34
+206 165 0 165 125 0 150 111 0 109 40 0
+99 0 0 110 0 0 243 152 0 199 196 0
+222 163 0 0 0 0 154 81 0 174 161 0
+0 0 0 255 255 0 238 210 0 215 185 0
+227 179 0 244 213 0 0 0 0 184 37 0
+255 255 0 0 0 0 255 255 60 0 0 0
+233 201 185 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+222 203 167 251 238 232 255 248 239 239 229 204
+232 217 197 249 241 236 250 240 231 245 239 229
+247 237 226 245 238 225 251 243 233 205 215 208
+134 31 0 186 172 0 150 85 0 210 182 0
+215 172 0 153 143 0 195 122 0 146 90 0
+223 207 0 111 0 0 169 119 0 189 122 0
+189 103 0 68 0 0 186 69 0 154 73 0
+164 68 0 180 84 0 197 80 0 20 0 0
+60 50 0 118 0 0 215 188 0 255 248 0
+0 0 0 27 0 0 53 0 0 221 75 0
+246 220 0 186 166 0 228 196 0 249 250 0
+74 39 0 0 0 0 15 0 0 0 0 0
+73 0 0 252 248 0 228 179 0 255 205 0
+34 66 0 0 0 0 96 0 0 0 0 0
+220 103 0 208 175 0 222 186 0 246 213 0
+218 232 0 0 0 0 39 0 0 86 0 0
+191 217 0 192 127 0 158 105 0 218 175 0
+232 212 0 252 216 0 38 0 0 0 0 0
+0 0 0 155 17 0 122 7 0 255 213 0
+215 199 0 255 244 12 206 174 0 200 157 0
+182 102 0 157 89 0 104 0 0 132 4 0
+126 34 0 139 30 0 157 63 0 208 135 0
+229 210 0 246 226 0 220 200 0 109 0 0
+0 0 0 154 113 0 203 197 0 129 89 0
+191 101 0 240 221 0 227 187 0 213 165 0
+243 196 0 218 205 0 0 0 0 255 231 0
+24 38 0 217 127 0 82 126 0 0 0 0
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+248 239 227 255 248 239 244 231 206 234 220 195
+248 237 232 248 240 229 247 237 225 250 237 229
+245 237 226 250 240 227 255 249 255 88 117 0
+181 72 0 225 183 0 148 100 0 143 89 0
+182 97 0 141 101 0 195 183 0 159 120 0
+181 133 0 188 157 0 121 17 0 148 58 0
+152 29 0 179 55 0 183 119 0 202 98 0
+110 0 0 63 0 0 123 135 110 214 218 190
+255 228 221 17 76 0 238 179 0 228 187 0
+187 223 0 0 0 0 0 0 0 0 0 0
+231 167 0 235 195 0 217 191 0 236 181 0
+239 227 0 0 0 0 84 0 0 39 0 0
+0 0 0 228 116 0 229 214 0 226 192 0
+251 234 0 0 0 0 0 0 0 0 0 0
+0 0 0 255 204 0 244 215 0 215 175 0
+255 233 134 191 222 0 0 0 0 75 0 0
+119 0 0 183 141 0 156 114 0 192 159 0
+175 113 0 168 127 0 238 173 0 177 163 0
+42 0 0 0 0 0 0 0 0 0 0 0
+73 0 0 211 163 0 230 185 0 255 237 0
+255 245 0 255 231 0 230 214 0 229 208 0
+249 237 0 237 203 0 255 220 0 219 149 0
+159 121 0 98 0 0 0 0 0 78 0 0
+203 170 0 242 176 0 0 0 0 79 0 0
+255 255 0 214 170 0 236 197 0 213 169 0
+249 213 0 0 0 0 157 6 0 170 177 0
+0 0 0 255 255 0 0 0 0 250 208 187
+255 255 241 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 246 244 227 210 169 233 212 202 248 240 234
+244 238 226 248 239 227 247 237 227 246 238 228
+252 239 230 254 246 237 251 254 224 0 0 0
+187 125 0 134 61 0 249 224 0 168 92 0
+104 61 0 245 200 0 167 109 0 169 84 0
+212 190 0 144 0 0 207 167 0 146 68 0
+121 0 0 182 113 0 165 17 0 0 0 0
+204 226 224 203 214 193 251 234 211 191 179 154
+194 172 152 255 229 235 44 11 0 237 191 0
+255 211 0 24 67 0 0 0 0 0 0 0
+130 0 0 245 189 0 218 195 0 213 178 0
+255 211 0 98 150 0 0 0 0 53 0 0
+53 0 0 0 0 0 227 94 0 242 220 0
+203 166 0 255 210 0 0 0 0 9 0 0
+0 0 0 107 0 0 225 208 0 225 174 0
+218 174 0 255 230 125 248 255 53 0 0 0
+23 0 0 121 0 0 166 104 0 163 109 0
+190 189 0 194 128 0 226 185 0 143 103 0
+238 221 0 168 119 0 152 0 0 0 0 0
+28 0 0 0 0 0 0 0 0 23 0 0
+102 0 0 100 0 0 159 114 0 135 28 0
+120 111 0 21 0 0 7 0 0 0 0 0
+44 0 0 96 0 0 199 204 0 130 133 0
+246 202 0 0 0 0 201 175 0 253 236 0
+235 208 0 218 176 0 212 159 0 255 255 0
+0 0 0 50 0 0 255 255 0 0 0 0
+237 150 0 24 66 0 179 127 130 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+226 204 174 246 231 223 250 248 234 245 236 225
+248 238 227 246 238 229 249 236 227 250 243 229
+244 237 228 255 250 247 161 192 134 110 0 0
+238 222 0 163 27 0 158 136 0 215 168 0
+203 170 0 200 152 0 162 87 0 144 132 0
+81 0 0 206 176 0 116 0 0 192 108 0
+150 37 0 69 0 0 112 99 89 244 255 231
+210 181 150 224 205 172 186 156 144 204 192 154
+202 182 162 220 205 178 239 216 223 36 72 0
+211 150 0 255 233 0 94 90 0 0 0 0
+29 0 0 40 0 0 255 249 0 216 189 0
+209 169 0 255 247 0 0 0 0 0 0 0
+138 0 0 0 0 0 0 0 0 255 229 0
+193 142 0 234 193 0 184 158 0 0 0 0
+0 0 0 0 0 0 171 34 0 255 255 0
+232 197 0 221 182 0 236 176 0 255 255 38
+2 9 0 0 0 0 43 0 0 202 81 0
+201 118 0 151 134 0 182 212 0 156 41 0
+123 78 0 161 145 0 210 175 0 213 198 0
+209 182 0 149 14 0 60 48 0 130 0 0
+68 6 0 20 0 0 4 0 0 40 0 0
+76 0 0 147 132 0 78 0 0 202 172 0
+255 236 0 163 181 0 130 37 0 131 3 0
+0 0 0 216 171 0 255 229 0 234 213 0
+217 181 0 210 155 0 255 218 0 120 86 0
+0 0 0 235 124 0 11 0 0 187 89 0
+254 255 0 0 0 0 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+246 236 229 250 241 229 247 241 229 248 239 229
+248 241 229 251 242 227 244 236 225 245 238 225
+250 239 231 255 255 255 79 29 0 108 7 0
+163 54 0 106 132 0 172 128 0 164 85 0
+104 3 0 178 121 0 187 153 0 191 59 0
+116 74 0 203 95 0 128 23 0 70 0 0
+136 159 153 223 212 210 215 187 158 231 219 192
+191 162 140 205 173 148 222 218 198 222 194 159
+202 187 164 203 194 165 217 183 166 255 231 236
+71 86 0 237 142 0 255 255 0 54 0 0
+0 0 0 60 0 0 140 0 0 216 208 0
+224 185 0 216 176 0 252 245 0 54 80 0
+0 0 0 12 0 0 0 0 0 16 0 0
+255 255 0 213 195 0 255 212 0 139 136 0
+0 0 0 21 0 0 0 0 0 94 0 0
+255 229 0 229 200 0 233 197 0 234 191 0
+255 233 0 194 197 0 0 0 0 0 0 0
+60 0 0 192 0 0 93 0 0 197 108 0
+179 99 0 96 57 0 191 159 0 143 126 0
+144 124 0 175 123 0 168 151 0 199 184 0
+203 172 0 175 150 0 211 176 0 180 174 0
+207 188 0 203 178 0 144 124 0 197 208 0
+114 0 0 140 49 0 0 0 0 113 0 0
+228 166 0 255 225 0 206 180 0 211 166 0
+213 166 0 252 211 0 228 180 0 0 0 0
+255 211 0 180 168 0 0 0 0 255 255 0
+0 0 0 255 254 242 255 252 240 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+246 240 231 248 239 228 245 238 226 252 237 228
+250 241 228 250 239 228 253 240 233 249 238 229
+249 241 232 255 255 255 49 0 0 188 75 0
+172 147 0 180 124 0 222 172 0 135 122 0
+225 192 0 101 69 0 120 0 0 225 182 0
+87 0 0 69 0 0 151 174 148 201 215 200
+241 209 175 209 190 166 192 179 150 210 193 157
+205 199 175 217 189 151 231 223 219 218 184 163
+239 235 220 217 196 170 239 218 199 208 204 175
+255 249 255 8 53 0 189 81 0 219 222 0
+0 0 0 10 0 0 0 0 0 211 66 0
+237 234 0 210 154 0 213 185 0 255 239 0
+0 0 0 0 0 0 0 0 0 0 0 0
+159 34 0 237 214 0 199 145 0 240 227 0
+206 167 0 0 0 0 0 0 0 0 0 0
+76 0 0 255 226 0 233 207 0 211 167 0
+234 205 0 240 192 0 252 234 0 193 193 0
+0 0 0 0 0 0 0 0 0 94 0 0
+126 0 0 160 46 0 202 179 0 135 58 0
+149 160 0 186 119 0 129 105 0 116 22 0
+149 118 0 143 126 0 170 88 0 160 104 0
+132 74 0 170 142 0 199 151 0 135 15 0
+0 0 0 0 0 0 232 184 0 255 243 0
+243 232 0 204 167 0 228 189 0 183 151 0
+245 210 0 205 158 0 0 0 0 255 175 0
+112 82 0 0 0 0 255 236 0 0 0 0
+221 188 164 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+248 243 230 255 244 232 253 245 230 248 237 228
+245 242 229 245 238 224 245 236 227 246 237 225
+255 255 255 190 213 182 116 0 0 176 123 0
+102 0 0 202 202 0 140 48 0 155 111 0
+150 92 0 238 178 0 88 0 0 148 10 0
+25 0 0 199 213 220 255 221 201 217 214 196
+220 197 173 214 189 170 250 230 220 186 173 132
+222 187 176 224 226 199 218 185 170 192 168 139
+201 188 152 203 179 153 199 183 143 201 169 146
+239 226 202 255 240 251 126 162 125 210 123 0
+229 234 0 0 0 0 39 0 0 0 0 0
+141 0 0 245 255 0 201 171 0 218 177 0
+255 241 0 0 0 0 0 0 0 0 0 0
+0 0 0 26 0 0 255 255 0 189 125 0
+241 217 0 206 185 0 0 0 0 0 0 0
+0 0 0 56 0 0 226 111 0 255 251 0
+217 184 0 232 204 0 225 192 0 230 173 0
+255 247 0 204 194 0 83 57 0 0 5 0
+0 0 0 0 0 0 0 0 0 159 0 0
+143 0 0 108 0 0 118 0 0 194 148 0
+137 53 0 160 0 0 0 0 0 83 0 0
+0 0 0 0 0 0 0 0 0 105 42 0
+238 225 0 255 220 0 223 203 0 215 193 0
+212 147 0 202 172 0 189 121 0 255 235 0
+156 62 0 0 0 0 175 0 0 163 114 0
+0 0 0 255 9 0 0 0 0 224 176 167
+255 255 255 251 242 229 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+248 237 228 249 237 224 248 237 229 245 238 226
+248 238 228 245 238 229 249 236 225 245 237 227
+255 255 255 107 128 0 107 0 0 215 171 0
+156 164 0 120 0 0 194 122 0 216 150 0
+28 0 0 209 104 0 0 0 0 91 89 30
+255 255 255 181 167 142 231 210 183 194 177 160
+210 190 163 215 196 187 230 225 200 244 233 226
+228 221 204 209 192 153 218 186 178 229 222 190
+224 205 179 223 204 189 231 211 194 180 184 158
+233 203 182 195 178 154 243 202 194 119 158 117
+206 106 0 236 215 0 0 6 0 0 0 0
+0 0 0 198 58 0 227 229 0 185 133 0
+212 184 0 232 219 0 79 83 0 0 0 0
+0 0 0 0 0 0 59 0 0 255 251 0
+188 127 0 169 105 0 225 215 0 87 24 0
+0 0 0 0 0 0 0 0 0 168 0 0
+233 198 0 235 199 0 192 159 0 234 193 0
+238 201 0 214 182 0 242 201 0 255 231 0
+242 208 0 151 140 0 111 98 0 60 65 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 27 0 0 111 73 0 118 119 0
+174 152 0 208 191 0 255 248 0 229 205 0
+241 199 0 192 154 0 231 209 0 209 136 0
+169 156 0 240 185 0 198 166 0 144 43 0
+0 0 0 255 159 0 231 235 0 0 0 0
+255 75 0 88 15 0 127 107 104 255 255 255
+251 239 226 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+249 241 230 247 236 226 248 241 228 247 237 227
+243 238 228 249 239 230 252 242 229 254 242 229
+255 255 255 7 0 0 147 90 0 204 145 0
+190 131 0 170 136 0 54 0 0 211 107 0
+38 0 0 0 0 0 224 223 169 213 195 171
+216 192 165 224 210 189 215 199 171 232 216 202
+207 190 156 234 219 197 217 198 174 219 189 168
+210 196 167 221 192 186 216 216 178 197 181 152
+224 195 170 226 218 183 223 217 194 194 167 145
+196 193 168 243 208 190 203 193 171 255 215 215
+161 192 98 106 52 0 250 225 0 69 38 0
+0 0 0 0 0 0 222 123 0 240 208 0
+200 166 0 217 157 0 255 237 0 36 45 0
+0 0 0 0 0 0 0 0 0 29 0 0
+216 150 0 221 210 0 201 153 0 216 174 0
+134 133 0 0 0 0 0 0 0 0 0 0
+44 0 0 208 69 0 224 186 0 235 202 0
+208 191 0 215 169 0 194 161 0 238 184 0
+239 203 0 244 203 0 246 199 0 244 213 0
+255 250 0 248 227 0 255 253 0 255 225 0
+255 240 0 255 252 0 242 185 0 255 235 0
+241 194 0 202 152 0 213 173 0 213 178 0
+196 143 0 204 188 0 224 152 0 183 136 0
+255 244 0 191 126 0 0 0 0 0 0 0
+212 172 0 185 172 0 0 0 0 255 12 0
+0 0 0 109 91 27 255 255 255 255 245 230
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+249 241 228 252 241 227 250 243 230 250 241 226
+245 237 229 249 240 228 248 240 229 249 241 231
+255 255 255 89 0 0 222 152 0 143 74 0
+115 0 0 229 174 0 137 42 0 82 0 0
+96 123 80 255 252 211 204 184 157 218 211 192
+190 169 139 240 223 215 229 203 187 247 242 224
+223 196 180 229 231 210 240 227 222 239 231 208
+223 221 203 234 219 205 245 241 229 247 240 234
+221 218 190 254 246 242 209 192 163 223 209 197
+218 203 185 203 189 154 214 192 169 214 190 167
+228 224 198 254 232 232 76 101 0 205 161 0
+214 178 0 0 0 0 0 0 0 65 0 0
+242 192 0 236 205 0 207 177 0 230 168 0
+131 98 0 0 0 0 0 0 0 0 0 0
+0 0 0 130 0 0 183 166 0 240 186 0
+162 99 0 218 212 0 88 0 0 0 0 0
+0 0 0 0 0 0 86 0 0 219 129 0
+248 179 0 212 185 0 218 192 0 190 150 0
+217 177 0 175 134 0 214 177 0 205 140 0
+211 180 0 187 142 0 201 153 0 202 149 0
+206 157 0 226 165 0 197 151 0 234 202 0
+204 143 0 146 140 0 218 174 0 222 188 0
+193 130 0 240 203 0 218 163 0 186 168 0
+94 0 0 0 0 0 118 0 0 229 182 0
+168 74 0 0 0 0 207 0 0 0 0 0
+247 222 204 255 255 255 255 244 231 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+250 241 230 253 243 231 253 247 231 252 239 228
+248 238 226 246 238 228 246 236 226 250 240 235
+255 255 225 95 0 0 152 75 0 173 55 0
+197 132 0 116 0 0 12 0 0 220 227 217
+221 204 178 206 181 159 224 202 181 220 209 189
+192 183 151 248 235 230 201 178 141 250 234 232
+251 245 235 249 242 230 248 238 229 248 240 231
+251 239 231 248 243 232 249 239 227 248 236 228
+250 241 231 249 244 229 239 218 204 222 210 184
+198 170 152 236 216 191 192 178 159 217 190 163
+210 194 161 202 177 158 250 216 213 164 183 153
+134 87 0 220 154 0 0 0 0 0 0 0
+0 0 0 255 214 0 207 204 0 213 177 0
+250 214 0 208 198 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 166 133 0
+250 215 0 126 103 0 236 176 0 135 37 0
+49 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 172 24 0 161 94 0 248 159 0
+221 183 0 188 150 0 188 156 0 200 157 0
+148 105 0 178 148 0 216 176 0 168 138 0
+219 175 0 185 145 0 230 161 0 209 188 0
+212 151 0 225 223 0 208 165 0 255 184 0
+202 157 0 204 95 0 0 0 0 0 0 0
+0 0 0 231 68 0 227 213 0 0 0 0
+0 0 0 10 0 0 0 0 0 255 234 204
+255 255 255 255 244 230 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+250 243 235 250 239 226 250 241 229 255 244 232
+245 236 227 252 242 232 249 237 228 248 240 229
+255 255 255 53 0 0 139 23 0 145 0 0
+75 0 0 121 120 62 228 244 234 237 208 171
+231 219 213 225 218 201 242 216 196 254 249 240
+254 242 229 248 242 235 253 245 233 247 240 231
+248 240 229 251 237 227 248 239 225 249 238 227
+245 237 229 249 238 229 249 242 229 245 238 225
+246 238 226 249 239 227 248 242 233 229 228 211
+243 228 209 215 196 166 211 195 164 184 164 158
+213 195 167 234 219 214 202 185 144 233 212 202
+213 203 197 165 171 106 151 65 0 157 59 0
+0 0 0 0 0 0 171 11 0 255 247 0
+183 133 0 162 160 0 185 174 0 115 77 0
+0 0 0 0 0 0 0 0 0 0 0 0
+150 8 0 197 117 0 223 203 0 163 123 0
+134 121 0 255 168 0 25 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+71 0 0 135 18 0 154 75 0 230 150 0
+181 111 0 210 157 0 234 164 0 224 174 0
+242 162 0 225 169 0 255 197 0 237 207 0
+174 115 0 128 83 0 147 0 0 0 0 0
+0 0 0 0 0 0 7 0 0 182 140 0
+251 97 0 52 31 0 0 0 0 0 0 0
+0 0 0 93 52 0 255 226 229 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+251 243 229 248 239 229 247 239 231 247 239 227
+246 240 227 246 240 227 254 240 231 253 245 231
+255 251 250 164 196 160 65 90 0 152 163 142
+200 192 171 253 239 225 220 214 188 238 214 206
+253 252 237 242 234 215 244 235 225 250 241 232
+243 238 229 247 239 227 252 241 231 247 240 227
+250 240 228 247 241 229 248 237 228 248 242 228
+247 238 229 248 238 226 248 241 228 247 241 229
+247 241 227 246 238 230 248 240 228 240 231 204
+250 233 226 195 184 140 198 165 142 246 216 205
+195 196 162 209 176 157 210 187 164 227 218 191
+192 168 154 235 194 179 237 240 219 150 169 91
+149 113 0 48 0 0 0 0 0 76 0 0
+255 188 0 247 222 0 129 89 0 214 195 0
+247 160 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 55 0 0 213 134 0
+199 141 0 210 201 0 206 152 0 184 97 0
+186 76 0 43 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 11 0 0
+127 0 0 210 206 0 255 214 0 167 93 0
+0 0 0 0 0 0 0 0 0 0 0 0
+220 188 166 255 255 255 255 250 241 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+253 242 234 250 243 228 246 242 230 253 243 230
+250 243 233 250 243 231 253 243 230 253 247 232
+254 242 233 251 246 225 239 215 209 247 231 211
+237 222 214 255 248 245 255 247 237 250 246 237
+248 236 226 254 242 235 248 243 230 250 240 231
+248 238 228 250 242 231 251 243 230 252 244 233
+247 240 228 250 240 225 248 241 232 249 241 228
+245 236 224 249 237 229 248 241 228 249 241 227
+251 243 231 248 243 229 233 217 191 247 232 226
+241 235 212 224 198 177 238 230 210 208 188 159
+196 179 150 212 192 169 198 184 160 221 193 171
+203 185 166 223 192 159 194 172 161 255 228 230
+224 207 172 202 209 64 165 123 0 0 0 0
+0 0 0 85 0 0 238 201 0 198 182 0
+243 191 0 176 111 0 165 180 4 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+55 0 0 24 0 0 254 201 0 206 167 0
+214 167 0 92 26 0 246 185 0 180 132 0
+122 0 0 48 0 0 132 0 0 10 0 0
+29 0 0 79 0 0 0 0 0 12 0 0
+0 0 0 49 0 0 24 0 0 95 0 0
+122 0 0 165 162 0 255 215 0 255 234 0
+115 91 0 157 31 0 0 0 0 0 0 0
+0 0 0 0 0 0 209 164 160 255 255 232
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+250 242 229 250 242 230 252 244 230 252 242 230
+251 243 230 248 239 228 250 239 230 249 243 229
+252 239 232 251 246 233 255 248 241 253 244 235
+254 248 234 253 243 231 254 243 234 249 239 228
+250 242 230 246 241 229 251 243 229 252 240 233
+248 240 232 247 243 230 249 243 230 247 239 228
+250 240 227 248 241 230 248 239 229 248 239 228
+247 237 229 244 241 228 249 241 229 251 242 234
+244 234 212 224 204 168 255 249 250 241 231 211
+222 197 174 255 250 253 243 237 219 233 209 188
+227 223 200 200 174 143 198 172 150 218 187 160
+212 190 168 199 180 154 210 181 146 231 208 205
+207 171 137 223 202 203 221 202 183 232 214 162
+138 142 0 0 0 0 0 0 0 142 0 0
+194 157 0 255 188 0 220 193 0 234 197 0
+213 180 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+90 0 0 134 44 0 200 181 0 182 104 0
+159 36 0 198 186 0 220 213 0 178 155 0
+250 119 0 181 182 0 235 158 0 212 144 0
+233 195 0 247 225 0 214 181 0 207 186 0
+92 78 0 131 83 0 54 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+249 243 232 252 243 230 251 240 230 255 243 233
+253 241 231 251 242 231 248 240 230 251 241 234
+250 241 234 250 245 228 253 241 231 249 241 228
+246 235 227 252 244 234 250 243 231 247 243 231
+249 242 227 251 242 231 252 243 230 243 236 226
+249 240 230 250 243 232 251 243 230 250 241 231
+250 245 230 245 237 227 247 237 230 248 241 228
+248 240 227 251 244 232 251 243 236 230 219 179
+224 201 181 255 249 245 226 211 183 227 208 189
+255 254 241 220 202 172 239 210 192 234 228 200
+220 189 149 233 215 200 244 224 211 196 184 144
+208 184 166 248 233 211 207 199 171 204 174 152
+232 218 191 204 191 163 207 193 155 212 193 169
+253 209 210 219 216 136 212 204 89 71 67 0
+0 0 0 0 0 0 82 0 0 133 50 0
+255 199 0 251 197 0 210 172 0 198 182 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 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 0 0 0 0 0
+24 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+243 236 227 252 241 228 249 240 228 250 242 228
+250 241 226 246 239 226 252 238 228 247 240 229
+249 240 230 251 243 227 247 239 231 247 240 227
+252 241 229 250 240 232 250 239 230 250 241 229
+252 242 227 250 242 231 247 241 225 248 239 230
+245 241 229 249 240 231 249 236 227 244 239 229
+247 238 227 245 237 228 249 239 230 248 241 228
+248 241 231 247 240 228 247 243 227 239 226 217
+253 249 240 226 213 173 243 226 225 255 248 244
+221 208 158 246 229 221 227 213 185 223 198 169
+255 246 247 246 246 226 203 178 147 242 232 215
+226 210 184 200 180 158 204 181 152 205 189 175
+209 206 173 202 163 148 224 194 171 202 190 151
+200 176 154 236 217 188 255 250 255 255 255 239
+255 255 164 223 217 188 87 124 0 71 55 0
+0 0 0 0 0 0 110 0 0 112 62 0
+186 99 0 208 197 0 234 179 0 128 25 0
+164 51 0 3 0 0 35 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 145 112 27 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+248 239 228 242 235 224 247 241 228 249 240 229
+243 233 225 243 237 225 252 241 228 248 239 227
+251 238 231 251 244 229 246 240 229 249 243 228
+247 240 228 246 240 228 252 243 230 250 243 231
+250 243 227 251 243 231 249 242 228 243 237 227
+246 239 230 248 243 229 245 237 228 249 241 232
+251 241 230 245 242 230 247 239 228 249 240 229
+250 240 228 245 237 229 247 241 231 252 247 237
+221 213 176 251 237 222 250 245 235 248 241 230
+252 235 223 206 193 161 222 192 175 255 255 255
+224 214 193 206 181 129 253 236 228 246 241 228
+221 202 166 217 192 171 229 215 206 248 229 207
+191 177 157 212 190 158 218 204 186 212 191 156
+254 240 230 250 244 234 255 245 235 250 244 237
+253 245 242 255 246 245 255 255 255 255 255 255
+250 250 197 215 211 159 173 193 165 121 113 0
+88 29 0 59 0 0 0 0 0 0 0 0
+20 0 0 0 0 0 139 56 0 51 0 0
+63 0 0 0 0 0 74 10 0 0 0 0
+0 0 0 42 0 0 0 0 0 41 0 0
+0 0 0 158 121 70 180 177 129 196 180 120
+255 251 226 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+252 241 232 248 237 226 248 243 232 244 235 224
+250 242 229 249 241 228 252 241 230 241 237 227
+253 239 232 250 240 227 243 237 228 246 237 225
+252 241 228 251 240 231 252 243 230 248 239 229
+247 240 228 250 240 229 246 240 228 250 237 230
+243 237 227 246 237 228 244 234 222 247 238 228
+247 238 224 244 236 229 247 237 232 245 240 221
+238 217 198 248 242 235 247 242 236 218 201 167
+252 239 234 253 241 228 250 241 233 249 241 236
+217 196 158 243 224 222 255 255 255 219 215 163
+222 194 180 251 238 233 238 231 215 200 174 141
+225 200 174 254 250 251 223 201 166 224 201 181
+255 247 232 202 186 155 226 197 178 255 252 240
+250 243 231 246 239 229 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 227 255 248 200 255 255 211 255 255 240
+255 255 219 252 229 192 217 217 179 232 235 189
+215 229 205 255 242 209 222 234 216 217 213 187
+240 233 183 251 237 189 246 239 202 255 255 255
+255 255 246 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+245 238 227 249 241 227 252 240 232 248 237 224
+244 238 228 246 241 230 250 238 229 248 240 230
+244 237 227 249 241 228 244 238 230 248 239 224
+247 239 228 249 236 232 253 245 232 251 243 231
+246 239 225 246 238 230 249 243 227 248 239 232
+247 241 229 249 243 232 245 237 226 249 240 233
+247 238 227 249 242 234 248 241 226 231 212 184
+250 242 236 251 246 238 222 205 168 249 233 212
+235 226 192 250 233 224 253 245 235 247 242 224
+252 240 217 243 238 222 222 201 177 230 211 190
+255 248 243 224 219 197 200 175 145 249 233 222
+255 252 244 214 190 161 247 232 220 246 234 211
+194 170 144 246 232 213 255 249 238 255 248 237
+251 246 227 246 238 227 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 254 245 241 254 250 239 255 251 240
+255 249 240 255 249 243 255 251 240 255 250 239
+255 251 236 255 245 239 255 251 239 255 248 238
+255 247 241 255 250 242 255 249 239 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+249 242 229 251 242 231 246 240 229 252 238 228
+252 245 228 253 240 229 250 242 232 242 234 222
+247 240 232 248 240 226 251 244 233 253 240 228
+247 241 228 248 236 230 247 244 232 251 239 231
+249 243 227 252 242 232 247 239 228 248 237 227
+247 236 227 248 242 231 251 243 230 247 237 228
+253 245 239 232 221 179 220 204 180 255 242 240
+247 238 223 215 202 161 255 242 240 231 224 161
+245 216 195 248 246 227 240 213 192 255 247 246
+250 245 220 200 175 133 224 197 190 255 255 243
+205 191 159 206 178 150 255 247 243 249 244 226
+233 218 178 248 235 224 215 193 164 204 177 144
+252 231 232 254 253 237 255 247 229 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+248 240 231 251 242 229 249 239 231 247 241 228
+245 236 224 249 239 228 247 236 227 248 243 231
+248 238 230 247 242 231 251 241 230 250 240 228
+250 241 226 247 238 231 250 242 230 247 239 229
+252 246 228 248 238 229 249 246 228 252 240 231
+246 240 231 248 241 231 249 241 229 251 243 239
+224 213 179 242 229 218 252 243 242 253 247 234
+235 226 204 255 240 228 226 214 174 255 244 241
+253 249 220 232 203 177 255 251 246 253 244 219
+209 177 151 251 232 228 255 254 241 208 187 143
+243 219 203 255 250 242 244 235 202 255 244 236
+255 251 236 208 183 147 230 203 190 255 247 236
+255 250 237 253 244 231 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+249 244 230 250 238 226 250 244 231 251 240 230
+248 241 229 249 241 228 251 240 231 253 241 232
+251 240 230 249 244 227 247 240 232 252 241 228
+247 236 225 249 241 232 249 240 230 246 238 227
+247 239 226 252 244 232 247 239 225 251 240 231
+250 242 230 250 246 234 251 241 235 229 217 181
+242 225 207 254 246 242 253 246 232 255 250 237
+252 242 215 236 213 179 255 247 250 232 223 185
+230 203 170 255 253 245 250 241 226 234 218 182
+255 245 238 245 233 205 210 185 154 253 233 219
+255 255 242 244 229 203 248 229 219 242 231 202
+211 185 144 235 211 198 255 255 255 255 248 232
+255 245 231 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+249 242 232 251 241 227 248 240 228 246 237 226
+248 239 229 251 241 228 250 238 227 251 240 231
+249 240 231 248 244 227 247 238 227 254 241 232
+247 240 227 247 240 230 251 239 230 247 242 231
+252 241 227 251 243 235 249 246 229 254 243 237
+251 246 232 212 190 157 255 248 242 253 248 245
+230 211 181 248 226 204 246 227 206 231 206 179
+255 255 255 234 224 194 230 197 172 255 251 247
+239 219 185 255 245 234 254 246 232 236 229 199
+241 219 198 255 255 255 255 249 236 243 241 215
+255 248 238 233 218 183 199 173 144 255 249 243
+255 249 239 255 244 228 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+251 241 231 252 243 231 251 242 231 249 237 228
+248 237 224 247 237 227 251 240 227 248 244 230
+251 237 231 249 242 228 248 239 228 247 236 225
+249 245 232 253 241 234 253 244 232 248 239 229
+248 242 228 247 237 229 247 241 227 251 242 233
+252 242 233 244 240 227 225 207 175 235 218 202
+255 251 248 233 223 184 252 229 224 243 236 206
+237 207 183 255 248 241 239 229 187 243 213 208
+255 255 245 255 246 232 255 246 233 255 255 255
+246 233 200 226 204 173 255 240 232 255 249 235
+250 236 214 247 240 220 239 226 193 204 172 148
+236 212 202 255 255 244 255 246 234 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+248 239 227 250 243 228 246 241 229 248 240 229
+248 243 230 249 240 228 249 238 230 247 243 231
+251 238 230 248 240 229 248 240 232 249 240 227
+246 238 227 248 238 235 248 240 230 248 240 231
+248 240 226 252 242 232 250 243 236 239 228 195
+219 193 168 250 237 235 252 246 234 226 218 184
+245 226 219 226 214 180 222 194 177 255 255 255
+215 200 151 235 210 198 255 255 244 225 201 166
+241 228 215 255 249 236 241 232 207 240 219 193
+255 255 255 248 229 203 255 245 237 253 248 237
+208 185 145 205 172 148 255 240 235 255 250 237
+254 245 229 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+246 243 231 246 243 227 248 241 231 252 244 232
+248 237 225 247 242 228 247 238 227 248 238 227
+252 240 231 246 240 227 248 241 227 250 240 228
+248 240 228 249 241 231 249 241 231 249 242 231
+245 240 225 251 243 236 235 229 189 228 209 198
+250 247 241 255 250 238 228 211 177 239 224 207
+232 228 190 236 215 209 255 255 255 219 207 171
+233 208 205 252 245 239 221 191 162 255 250 243
+253 248 237 252 242 221 250 239 233 255 255 255
+228 218 169 240 223 211 242 239 234 198 183 145
+235 213 199 255 249 243 252 246 234 251 243 230
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+250 243 230 252 242 232 246 240 227 248 238 228
+247 240 230 251 244 231 252 240 231 246 240 231
+250 242 230 245 238 227 246 236 229 248 239 228
+249 241 229 245 236 224 245 235 226 249 241 231
+251 244 234 234 227 196 230 204 189 253 248 243
+255 248 241 222 201 159 254 233 232 225 213 180
+255 231 225 241 237 217 216 200 153 240 223 220
+244 237 215 225 199 156 249 238 239 249 243 224
+227 206 186 255 248 239 252 242 218 226 211 180
+246 226 220 228 220 197 206 180 144 236 216 206
+255 253 240 254 247 232 245 241 230 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+248 241 230 248 237 223 245 239 229 245 235 224
+252 241 230 250 241 231 248 238 229 244 240 226
+252 240 233 246 240 227 253 245 236 246 236 227
+247 241 228 244 236 228 244 238 229 252 248 239
+236 222 187 237 220 205 254 254 245 235 230 205
+217 193 162 254 242 231 225 211 172 239 219 209
+247 248 221 217 192 174 249 237 233 240 233 207
+223 203 168 255 245 242 249 246 229 222 205 162
+250 234 229 251 246 233 213 187 156 240 228 219
+227 218 180 198 168 141 240 216 207 255 255 240
+253 244 235 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+249 241 232 246 234 227 247 243 232 244 237 226
+251 240 227 252 244 232 247 238 227 250 242 231
+249 240 233 246 240 223 248 238 229 248 240 227
+250 244 229 248 239 233 251 246 239 228 215 178
+242 230 219 252 246 241 242 236 211 225 202 168
+255 242 236 228 217 178 254 239 237 244 238 229
+228 207 161 253 244 245 233 229 207 223 191 169
+255 249 249 247 240 215 227 202 183 255 255 255
+237 239 211 218 195 165 240 232 216 219 206 181
+215 184 156 253 247 243 255 247 236 251 244 232
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+249 239 228 251 244 231 252 241 230 248 240 231
+250 241 229 252 244 227 247 234 226 248 243 229
+250 240 231 249 241 228 248 241 231 252 240 231
+250 245 230 249 240 234 230 219 188 238 216 209
+253 248 237 246 233 220 228 207 187 248 244 222
+226 206 177 255 242 243 238 231 193 220 193 168
+255 254 246 234 221 186 235 214 185 255 255 255
+232 219 193 221 199 161 255 255 255 221 207 182
+232 207 170 249 240 230 205 182 137 214 187 165
+255 255 242 255 248 237 255 244 229 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+247 239 230 251 241 229 247 239 229 247 239 228
+252 243 231 252 244 230 247 234 223 248 241 230
+248 237 227 244 237 228 244 237 229 248 238 227
+248 240 232 232 219 193 242 228 213 255 255 255
+232 221 190 228 209 177 255 247 244 229 213 165
+253 238 236 242 232 201 251 226 213 255 255 255
+228 215 178 245 221 207 255 255 255 228 218 169
+237 210 205 255 255 244 222 207 172 246 229 213
+247 236 207 200 176 144 240 220 209 255 248 242
+255 248 231 255 243 230 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+247 243 230 249 242 228 249 243 231 251 243 231
+251 242 230 251 240 230 251 245 233 249 242 230
+247 236 231 250 245 227 249 240 234 251 243 231
+250 242 232 252 246 239 255 251 245 229 218 178
+239 218 203 255 248 238 255 250 230 255 245 238
+239 227 189 248 229 216 255 249 228 240 220 183
+244 218 195 255 254 243 227 206 173 236 212 181
+255 248 234 232 220 180 255 235 226 217 209 176
+198 171 114 244 227 215 255 255 243 255 245 233
+255 245 235 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+249 243 230 251 242 230 246 241 231 250 238 226
+253 246 232 252 243 234 248 237 230 251 240 228
+249 238 231 250 246 233 252 241 225 250 242 228
+255 246 233 255 248 234 227 215 187 246 222 208
+255 252 238 250 234 207 255 249 241 251 239 222
+250 236 218 255 253 246 228 206 155 245 227 226
+255 255 246 225 202 155 229 212 197 255 255 255
+235 225 191 255 236 230 218 207 163 223 190 172
+247 229 219 255 253 239 255 245 236 255 247 231
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+246 238 230 251 242 230 250 242 230 253 242 230
+253 244 231 249 242 231 250 240 228 251 243 232
+250 243 237 247 236 207 237 212 188 255 247 234
+255 253 243 222 202 164 238 216 198 255 251 241
+255 249 236 255 249 240 242 225 184 255 249 237
+255 251 242 234 212 178 255 244 241 255 251 237
+228 208 172 255 242 237 255 252 242 255 250 236
+254 242 226 224 207 177 219 190 164 255 252 246
+255 253 237 255 247 234 255 245 235 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+250 242 229 249 243 230 251 243 229 251 244 229
+251 241 231 250 243 231 251 241 232 253 244 238
+239 227 197 229 204 175 255 254 246 255 245 232
+255 245 230 254 236 234 255 251 240 255 248 235
+252 243 218 230 209 172 255 248 238 249 241 228
+236 212 187 255 254 243 255 245 227 224 208 165
+255 249 249 244 237 193 255 237 230 251 247 223
+208 183 139 222 196 175 255 253 247 255 248 234
+255 245 231 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+248 241 230 255 245 233 254 247 235 253 241 233
+250 245 234 251 243 232 250 241 236 222 207 169
+227 201 172 255 255 246 255 247 240 255 242 227
+255 246 231 255 246 238 255 251 240 245 236 216
+232 205 167 254 239 230 255 249 234 255 241 225
+255 250 238 245 237 210 217 188 163 252 235 222
+231 210 173 254 235 223 252 239 210 207 179 148
+236 211 198 255 251 240 255 250 234 255 247 235
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 252 243 228 251 241 229 250 243 230
+246 238 226 248 241 231 251 242 228 242 226 210
+255 251 245 255 251 233 242 221 189 255 247 235
+255 247 235 255 248 240 248 238 220 225 200 168
+255 252 246 255 248 231 255 247 234 255 247 237
+255 248 236 222 197 174 253 240 220 227 203 164
+255 249 246 238 228 200 199 182 140 243 221 211
+255 249 240 255 248 231 255 243 233 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 245 243 229 250 236 228
+250 242 231 252 245 231 255 245 234 255 250 237
+255 244 240 233 219 172 254 242 238 255 248 234
+255 253 245 229 208 168 228 203 171 255 251 251
+249 237 195 249 232 219 255 254 242 255 244 230
+255 247 236 249 242 211 231 201 186 255 255 255
+238 231 197 200 172 141 236 200 179 255 255 246
+254 245 230 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 251 242 230
+252 245 229 255 246 233 255 243 228 255 248 238
+238 226 193 253 237 228 255 250 242 255 251 242
+231 211 165 246 226 213 255 249 247 228 207 169
+255 237 232 255 251 240 227 207 172 255 255 255
+252 243 225 226 205 169 255 255 247 232 224 196
+207 178 134 247 232 217 255 248 245 255 249 234
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 246 235 255 247 236 255 245 232 255 246 234
+255 246 239 255 251 235 255 244 229 222 205 159
+244 220 213 247 237 228 225 200 150 244 224 222
+255 248 220 225 205 165 255 252 245 229 215 166
+220 192 165 255 255 255 212 189 156 201 178 149
+248 228 215 255 255 242 255 246 235 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 245 232 255 245 231 255 246 232 255 243 229
+255 246 234 255 249 236 237 216 184 248 231 214
+252 244 222 213 185 152 236 215 200 255 246 228
+234 212 180 255 246 247 226 216 180 235 213 191
+255 247 243 223 199 163 214 191 160 255 237 228
+255 254 239 255 245 233 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 243 232 255 246 234
+255 245 236 255 246 230 255 247 245 253 248 224
+210 179 128 255 243 244 255 248 237 223 205 176
+255 251 246 241 226 190 248 229 217 253 243 224
+205 196 158 222 188 167 255 255 255 255 248 238
+255 245 229 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 246 233 255 245 232
+255 243 230 255 252 240 241 226 193 213 180 153
+255 248 240 255 250 239 252 241 223 255 253 242
+224 205 168 253 228 220 254 246 226 206 176 134
+225 194 171 255 254 245 255 248 236 255 245 232
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 246 235 254 240 221 220 192 161 255 238 230
+254 246 233 255 248 242 255 250 237 218 190 151
+255 251 249 254 248 228 203 178 140 246 223 216
+255 255 246 255 247 234 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 243 234 249 243 223 254 249 237 255 249 237
+255 247 238 245 232 198 211 187 160 255 243 236
+246 238 215 211 189 148 226 200 177 255 250 243
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 249 242 226 253 242 235 255 243 234
+242 235 216 214 186 164 255 245 242 251 248 228
+201 174 137 237 217 205 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 248 241 230 253 244 235
+247 241 220 255 255 255 251 249 236 195 176 133
+240 214 201 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 252 243 229
+255 249 240 230 222 197 206 178 144 218 195 171
+255 255 244 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+234 226 212 200 174 136 225 203 188 255 255 255
+250 242 230 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 246 232 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
+255 255 255 255 255 255 255 255 255 255 255 255
diff --git a/src/boost/libs/gil/test/extension/io/images/pnm/p4.pnm b/src/boost/libs/gil/test/extension/io/images/pnm/p4.pnm
new file mode 100644
index 000000000..468b839aa
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/pnm/p4.pnm
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/pnm/p5.pnm b/src/boost/libs/gil/test/extension/io/images/pnm/p5.pnm
new file mode 100644
index 000000000..c07b78a82
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/pnm/p5.pnm
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/pnm/p6.pnm b/src/boost/libs/gil/test/extension/io/images/pnm/p6.pnm
new file mode 100644
index 000000000..bf4a94710
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/pnm/p6.pnm
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/pnm/readme.txt b/src/boost/libs/gil/test/extension/io/images/pnm/readme.txt
new file mode 100644
index 000000000..7a9ab2cb7
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/pnm/readme.txt
@@ -0,0 +1,5 @@
+# Copyright (C) 2013 Christian Henning
+# Distributed under the Boost Software License, Version 1.0.
+# See www.boost.org/LICENSE_1_0.txt
+
+Please send me an email to retrieve the test files at chhenning **at** gmail.com. \ No newline at end of file
diff --git a/src/boost/libs/gil/test/extension/io/images/pnm/rgb.pnm b/src/boost/libs/gil/test/extension/io/images/pnm/rgb.pnm
new file mode 100644
index 000000000..9299261ac
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/pnm/rgb.pnm
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/raw/RAW_CANON_D30_SRGB.CRW b/src/boost/libs/gil/test/extension/io/images/raw/RAW_CANON_D30_SRGB.CRW
new file mode 100644
index 000000000..433d9c31a
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/raw/RAW_CANON_D30_SRGB.CRW
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/raw/readme.txt b/src/boost/libs/gil/test/extension/io/images/raw/readme.txt
new file mode 100644
index 000000000..7436b5493
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/raw/readme.txt
@@ -0,0 +1,5 @@
+# Copyright (C) 2013 Christian Henning
+# Distributed under the Boost Software License, Version 1.0.
+# See www.boost.org/LICENSE_1_0.txt
+
+Images are taken from http://www.rawsamples.ch/index_en.php \ No newline at end of file
diff --git a/src/boost/libs/gil/test/extension/io/images/readme.md b/src/boost/libs/gil/test/extension/io/images/readme.md
new file mode 100644
index 000000000..cefddf5b3
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/readme.md
@@ -0,0 +1,3 @@
+For copyright reasons the complete is available here:
+
+https://github.com/chhenning/gil_io_images \ No newline at end of file
diff --git a/src/boost/libs/gil/test/extension/io/images/targa/24BPP_compressed.tga b/src/boost/libs/gil/test/extension/io/images/targa/24BPP_compressed.tga
new file mode 100644
index 000000000..e957723c9
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/targa/24BPP_compressed.tga
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/targa/24BPP_compressed_ul_origin.tga b/src/boost/libs/gil/test/extension/io/images/targa/24BPP_compressed_ul_origin.tga
new file mode 100644
index 000000000..98988a751
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/targa/24BPP_compressed_ul_origin.tga
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/targa/24BPP_uncompressed.tga b/src/boost/libs/gil/test/extension/io/images/targa/24BPP_uncompressed.tga
new file mode 100644
index 000000000..410043fac
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/targa/24BPP_uncompressed.tga
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/targa/24BPP_uncompressed_ul_origin.tga b/src/boost/libs/gil/test/extension/io/images/targa/24BPP_uncompressed_ul_origin.tga
new file mode 100644
index 000000000..e5cab05c0
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/targa/24BPP_uncompressed_ul_origin.tga
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/targa/32BPP_compressed.tga b/src/boost/libs/gil/test/extension/io/images/targa/32BPP_compressed.tga
new file mode 100644
index 000000000..a54645541
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/targa/32BPP_compressed.tga
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/targa/32BPP_compressed_ul_origin.tga b/src/boost/libs/gil/test/extension/io/images/targa/32BPP_compressed_ul_origin.tga
new file mode 100644
index 000000000..1fa4c636e
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/targa/32BPP_compressed_ul_origin.tga
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/targa/32BPP_uncompressed.tga b/src/boost/libs/gil/test/extension/io/images/targa/32BPP_uncompressed.tga
new file mode 100644
index 000000000..fb38dc48b
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/targa/32BPP_uncompressed.tga
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/targa/32BPP_uncompressed_ul_origin.tga b/src/boost/libs/gil/test/extension/io/images/targa/32BPP_uncompressed_ul_origin.tga
new file mode 100644
index 000000000..65e807408
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/targa/32BPP_uncompressed_ul_origin.tga
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/images/targa/fileformat_info/readme.txt b/src/boost/libs/gil/test/extension/io/images/targa/fileformat_info/readme.txt
new file mode 100644
index 000000000..b4ec88cb3
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/targa/fileformat_info/readme.txt
@@ -0,0 +1,5 @@
+# Copyright (C) 2013 Christian Henning
+# Distributed under the Boost Software License, Version 1.0.
+# See www.boost.org/LICENSE_1_0.txt
+
+taken from http://www.fileformat.info/format/tga/sample/index.htm
diff --git a/src/boost/libs/gil/test/extension/io/images/tiff/graphicmagick/readme.txt b/src/boost/libs/gil/test/extension/io/images/tiff/graphicmagick/readme.txt
new file mode 100644
index 000000000..9d49c13c4
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/tiff/graphicmagick/readme.txt
@@ -0,0 +1,7 @@
+# Copyright (C) 2013 Christian Henning
+# Distributed under the Boost Software License, Version 1.0.
+# See www.boost.org/LICENSE_1_0.txt
+
+files can be found at ftp://ftp.graphicsmagick.org/pub/tiff-samples/
+
+if not available please ask me at chhenning **at** gmail.com \ No newline at end of file
diff --git a/src/boost/libs/gil/test/extension/io/images/tiff/libtiffpic/readme.txt b/src/boost/libs/gil/test/extension/io/images/tiff/libtiffpic/readme.txt
new file mode 100644
index 000000000..9bc367e69
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/tiff/libtiffpic/readme.txt
@@ -0,0 +1,7 @@
+# Copyright (C) 2013 Christian Henning
+# Distributed under the Boost Software License, Version 1.0.
+# See www.boost.org/LICENSE_1_0.txt
+
+taken from http://www.remotesensing.org/libtiff/images.html
+
+if not available please ask me at chhenning **at** gmail.com \ No newline at end of file
diff --git a/src/boost/libs/gil/test/extension/io/images/tiff/test.tif b/src/boost/libs/gil/test/extension/io/images/tiff/test.tif
new file mode 100644
index 000000000..78ae4d3e2
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/images/tiff/test.tif
Binary files differ
diff --git a/src/boost/libs/gil/test/extension/io/jpeg/Jamfile b/src/boost/libs/gil/test/extension/io/jpeg/Jamfile
new file mode 100644
index 000000000..50590fbde
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/jpeg/Jamfile
@@ -0,0 +1,29 @@
+# Boost.GIL (Generic Image Library) - IO tests
+#
+# Copyright (c) 2012 Christian Henning
+# Copyright (c) 2017 Stefan Seefeld
+# Copyright (c) 2012-2020 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import ac ;
+import testing ;
+
+using libjpeg : : : : true ; # work around bug on master
+
+project
+ : requirements
+ <define>BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+ <define>BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ <library>/boost/filesystem//boost_filesystem
+ [ ac.check-library /libjpeg//libjpeg : <library>/libjpeg//libjpeg : <build>no ]
+ ;
+
+
+run jpeg_test.cpp ;
+run jpeg_read_test.cpp ;
+run jpeg_write_test.cpp ;
+
+run jpeg_old_test.cpp ;
diff --git a/src/boost/libs/gil/test/extension/io/jpeg/jpeg_old_test.cpp b/src/boost/libs/gil/test/extension/io/jpeg/jpeg_old_test.cpp
new file mode 100644
index 000000000..241b51bc6
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/jpeg/jpeg_old_test.cpp
@@ -0,0 +1,101 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/jpeg/old.hpp>
+
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include "mandel_view.hpp"
+#include "paths.hpp"
+
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+
+void test_old_read_dimensions()
+{
+ gil::point_t dim = gil::jpeg_read_dimensions(jpeg_filename);
+ BOOST_TEST_EQ(dim.x, 1000);
+ BOOST_TEST_EQ(dim.y, 600);
+}
+
+void test_old_read_image()
+{
+ gil::rgb8_image_t img;
+ gil::jpeg_read_image(jpeg_filename, img);
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+}
+
+void test_old_read_and_convert_image()
+{
+ gil::rgb8_image_t img;
+ gil::jpeg_read_and_convert_image(jpeg_filename, img);
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+}
+
+void test_old_read_view()
+{
+ gil::rgb8_image_t img(1000, 600);
+ gil::jpeg_read_view(jpeg_filename, gil::view(img));
+}
+
+void test_old_read_and_convert_view()
+{
+ gil::rgb8_image_t img(1000, 600);
+ gil::jpeg_read_and_convert_view(jpeg_filename, gil::view(img));
+}
+
+void test_old_write_view()
+{
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ auto b = gil::rgb8_pixel_t(0, 0, 255);
+ auto g = gil::rgb8_pixel_t(0, 255, 0);
+ gil::jpeg_write_view(jpeg_out + "old_write_test.jpg", create_mandel_view(320, 240, b, g));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_old_dynamic_image()
+{
+ using my_img_types = mp11::mp_list
+ <
+ gil::gray8_image_t,
+ gil::gray16_image_t,
+ gil::rgb8_image_t,
+ gil::rgba8_image_t
+ >;
+
+ gil::any_image<my_img_types> image;
+ gil::jpeg_read_image(jpeg_filename.c_str(), image);
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::jpeg_write_view(jpeg_out + "old_dynamic_image_test.jpg", gil::view(image));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+int main()
+{
+ test_old_read_dimensions();
+ test_old_read_image();
+ test_old_read_and_convert_image();
+ test_old_read_view();
+ test_old_read_and_convert_view();
+ test_old_write_view();
+ test_old_dynamic_image();
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/jpeg/jpeg_read_test.cpp b/src/boost/libs/gil/test/extension/io/jpeg/jpeg_read_test.cpp
new file mode 100644
index 000000000..c63621148
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/jpeg/jpeg_read_test.cpp
@@ -0,0 +1,106 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/jpeg.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "paths.hpp"
+#include "scanline_read_test.hpp"
+
+#include <cmath>
+#include <sstream>
+#include <string>
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+
+void test_read_header()
+{
+ using backend_t = gil::get_reader_backend<std::string const, gil::jpeg_tag>::type;
+ backend_t backend = gil::read_image_info(jpeg_filename, gil::jpeg_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000u);
+ BOOST_TEST_EQ(backend._info._height, 600u);
+
+ BOOST_TEST_EQ(backend._info._num_components, 3);
+ BOOST_TEST_EQ(backend._info._color_space, JCS_YCbCr);
+
+ BOOST_TEST_EQ(backend._info._data_precision, 8);
+}
+
+void test_read_pixel_density()
+{
+ using backend_t = gil::get_reader_backend<std::string const, gil::jpeg_tag>::type;
+ backend_t backend = gil::read_image_info(jpeg_in + "EddDawson/36dpi.jpg", gil::jpeg_tag());
+
+ gil::rgb8_image_t img;
+ gil::read_image(jpeg_in + "EddDawson/36dpi.jpg", img, gil::jpeg_tag());
+
+ gil::image_write_info<gil::jpeg_tag> write_settings;
+ write_settings.set_pixel_dimensions(backend._info._width, backend._info._height, backend._info._pixel_width_mm, backend._info._pixel_height_mm);
+
+ std::stringstream in_memory(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
+ gil::write_view(in_memory, gil::view(img), write_settings);
+
+ using backend2_t = gil::get_reader_backend<std::stringstream, gil::jpeg_tag>::type;
+ backend2_t backend2 = gil::read_image_info(in_memory, gil::jpeg_tag());
+
+ // Because of rounding the two results differ slightly.
+ if (std::abs(backend._info._pixel_width_mm - backend2._info._pixel_width_mm) > 10.0 || std::abs(backend._info._pixel_height_mm - backend2._info._pixel_height_mm) > 10.0)
+ {
+ BOOST_TEST_EQ(0, 1);
+ }
+}
+
+void test_read_reference_images()
+{
+ using image_t = gil::rgb8_image_t;
+ image_t img;
+ read_image(jpeg_filename, img, gil::jpeg_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(jpeg_out + "rgb8_test.jpg", gil::view(img), gil::jpeg_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_dct_method_read()
+{
+ using image_t = gil::rgb8_image_t;
+ image_t img;
+
+ gil::image_read_settings<gil::jpeg_tag> settings;
+ settings._dct_method = gil::jpeg_dct_method::fast;
+
+ gil::read_image(jpeg_filename, img, settings);
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(jpeg_out + "fast_dct_read_test.jpg", gil::view(img), gil::jpeg_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_read_reference_images_image_iterator()
+{
+ test_scanline_reader<gil::rgb8_image_t, gil::jpeg_tag>(jpeg_filename.c_str());
+}
+
+int main()
+{
+ test_read_header();
+ test_read_pixel_density();
+ test_read_reference_images();
+ test_dct_method_read();
+ test_read_reference_images_image_iterator();
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/jpeg/jpeg_test.cpp b/src/boost/libs/gil/test/extension/io/jpeg/jpeg_test.cpp
new file mode 100644
index 000000000..be7628180
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/jpeg/jpeg_test.cpp
@@ -0,0 +1,274 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#define BOOST_FILESYSTEM_VERSION 3
+#define BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/jpeg.hpp>
+
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include <fstream>
+#include <sstream>
+#include <string>
+
+#include "mandel_view.hpp"
+#include "paths.hpp"
+#include "subimage_test.hpp"
+
+namespace fs = boost::filesystem;
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+
+void test_read_image_info()
+{
+ {
+ using backend_t = gil::get_reader_backend<std::string const, gil::jpeg_tag>::type;
+ backend_t backend = gil::read_image_info(jpeg_filename, gil::jpeg_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000u);
+ BOOST_TEST_EQ(backend._info._height, 600u);
+ }
+ {
+ std::ifstream in(jpeg_filename.c_str(), std::ios::binary);
+
+ using backend_t = gil::get_reader_backend<std::ifstream, gil::jpeg_tag>::type;
+ backend_t backend = gil::read_image_info(in, gil::jpeg_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000u);
+ BOOST_TEST_EQ(backend._info._height, 600u);
+ }
+ {
+ FILE *file = fopen(jpeg_filename.c_str(), "rb");
+
+ using backend_t = gil::get_reader_backend<FILE *, gil::jpeg_tag>::type;
+ backend_t backend = gil::read_image_info(file, gil::jpeg_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000u);
+ BOOST_TEST_EQ(backend._info._height, 600u);
+ }
+ {
+ using backend_t = gil::get_reader_backend<fs::path, gil::jpeg_tag>::type;
+ backend_t backend = gil::read_image_info(fs::path(jpeg_filename), gil::jpeg_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000u);
+ BOOST_TEST_EQ(backend._info._height, 600u);
+ }
+}
+
+void test_read_image()
+{
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(jpeg_filename, img, gil::jpeg_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+ {
+ std::ifstream in(jpeg_filename.c_str(), std::ios::binary);
+ gil::rgb8_image_t img;
+ gil::read_image(in, img, gil::jpeg_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+ {
+ FILE *file = fopen(jpeg_filename.c_str(), "rb");
+ gil::rgb8_image_t img;
+ gil::read_image(file, img, gil::jpeg_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+ {
+ gil::rgb8_image_t img;
+ gil::image_read_settings<gil::jpeg_tag> settings(gil::point_t(0, 0), gil::point_t(10, 10), gil::jpeg_dct_method::slow);
+ gil::read_image(jpeg_filename, img, settings);
+
+ BOOST_TEST_EQ(img.width(), 10u);
+ BOOST_TEST_EQ(img.height(), 10u);
+ }
+}
+
+void test_read_and_convert_image()
+{
+ {
+ gil::rgb8_image_t img;
+ gil::read_and_convert_image(jpeg_filename, img, gil::jpeg_tag());
+ }
+ {
+ std::ifstream in(jpeg_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img;
+ gil::read_and_convert_image(in, img, gil::jpeg_tag());
+ }
+}
+
+void test_read_view()
+{
+ {
+ gil::rgb8_image_t img(1000, 600);
+ gil::read_view(jpeg_filename, gil::view(img), gil::jpeg_tag());
+ }
+ {
+ std::ifstream in(jpeg_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img(1000, 600);
+ gil::read_view(in, gil::view(img), gil::jpeg_tag());
+ }
+ {
+ FILE *file = fopen(jpeg_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img(1000, 600);
+ gil::read_view(file, gil::view(img), gil::jpeg_tag());
+ }
+}
+
+void test_read_and_convert_view()
+{
+ {
+ gil::rgb8_image_t img(1000, 600);
+ gil::read_and_convert_view(jpeg_filename, gil::view(img), gil::jpeg_tag());
+ }
+ {
+ std::ifstream in(jpeg_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img(1000, 600);
+ gil::read_and_convert_view(in, gil::view(img), gil::jpeg_tag());
+ }
+ {
+ FILE *file = fopen(jpeg_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img(1000, 600);
+ gil::read_and_convert_view(file, gil::view(img), gil::jpeg_tag());
+ }
+}
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+void test_write_view()
+{
+ auto const b = gil::rgb8_pixel_t(0, 0, 255);
+ auto const g = gil::rgb8_pixel_t(0, 255, 0);
+ {
+ std::string filename(jpeg_out + "write_test_string.jpg");
+
+ gil::write_view(filename, create_mandel_view(320, 240, b, g), gil::jpeg_tag());
+ }
+ {
+ std::string filename(jpeg_out + "write_test_ofstream.jpg");
+ std::ofstream out(filename.c_str(), std::ios::binary);
+
+ gil::write_view(out, create_mandel_view(320, 240, b, g), gil::jpeg_tag());
+ }
+ {
+ std::string filename(jpeg_out + "write_test_file.jpg");
+ FILE *file = fopen(filename.c_str(), "wb");
+
+ gil::write_view(file, create_mandel_view(320, 240, b, g), gil::jpeg_tag());
+ }
+ {
+ std::string filename(jpeg_out + "write_test_info.jpg");
+ FILE *file = fopen(filename.c_str(), "wb");
+
+ gil::image_write_info<gil::jpeg_tag> info;
+ gil::write_view(file, create_mandel_view(320, 240, b, g), info);
+ }
+}
+#endif //BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+
+void test_stream()
+{
+ // 1. Read an image.
+ std::ifstream in(jpeg_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img;
+ gil::read_image(in, img, gil::jpeg_tag());
+
+ // 2. Write image to in-memory buffer.
+ std::stringstream out_buffer(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
+ gil::write_view(out_buffer, gil::view(img), gil::jpeg_tag());
+
+ // 3. Copy in-memory buffer to another.
+ std::stringstream in_buffer(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
+ in_buffer << out_buffer.rdbuf();
+
+ // 4. Read in-memory buffer to gil image
+ gil::rgb8_image_t dst;
+ gil::read_image(in_buffer, dst, gil::jpeg_tag());
+
+ // 5. Write out image.
+ std::string filename(jpeg_out + "stream_test.jpg");
+ std::ofstream out(filename.c_str(), std::ios_base::binary);
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(out, gil::view(dst), gil::jpeg_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_stream_2()
+{
+ std::filebuf in_buf;
+ if (!in_buf.open(jpeg_filename.c_str(), std::ios::in | std::ios::binary))
+ {
+ BOOST_TEST(false);
+ }
+
+ std::istream in(&in_buf);
+
+ gil::rgb8_image_t img;
+ gil::read_image(in, img, gil::jpeg_tag());
+}
+
+void test_subimage()
+{
+ run_subimage_test<gil::rgb8_image_t, gil::jpeg_tag>(jpeg_filename,
+ gil::point_t(0, 0), gil::point_t(50, 50));
+
+ run_subimage_test<gil::rgb8_image_t, gil::jpeg_tag>(jpeg_filename,
+ gil::point_t(43, 24), gil::point_t(50, 50));
+}
+
+void test_dynamic_image()
+{
+ using my_img_types = mp11::mp_list
+ <
+ gil::gray8_image_t,
+ gil::gray16_image_t,
+ gil::rgb8_image_t,
+ gil::rgba8_image_t
+ >;
+
+ gil::any_image<my_img_types> image;
+ gil::read_image(jpeg_filename.c_str(), image, gil::jpeg_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(jpeg_out + "old_dynamic_image_test.jpg", gil::view(image), gil::jpeg_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+int main()
+{
+ test_read_image_info();
+ test_read_image();
+ test_read_and_convert_image();
+ test_read_view();
+ test_read_and_convert_view();
+ test_write_view();
+ test_stream();
+ test_stream_2();
+ test_subimage();
+ test_dynamic_image();
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/jpeg/jpeg_write_test.cpp b/src/boost/libs/gil/test/extension/io/jpeg/jpeg_write_test.cpp
new file mode 100644
index 000000000..32994dc73
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/jpeg/jpeg_write_test.cpp
@@ -0,0 +1,81 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/jpeg.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "color_space_write_test.hpp"
+#include "mandel_view.hpp"
+#include "paths.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+void test_write_gray8()
+{
+ gil::write_view(jpeg_out + "gray8_test.jpg", create_mandel_view(200, 200,
+ gil::gray8_pixel_t(0), gil::gray8_pixel_t(255)), gil::jpeg_tag());
+}
+
+void test_write_rgb8()
+{
+ gil::write_view(jpeg_out + "rgb8_test.jpg", create_mandel_view(200, 200,
+ gil::rgb8_pixel_t(0, 0, 255), gil::rgb8_pixel_t(0, 255, 0)), gil::jpeg_tag());
+}
+
+void test_write_cmyk8()
+{
+ gil::write_view(jpeg_out + "cmyk8_test.jpg", create_mandel_view(200, 200,
+ gil::cmyk8_pixel_t(0, 0, 255, 127), gil::cmyk8_pixel_t(0, 255, 0, 127)), gil::jpeg_tag());
+}
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+
+void test_dct_method_write_test()
+{
+ using image_t = gil::rgb8_image_t;
+ image_t img;
+
+ gil::read_image(jpeg_filename, img, gil::jpeg_tag());
+ gil::image_write_info<gil::jpeg_tag> info;
+ info._dct_method = gil::jpeg_dct_method::fast;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(jpeg_out + "fast_dct_write_test.jpg", gil::view(img), info);
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+
+void test_rgb_color_space_write_test()
+{
+ color_space_write_test<gil::jpeg_tag>(
+ jpeg_out + "rgb_color_space_test.jpg",
+ jpeg_out + "bgr_color_space_test.jpg");
+}
+
+int main()
+{
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ test_write_gray8();
+ test_write_rgb8();
+ test_write_cmyk8();
+#endif
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+ test_dct_method_write_test();
+#endif
+
+ test_rgb_color_space_write_test();
+
+ return boost::report_errors();
+}
+
+
diff --git a/src/boost/libs/gil/test/extension/io/mandel_view.hpp b/src/boost/libs/gil/test/extension/io/mandel_view.hpp
new file mode 100644
index 000000000..e2477f416
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/mandel_view.hpp
@@ -0,0 +1,103 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifndef BOOST_GIL_TEST_EXTENSION_IO_MANDEL_VIEW_HPP
+#define BOOST_GIL_TEST_EXTENSION_IO_MANDEL_VIEW_HPP
+
+#include <boost/gil.hpp>
+
+#include <cmath>
+#include <cstdint>
+
+namespace gil = boost::gil;
+
+// Models a Unary Function
+template <typename P> // Models PixelValueConcept
+struct mandelbrot_fn
+{
+ using point_t = gil::point_t;
+ using const_t = mandelbrot_fn;
+ using value_type = P;
+ using reference = value_type;
+ using const_reference = value_type;
+ using argument_type = point_t;
+ using result_type = reference;
+ static constexpr bool is_mutable = false;
+
+ value_type in_color_;
+ value_type out_color_;
+ point_t img_size_;
+ static const int MAX_ITER = 100; // max number of iterations
+
+ mandelbrot_fn() = default;
+ mandelbrot_fn(gil::point_t const& sz, value_type const& in_color, value_type const& out_color)
+ : in_color_(in_color), out_color_(out_color), img_size_(sz)
+ {
+ }
+
+ std::ptrdiff_t width()
+ {
+ return img_size_.x;
+ }
+ std::ptrdiff_t height()
+ {
+ return img_size_.y;
+ }
+
+ result_type operator()(gil::point_t const& p) const
+ {
+ // normalize the coords to (-2..1, -1.5..1.5)
+ // (actually make y -1.0..2 so it is asymmetric, so we can verify some view factory methods)
+ gil::point<double> const n{
+ static_cast<double>(p.x) / static_cast<double>(img_size_.x) * 3 - 2,
+ static_cast<double>(p.y) / static_cast<double>(img_size_.y) * 3 - 1.0f}; //1.5f}
+ double t = get_num_iter(n);
+ t = std::pow(t, 0.2);
+
+ value_type ret;
+ for (std::size_t k = 0; k < gil::num_channels<P>::value; ++k)
+ ret[k] =
+ (typename gil::channel_type<P>::type)(in_color_[k] * t + out_color_[k] * (1 - t));
+ return ret;
+ }
+
+ private:
+ double get_num_iter(boost::gil::point<double> const& p) const
+ {
+ gil::point<double> z(0, 0);
+ for (int i = 0; i < MAX_ITER; ++i)
+ {
+ z = gil::point<double>(z.x * z.x - z.y * z.y + p.x, 2 * z.x * z.y + p.y);
+ if (z.x * z.x + z.y * z.y > 4)
+ return i / (double)MAX_ITER;
+ }
+ return 0;
+ }
+};
+
+template <typename Pixel>
+struct mandel_view
+{
+ using deref_t = mandelbrot_fn<Pixel>;
+ using locator_t = gil::virtual_2d_locator<deref_t, false>;
+ using my_virt_view_t = gil::image_view<locator_t>;
+ using type = my_virt_view_t;
+};
+
+template <typename Pixel>
+auto create_mandel_view(unsigned int width, unsigned int height, Pixel const& in, Pixel const& out)
+ -> typename mandel_view<Pixel>::type
+{
+ using view_t = typename mandel_view<Pixel>::type;
+ using deref_t = typename mandel_view<Pixel>::deref_t;
+ using locator_t = typename mandel_view<Pixel>::locator_t;
+
+ gil::point_t dims(width, height);
+ return view_t(dims, locator_t(gil::point_t(0, 0), gil::point_t(1, 1), deref_t(dims, in, out)));
+}
+
+#endif // BOOST_GIL_TEST_EXTENSION_IO_MANDEL_VIEW_HPP
diff --git a/src/boost/libs/gil/test/extension/io/paths.hpp b/src/boost/libs/gil/test/extension/io/paths.hpp
new file mode 100644
index 000000000..9726afccc
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/paths.hpp
@@ -0,0 +1,69 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifndef BOOST_GIL_TEST_EXTENSION_IO_PATHS_HPP
+#define BOOST_GIL_TEST_EXTENSION_IO_PATHS_HPP
+
+// Disable warning: conversion to 'std::atomic<int>::__integral_type {aka int}' from 'long int' may alter its value
+#if defined(BOOST_CLANG)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wshorten-64-to-32"
+#endif
+
+#if defined(BOOST_GCC) && (BOOST_GCC >= 40900)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+
+#define BOOST_FILESYSTEM_VERSION 3
+#include <boost/filesystem.hpp>
+
+#if defined(BOOST_CLANG)
+#pragma clang diagnostic pop
+#endif
+
+#if defined(BOOST_GCC) && (BOOST_GCC >= 40900)
+#pragma GCC diagnostic pop
+#endif
+
+#include <string>
+
+// `base` holds the path to ../.., i.e. the directory containing `images`
+static const std::string base =
+ (boost::filesystem::absolute(boost::filesystem::path(__FILE__)).parent_path().string()) + "/";
+
+static const std::string bmp_in = base + "images/bmp/";
+static const std::string bmp_out = base + "output/";
+
+static const std::string jpeg_in = base + "images/jpeg/";
+static const std::string jpeg_out = base + "output/";
+
+static const std::string png_base_in = base + "images/png/";
+static const std::string png_in = png_base_in + "PngSuite/";
+static const std::string png_out = base + "output/";
+
+static const std::string pnm_in = base + "images/pnm/";
+static const std::string pnm_out = base + "output/";
+
+static const std::string raw_in = base + "images/raw/";
+
+static const std::string targa_in = base + "images/targa/";
+static const std::string targa_out = base + "output/";
+
+static const std::string tiff_in = base + "images/tiff/";
+static const std::string tiff_out = base + "output/";
+static const std::string tiff_in_GM = tiff_in + "graphicmagick/";
+
+static const std::string bmp_filename(bmp_in + "test.bmp");
+static const std::string jpeg_filename(jpeg_in + "test.jpg");
+static const std::string png_filename(png_base_in + "test.png");
+static const std::string pnm_filename(pnm_in + "rgb.pnm");
+static const std::string raw_filename(raw_in + "RAW_CANON_D30_SRGB.CRW");
+static const std::string targa_filename(targa_in + "24BPP_compressed.tga");
+static const std::string tiff_filename(tiff_in + "test.tif");
+
+#endif // BOOST_GIL_TEST_EXTENSION_IO_PATHS_HPP
diff --git a/src/boost/libs/gil/test/extension/io/png/Jamfile b/src/boost/libs/gil/test/extension/io/png/Jamfile
new file mode 100644
index 000000000..a7e8fbdb9
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/png/Jamfile
@@ -0,0 +1,32 @@
+# Boost.GIL (Generic Image Library) - IO tests
+#
+# Copyright (c) 2012 Christian Henning
+# Copyright (c) 2017 Stefan Seefeld
+# Copyright (c) 2012-2020 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import ac ;
+import testing ;
+
+using zlib ;
+using libpng : : : : true ;
+
+# TODO: Download PNG test suite images and build with BOOST_GIL_IO_USE_PNG_FILEFORMAT_TEST_SUITE_IMAGES
+
+project
+ : requirements
+ <define>BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+ <define>BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ <library>/boost/filesystem//boost_filesystem
+ [ ac.check-library /zlib//zlib : <library>/zlib//zlib : <build>no ]
+ [ ac.check-library /libpng//libpng : <library>/libpng//libpng : <build>no ]
+ ;
+
+run png_test.cpp ;
+run png_file_format_test.cpp ;
+run png_read_test.cpp ;
+
+run png_old_test.cpp ;
diff --git a/src/boost/libs/gil/test/extension/io/png/png_file_format_test.cpp b/src/boost/libs/gil/test/extension/io/png/png_file_format_test.cpp
new file mode 100644
index 000000000..cda7fffde
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/png/png_file_format_test.cpp
@@ -0,0 +1,71 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#define BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
+#define BOOST_GIL_IO_ENABLE_GRAY_ALPHA
+#define BOOST_FILESYSTEM_VERSION 3
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/png.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "paths.hpp"
+
+namespace gil = boost::gil;
+namespace fs = boost::filesystem;
+
+#ifdef BOOST_GIL_IO_USE_PNG_TEST_SUITE_IMAGES
+
+// Test will loop through the "in" folder to read and convert
+// the png's to rgb8_image_t's. Which then will be written in
+// the "out" folder.
+//
+// The file name structure is as followed:
+//
+// g04i2c08.png
+// || |||+---- bit-depth
+// || ||+----- color-type (descriptive)
+// || |+------ color-type (numerical)
+// || +------- interlaced or non-interlaced
+// |+--------- parameter of test (in this case gamma-value)
+// +---------- test feature (in this case gamma)
+
+void test_file_format()
+{
+ std::string in(png_in + "PngSuite\\");
+ fs::path in_path = fs::system_complete(fs::path(in));
+
+ if (fs::is_directory(in_path))
+ {
+ fs::directory_iterator end_iter;
+ for (fs::directory_iterator dir_itr(in_path); dir_itr != end_iter; ++dir_itr)
+ {
+ if (fs::is_regular(dir_itr->status()) && (fs::extension(dir_itr->path()) == ".PNG"))
+ {
+ gil::rgb8_image_t img;
+ std::string filename = in + dir_itr->path().leaf().string();
+ gil::read_and_convert_image(filename, img, gil::png_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(png_out + fs::basename(dir_itr->path()) + ".png",
+ gil::view(img), gil::png_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ }
+ }
+ }
+}
+
+int main()
+{
+ test_file_format();
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_PNG_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/png/png_old_test.cpp b/src/boost/libs/gil/test/extension/io/png/png_old_test.cpp
new file mode 100644
index 000000000..869f749e0
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/png/png_old_test.cpp
@@ -0,0 +1,101 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/png/old.hpp>
+
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include "mandel_view.hpp"
+#include "paths.hpp"
+
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+
+void test_old_read_dimensions()
+{
+ gil::point_t dim = gil::png_read_dimensions(png_filename);
+ BOOST_TEST_EQ(dim.x, 1000);
+ BOOST_TEST_EQ(dim.y, 600);
+}
+
+void test_old_read_image()
+{
+ gil::rgba8_image_t img;
+ gil::png_read_image(png_filename, img);
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+}
+
+void test_old_read_and_convert_image()
+{
+ gil::rgb8_image_t img;
+ gil::png_read_and_convert_image(png_filename, img);
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+}
+
+void test_old_read_view()
+{
+ gil::rgba8_image_t img(1000, 600);
+ gil::png_read_view(png_filename, view(img));
+}
+
+void test_old_read_and_convert_view()
+{
+ gil::rgb8_image_t img(1000, 600);
+ gil::png_read_and_convert_view(png_filename, view(img));
+}
+
+void test_old_write_view()
+{
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::png_write_view(
+ png_out + "old_write_view_test.png",
+ create_mandel_view(320, 240, gil::rgb8_pixel_t(0, 0, 255), gil::rgb8_pixel_t(0, 255, 0)));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_old_dynamic_image()
+{
+ using my_img_types = mp11::mp_list
+ <
+ gil::gray8_image_t,
+ gil::gray16_image_t,
+ gil::rgb8_image_t,
+ gil::rgba8_image_t
+ >;
+ gil::any_image<my_img_types> image;
+
+ gil::png_read_image(png_filename.c_str(), image);
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::png_write_view(png_out + "old_dynamic_image_test.png", gil::view(image));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+int main()
+{
+ test_old_read_dimensions();
+ test_old_read_image();
+ test_old_read_and_convert_image();
+ test_old_read_view();
+ test_old_read_and_convert_view();
+ test_old_write_view();
+ test_old_dynamic_image();
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/png/png_read_test.cpp b/src/boost/libs/gil/test/extension/io/png/png_read_test.cpp
new file mode 100644
index 000000000..5b51cf548
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/png/png_read_test.cpp
@@ -0,0 +1,764 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#define BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
+#define BOOST_GIL_IO_ENABLE_GRAY_ALPHA
+#define BOOST_FILESYSTEM_VERSION 3
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/png.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+#include <iostream>
+#include <sstream>
+#include <string>
+
+#include "paths.hpp"
+#include "scanline_read_test.hpp"
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+namespace fs = boost::filesystem;
+
+using gray_alpha8_pixel_t = gil::pixel<std::uint8_t, gil::gray_alpha_layout_t>;
+using gray_alpha8c_pixel_t = gil::pixel<std::uint8_t, gil::gray_alpha_layout_t> const;
+using gray_alpha8_image_t= gil::image<gray_alpha8_pixel_t, false>;
+
+using gray_alpha16_pixel_t = gil::pixel<std::uint16_t, gil::gray_alpha_layout_t>;
+using gray_alpha16c_pixel_t = gil::pixel<std::uint16_t, gil::gray_alpha_layout_t> const;
+using gray_alpha16_image_t = gil::image<gray_alpha16_pixel_t, false>;
+
+template <typename Image>
+void test_file(std::string filename)
+{
+ Image src, dst;
+
+ gil::image_read_settings<gil::png_tag> settings;
+ settings._read_file_gamma = true;
+ settings._read_transparency_data = true;
+
+ using backend_t = gil::get_reader_backend<std::string const, gil::png_tag>::type;
+ backend_t backend = gil::read_image_info(png_in + filename, settings);
+
+ gil::read_image(png_in + filename, src, settings);
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::image_write_info<gil::png_tag> write_info;
+ write_info._file_gamma = backend._info._file_gamma;
+
+ gil::write_view(png_out + filename, view(src), write_info);
+ gil::read_image(png_out + filename, dst, settings);
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(src), gil::const_view(dst)));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+template <typename Image>
+void test_png_scanline_reader(std::string filename)
+{
+ test_scanline_reader<Image, gil::png_tag>(std::string(png_in + filename).c_str());
+}
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+void test_read_header()
+{
+ using backend_t = gil::get_reader_backend<std::string const, gil::png_tag>::type;
+ backend_t backend = gil::read_image_info(png_filename, gil::png_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000u);
+ BOOST_TEST_EQ(backend._info._height, 600u);
+
+ BOOST_TEST_EQ(backend._info._num_channels, 4);
+ BOOST_TEST_EQ(backend._info._bit_depth, 8);
+ BOOST_TEST_EQ(backend._info._color_type, PNG_COLOR_TYPE_RGBA);
+
+ BOOST_TEST_EQ(backend._info._interlace_method, PNG_INTERLACE_NONE);
+ BOOST_TEST_EQ(backend._info._compression_method, PNG_COMPRESSION_TYPE_BASE);
+ BOOST_TEST_EQ(backend._info._filter_method, PNG_FILTER_TYPE_BASE);
+
+ BOOST_TEST_EQ(backend._info._file_gamma, 1);
+}
+
+void test_read_pixel_per_meter()
+{
+ gil::image_read_settings<gil::png_tag> settings;
+ settings.set_read_members_true();
+
+ using backend_t = gil::get_reader_backend<std::string const, gil::png_tag>::type;
+ backend_t backend = gil::read_image_info(png_base_in + "EddDawson/36dpi.png", settings);
+
+ BOOST_TEST_EQ(backend._info._pixels_per_meter, png_uint_32(1417));
+}
+
+void test_read_with_trns_chunk_color_type_0()
+{
+ // PNG 1.2: For color type 0 (grayscale), the tRNS chunk contains a single gray level value,
+ // stored in the format:
+ //
+ // Gray: 2 bytes, range 0 .. (2^bitdepth)-1
+ {
+ auto const png_path = png_in + "tbbn0g04.png";
+ gil::image_read_settings<gil::png_tag> settings;
+ settings.set_read_members_true();
+ auto backend = gil::read_image_info(png_path, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(backend._info._bit_depth, 4);
+ BOOST_TEST_EQ(backend._info._num_channels, 1u);
+ BOOST_TEST_EQ(backend._info._color_type, PNG_COLOR_TYPE_GRAY);
+
+ gray_alpha8_image_t img;
+ read_image(png_path, img, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(const_view(img).front(), gray_alpha8c_pixel_t(255, 0));
+ BOOST_TEST_EQ(const_view(img)[78], gray_alpha8c_pixel_t(221, 255));
+ BOOST_TEST_EQ(const_view(img)[79], gray_alpha8c_pixel_t(204, 255));
+ BOOST_TEST_EQ(const_view(img)[975], gray_alpha8c_pixel_t(238, 255));
+ BOOST_TEST_EQ(const_view(img)[976], gray_alpha8c_pixel_t(221, 255));
+ BOOST_TEST_EQ(const_view(img).back(), gray_alpha8c_pixel_t(255, 0));
+ }
+ {
+ auto const png_path = png_in + "tbwn0g16.png";
+ gil::image_read_settings<gil::png_tag> settings;
+ settings.set_read_members_true();
+ auto backend = gil::read_image_info(png_path, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(backend._info._bit_depth, 16);
+ BOOST_TEST_EQ(backend._info._num_channels, 1u);
+ BOOST_TEST_EQ(backend._info._color_type, PNG_COLOR_TYPE_GRAY);
+
+ gray_alpha16_image_t img;
+ read_image(png_path, img, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(const_view(img).front(), gray_alpha16c_pixel_t(65535, 0));
+ BOOST_TEST_EQ(const_view(img)[78], gray_alpha16c_pixel_t(58339, 65535));
+ BOOST_TEST_EQ(const_view(img)[79], gray_alpha16c_pixel_t(51657, 65535));
+ BOOST_TEST_EQ(const_view(img)[975], gray_alpha16c_pixel_t(62965, 65535));
+ BOOST_TEST_EQ(const_view(img)[976], gray_alpha16c_pixel_t(58339, 65535));
+ BOOST_TEST_EQ(const_view(img).back(), gray_alpha16c_pixel_t(65535, 0));
+ }
+}
+
+void test_read_with_trns_chunk_color_type_2()
+{
+ // PNG 1.2: For color type 2 (truecolor), the tRNS chunk contains a single RGB color value,
+ // stored in the format:
+ //
+ // Red: 2 bytes, range 0 .. (2^bitdepth)-1
+ // Green: 2 bytes, range 0 .. (2^bitdepth)-1
+ // Blue: 2 bytes, range 0 .. (2^bitdepth)-1
+ {
+ auto const png_path = png_in + "tbbn2c16.png";
+ gil::image_read_settings<gil::png_tag> settings;
+ settings.set_read_members_true();
+ auto backend = gil::read_image_info(png_path, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(backend._info._bit_depth, 16);
+ BOOST_TEST_EQ(backend._info._num_channels, 3u);
+ BOOST_TEST_EQ(backend._info._color_type, PNG_COLOR_TYPE_RGB);
+
+ gil::rgba16_image_t img;
+ read_image(png_path, img, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(const_view(img).front(), gil::rgba16c_pixel_t(65535, 65535, 65535, 0));
+ BOOST_TEST_EQ(const_view(img)[78], gil::rgba16c_pixel_t(58339, 58339, 58339, 65535));
+ BOOST_TEST_EQ(const_view(img)[79], gil::rgba16c_pixel_t(51657, 51657, 51657, 65535));
+ BOOST_TEST_EQ(const_view(img)[975], gil::rgba16c_pixel_t(62965, 62965, 62965, 65535));
+ BOOST_TEST_EQ(const_view(img)[976], gil::rgba16c_pixel_t(58339, 58339, 58339, 65535));
+ BOOST_TEST_EQ(const_view(img).back(), gil::rgba16c_pixel_t(65535, 65535, 65535, 0));
+ }
+ {
+ auto const png_path = png_in + "tbgn2c16.png";
+ gil::image_read_settings<gil::png_tag> settings;
+ settings.set_read_members_true();
+ auto backend = gil::read_image_info(png_path, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(backend._info._bit_depth, 16);
+ BOOST_TEST_EQ(backend._info._num_channels, 3u);
+ BOOST_TEST_EQ(backend._info._color_type, PNG_COLOR_TYPE_RGB);
+
+ gil::rgba16_image_t img;
+ read_image(png_path, img, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(const_view(img).front(), gil::rgba16c_pixel_t(65535, 65535, 65535, 0));
+ BOOST_TEST_EQ(const_view(img)[78], gil::rgba16c_pixel_t(58339, 58339, 58339, 65535));
+ BOOST_TEST_EQ(const_view(img)[79], gil::rgba16c_pixel_t(51657, 51657, 51657, 65535));
+ BOOST_TEST_EQ(const_view(img)[975], gil::rgba16c_pixel_t(62965, 62965, 62965, 65535));
+ BOOST_TEST_EQ(const_view(img)[976], gil::rgba16c_pixel_t(58339, 58339, 58339, 65535));
+ BOOST_TEST_EQ(const_view(img).back(), gil::rgba16c_pixel_t(65535, 65535, 65535, 0));
+ }
+ {
+ auto const png_path = png_in + "tbrn2c08.png";
+ gil::image_read_settings<gil::png_tag> settings;
+ settings.set_read_members_true();
+ auto backend = gil::read_image_info(png_path, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(backend._info._bit_depth, 8);
+ BOOST_TEST_EQ(backend._info._num_channels, 3u);
+ BOOST_TEST_EQ(backend._info._color_type, PNG_COLOR_TYPE_RGB);
+
+ gil::rgba8_image_t img;
+ read_image(png_path, img, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(const_view(img).front(), gil::rgba8c_pixel_t(255, 255, 255, 0));
+ BOOST_TEST_EQ(const_view(img)[78], gil::rgba8c_pixel_t(227, 227, 227, 255));
+ BOOST_TEST_EQ(const_view(img)[79], gil::rgba8c_pixel_t(201, 201, 201, 255));
+ BOOST_TEST_EQ(const_view(img)[975], gil::rgba8c_pixel_t(245, 245, 245, 255));
+ BOOST_TEST_EQ(const_view(img)[976], gil::rgba8c_pixel_t(227, 227, 227, 255));
+ BOOST_TEST_EQ(const_view(img).back(), gil::rgba8c_pixel_t(255, 255, 255, 0));
+ }
+}
+
+void test_read_with_trns_chunk_color_type_3()
+{
+ // PNG 1.2: For color type 3 (indexed color), the tRNS chunk contains a series of one-byte
+ // alpha values, corresponding to entries in the PLTE chunk:
+ //
+ // Alpha for palette index 0: 1 byte
+ // Alpha for palette index 1: 1 byte
+ // ...etc...
+ {
+ auto const png_path = png_in + "tbbn3p08.png";
+ gil::image_read_settings<gil::png_tag> settings;
+ settings.set_read_members_true();
+ auto backend = gil::read_image_info(png_path, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(backend._info._bit_depth, 8);
+ BOOST_TEST_EQ(backend._info._num_channels, 1u);
+ BOOST_TEST_EQ(backend._info._color_type, PNG_COLOR_TYPE_PALETTE);
+
+ gil::rgba8_image_t img;
+ read_image(png_path, img, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(const_view(img).front(), gil::rgba8c_pixel_t(255, 255, 255, 0));
+ BOOST_TEST_EQ(const_view(img)[78], gil::rgba8c_pixel_t(227, 227, 227, 255));
+ BOOST_TEST_EQ(const_view(img)[79], gil::rgba8c_pixel_t(201, 201, 201, 255));
+ BOOST_TEST_EQ(const_view(img)[975], gil::rgba8c_pixel_t(246, 246, 246, 255));
+ BOOST_TEST_EQ(const_view(img)[976], gil::rgba8c_pixel_t(227, 227, 227, 255));
+ BOOST_TEST_EQ(const_view(img).back(), gil::rgba8c_pixel_t(255, 255, 255, 0));
+ }
+ {
+ auto const png_path = png_in + "tbgn3p08.png";
+ gil::image_read_settings<gil::png_tag> settings;
+ settings.set_read_members_true();
+ auto backend = gil::read_image_info(png_path, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(backend._info._bit_depth, 8);
+ BOOST_TEST_EQ(backend._info._num_channels, 1u);
+ BOOST_TEST_EQ(backend._info._color_type, PNG_COLOR_TYPE_PALETTE);
+
+ gil::rgba8_image_t img;
+ read_image(png_path, img, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(const_view(img).front(), gil::rgba8c_pixel_t(255, 255, 255, 0));
+ BOOST_TEST_EQ(const_view(img)[78], gil::rgba8c_pixel_t(227, 227, 227, 255));
+ BOOST_TEST_EQ(const_view(img)[79], gil::rgba8c_pixel_t(201, 201, 201, 255));
+ BOOST_TEST_EQ(const_view(img)[975], gil::rgba8c_pixel_t(246, 246, 246, 255));
+ BOOST_TEST_EQ(const_view(img)[976], gil::rgba8c_pixel_t(227, 227, 227, 255));
+ BOOST_TEST_EQ(const_view(img).back(), gil::rgba8c_pixel_t(255, 255, 255, 0));
+ }
+ {
+ auto const png_path = png_in + "tp1n3p08.png";
+ gil::image_read_settings<gil::png_tag> settings;
+ settings.set_read_members_true();
+ auto backend = gil::read_image_info(png_path, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(backend._info._bit_depth, 8);
+ BOOST_TEST_EQ(backend._info._num_channels, 1u);
+ BOOST_TEST_EQ(backend._info._color_type, PNG_COLOR_TYPE_PALETTE);
+
+ gil::rgba8_image_t img;
+ read_image(png_path, img, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(const_view(img).front(), gil::rgba8c_pixel_t(255, 255, 255, 0));
+ BOOST_TEST_EQ(const_view(img)[78], gil::rgba8c_pixel_t(227, 227, 227, 255));
+ BOOST_TEST_EQ(const_view(img)[79], gil::rgba8c_pixel_t(201, 201, 201, 255));
+ BOOST_TEST_EQ(const_view(img)[975], gil::rgba8c_pixel_t(246, 246, 246, 255));
+ BOOST_TEST_EQ(const_view(img)[976], gil::rgba8c_pixel_t(227, 227, 227, 255));
+ BOOST_TEST_EQ(const_view(img).back(), gil::rgba8c_pixel_t(255, 255, 255, 0));
+ }
+ {
+ auto const png_path = png_in + "tm3n3p02.png";
+ gil::image_read_settings<gil::png_tag> settings;
+ settings.set_read_members_true();
+ auto backend = gil::read_image_info(png_path, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(backend._info._bit_depth, 2);
+ BOOST_TEST_EQ(backend._info._num_channels, 1u);
+ BOOST_TEST_EQ(backend._info._color_type, PNG_COLOR_TYPE_PALETTE);
+
+ gil::rgba8_image_t img;
+ read_image(png_path, img, settings);
+ BOOST_TEST_EQ(backend._info._width, 32u);
+ BOOST_TEST_EQ(backend._info._height, 32u);
+ BOOST_TEST_EQ(const_view(img).front(), gil::rgba8c_pixel_t(0, 0, 255, 0));
+ BOOST_TEST_EQ(const_view(img)[16], gil::rgba8c_pixel_t(0, 0, 255, 85));
+ BOOST_TEST_EQ(const_view(img)[511], gil::rgba8c_pixel_t(0, 0, 255, 85));
+ BOOST_TEST_EQ(const_view(img)[1007], gil::rgba8c_pixel_t(0, 0, 255, 170));
+ BOOST_TEST_EQ(const_view(img).back(), gil::rgba8c_pixel_t(0, 0, 255, 255));
+ }
+}
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+
+#ifdef BOOST_GIL_IO_USE_PNG_TEST_SUITE_IMAGES
+void test_basic_format()
+{
+ // Basic format test files (non-interlaced)
+
+ // BASN0g01 - black & white
+ test_file<gil::gray1_image_t>("BASN0G01.PNG");
+ test_png_scanline_reader<gil::gray1_image_t>("BASN0G01.PNG");
+
+ // BASN0g02 - 2 bit (4 level) grayscale
+ test_file<gil::gray2_image_t>("BASN0G02.PNG");
+ test_png_scanline_reader<gil::gray2_image_t>("BASN0G02.PNG");
+
+ // BASN0g04 - 4 bit (16 level) grayscale
+ test_file<gil::gray4_image_t>("BASN0G04.PNG");
+ test_png_scanline_reader<gil::gray4_image_t>("BASN0G04.PNG");
+
+ // BASN0g08 - 8 bit (256 level) grayscale
+ test_file<gil::gray8_image_t>("BASN0G08.PNG");
+ test_png_scanline_reader<gil::gray8_image_t>("BASN0G08.PNG");
+
+ // BASN0g16 - 16 bit (64k level) grayscale
+ test_file<gil::gray16_image_t>("BASN0G16.PNG");
+ test_png_scanline_reader<gil::gray16_image_t>("BASN0G16.PNG");
+
+ // BASN2c08 - 3x8 bits gil::rgb color
+ test_file<gil::rgb8_image_t>("BASN2C08.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("BASN2C08.PNG");
+
+ // BASN2c16 - 3x16 bits gil::rgb color
+ test_file<gil::rgb16_image_t>("BASN2C16.PNG");
+ test_png_scanline_reader<gil::rgb16_image_t>("BASN2C16.PNG");
+
+ // BASN3p01 - 1 bit (2 color) paletted
+ test_file<gil::rgb8_image_t>("BASN3P01.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("BASN3P01.PNG");
+
+ // BASN3p02 - 2 bit (4 color) paletted
+ test_file<gil::rgb8_image_t>("BASN3P02.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("BASN3P02.PNG");
+
+ // BASN3p04 - 4 bit (16 color) paletted
+ test_file<gil::rgb8_image_t>("BASN3P04.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("BASN3P04.PNG");
+
+ // BASN3p08 - 8 bit (256 color) paletted
+ test_file<gil::rgb8_image_t>("BASN3P08.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("BASN3P08.PNG");
+
+ // BASN4a08 - 8 bit grayscale + 8 bit alpha-channel
+ test_file<gil::gray_alpha8_image_t>("BASN4A08.PNG");
+ test_png_scanline_reader<gil::gray_alpha8_image_t>("BASN4A08.PNG");
+
+ // BASN4a16 - 16 bit grayscale + 16 bit alpha-channel
+ test_file<gil::gray_alpha16_image_t>("BASN4A16.PNG");
+ test_png_scanline_reader<gil::gray_alpha16_image_t>("BASN4A16.PNG");
+
+ // BASN6a08 - 3x8 bits gil::rgb color + 8 bit alpha-channel
+ test_file<gil::rgba8_image_t>("BASN6A08.PNG");
+ test_png_scanline_reader<gil::rgba8_image_t>("BASN6A08.PNG");
+
+ // BASN6a16 - 3x16 bits gil::rgb color + 16 bit alpha-channel
+ test_file<gil::rgba16_image_t>("BASN6A16.PNG");
+ test_png_scanline_reader<gil::rgba16_image_t>("BASN6A16.PNG");
+}
+
+void test_basic_format_interlaced()
+{
+ // Basic format test files (Adam-7 interlaced)
+
+ // BASI0g01 - black & white
+ test_file<gil::gray1_image_t>("BASI0G01.PNG");
+
+ // BASI0g02 - 2 bit (4 level) grayscale
+ test_file<gil::gray2_image_t>("BASI0G02.PNG");
+
+ // BASI0g04 - 4 bit (16 level) grayscale
+ test_file<gil::gray4_image_t>("BASI0G04.PNG");
+
+ // BASI0g08 - 8 bit (256 level) grayscale
+ test_file<gil::gray8_image_t>("BASI0G08.PNG");
+
+ // BASI0g16 - 16 bit (64k level) grayscale
+ test_file<gil::gray16_image_t>("BASI0G16.PNG");
+
+ // BASI2c08 - 3x8 bits gil::rgb color
+ test_file<gil::rgb8_image_t>("BASI2C08.PNG");
+
+ // BASI2c16 - 3x16 bits gil::rgb color
+ test_file<gil::rgb16_image_t>("BASI2C16.PNG");
+
+ // BASI3p01 - 1 bit (2 color) paletted
+ test_file<gil::rgb8_image_t>("BASI3P01.PNG");
+
+ // BASI3p02 - 2 bit (4 color) paletted
+ test_file<gil::rgb8_image_t>("BASI3P02.PNG");
+
+ // BASI3p04 - 4 bit (16 color) paletted
+ test_file<gil::rgb8_image_t>("BASI3P04.PNG");
+
+ // BASI3p08 - 8 bit (256 color) paletted
+ test_file<gil::rgb8_image_t>("BASI3P08.PNG");
+
+ // BASI4a08 - 8 bit grayscale + 8 bit alpha-channel
+ test_file<gil::gray_alpha8_image_t>("BASI4A08.PNG");
+
+ // BASI4a16 - 16 bit grayscale + 16 bit alpha-channel
+ test_file<gil::gray_alpha16_image_t>("BASI4A16.PNG");
+
+ // BASI6a08 - 3x8 bits gil::rgb color + 8 bit alpha-channel
+ test_file<gil::rgba8_image_t>("BASI6A08.PNG");
+
+ // BASI6a16 - 3x16 bits gil::rgb color + 16 bit alpha-channel
+ test_file<gil::rgba16_image_t>("BASI6A16.PNG");
+}
+
+void test_odd_sizes()
+{
+ // S01I3P01 - 1x1 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S01I3P01.PNG");
+
+ // S01N3P01 - 1x1 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S01N3P01.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S01N3P01.PNG");
+
+ // S02I3P01 - 2x2 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S02I3P01.PNG");
+
+ // S02N3P01 - 2x2 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S02N3P01.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S02N3P01.PNG");
+
+ // S03I3P01 - 3x3 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S03I3P01.PNG");
+
+ // S03N3P01 - 3x3 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S03N3P01.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S03N3P01.PNG");
+
+ // S04I3P01 - 4x4 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S04I3P01.PNG");
+
+ // S04N3P01 - 4x4 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S04N3P01.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S04N3P01.PNG");
+
+ // S05I3P02 - 5x5 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S05I3P02.PNG");
+
+ // S05N3P02 - 5x5 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S05N3P02.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S05N3P02.PNG");
+
+ // S06I3P02 - 6x6 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S06I3P02.PNG");
+
+ // S06N3P02 - 6x6 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S06N3P02.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S06N3P02.PNG");
+
+ // S07I3P02 - 7x7 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S07I3P02.PNG");
+
+ // S07N3P02 - 7x7 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S07N3P02.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S07N3P02.PNG");
+
+ // S08I3P02 - 8x8 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S08I3P02.PNG");
+
+ // S08N3P02 - 8x8 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S08N3P02.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S08N3P02.PNG");
+
+ // S09I3P02 - 9x9 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S09I3P02.PNG");
+
+ // S09N3P02 - 9x9 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S09N3P02.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S09N3P02.PNG");
+
+ // S32I3P04 - 32x32 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S32I3P04.PNG");
+
+ // S32N3P04 - 32x32 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S32N3P04.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S32N3P04.PNG");
+
+ // S33I3P04 - 33x33 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S33I3P04.PNG");
+
+ // S33N3P04 - 33x33 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S33N3P04.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S33N3P04.PNG");
+
+ // S34I3P04 - 34x34 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S34I3P04.PNG");
+
+ // S34N3P04 - 34x34 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S34N3P04.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S34N3P04.PNG");
+
+ // S35I3P04 - 35x35 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S35I3P04.PNG");
+
+ // S35N3P04 - 35x35 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S35N3P04.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S35N3P04.PNG");
+
+ // S36I3P04 - 36x36 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S36I3P04.PNG");
+
+ // S36N3P04 - 36x36 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S36N3P04.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S36N3P04.PNG");
+
+ // S37I3P04 - 37x37 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S37I3P04.PNG");
+
+ // S37N3P04 - 37x37 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S37N3P04.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S37N3P04.PNG");
+
+ // S38I3P04 - 38x38 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S38I3P04.PNG");
+
+ // S38N3P04 - 38x38 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S38N3P04.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S38N3P04.PNG");
+
+ // S39I3P04 - 39x39 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S39I3P04.PNG");
+
+ // S39N3P04 - 39x39 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S39N3P04.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S39N3P04.PNG");
+
+ // S40I3P04 - 40x40 paletted file, interlaced
+ test_file<gil::rgb8_image_t>("S40I3P04.PNG");
+
+ // S40N3P04 - 40x40 paletted file, no interlacing
+ test_file<gil::rgb8_image_t>("S40N3P04.PNG");
+ test_png_scanline_reader<gil::rgb8_image_t>("S40N3P04.PNG");
+}
+
+void test_background()
+{
+ // BGAI4A08 - 8 bit grayscale, alpha, no background chunk, interlaced
+ test_file<gil::gray_alpha8_image_t>("BGAI4A08.PNG");
+
+ // BGAI4A16 - 16 bit grayscale, alpha, no background chunk, interlaced
+ test_file<gil::gray_alpha16_image_t>("BGAI4A16.PNG");
+
+ // BGAN6A08 - 3x8 bits gil::rgb color, alpha, no background chunk
+ test_file<gil::rgba8_image_t>("BGAN6A08.PNG");
+
+ // BGAN6A16 - 3x16 bits gil::rgb color, alpha, no background chunk
+ test_file<gil::rgba16_image_t>("BGAN6A16.PNG");
+
+ // BGBN4A08 - 8 bit grayscale, alpha, black background chunk
+ test_file<gil::gray_alpha8_image_t>("BGBN4A08.PNG");
+
+ // BGGN4A16 - 16 bit grayscale, alpha, gray background chunk
+ test_file<gil::gray_alpha16_image_t>("BGGN4A16.PNG");
+
+ // BGWN6A08 - 3x8 bits gil::rgb color, alpha, white background chunk
+ test_file<gil::rgba8_image_t>("BGWN6A08.PNG");
+
+ // BGYN6A16 - 3x16 bits gil::rgb color, alpha, yellow background chunk
+ test_file<gil::rgba16_image_t>("BGYN6A16.PNG");
+}
+
+void test_transparency()
+{
+ // TBBN1G04 - transparent, black background chunk
+ // file missing
+ //test_file<gil::gray_alpha8_image_t>("TBBN1G04.PNG" );
+
+ // TBBN2C16 - transparent, blue background chunk
+ test_file<gil::rgba16_image_t>("TBBN2C16.PNG");
+
+ // TBBN3P08 - transparent, black background chunk
+ test_file<gil::rgba8_image_t>("TBBN3P08.PNG");
+
+ // TBGN2C16 - transparent, green background chunk
+ test_file<gil::rgba16_image_t>("TBGN2C16.PNG");
+
+ // TBGN3P08 - transparent, light-gray background chunk
+ test_file<gil::rgba8_image_t>("TBGN3P08.PNG");
+
+ // TBRN2C08 - transparent, red background chunk
+ test_file<gil::rgba8_image_t>("TBRN2C08.PNG");
+
+ // TBWN1G16 - transparent, white background chunk
+ test_file<gil::gray_alpha16_image_t>("TBWN0G16.PNG");
+
+ // TBWN3P08 - transparent, white background chunk
+ test_file<gil::rgba8_image_t>("TBWN3P08.PNG");
+
+ // TBYN3P08 - transparent, yellow background chunk
+ test_file<gil::rgba8_image_t>("TBYN3P08.PNG");
+
+ // TP0N1G08 - not transparent for reference (logo on gray)
+ test_file<gil::gray8_image_t>("TP0N0G08.PNG");
+
+ // TP0N2C08 - not transparent for reference (logo on gray)
+ test_file<gil::rgb8_image_t>("TP0N2C08.PNG");
+
+ // TP0N3P08 - not transparent for reference (logo on gray)
+ test_file<gil::rgb8_image_t>("TP0N3P08.PNG");
+
+ // TP1N3P08 - transparent, but no background chunk
+ test_file<gil::rgba8_image_t>("TP1N3P08.PNG");
+}
+
+void test_gamma()
+{
+ // G03N0G16 - grayscale, file-gamma = 0.35
+ test_file<gil::gray16_image_t>("G03N0G16.PNG");
+
+ // G03N2C08 - color, file-gamma = 0.35
+ test_file<gil::rgb8_image_t>("G03N2C08.PNG");
+
+ // G03N3P04 - paletted, file-gamma = 0.35
+ test_file<gil::rgb8_image_t>("G03N3P04.PNG");
+
+ // G04N0G16 - grayscale, file-gamma = 0.45
+ test_file<gil::gray16_image_t>("G04N0G16.PNG");
+
+ // G04N2C08 - color, file-gamma = 0.45
+ test_file<gil::rgb8_image_t>("G04N2C08.PNG");
+
+ // G04N3P04 - paletted, file-gamma = 0.45
+ test_file<gil::rgb8_image_t>("G04N3P04.PNG");
+
+ // G05N0G16 - grayscale, file-gamma = 0.55
+ test_file<gil::gray16_image_t>("G05N0G16.PNG");
+
+ // G05N2C08 - color, file-gamma = 0.55
+ test_file<gil::rgb8_image_t>("G05N2C08.PNG");
+
+ // G05N3P04 - paletted, file-gamma = 0.55
+ test_file<gil::rgb8_image_t>("G05N3P04.PNG");
+
+ // G07N0G16 - grayscale, file-gamma = 0.70
+ test_file<gil::gray16_image_t>("G07N0G16.PNG");
+
+ // G07N2C08 - color, file-gamma = 0.70
+ test_file<gil::rgb8_image_t>("G07N2C08.PNG");
+
+ // G07N3P04 - paletted, file-gamma = 0.70
+ test_file<gil::rgb8_image_t>("G07N3P04.PNG");
+
+ // G10N0G16 - grayscale, file-gamma = 1.00
+ test_file<gil::gray16_image_t>("G10N0G16.PNG");
+
+ // G10N2C08 - color, file-gamma = 1.00
+ test_file<gil::rgb8_image_t>("G10N2C08.PNG");
+
+ // G10N3P04 - paletted, file-gamma = 1.00
+ test_file<gil::rgb8_image_t>("G10N3P04.PNG");
+
+ // G25N0G16 - grayscale, file-gamma = 2.50
+ test_file<gil::gray16_image_t>("G25N0G16.PNG");
+
+ // G25N2C08 - color, file-gamma = 2.50
+ test_file<gil::rgb8_image_t>("G25N2C08.PNG");
+
+ // G25N3P04 - paletted, file-gamma = 2.50
+ test_file<gil::rgb8_image_t>("G25N3P04.PNG");
+}
+#endif // BOOST_GIL_IO_USE_PNG_TEST_SUITE_IMAGES
+
+void test_corrupted_png_read()
+{
+// taken from https://github.com/boostorg/gil/issues/401#issue-518615480
+// author: https://github.com/misos1
+
+ std::initializer_list<unsigned char> corrupt_png = {
+ 0x89, 'P', 'N', 'G', 0x0D, 0x0A, 0x1A, 0x0A,
+ 0x00, 0x00, 0x00, 0x0D,
+ 'I', 'H', 'D', 'R',
+ 0x00, 0x00, 0x04, 0x00,
+ 0x00, 0x00, 0x05, 0xA9,
+ 0x08, 0x02, 0x00, 0x00, 0x00,
+ 0x68, 0x1B, 0xF7, 0x46,
+ 0x00, 0x00, 0x00, 0x00,
+ 'I', 'D', 'A', 'T',
+ 0x35, 0xAF, 0x06, 0x1E,
+ 0x00, 0x00, 0x00, 0x00,
+ 'I', 'E', 'N', 'D',
+ 0xAE, 0x42, 0x60, 0x82
+ };
+
+ std::stringstream ss(
+ std::string(corrupt_png.begin(), corrupt_png.end()),
+ std::ios_base::in | std::ios_base::binary);
+ boost::gil::rgb8_image_t img;
+
+ // TODO: Replace with BOOST_ERROR below with BOOST_TEST_THROWS
+ try
+ {
+ boost::gil::read_image(ss, img, boost::gil::png_tag{});
+ }
+ catch (std::ios_base::failure& exception)
+ {
+ // the exception message is "png is invalid: iostream error"
+ // is the error portable throughout stdlib implementations,
+ // or is it native to this one?
+ // the description passd is "png_is_invalid"
+ // the exact error message is thus not checked
+ return;
+ }
+
+ BOOST_ERROR("no exception was thrown, which is an error");
+}
+
+int main()
+{
+ test_read_header();
+ test_corrupted_png_read();
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+ test_read_pixel_per_meter();
+ test_read_with_trns_chunk_color_type_0();
+ test_read_with_trns_chunk_color_type_2();
+ test_read_with_trns_chunk_color_type_3();
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+
+#ifdef BOOST_GIL_IO_USE_PNG_TEST_SUITE_IMAGES
+ test_basic_format();
+ test_basic_format_interlaced();
+ test_odd_sizes();
+ test_background();
+ test_transparency();
+ test_gamma();
+#endif
+
+ return boost::report_errors();
+}
+
diff --git a/src/boost/libs/gil/test/extension/io/png/png_test.cpp b/src/boost/libs/gil/test/extension/io/png/png_test.cpp
new file mode 100644
index 000000000..937c4bbe0
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/png/png_test.cpp
@@ -0,0 +1,302 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+//#define BOOST_GIL_IO_PNG_FLOATING_POINT_SUPPORTED
+//#define BOOST_GIL_IO_PNG_FIXED_POINT_SUPPORTED
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/png.hpp>
+
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include <fstream>
+#include <sstream>
+#include <string>
+
+#include "mandel_view.hpp"
+#include "paths.hpp"
+#include "subimage_test.hpp"
+
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+void test_read_image_info_using_string()
+{
+ {
+ using backend_t = gil::get_reader_backend<std::string const, gil::png_tag>::type;
+ backend_t backend = gil::read_image_info(png_filename, gil::png_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000u);
+ BOOST_TEST_EQ(backend._info._height, 600u);
+ }
+ {
+ std::ifstream in(png_filename.c_str(), std::ios::binary);
+
+ using backend_t = gil::get_reader_backend<std::ifstream, gil::png_tag>::type;
+ backend_t backend = gil::read_image_info(in, gil::png_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000u);
+ BOOST_TEST_EQ(backend._info._height, 600u);
+ }
+ {
+ FILE* file = fopen(png_filename.c_str(), "rb");
+
+ using backend_t = gil::get_reader_backend<FILE*, gil::png_tag>::type;
+ backend_t backend = gil::read_image_info(file, gil::png_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000u);
+ BOOST_TEST_EQ(backend._info._height, 600u);
+ }
+}
+
+void test_read_image()
+{
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(png_filename, img, gil::png_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+ {
+ std::ifstream in(png_filename.c_str(), std::ios::binary);
+
+ gil::rgba8_image_t img;
+ gil::read_image(in, img, gil::png_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+ {
+ FILE* file = fopen(png_filename.c_str(), "rb");
+
+ gil::rgba8_image_t img;
+ gil::read_image(file, img, gil::png_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+}
+
+void test_read_and_convert_image()
+{
+ {
+ gil::rgb8_image_t img;
+ gil::read_and_convert_image(png_filename, img, gil::png_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+ {
+ gil::rgba8_image_t img;
+ gil::read_and_convert_image(png_filename, img, gil::png_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+ {
+ std::ifstream in(png_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img;
+ gil::read_and_convert_image(in, img, gil::png_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+ {
+ FILE* file = fopen(png_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img;
+ gil::read_and_convert_image(file, img, gil::png_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+}
+
+void test_read_view()
+{
+ {
+ gil::rgba8_image_t img(1000, 600);
+ gil::read_view(png_filename, view(img), gil::png_tag());
+ }
+ {
+ std::ifstream in(png_filename.c_str(), std::ios::binary);
+
+ gil::rgba8_image_t img(1000, 600);
+ gil::read_view(in, view(img), gil::png_tag());
+ }
+ {
+ FILE* file = fopen(png_filename.c_str(), "rb");
+
+ gil::rgba8_image_t img(1000, 600);
+ gil::read_view(file, view(img), gil::png_tag());
+ }
+}
+
+void test_read_and_convert_view()
+{
+ {
+ gil::rgb8_image_t img(1000, 600);
+ gil::read_and_convert_view(png_filename, view(img), gil::png_tag());
+ }
+ {
+ std::ifstream in(png_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img(1000, 600);
+ gil::read_and_convert_view(in, view(img), gil::png_tag());
+ }
+ {
+ FILE* file = fopen(png_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img(1000, 600);
+ gil::read_and_convert_view(file, view(img), gil::png_tag());
+ }
+}
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+void test_write_view()
+{
+ {
+ std::string filename(png_out + "write_test_string.png");
+
+ gil::write_view(
+ filename,
+ create_mandel_view(320, 240, gil::rgb8_pixel_t(0, 0, 255), gil::rgb8_pixel_t(0, 255, 0)),
+ gil::png_tag());
+ }
+ {
+ std::string filename(png_out + "write_test_string_bgr.png");
+
+ gil::write_view(
+ filename,
+ create_mandel_view(320, 240, gil::bgr8_pixel_t(255, 0, 0), gil::bgr8_pixel_t(0, 255, 0)),
+ gil::png_tag());
+ }
+ {
+ std::string filename(png_out + "write_test_ofstream.png");
+ std::ofstream out(filename.c_str(), std::ios::out | std::ios::binary);
+
+ gil::write_view(
+ out,
+ create_mandel_view(320, 240, gil::rgb8_pixel_t(0, 0, 255), gil::rgb8_pixel_t(0, 255, 0)),
+ gil::png_tag());
+ }
+ {
+ std::string filename(png_out + "write_test_file.png");
+ FILE* file = fopen(filename.c_str(), "wb");
+
+ gil::write_view(
+ file,
+ create_mandel_view(320, 240, gil::rgb8_pixel_t(0, 0, 255), gil::rgb8_pixel_t(0, 255, 0)),
+ gil::png_tag());
+ }
+
+ {
+ std::string filename(png_out + "write_test_info.png");
+ FILE* file = fopen(filename.c_str(), "wb");
+
+ gil::image_write_info<gil::png_tag> info;
+ gil::write_view(
+ file,
+ create_mandel_view(320, 240, gil::rgb8_pixel_t(0, 0, 255), gil::rgb8_pixel_t(0, 255, 0)),
+ info);
+ }
+}
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+void test_stream()
+{
+ // 1. Read an image.
+ std::ifstream in(png_filename.c_str(), std::ios::binary);
+
+ gil::rgba8_image_t img;
+ gil::read_image(in, img, gil::png_tag());
+
+ // 2. Write image to in-memory buffer.
+ std::stringstream out_buffer(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
+ gil::write_view(out_buffer, view(img), gil::png_tag());
+
+ // 3. Copy in-memory buffer to another.
+ std::stringstream in_buffer(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
+ in_buffer << out_buffer.rdbuf();
+
+ // 4. Read in-memory buffer to gil image
+ gil::rgba8_image_t dst;
+ gil::read_image(in_buffer, dst, gil::png_tag());
+
+ // 5. Write out image.
+ std::string filename(png_out + "stream_test.png");
+ std::ofstream out(filename.c_str(), std::ios_base::binary);
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(out, view(dst), gil::png_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_stream_2()
+{
+ std::filebuf in_buf;
+ if (!in_buf.open(png_filename.c_str(), std::ios::in | std::ios::binary))
+ {
+ BOOST_TEST(false);
+ }
+ std::istream in(&in_buf);
+
+ gil::rgba8_image_t img;
+ gil::read_image(in, img, gil::png_tag());
+}
+
+void test_subimage()
+{
+ run_subimage_test<gil::rgba8_image_t, gil::png_tag>(
+ png_filename, gil::point_t(0, 0), gil::point_t(50, 50));
+
+ run_subimage_test<gil::rgba8_image_t, gil::png_tag>(
+ png_filename, gil::point_t(135, 95), gil::point_t(50, 50));
+}
+
+void test_dynamic_image()
+{
+ using my_img_types = mp11::mp_list
+ <
+ gil::gray8_image_t,
+ gil::gray16_image_t,
+ gil::rgb8_image_t,
+ gil::rgba8_image_t
+ >;
+ gil::any_image<my_img_types> image;
+
+ gil::read_image(png_filename.c_str(), image, gil::png_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(png_out + "dynamic_image_test.png", gil::view(image), gil::png_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+int main()
+{
+ test_read_image_info_using_string();
+ test_read_image();
+ test_read_and_convert_image();
+ test_read_view();
+ test_read_and_convert_view();
+ test_write_view();
+ test_stream();
+ test_stream_2();
+ test_subimage();
+ test_dynamic_image();
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/png/png_write_test.cpp b/src/boost/libs/gil/test/extension/io/png/png_write_test.cpp
new file mode 100644
index 000000000..85f1541af
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/png/png_write_test.cpp
@@ -0,0 +1,33 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#define BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
+#define BOOST_GIL_IO_ENABLE_GRAY_ALPHA
+#define BOOST_FILESYSTEM_VERSION 3
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/png.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "color_space_write_test.hpp"
+#include "paths.hpp"
+#include "scanline_read_test.hpp"
+
+namespace gil = boost::gil;
+
+void test_rgb_color_space_write()
+{
+ color_space_write_test<gil::png_tag>(
+ png_out + "rgb_color_space_test.png", png_out + "bgr_color_space_test.png");
+}
+
+int main()
+{
+ test_rgb_color_space_write();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/io/pnm/Jamfile b/src/boost/libs/gil/test/extension/io/pnm/Jamfile
new file mode 100644
index 000000000..ab8d62441
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/pnm/Jamfile
@@ -0,0 +1,26 @@
+# Boost.GIL (Generic Image Library) - IO tests
+#
+# Copyright (c) 2012 Christian Henning
+# Copyright (c) 2017 Stefan Seefeld
+# Copyright (c) 2012-2020 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+# TODO: Download PNM test suite images and build with BOOST_GIL_IO_USE_PNM_TEST_SUITE_IMAGES
+
+project
+ : requirements
+ <define>BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+ <define>BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ <library>/boost/filesystem//boost_filesystem
+ ;
+
+run pnm_test.cpp ;
+run pnm_read_test.cpp ;
+run pnm_write_test.cpp ;
+
+run pnm_old_test.cpp ;
diff --git a/src/boost/libs/gil/test/extension/io/pnm/pnm_old_test.cpp b/src/boost/libs/gil/test/extension/io/pnm/pnm_old_test.cpp
new file mode 100644
index 000000000..21e07fe3e
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/pnm/pnm_old_test.cpp
@@ -0,0 +1,96 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/pnm/old.hpp>
+
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include "paths.hpp"
+
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+void test_old_read_dimensions()
+{
+ boost::gil::point_t dim = gil::pnm_read_dimensions(pnm_filename);
+ BOOST_TEST_EQ(dim.x, 256);
+ BOOST_TEST_EQ(dim.y, 256);
+}
+
+void test_old_read_image()
+{
+ gil::rgb8_image_t img;
+ gil::pnm_read_image(pnm_filename, img);
+
+ BOOST_TEST_EQ(img.width(), 256);
+ BOOST_TEST_EQ(img.height(), 256);
+}
+
+void test_old_read_and_convert_image()
+{
+ gil::rgb8_image_t img;
+ gil::pnm_read_and_convert_image(pnm_filename, img);
+
+ BOOST_TEST_EQ(img.width(), 256);
+ BOOST_TEST_EQ(img.height(), 256);
+}
+
+void test_old_read_view()
+{
+ gil::rgb8_image_t img(256, 256);
+ gil::pnm_read_view(pnm_filename, gil::view(img));
+}
+
+void test_old_read_and_convert_view()
+{
+ gil::rgb8_image_t img(256, 256);
+ gil::pnm_read_and_convert_view(pnm_filename, gil::view(img));
+}
+
+void test_old_write_view()
+{
+ std::string filename(pnm_out + "test5.pnm");
+ gil::gray8_image_t img(256, 256);
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::pnm_write_view(filename, gil::view(img));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_old_dynamic_image()
+{
+ using my_img_types =
+ mp11::mp_list<gil::gray8_image_t, gil::gray16_image_t, gil::rgb8_image_t, gil::gray1_image_t>;
+
+ gil::any_image<my_img_types> image;
+
+ gil::pnm_read_image(pnm_filename.c_str(), image);
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::pnm_write_view(pnm_out + "old_dynamic_image_test.pnm", gil::view(image));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+int main()
+{
+ test_old_read_dimensions();
+ test_old_read_image();
+ test_old_read_and_convert_image();
+ test_old_read_view();
+ test_old_read_and_convert_view();
+ test_old_write_view();
+ test_old_dynamic_image();
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/pnm/pnm_read_test.cpp b/src/boost/libs/gil/test/extension/io/pnm/pnm_read_test.cpp
new file mode 100644
index 000000000..6f90a29ce
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/pnm/pnm_read_test.cpp
@@ -0,0 +1,124 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/pnm.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "paths.hpp"
+#include "scanline_read_test.hpp"
+
+namespace gil = boost::gil;
+
+template <typename Image>
+void write(Image& img, std::string const& file_name)
+{
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(pnm_out + file_name, gil::view(img), gil::pnm_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+template <typename Image>
+void test_pnm_scanline_reader(std::string filename)
+{
+ test_scanline_reader<Image, gil::pnm_tag>(std::string(pnm_in + filename).c_str());
+}
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+void test_read_header()
+{
+ using backend_t = gil::get_reader_backend<std::string const, gil::pnm_tag>::type;
+ backend_t backend = gil::read_image_info(pnm_filename, gil::pnm_tag());
+
+ BOOST_TEST_EQ(backend._info._type, gil::pnm_image_type::color_bin_t::value);
+ BOOST_TEST_EQ(backend._info._width, 256u);
+ BOOST_TEST_EQ(backend._info._height, 256u);
+ BOOST_TEST_EQ(backend._info._max_value, 255u);
+}
+
+#ifdef BOOST_GIL_IO_USE_PNM_TEST_SUITE_IMAGES
+void test_read_reference_images()
+{
+ // p1.pnm
+ {
+ gil::gray8_image_t img;
+ gil::read_image(pnm_in + "p1.pnm", img, gil::pnm_tag());
+ BOOST_TEST_EQ(view(img).width(), 200u);
+ BOOST_TEST_EQ(view(img).height(), 200u);
+
+ write(img, "p1.pnm");
+ test_pnm_scanline_reader<gil::gray8_image_t>("p1.pnm");
+ }
+ // p2.pnm
+ {
+ gil::gray8_image_t img;
+ gil::read_image(pnm_in + "p2.pnm", img, gil::pnm_tag());
+ BOOST_TEST_EQ(view(img).width(), 200u);
+ BOOST_TEST_EQ(view(img).height(), 200u);
+
+ write(img, "p2.pnm");
+ test_pnm_scanline_reader<gil::gray8_image_t>("p2.pnm");
+ }
+ // p3.pnm
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(pnm_in + "p3.pnm", img, gil::pnm_tag());
+ BOOST_TEST_EQ(view(img).width(), 256u);
+ BOOST_TEST_EQ(view(img).height(), 256u);
+
+ write(img, "p3.pnm");
+ test_pnm_scanline_reader<rgb8_image_t>("p3.pnm");
+ }
+ // p4.pnm
+ {
+ gil::gray1_image_t img;
+ gil::read_image(pnm_in + "p4.pnm", img, gil::pnm_tag());
+ BOOST_TEST_EQ(view(img).width(), 200u);
+ BOOST_TEST_EQ(view(img).height(), 200u);
+
+ write(img, "p4.pnm");
+ test_pnm_scanline_reader<gil::gray1_image_t>("p4.pnm");
+ }
+ // p5.pnm
+ {
+ gil::gray8_image_t img;
+ gil::read_image(pnm_in + "p5.pnm", img, gil::pnm_tag());
+ BOOST_TEST_EQ(view(img).width(), 200u);
+ BOOST_TEST_EQ(view(img).height(), 200u);
+
+ write(img, "p5.pnm");
+ test_pnm_scanline_reader<gil::gray8_image_t>("p5.pnm");
+ }
+ // p6.pnm
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(pnm_in + "p6.pnm", img, gil::pnm_tag());
+ BOOST_TEST_EQ(view(img).width(), 256u);
+ BOOST_TEST_EQ(view(img).height(), 256u);
+
+ write(img, "p6.pnm");
+ test_pnm_scanline_reader<gil::rgb8_image_t>("p6.pnm");
+ }
+}
+#endif // BOOST_GIL_IO_USE_PNM_TEST_SUITE_IMAGES
+
+int main()
+{
+ test_read_header();
+
+#ifdef BOOST_GIL_IO_USE_PNM_TEST_SUITE_IMAGES
+ test_read_reference_images();
+#endif
+
+ return boost::report_errors();
+}
+#else
+int main() {}
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/pnm/pnm_test.cpp b/src/boost/libs/gil/test/extension/io/pnm/pnm_test.cpp
new file mode 100644
index 000000000..2e398343e
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/pnm/pnm_test.cpp
@@ -0,0 +1,240 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/pnm.hpp>
+
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include <fstream>
+#include <sstream>
+#include <string>
+
+#include "mandel_view.hpp"
+#include "paths.hpp"
+#include "subimage_test.hpp"
+
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+void test_read_image_info_using_string()
+{
+ {
+ using backend_t = gil::get_reader_backend<std::string const, gil::pnm_tag>::type;
+ backend_t backend = gil::read_image_info(pnm_filename, gil::pnm_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 256u);
+ BOOST_TEST_EQ(backend._info._height, 256u);
+ }
+ {
+ std::ifstream in(pnm_filename.c_str(), std::ios::binary);
+
+ using backend_t = gil::get_reader_backend<std::ifstream, gil::pnm_tag>::type;
+ backend_t backend = gil::read_image_info(in, gil::pnm_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 256u);
+ BOOST_TEST_EQ(backend._info._height, 256u);
+ }
+ {
+ FILE* file = fopen(pnm_filename.c_str(), "rb");
+
+ using backend_t = gil::get_reader_backend<FILE*, gil::pnm_tag>::type;
+ backend_t backend = gil::read_image_info(file, gil::pnm_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 256u);
+ BOOST_TEST_EQ(backend._info._height, 256u);
+ }
+}
+
+void test_read_image()
+{
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(pnm_filename, img, gil::pnm_tag());
+
+ BOOST_TEST_EQ(img.width(), 256u);
+ BOOST_TEST_EQ(img.height(), 256u);
+ }
+ {
+ std::ifstream in(pnm_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img;
+ gil::read_image(in, img, gil::pnm_tag());
+
+ BOOST_TEST_EQ(img.width(), 256u);
+ BOOST_TEST_EQ(img.height(), 256u);
+ }
+ {
+ FILE* file = fopen(pnm_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img;
+ gil::read_image(file, img, gil::pnm_tag());
+
+ BOOST_TEST_EQ(img.width(), 256u);
+ BOOST_TEST_EQ(img.height(), 256u);
+ }
+}
+
+void test_read_and_convert_image()
+{
+ {
+ gil::rgb8_image_t img;
+ gil::read_and_convert_image(pnm_filename, img, gil::pnm_tag());
+
+ BOOST_TEST_EQ(img.width(), 256u);
+ BOOST_TEST_EQ(img.height(), 256u);
+ }
+ {
+ std::ifstream in(pnm_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img;
+ gil::read_and_convert_image(in, img, gil::pnm_tag());
+
+ BOOST_TEST_EQ(img.width(), 256u);
+ BOOST_TEST_EQ(img.height(), 256u);
+ }
+ {
+ FILE* file = fopen(pnm_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img;
+ gil::read_and_convert_image(file, img, gil::pnm_tag());
+
+ BOOST_TEST_EQ(img.width(), 256u);
+ BOOST_TEST_EQ(img.height(), 256u);
+ }
+}
+
+void test_read_view()
+{
+ {
+ gil::rgb8_image_t img(256, 256);
+ gil::read_view(pnm_filename, gil::view(img), gil::pnm_tag());
+ }
+ {
+ std::ifstream in(pnm_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img(256, 256);
+ gil::read_view(in, gil::view(img), gil::pnm_tag());
+ }
+ {
+ FILE* file = fopen(pnm_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img(256, 256);
+ gil::read_view(file, gil::view(img), gil::pnm_tag());
+ }
+}
+
+void test_read_and_convert_view()
+{
+ {
+ gil::rgb8_image_t img(256, 256);
+ gil::read_and_convert_view(pnm_filename, gil::view(img), gil::pnm_tag());
+ }
+ {
+ std::ifstream in(pnm_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img(256, 256);
+ gil::read_and_convert_view(in, gil::view(img), gil::pnm_tag());
+ }
+ {
+ FILE* file = fopen(pnm_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img(256, 256);
+
+ gil::read_and_convert_view(file, gil::view(img), gil::pnm_tag());
+ }
+}
+
+void test_stream()
+{
+ // 1. Read an image.
+ std::ifstream in(pnm_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img;
+ gil::read_image(in, img, gil::pnm_tag());
+
+ // 2. Write image to in-memory buffer.
+ std::stringstream out_buffer(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
+ gil::write_view(out_buffer, gil::view(img), gil::pnm_tag());
+
+ // 3. Copy in-memory buffer to another.
+ std::stringstream in_buffer(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
+ in_buffer << out_buffer.rdbuf();
+
+ // 4. Read in-memory buffer to gil image
+ gil::rgb8_image_t dst;
+ gil::read_image(in_buffer, dst, gil::pnm_tag());
+
+ // 5. Write out image.
+ std::string filename(pnm_out + "stream_test.pnm");
+ std::ofstream out(filename.c_str(), std::ios_base::binary);
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(out, gil::view(dst), gil::pnm_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_stream_2()
+{
+ std::filebuf in_buf;
+ if (!in_buf.open(pnm_filename.c_str(), std::ios::in | std::ios::binary))
+ {
+ BOOST_TEST(false);
+ }
+
+ std::istream in(&in_buf);
+
+ gil::rgb8_image_t img;
+ gil::read_image(in, img, gil::pnm_tag());
+}
+
+void test_subimage()
+{
+ run_subimage_test<gil::rgb8_image_t, gil::pnm_tag>(
+ pnm_filename, gil::point_t(0, 0), gil::point_t(50, 50));
+
+ run_subimage_test<gil::rgb8_image_t, gil::pnm_tag>(
+ pnm_filename, gil::point_t(103, 103), gil::point_t(50, 50));
+}
+
+void test_dynamic_image_test()
+{
+ using my_img_types = mp11::mp_list
+ <
+ gil::gray8_image_t,
+ gil::gray16_image_t,
+ gil::rgb8_image_t,
+ gil::gray1_image_t
+ >;
+
+ gil::any_image<my_img_types> image;
+
+ gil::read_image(pnm_filename.c_str(), image, gil::pnm_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(pnm_out + "dynamic_image_test.pnm", gil::view(image), gil::pnm_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+int main()
+{
+ test_read_image_info_using_string();
+ test_read_image();
+ test_read_and_convert_image();
+ test_read_view();
+ test_read_and_convert_view();
+ test_stream();
+ test_stream_2();
+ test_subimage();
+ test_dynamic_image_test();
+
+ return boost::report_errors();
+}
+#else
+int main() {}
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/pnm/pnm_write_test.cpp b/src/boost/libs/gil/test/extension/io/pnm/pnm_write_test.cpp
new file mode 100644
index 000000000..c6b166b02
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/pnm/pnm_write_test.cpp
@@ -0,0 +1,60 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/pnm.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "color_space_write_test.hpp"
+#include "mandel_view.hpp"
+#include "paths.hpp"
+
+namespace gil = boost::gil;;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+void test_write()
+{
+ mandel_view<gil::rgb8_pixel_t>::type v =
+ create_mandel_view(200, 200, gil::rgb8_pixel_t(0, 0, 255), gil::rgb8_pixel_t(0, 255, 0));
+
+ // test writing all supported image types
+ {
+ using gray1_image_t = gil::bit_aligned_image1_type<1, gil::gray_layout_t>::type;
+ gray1_image_t dst(200, 200);
+ gil::copy_and_convert_pixels(v, gil::view(dst));
+
+ gil::write_view(pnm_out + "p4_write_test.pnm", gil::view(dst), gil::pnm_tag());
+ }
+ {
+ gil::gray8_image_t dst(200, 200);
+ gil::copy_and_convert_pixels(v, gil::view(dst));
+
+ gil::write_view(pnm_out + "p5_write_test.pnm", gil::view(dst), gil::pnm_tag());
+ }
+ {
+ gil::write_view(pnm_out + "p6_write_test.pnm", v, gil::pnm_tag());
+ }
+}
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+
+void test_rgb_color_space_write()
+{
+ color_space_write_test<gil::pnm_tag>(
+ pnm_out + "rgb_color_space_test.pnm", pnm_out + "bgr_color_space_test.pnm");
+}
+
+int main()
+{
+ test_rgb_color_space_write();
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ test_write();
+#endif
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/io/raw/Jamfile b/src/boost/libs/gil/test/extension/io/raw/Jamfile
new file mode 100644
index 000000000..c0e1a5896
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/raw/Jamfile
@@ -0,0 +1,24 @@
+# Boost.GIL (Generic Image Library) - IO tests
+#
+# Copyright (c) 2012 Christian Henning
+# Copyright (c) 2017 Stefan Seefeld
+# Copyright (c) 2012-2020 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import ac ;
+import testing ;
+
+lib libraw : : <name>raw ;
+
+project
+ : requirements
+ <define>BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+ <define>BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ <library>/boost/filesystem//boost_filesystem
+ <library>libraw
+ ;
+
+run raw_test.cpp ;
diff --git a/src/boost/libs/gil/test/extension/io/raw/raw_test.cpp b/src/boost/libs/gil/test/extension/io/raw/raw_test.cpp
new file mode 100644
index 000000000..029eef07f
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/raw/raw_test.cpp
@@ -0,0 +1,127 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#define BOOST_FILESYSTEM_VERSION 3
+#define BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/raw.hpp>
+
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include <fstream>
+
+#include "mandel_view.hpp"
+#include "paths.hpp"
+#include "subimage_test.hpp"
+
+namespace fs = boost::filesystem;
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+
+void test_read_image_info_using_string()
+{
+ {
+ /// raw_tag reader's can only constructed with char*, std::string, and LibRaw object
+
+ using backend_t = gil::get_reader_backend<char const *, gil::raw_tag>::type;
+ backend_t b = gil::make_reader_backend(raw_filename.c_str(),
+ gil::image_read_settings<gil::raw_tag>());
+ backend_t backend = gil::read_image_info(raw_filename, gil::raw_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 2176);
+ BOOST_TEST_EQ(backend._info._height, 1448);
+ }
+ {
+ fs::path my_path(raw_filename);
+ using backend_t = gil::get_reader_backend<fs::path, gil::raw_tag>::type;
+ backend_t backend = gil::read_image_info(my_path, gil::raw_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 2176);
+ BOOST_TEST_EQ(backend._info._height, 1448);
+ }
+}
+
+void test_read_image()
+{
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(raw_filename, img, gil::raw_tag());
+
+ BOOST_TEST_EQ(img.width(), 2176);
+ BOOST_TEST_EQ(img.height(), 1448);
+ }
+
+ {
+ fs::path my_path(raw_filename);
+ gil::rgb8_image_t img;
+ gil::read_image(my_path, img, gil::raw_tag());
+
+ BOOST_TEST_EQ(img.width(), 2176);
+ BOOST_TEST_EQ(img.height(), 1448);
+ }
+}
+
+void test_read_and_convert_image()
+{
+ gil::rgb8_image_t img;
+ gil::read_and_convert_image(raw_filename, img, gil::raw_tag());
+
+ BOOST_TEST_EQ(img.width(), 2176);
+ BOOST_TEST_EQ(img.height(), 1448);
+}
+
+void test_read_view()
+{
+ gil::rgb8_image_t img(2176, 1448);
+ gil::read_view(raw_filename, gil::view(img), gil::raw_tag());
+}
+
+void test_read_and_convert_view()
+{
+ gil::rgb8_image_t img(2176, 1448);
+ gil::read_and_convert_view(raw_filename, gil::view(img), gil::raw_tag());
+}
+
+void test_subimage()
+{
+ run_subimage_test<gil::rgb8_image_t, gil::raw_tag>(raw_filename, gil::point_t(0, 0), gil::point_t(127, 1));
+ run_subimage_test<gil::rgb8_image_t, gil::raw_tag>(raw_filename, gil::point_t(39, 7), gil::point_t(50, 50));
+}
+
+void test_dynamic_image()
+{
+ using my_img_types = mp11::mp_list
+ <
+ gil::gray8_image_t,
+ gil::gray16_image_t,
+ gil::rgb8_image_t,
+ gil::rgba8_image_t
+ >;
+
+ gil::any_image<my_img_types> image;
+ gil::read_image(raw_filename.c_str(), image, gil::raw_tag());
+}
+
+int main()
+{
+ test_read_image_info_using_string();
+ test_read_image();
+ test_read_and_convert_image();
+ test_read_view();
+ test_read_and_convert_view();
+ //test_subimage();
+ test_dynamic_image();
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/scanline_read_test.hpp b/src/boost/libs/gil/test/extension/io/scanline_read_test.hpp
new file mode 100644
index 000000000..ae10c7f10
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/scanline_read_test.hpp
@@ -0,0 +1,61 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifndef BOOST_GIL_IO_TEST_SCANLINE_READ_TEST_HPP
+#define BOOST_GIL_IO_TEST_SCANLINE_READ_TEST_HPP
+
+#include <boost/gil.hpp>
+
+#include "cmp_view.hpp"
+
+template< typename Image
+ , typename FormatTag
+ >
+void test_scanline_reader( const char* file_name )
+{
+ using namespace boost::gil;
+
+ // read image using scanline_read_iterator
+ using reader_t = scanline_reader
+ <
+ typename get_read_device<char const*, FormatTag>::type,
+ FormatTag
+ >;
+
+ reader_t reader = make_scanline_reader( file_name, FormatTag() );
+
+ Image dst( reader._info._width, reader._info._height );
+
+ using iterator_t = typename reader_t::iterator_t;
+
+ iterator_t it = reader.begin();
+ iterator_t end = reader.end();
+
+ for( int row = 0; it != end; ++it, ++row )
+ {
+ copy_pixels( interleaved_view( reader._info._width
+ , 1
+ , ( typename Image::view_t::x_iterator ) *it
+ , reader._scanline_length
+ )
+ , subimage_view( view( dst )
+ , 0
+ , row
+ , reader._info._width
+ , 1
+ )
+ );
+ }
+
+ //compare
+ Image img;
+ read_image( file_name, img, FormatTag() );
+
+ cmp_view( view( dst ), view( img ) );
+}
+
+#endif // BOOST_GIL_IO_TEST_SCANLINE_READ_TEST_HPP
diff --git a/src/boost/libs/gil/test/extension/io/simple_all_formats.cpp b/src/boost/libs/gil/test/extension/io/simple_all_formats.cpp
new file mode 100644
index 000000000..2acdb39fe
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/simple_all_formats.cpp
@@ -0,0 +1,94 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/extension/io/png.hpp>
+#include <boost/gil/extension/io/bmp.hpp>
+#include <boost/gil/extension/io/jpeg.hpp>
+#include <boost/gil/extension/io/pnm.hpp>
+#include <boost/gil/extension/io/targa.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "paths.hpp"
+
+namespace gil = boost::gil;
+namespace fs = boost::filesystem;
+
+// Test will include all format's headers and load and write some images.
+// This test is more of a compilation test.
+
+void test_bmp()
+{
+ gil::rgb8_image_t img;
+ gil::read_image(bmp_filename, img, gil::bmp_tag());
+
+ fs::create_directories(fs::path(bmp_out));
+ gil::write_view(bmp_out + "simple_all_format.bmp", gil::view(img), gil::bmp_tag());
+}
+
+void test_jpeg()
+{
+ gil::rgb8_image_t img;
+ gil::read_image(jpeg_filename, img, gil::jpeg_tag());
+ fs::create_directories(fs::path(jpeg_out));
+ gil::write_view(jpeg_out + "simple_all_format.jpg", gil::view(img), gil::jpeg_tag());
+}
+
+void test_png()
+{
+ gil::rgba8_image_t img;
+ gil::read_image(png_filename, img, gil::png_tag());
+ fs::create_directories(fs::path(png_out));
+ gil::write_view(png_out + "simple_all_format.png", gil::view(img), gil::png_tag());
+}
+
+void test_pnm()
+{
+ gil::rgb8_image_t img;
+ gil::read_image(pnm_filename, img, gil::pnm_tag());
+
+ fs::create_directories(fs::path(pnm_out));
+ gil::write_view(pnm_out + "simple_all_format.pnm", gil::view(img), gil::pnm_tag());
+}
+
+void test_targa()
+{
+ gil::rgb8_image_t img;
+ gil::read_image(targa_filename, img, gil::targa_tag());
+
+ fs::create_directories(fs::path(targa_out));
+ gil::write_view(targa_out + "simple_all_format.tga", gil::view(img), gil::targa_tag());
+}
+
+void test_tiff()
+{
+ gil::rgba8_image_t img;
+ gil::read_image(tiff_filename, img, gil::tiff_tag());
+
+ fs::create_directories(fs::path(tiff_out));
+ gil::write_view(tiff_out + "simple_all_format.tif", gil::view(img), gil::tiff_tag());
+}
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ test_bmp();
+ test_jpeg();
+ test_png();
+ test_pnm();
+ // TODO: test_raw()
+ test_targa();
+ test_tiff();
+ }
+ catch (std::exception const& e)
+ {
+ BOOST_ERROR(e.what());
+ }
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/io/subimage_test.hpp b/src/boost/libs/gil/test/extension/io/subimage_test.hpp
new file mode 100644
index 000000000..1b320b2a7
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/subimage_test.hpp
@@ -0,0 +1,30 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifndef BOOST_GIL_IO_TEST_SUBIMAGE_TEST_HPP
+#define BOOST_GIL_IO_TEST_SUBIMAGE_TEST_HPP
+
+#include <boost/gil.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+template <typename Image, typename Format>
+void run_subimage_test(
+ std::string const& filename, boost::gil::point_t const& top_left, boost::gil::point_t const& dimension)
+{
+ Image original, subimage;
+ boost::gil::read_image(filename, original, Format{});
+ boost::gil::image_read_settings<Format> settings(top_left, dimension);
+ boost::gil::read_image(filename, subimage, settings);
+ BOOST_TEST(boost::gil::equal_pixels(
+ boost::gil::const_view(subimage),
+ boost::gil::subimage_view(boost::gil::const_view(original), top_left, dimension)));
+}
+
+#endif // BOOST_GIL_IO_TEST_SUBIMAGE_TEST_HPP
diff --git a/src/boost/libs/gil/test/extension/io/targa/Jamfile b/src/boost/libs/gil/test/extension/io/targa/Jamfile
new file mode 100644
index 000000000..ac35f88c3
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/targa/Jamfile
@@ -0,0 +1,22 @@
+# Boost.GIL (Generic Image Library) - IO tests
+#
+# Copyright (c) 2012 Christian Henning
+# Copyright (c) 2017 Stefan Seefeld
+# Copyright (c) 2012-2020 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+project
+ : requirements
+ <library>/boost/filesystem//boost_filesystem
+ ;
+
+run targa_test.cpp ;
+run targa_read_test.cpp ;
+run targa_write_test.cpp ;
+
+run targa_old_test.cpp ;
diff --git a/src/boost/libs/gil/test/extension/io/targa/targa_old_test.cpp b/src/boost/libs/gil/test/extension/io/targa/targa_old_test.cpp
new file mode 100644
index 000000000..cfb7aa9a7
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/targa/targa_old_test.cpp
@@ -0,0 +1,92 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/targa/old.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+#include <boost/mp11.hpp>
+
+#include "mandel_view.hpp"
+#include "paths.hpp"
+
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+void test_old_read_dimensions()
+{
+ boost::gil::point_t dim = gil::targa_read_dimensions(targa_filename);
+
+ BOOST_TEST_EQ(dim.x, 124);
+ BOOST_TEST_EQ(dim.y, 124);
+}
+
+void test_old_read_image()
+{
+ gil::rgb8_image_t img;
+ gil::targa_read_image(targa_filename, img);
+
+ BOOST_TEST_EQ(img.width(), 124);
+ BOOST_TEST_EQ(img.height(), 124);
+}
+
+void test_old_read_and_convert_image()
+{
+ gil::rgb8_image_t img;
+ gil::targa_read_and_convert_image(targa_filename, img);
+
+ BOOST_TEST_EQ(img.width(), 124);
+ BOOST_TEST_EQ(img.height(), 124);
+}
+
+void test_old_read_view()
+{
+ gil::rgb8_image_t img(124, 124);
+ gil::targa_read_view(targa_filename, gil::view(img));
+}
+
+void test_old_read_and_convert_view()
+{
+ gil::rgb8_image_t img(124, 124);
+ gil::targa_read_and_convert_view(targa_filename, gil::view(img));
+}
+
+void test_old_write_view()
+{
+ targa_write_view(
+ targa_out + "old_write_view_test.tga",
+ create_mandel_view(124, 124, gil::rgb8_pixel_t(0, 0, 255), gil::rgb8_pixel_t(0, 255, 0)));
+}
+
+void test_old_dynamic_image()
+{
+ using my_img_types = mp11::mp_list
+ <
+ gil::gray8_image_t,
+ gil::gray16_image_t,
+ gil::rgb8_image_t,
+ gil::rgba8_image_t
+ >;
+
+ gil::any_image<my_img_types> image;
+ gil::targa_read_image(targa_filename.c_str(), image);
+
+ targa_write_view(targa_out + "old_dynamic_image_test.tga", gil::view(image));
+}
+
+int main()
+{
+ test_old_read_dimensions();
+ test_old_read_image();
+ test_old_read_and_convert_image();
+ test_old_read_view();
+ test_old_read_and_convert_view();
+ test_old_write_view();
+ test_old_dynamic_image();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/io/targa/targa_read_test.cpp b/src/boost/libs/gil/test/extension/io/targa/targa_read_test.cpp
new file mode 100644
index 000000000..c585271b4
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/targa/targa_read_test.cpp
@@ -0,0 +1,213 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/targa.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "paths.hpp"
+#include "scanline_read_test.hpp"
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+
+template <typename Image>
+void test_targa_scanline_reader(std::string filename)
+{
+ test_scanline_reader<Image, gil::targa_tag>(std::string(targa_in + filename).c_str());
+}
+
+template <typename Image>
+void write(Image& img, std::string const& file_name)
+{
+ gil::write_view(targa_out + file_name, gil::view(img), gil::targa_tag());
+}
+
+void test_read_header()
+{
+ using backend_t = gil::get_reader_backend<std::string const, gil::targa_tag>::type;
+ backend_t backend = gil::read_image_info(targa_filename, gil::targa_tag());
+
+ BOOST_TEST_EQ(backend._info._header_size, 18);
+ BOOST_TEST_EQ(backend._info._offset, 18);
+ BOOST_TEST_EQ(backend._info._color_map_type, 0);
+ BOOST_TEST_EQ(backend._info._image_type, 10);
+ BOOST_TEST_EQ(backend._info._color_map_start, 0);
+ BOOST_TEST_EQ(backend._info._color_map_length, 0);
+ BOOST_TEST_EQ(backend._info._color_map_depth, 0);
+ BOOST_TEST_EQ(backend._info._x_origin, 0);
+ BOOST_TEST_EQ(backend._info._y_origin, 0);
+ BOOST_TEST_EQ(backend._info._width, 124);
+ BOOST_TEST_EQ(backend._info._height, 124);
+ BOOST_TEST_EQ(backend._info._bits_per_pixel, 24);
+ BOOST_TEST_EQ(backend._info._descriptor, 0);
+}
+
+void test_read_reference_images()
+{
+ // 24BPP_compressed.tga
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(targa_in + "24BPP_compressed.tga", img, gil::targa_tag());
+
+ typename gil::rgb8_image_t::x_coord_t width = gil::view(img).width();
+ typename gil::rgb8_image_t::y_coord_t height = gil::view(img).height();
+
+ BOOST_TEST_EQ(width, 124);
+ BOOST_TEST_EQ(height, 124);
+ BOOST_TEST_EQ(gil::view(img)(0, 0), gil::rgb8_pixel_t(248, 0, 248));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, 0), gil::rgb8_pixel_t(0, 0, 248));
+ BOOST_TEST_EQ(gil::view(img)(0, height - 1), gil::rgb8_pixel_t(248, 0, 0));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, height - 1), gil::rgb8_pixel_t(248, 0, 248));
+
+ write(img, "24BPP_compressed_out.tga");
+ }
+ // 24BPP_uncompressed.tga
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(targa_in + "24BPP_uncompressed.tga", img, gil::targa_tag());
+
+ typename gil::rgb8_image_t::x_coord_t width = gil::view(img).width();
+ typename gil::rgb8_image_t::y_coord_t height = gil::view(img).height();
+
+ BOOST_TEST_EQ(width, 124);
+ BOOST_TEST_EQ(height, 124);
+ BOOST_TEST_EQ(gil::view(img)(0, 0), gil::rgb8_pixel_t(248, 0, 248));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, 0), gil::rgb8_pixel_t(0, 0, 248));
+ BOOST_TEST_EQ(gil::view(img)(0, height - 1), gil::rgb8_pixel_t(248, 0, 0));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, height - 1), gil::rgb8_pixel_t(248, 0, 248));
+
+ write(img, "24BPP_uncompressed_out.tga");
+
+ test_targa_scanline_reader<gil::bgr8_image_t>("24BPP_uncompressed.tga");
+ }
+ // 32BPP_compressed.tga
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(targa_in + "32BPP_compressed.tga", img, gil::targa_tag());
+
+ typename gil::rgba8_image_t::x_coord_t width = gil::view(img).width();
+ typename gil::rgba8_image_t::y_coord_t height = gil::view(img).height();
+
+ BOOST_TEST_EQ(width, 124);
+ BOOST_TEST_EQ(height, 124);
+ BOOST_TEST_EQ(gil::view(img)(0, 0), gil::rgba8_pixel_t(248, 0, 248, 255));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, 0), gil::rgba8_pixel_t(0, 0, 248, 255));
+ BOOST_TEST_EQ(gil::view(img)(0, height - 1), gil::rgba8_pixel_t(0, 0, 0, 0));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, height - 1), gil::rgba8_pixel_t(248, 0, 248, 255));
+
+ write(img, "32BPP_compressed_out.tga");
+ }
+ // 32BPP_uncompressed.tga
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(targa_in + "32BPP_uncompressed.tga", img, gil::targa_tag());
+
+ typename gil::rgba8_image_t::x_coord_t width = gil::view(img).width();
+ typename gil::rgba8_image_t::y_coord_t height = gil::view(img).height();
+
+ BOOST_TEST_EQ(width, 124);
+ BOOST_TEST_EQ(height, 124);
+ BOOST_TEST_EQ(gil::view(img)(0, 0), gil::rgba8_pixel_t(248, 0, 248, 255));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, 0), gil::rgba8_pixel_t(0, 0, 248, 255));
+ BOOST_TEST_EQ(gil::view(img)(0, height - 1), gil::rgba8_pixel_t(0, 0, 0, 0));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, height - 1), gil::rgba8_pixel_t(248, 0, 248, 255));
+
+ write(img, "32BPP_uncompressed_out.tga");
+
+ test_targa_scanline_reader<gil::bgra8_image_t>("32BPP_uncompressed.tga");
+ }
+ // 24BPP_compressed_ul_origin.tga
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(targa_in + "24BPP_compressed_ul_origin.tga", img, gil::targa_tag());
+
+ typename gil::rgb8_image_t::x_coord_t width = gil::view(img).width();
+ typename gil::rgb8_image_t::y_coord_t height = gil::view(img).height();
+
+ BOOST_TEST_EQ(width, 124);
+ BOOST_TEST_EQ(height, 124);
+ BOOST_TEST_EQ(gil::view(img)(0, 0), gil::rgb8_pixel_t(248, 0, 248));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, 0), gil::rgb8_pixel_t(0, 0, 248));
+ BOOST_TEST_EQ(gil::view(img)(0, height - 1), gil::rgb8_pixel_t(248, 0, 0));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, height - 1), gil::rgb8_pixel_t(248, 0, 248));
+
+ write(img, "24BPP_compressed_ul_origin_out.tga");
+ }
+ // 24BPP_uncompressed_ul_origin.tga
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(targa_in + "24BPP_uncompressed_ul_origin.tga", img, gil::targa_tag());
+
+ typename gil::rgb8_image_t::x_coord_t width = gil::view(img).width();
+ typename gil::rgb8_image_t::y_coord_t height = gil::view(img).height();
+
+ BOOST_TEST_EQ(width, 124);
+ BOOST_TEST_EQ(height, 124);
+ BOOST_TEST_EQ(gil::view(img)(0, 0), gil::rgb8_pixel_t(248, 0, 248));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, 0), gil::rgb8_pixel_t(0, 0, 248));
+ BOOST_TEST_EQ(gil::view(img)(0, height - 1), gil::rgb8_pixel_t(248, 0, 0));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, height - 1), gil::rgb8_pixel_t(248, 0, 248));
+
+ write(img, "24BPP_uncompressed_ul_origin_out.tga");
+ }
+ // 32BPP_compressed_ul_origin.tga
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(targa_in + "32BPP_compressed_ul_origin.tga", img, gil::targa_tag());
+
+ typename gil::rgba8_image_t::x_coord_t width = gil::view(img).width();
+ typename gil::rgba8_image_t::y_coord_t height = gil::view(img).height();
+
+ BOOST_TEST_EQ(width, 124);
+ BOOST_TEST_EQ(height, 124);
+ BOOST_TEST_EQ(gil::view(img)(0, 0), gil::rgba8_pixel_t(248, 0, 248, 255));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, 0), gil::rgba8_pixel_t(0, 0, 248, 255));
+ BOOST_TEST_EQ(gil::view(img)(0, height - 1), gil::rgba8_pixel_t(0, 0, 0, 0));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, height - 1), gil::rgba8_pixel_t(248, 0, 248, 255));
+
+ write(img, "32BPP_compressed_ul_origin_out.tga");
+ }
+ // 32BPP_uncompressed_ul_origin.tga
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(targa_in + "32BPP_uncompressed_ul_origin.tga", img, gil::targa_tag());
+
+ typename gil::rgba8_image_t::x_coord_t width = gil::view(img).width();
+ typename gil::rgba8_image_t::y_coord_t height = gil::view(img).height();
+
+ BOOST_TEST_EQ(width, 124);
+ BOOST_TEST_EQ(height, 124);
+ BOOST_TEST_EQ(gil::view(img)(0, 0), gil::rgba8_pixel_t(248, 0, 248, 255));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, 0), gil::rgba8_pixel_t(0, 0, 248, 255));
+ BOOST_TEST_EQ(gil::view(img)(0, height - 1), gil::rgba8_pixel_t(0, 0, 0, 0));
+ BOOST_TEST_EQ(gil::view(img)(width - 1, height - 1), gil::rgba8_pixel_t(248, 0, 248, 255));
+
+ write(img, "32BPP_uncompressed_ul_origin_out.tga");
+ }
+}
+
+void test_partial_image()
+{
+ std::string const filename(targa_in + "24BPP_compressed.tga");
+
+ gil::rgb8_image_t img;
+ gil::read_image(
+ filename, img,
+ gil::image_read_settings<gil::targa_tag>(gil::point_t(0, 0), gil::point_t(50, 50)));
+
+ gil::write_view(targa_out + "targa_partial.tga", gil::view(img), gil::targa_tag());
+}
+
+int main()
+{
+ test_read_header();
+ test_read_reference_images();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/io/targa/targa_test.cpp b/src/boost/libs/gil/test/extension/io/targa/targa_test.cpp
new file mode 100644
index 000000000..bb1d98935
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/targa/targa_test.cpp
@@ -0,0 +1,283 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#define BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/targa.hpp>
+
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include <fstream>
+#include <sstream>
+#include <string>
+
+#include "mandel_view.hpp"
+#include "paths.hpp"
+#include "subimage_test.hpp"
+#include "test_utility_output_stream.hpp"
+
+namespace fs = boost::filesystem;
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+void test_read_image_info_using_string()
+{
+ {
+ using backend_t = gil::get_reader_backend<std::string const, gil::targa_tag>::type;
+ backend_t backend = gil::read_image_info(targa_filename, gil::targa_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 124);
+ BOOST_TEST_EQ(backend._info._height, 124);
+ }
+ {
+ std::ifstream in(targa_filename.c_str(), std::ios::binary);
+
+ using backend_t = gil::get_reader_backend<std::ifstream, gil::targa_tag>::type;
+ backend_t backend = gil::read_image_info(in, gil::targa_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 124);
+ BOOST_TEST_EQ(backend._info._height, 124);
+ }
+ {
+ FILE* file = fopen(targa_filename.c_str(), "rb");
+
+ using backend_t = gil::get_reader_backend<FILE*, gil::targa_tag>::type;
+ backend_t backend = gil::read_image_info(file, gil::targa_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 124);
+ BOOST_TEST_EQ(backend._info._height, 124);
+ }
+ {
+ fs::path my_path(targa_filename);
+
+ using backend_t = gil::get_reader_backend<fs::path, gil::targa_tag>::type;
+ backend_t backend = gil::read_image_info(my_path, gil::targa_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 124);
+ BOOST_TEST_EQ(backend._info._height, 124);
+ }
+}
+
+void test_read_image()
+{
+ {
+ gil::rgb8_image_t img;
+ gil::read_image(targa_filename, img, gil::targa_tag());
+
+ BOOST_TEST_EQ(img.width(), 124);
+ BOOST_TEST_EQ(img.height(), 124);
+ }
+ {
+ std::ifstream in(targa_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img;
+ gil::read_image(in, img, gil::targa_tag());
+
+ BOOST_TEST_EQ(img.width(), 124);
+ BOOST_TEST_EQ(img.height(), 124);
+ }
+ {
+ FILE* file = fopen(targa_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img;
+ gil::read_image(file, img, gil::targa_tag());
+
+ BOOST_TEST_EQ(img.width(), 124);
+ BOOST_TEST_EQ(img.height(), 124);
+ }
+}
+
+void test_read_and_convert_image()
+{
+ {
+ gil::rgb8_image_t img;
+ read_and_convert_image(targa_filename, img, gil::targa_tag());
+
+ BOOST_TEST_EQ(img.width(), 124);
+ BOOST_TEST_EQ(img.height(), 124);
+ }
+ {
+ std::ifstream in(targa_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img;
+ gil::read_and_convert_image(in, img, gil::targa_tag());
+
+ BOOST_TEST_EQ(img.width(), 124);
+ BOOST_TEST_EQ(img.height(), 124);
+ }
+ {
+ FILE* file = fopen(targa_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img;
+ gil::read_and_convert_image(file, img, gil::targa_tag());
+
+ BOOST_TEST_EQ(img.width(), 124);
+ BOOST_TEST_EQ(img.height(), 124);
+ }
+}
+
+void test_read_view()
+{
+ {
+ gil::rgb8_image_t img(124, 124);
+ gil::read_view(targa_filename, gil::view(img), gil::targa_tag());
+ }
+ {
+ std::ifstream in(targa_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img(124, 124);
+ gil::read_view(in, gil::view(img), gil::targa_tag());
+ }
+ {
+ FILE* file = fopen(targa_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img(124, 124);
+ gil::read_view(file, gil::view(img), gil::targa_tag());
+ }
+}
+
+void test_read_and_convert_view()
+{
+ {
+ gil::rgb8_image_t img(124, 124);
+ gil::read_and_convert_view(targa_filename, gil::view(img), gil::targa_tag());
+ }
+ {
+ std::ifstream in(targa_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img(124, 124);
+ gil::read_and_convert_view(in, gil::view(img), gil::targa_tag());
+ }
+ {
+ FILE* file = fopen(targa_filename.c_str(), "rb");
+
+ gil::rgb8_image_t img(124, 124);
+ gil::read_and_convert_view(file, gil::view(img), gil::targa_tag());
+ }
+}
+
+void test_write_view()
+{
+ {
+ std::string filename(png_out + "write_test_string.tga");
+
+ gil::rgb8_image_t img;
+ gil::write_view(
+ filename,
+ create_mandel_view(124, 124, gil::rgb8_pixel_t(0, 0, 255), gil::rgb8_pixel_t(0, 255, 0)),
+ gil::targa_tag());
+ }
+ {
+ std::string filename(targa_out + "write_test_ofstream.tga");
+ std::ofstream out(filename.c_str(), std::ios::out | std::ios::binary);
+
+ gil::write_view(
+ out,
+ create_mandel_view(124, 124, gil::rgb8_pixel_t(0, 0, 255), gil::rgb8_pixel_t(0, 255, 0)),
+ gil::targa_tag());
+ }
+ {
+ std::string filename(targa_out + "write_test_file.tga");
+ FILE* file = fopen(filename.c_str(), "wb");
+
+ gil::write_view(
+ file,
+ create_mandel_view(124, 124, gil::rgb8_pixel_t(0, 0, 255), gil::rgb8_pixel_t(0, 255, 0)),
+ gil::targa_tag());
+ }
+ {
+ std::string filename(targa_out + "write_test_info.tga");
+ FILE* file = fopen(filename.c_str(), "wb");
+
+ gil::image_write_info<gil::targa_tag> info;
+ gil::write_view(
+ file,
+ create_mandel_view(124, 124, gil::rgb8_pixel_t(0, 0, 255), gil::rgb8_pixel_t(0, 255, 0)),
+ info);
+ }
+}
+
+void test_stream()
+{
+ // 1. Read an image.
+ std::ifstream in(targa_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img;
+ gil::read_image(in, img, gil::targa_tag());
+
+ // 2. Write image to in-memory buffer.
+ std::stringstream out_buffer(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
+ gil::write_view(out_buffer, gil::view(img), gil::targa_tag());
+
+ // 3. Copy in-memory buffer to another.
+ std::stringstream in_buffer(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
+ in_buffer << out_buffer.rdbuf();
+
+ // 4. Read in-memory buffer to gil image
+ gil::rgb8_image_t dst;
+ gil::read_image(in_buffer, dst, gil::targa_tag());
+
+ // 5. Write out image.
+ std::string filename(targa_out + "stream_test.tga");
+ std::ofstream out(filename.c_str(), std::ios_base::binary);
+ gil::write_view(out, gil::view(dst), gil::targa_tag());
+}
+
+void test_stream_2()
+{
+ std::filebuf in_buf;
+ if (!in_buf.open(targa_filename.c_str(), std::ios::in | std::ios::binary))
+ {
+ BOOST_TEST(false);
+ }
+
+ std::istream in(&in_buf);
+
+ gil::rgb8_image_t img;
+ gil::read_image(in, img, gil::targa_tag());
+}
+
+void test_subimage()
+{
+ run_subimage_test<gil::rgb8_image_t, gil::targa_tag>(
+ targa_filename, gil::point_t(0, 0), gil::point_t(50, 50));
+
+ // FIXME: not working
+ // run_subimage_test<gil::gray8_image_t, gil::targa_tag>(
+ // targa_filename, gil::point_t(39, 7), gil::point_t(50, 50));
+}
+
+void test_dynamic_image()
+{
+ using my_img_types = mp11::mp_list
+ <
+ gil::gray8_image_t,
+ gil::gray16_image_t,
+ gil::rgb8_image_t,
+ gil::rgba8_image_t
+ >;
+
+ gil::any_image<my_img_types> image;
+ gil::read_image(targa_filename.c_str(), image, gil::targa_tag());
+ gil::write_view(targa_out + "dynamic_image_test.tga", gil::view(image), gil::targa_tag());
+}
+
+int main()
+{
+ test_read_image_info_using_string();
+ test_read_image();
+ test_read_and_convert_image();
+ test_read_view();
+ test_read_and_convert_view();
+ test_stream();
+ test_stream_2();
+ test_subimage();
+ test_dynamic_image();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/io/targa/targa_write_test.cpp b/src/boost/libs/gil/test/extension/io/targa/targa_write_test.cpp
new file mode 100644
index 000000000..c57ea71af
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/targa/targa_write_test.cpp
@@ -0,0 +1,50 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/io/typedefs.hpp>
+#include <boost/gil/extension/io/targa.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "color_space_write_test.hpp"
+#include "mandel_view.hpp"
+#include "paths.hpp"
+
+namespace gil = boost::gil;
+
+void test_write()
+{
+ // test writing all supported image types
+ {
+ gil::write_view(
+ targa_out + "rgb8_test.tga",
+ create_mandel_view(200, 200, gil::rgb8_pixel_t(0, 0, 255), gil::rgb8_pixel_t(0, 255, 0)),
+ gil::targa_tag());
+ }
+ {
+ gil::write_view(
+ targa_out + "rgba8_test.tga",
+ create_mandel_view(
+ 200, 200, gil::rgba8_pixel_t(0, 0, 255, 0), gil::rgba8_pixel_t(0, 255, 0, 0)),
+ gil::targa_tag());
+ }
+}
+
+void test_rgb_color_space_write()
+{
+ color_space_write_test<gil::targa_tag>(
+ targa_out + "rgb_color_space_test.tga", targa_out + "bgr_color_space_test.tga");
+}
+
+int main()
+{
+ test_rgb_color_space_write();
+ test_write();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/io/tiff/Jamfile b/src/boost/libs/gil/test/extension/io/tiff/Jamfile
new file mode 100644
index 000000000..f92036797
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/Jamfile
@@ -0,0 +1,54 @@
+# Boost.GIL (Generic Image Library) - IO tests
+#
+# Copyright (c) 2012 Christian Henning
+# Copyright (c) 2017 Stefan Seefeld
+# Copyright (c) 2012-2020 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import ac ;
+import testing ;
+
+using libtiff : : : : true ;
+lib libtiffxx : : <name>tiffxx ;
+
+# TODO: Download TIFF test suite images and build with BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+project
+ : requirements
+ <define>BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+ <define>BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ <library>/boost/filesystem//boost_filesystem
+ <library>libtiffxx
+ [ ac.check-library /libtiff//libtiff : <library>/libtiff//libtiff : <build>no ]
+ ;
+
+run tiff_file_format_test.cpp ;
+run tiff_subimage_test.cpp ;
+run tiff_test.cpp ;
+run tiff_tiled_float_test.cpp ;
+run tiff_tiled_minisblack_test_1-10.cpp ;
+run tiff_tiled_minisblack_test_11-20.cpp ;
+run tiff_tiled_minisblack_test_21-31_32-64.cpp ;
+run tiff_tiled_minisblack_write_test_1-10.cpp ;
+run tiff_tiled_minisblack_write_test_11-20.cpp ;
+run tiff_tiled_minisblack_write_test_21-31_32-64.cpp ;
+run tiff_tiled_palette_test_1-8.cpp ;
+run tiff_tiled_palette_test_8-16.cpp ;
+run tiff_tiled_palette_write_test_1-8.cpp ;
+run tiff_tiled_palette_write_test_8-16.cpp ;
+run tiff_tiled_rgb_contig_test_1-10.cpp ;
+run tiff_tiled_rgb_contig_test_11-20.cpp ;
+run tiff_tiled_rgb_contig_test_21-31_32_64.cpp ;
+run tiff_tiled_rgb_contig_write_test_1-10.cpp ;
+run tiff_tiled_rgb_contig_write_test_11-20.cpp ;
+run tiff_tiled_rgb_contig_write_test_21-31_32_64.cpp ;
+run tiff_tiled_rgb_planar_test_1-10.cpp ;
+run tiff_tiled_rgb_planar_test_11-20.cpp ;
+run tiff_tiled_rgb_planar_test_21-31_32_64.cpp ;
+run tiff_tiled_test.cpp ;
+run tiff_write_test.cpp ;
+
+run tiff_old_test.cpp ;
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_file_format_test.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_file_format_test.cpp
new file mode 100644
index 000000000..4264312f7
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_file_format_test.cpp
@@ -0,0 +1,637 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "paths.hpp"
+#include "scanline_read_test.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_LIBTIFF_TEST_SUITE_IMAGES
+template <typename Image>
+void test_tiff_scanline_reader(std::string filename)
+{
+ test_scanline_reader<Image, gil::tiff_tag>(filename.c_str());
+}
+
+// 73x43 2-bit minisblack gray image
+void test_two_bit_minisblack_gray_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-minisblack-02.tif");
+
+ using image_t = gil::bit_aligned_image1_type<2, gil::gray_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test4.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-minisblack-04.tif 73x43 4-bit minisblack gray image
+void test_four_bit_minisblack_gray_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-minisblack-04.tif");
+
+ using image_t = gil::bit_aligned_image1_type<4, gil::gray_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test5.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-minisblack-06.tif 73x43 6-bit minisblack gray image
+void test_six_bit_minisblack_gray_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-minisblack-06.tif");
+
+ using image_t = gil::bit_aligned_image1_type<6, gil::gray_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test6.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-minisblack-08.tif 73x43 8-bit minisblack gray image
+void test_eight_bit_minisblack_gray_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-minisblack-08.tif");
+
+ using image_t = gray8_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test7.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-minisblack-10.tif 73x43 10-bit minisblack gray image
+void test_ten_bit_minisblack_gray_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-minisblack-10.tif");
+
+ using image_t = gil::bit_aligned_image1_type<10, gil::gray_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test8.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-minisblack-12.tif 73x43 12-bit minisblack gray image
+void test_twelve_bit_minisblack_gray_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-minisblack-12.tif");
+
+ using image_t = gil::bit_aligned_image1_type<12, gil::gray_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test9.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-minisblack-14.tif 73x43 14-bit minisblack gray image
+void test_fourteen_bit_minisblack_gray_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-minisblack-14.tif");
+
+ using image_t = gil::bit_aligned_image1_type<14, gil::gray_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test10.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-minisblack-16.tif 73x43 16-bit minisblack gray image
+void test_sixteen_bit_minisblack_gray_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-minisblack-16.tif");
+
+ using image_t = gray16_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test11.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-minisblack-24.tif 73x43 24-bit minisblack gray image
+void test_twentyfour_bit_minisblack_gray_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-minisblack-24.tif");
+
+ using image_t = gil::bit_aligned_image1_type<24, gil::gray_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test12.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-minisblack-32.tif 73x43 32-bit minisblack gray image
+void test_thirtytwo_bit_minisblack_gray_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-minisblack-32.tif");
+
+ using image_t = gray32_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test13.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-palette-02.tif 73x43 4-entry colormapped image
+void test_four_entry_colormapped_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-palette-02.tif");
+
+ using image_t = gil::rgb16_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test14.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-palette-04.tif 73x43 16-entry colormapped image
+void test_sixteen_entry_colormapped_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-palette-04.tif");
+
+ using image_t = gil::rgb16_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test15.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-palette-08.tif 73x43 256-entry colormapped image
+void test_twohundred_twenty_five_entry_colormapped_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-palette-08.tif");
+
+ using image_t = gil::rgb16_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test16.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-palette-16.tif 73x43 65536-entry colormapped image
+void test_sixtyfive_thousand_entry_colormapped_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-palette-16.tif");
+
+ using image_t = gil::rgb16_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test17.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-contig-02.tif 73x43 2-bit contiguous RGB image
+void test_two_bit_contiguous_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-contig-02.tif");
+
+ using image_t = gil::bit_aligned_image3_type<2, 2, 2, gil::rgb_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test18.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-contig-04.tif 73x43 4-bit contiguous RGB image
+void test_four_bit_contiguous_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-contig-04.tif");
+
+ using image_t = gil::bit_aligned_image3_type<4, 4, 4, gil::rgb_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test19.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-contig-08.tif 73x43 8-bit contiguous RGB image
+void test_eight_bit_contiguous_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-contig-08.tif");
+
+ using image_t = gil::rgb8_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test20.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-contig-10.tif 73x43 10-bit contiguous RGB image
+void test_ten_bit_contiguous_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-contig-10.tif");
+
+ using image_t = gil::bit_aligned_image3_type<10, 10, 10, gil::rgb_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test21.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-contig-12.tif 73x43 12-bit contiguous RGB image
+void test_twelve_bit_contiguous_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-contig-12.tif");
+
+ using image_t = gil::bit_aligned_image3_type<12, 12, 12, gil::rgb_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test22.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-contig-14.tif 73x43 14-bit contiguous RGB image
+void test_fourteen_bit_contiguous_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-contig-14.tif");
+
+ using image_t = gil::bit_aligned_image3_type<14, 14, 14, gil::rgb_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test23.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-contig-16.tif 73x43 16-bit contiguous RGB image
+void test_sixteen_bit_contiguous_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-contig-16.tif");
+
+ using image_t = gil::rgb16_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test24.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-contig-24.tif 73x43 24-bit contiguous RGB image
+void test_twenty_four_bit_contiguous_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-contig-24.tif");
+
+ using image_t = gil::bit_aligned_image3_type<24, 24, 24, gil::rgb_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test25.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-contig-32.tif 73x43 32-bit contiguous RGB image
+void test_thirty_two_bit_contiguous_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-contig-32.tif");
+
+ using image_t = gil::rgb32_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test26.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-planar-02.tif 73x43 2-bit seperated RGB image
+void test_two_bit_seperated_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-planar-02.tif");
+
+ using image_t = gil::bit_aligned_image3_type<2, 2, 2, gil::rgb_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test27.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-planar-04.tif 73x43 4-bit seperated RGB image
+void test_four_bit_seperated_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-planar-04.tif");
+
+ using image_t = gil::bit_aligned_image3_type<4, 4, 4, gil::rgb_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test28.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-planar-08.tif 73x43 8-bit seperated RGB image
+void test_eight_bit_seperated_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-planar-08.tif");
+
+ using image_t = gil::rgb8_planar_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test29.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-planar-10.tif 73x43 10-bit seperated RGB image
+void test_ten_bit_seperated_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-planar-10.tif");
+
+ using image_t = gil::bit_aligned_image3_type<10, 10, 10, gil::rgb_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test30.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-planar-12.tif 73x43 12-bit seperated RGB image
+void test_twelve_bit_seperated_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-planar-12.tif");
+
+ using image_t = gil::bit_aligned_image3_type<12, 12, 12, gil::rgb_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test31.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-planar-14.tif 73x43 14-bit seperated RGB image
+void test_fourteen_bit_seperated_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-planar-14.tif");
+
+ using image_t = gil::bit_aligned_image3_type<14, 14, 14, gil::rgb_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test32.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-planar-16.tif 73x43 16-bit seperated RGB image
+void test_sixteen_bit_seperated_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-planar-16.tif");
+
+ using image_t = gil::rgb16_planar_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test33.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-planar-24.tif 73x43 24-bit seperated RGB image
+void test_twenty_four_bit_seperated_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-planar-24.tif");
+
+ using image_t = gil::bit_aligned_image3_type<24, 24, 24, gil::rgb_layout_t>::type;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test34.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-rgb-planar-32.tif 73x43 32-bit seperated RGB image
+void test_thirty_two_bit_seperated_rgb_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-rgb-planar-32.tif");
+
+ using image_t = gil::rgb32_planar_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test35.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-separated-contig-08.tif 73x43 8-bit contiguous CMYK image
+void test_eight_bit_contiguous_cmyk_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-separated-contig-08.tif");
+
+ using image_t = gil::cmyk8_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test36.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-separated-contig-16.tif 73x43 16-bit contiguous CMYK image
+void test_sixteen_bit_contiguous_cmyk_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-separated-contig-16.tif");
+
+ using image_t = gil::cmyk16_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test37.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-separated-planar-08.tif 73x43 8-bit separated CMYK image
+void test_eight_bit_separated_cmyk_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-separated-planar-08.tif");
+
+ using image_t = gil::cmyk8_planar_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test38.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+// flower-separated-planar-16.tif 73x43 16-bit separated CMYK image
+void test_sixteen_bit_separated_cmyk_image()
+{
+ std::string filename(tiff_in + "libtiffpic/depth/flower-separated-planar-16.tif");
+
+ using image_t = gil::cmyk16_planar_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test39.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+#endif // BOOST_GIL_IO_USE_TIFF_LIBTIFF_TEST_SUITE_IMAGES
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+void test_tiger_separated_strip_contig_08()
+{
+ std::string filename(tiff_in_GM + "tiger-separated-strip-contig-08.tif");
+
+ using image_t = gil::cmyk8_planar_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test40.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_tiger_separated_strip_contig_16()
+{
+ std::string filename(tiff_in_GM + "tiger-separated-strip-contig-16.tif");
+
+ using image_t = gil::cmyk16_planar_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test41.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_tiger_separated_strip_planar_08()
+{
+ std::string filename(tiff_in_GM + "tiger-separated-strip-planar-08.tif");
+
+ using image_t = gil::cmyk8_planar_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test42.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_tiger_separated_strip_planar_16()
+{
+ std::string filename(tiff_in_GM + "tiger-separated-strip-planar-16.tif");
+
+ using image_t = gil::cmyk16_planar_image_t;
+ image_t img;
+ gil::read_image(filename, img, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "test43.tif", gil::view(img), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES }
+}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+int main()
+{
+#ifdef BOOST_GIL_IO_USE_TIFF_LIBTIFF_TEST_SUITE_IMAGES
+ test_two_bit_minisblack_gray_image();
+ test_four_bit_minisblack_gray_image();
+ test_six_bit_minisblack_gray_image();
+ test_eight_bit_minisblack_gray_image();
+ test_ten_bit_minisblack_gray_image();
+ test_twelve_bit_minisblack_gray_image();
+ test_fourteen_bit_minisblack_gray_image();
+ test_sixteen_bit_minisblack_gray_image();
+ test_twentyfour_bit_minisblack_gray_image();
+ test_thirtytwo_bit_minisblack_gray_image();
+ test_four_entry_colormapped_image();
+ test_sixteen_entry_colormapped_image();
+ test_twohundred_twenty_five_entry_colormapped_image();
+ test_sixtyfive_thousand_entry_colormapped_image();
+ test_two_bit_contiguous_rgb_image();
+ test_four_bit_contiguous_rgb_image();
+ test_eight_bit_contiguous_rgb_image();
+ test_ten_bit_contiguous_rgb_image();
+ test_twelve_bit_contiguous_rgb_image();
+ test_fourteen_bit_contiguous_rgb_image();
+ test_sixteen_bit_contiguous_rgb_image();
+ test_twenty_four_bit_contiguous_rgb_image();
+ test_thirty_two_bit_contiguous_rgb_image();
+ test_two_bit_seperated_rgb_image();
+ test_four_bit_seperated_rgb_image();
+ test_eight_bit_seperated_rgb_image();
+ test_ten_bit_seperated_rgb_image();
+ test_twelve_bit_seperated_rgb_image();
+ test_fourteen_bit_seperated_rgb_image();
+ test_sixteen_bit_seperated_rgb_image();
+ test_twenty_four_bit_seperated_rgb_image();
+ test_thirty_two_bit_seperated_rgb_image();
+ test_eight_bit_contiguous_cmyk_image();
+ test_sixteen_bit_contiguous_cmyk_image();
+ test_eight_bit_separated_cmyk_image();
+ test_sixteen_bit_separated_cmyk_image();
+#endif
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+ test_tiger_separated_strip_contig_08();
+ test_tiger_separated_strip_contig_16();
+ test_tiger_separated_strip_planar_08();
+ test_tiger_separated_strip_planar_16();
+#endif
+
+#if defined(BOOST_GIL_IO_USE_TIFF_LIBTIFF_TEST_SUITE_IMAGES) || defined(BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES)
+ return boost::report_errors();
+#endif
+}
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_old_test.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_old_test.cpp
new file mode 100644
index 000000000..326a75c18
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_old_test.cpp
@@ -0,0 +1,93 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff/old.hpp>
+
+#include <boost/mp11.hpp>
+#include <boost/core/lightweight_test.hpp>
+
+#include "paths.hpp"
+
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+// This test file will only test the old library's interface.
+// It's more of a compile time test than a runtime test.
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+
+void test_old_read_dimensions()
+{
+ boost::gil::point_t dim = gil::tiff_read_dimensions(tiff_filename);
+ BOOST_TEST_EQ(dim.x, 1000);
+ BOOST_TEST_EQ(dim.y, 600);
+}
+
+void test_old_read_image()
+{
+ gil::rgba8_image_t img;
+ gil::tiff_read_image(tiff_filename, img);
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+}
+
+void test_old_read_and_convert_image()
+{
+ gil::rgb8_image_t img;
+ gil::tiff_read_and_convert_image(tiff_filename, img);
+
+ BOOST_TEST_EQ(img.width(), 1000);
+ BOOST_TEST_EQ(img.height(), 600);
+}
+
+void test_old_read_view()
+{
+ gil::rgba8_image_t img(1000, 600);
+ gil::tiff_read_view(tiff_filename, gil::view(img));
+}
+
+void test_old_read_and_convert_view()
+{
+ gil::rgb8_image_t img(1000, 600);
+ gil::tiff_read_and_convert_view(tiff_filename, gil::view(img));
+}
+
+void test_old_dynamic_image()
+{
+ using my_img_types = mp11::mp_list
+ <
+ gil::gray8_image_t,
+ gil::gray16_image_t,
+ gil::rgba8_image_t,
+ gil::gray1_image_t
+ >;
+ gil::any_image<my_img_types> image;
+
+ gil::tiff_read_image(tiff_filename.c_str(), image);
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::tiff_write_view(tiff_out + "old_dynamic_image_test.tif", gil::view(image));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+int main()
+{
+ test_old_read_dimensions();
+ test_old_read_image();
+ test_old_read_and_convert_image();
+ test_old_read_view();
+ test_old_read_and_convert_view();
+ test_old_dynamic_image();
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_subimage_test.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_subimage_test.cpp
new file mode 100644
index 000000000..062525dad
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_subimage_test.cpp
@@ -0,0 +1,128 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <fstream>
+#include <sstream>
+
+#include "mandel_view.hpp"
+#include "paths.hpp"
+#include "subimage_test.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/stringize.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/comparison/less.hpp>
+#include <boost/preprocessor/repetition/repeat_from_to.hpp>
+
+#define BOOST_GIL_TEST_NAME_SUBIMAGE_TEST(n, data) \
+ BOOST_PP_CAT(BOOST_PP_CAT(BOOST_PP_CAT(test_, BOOST_PP_CAT(data, _)), n), bit_bit_aligned)
+
+#define BOOST_GIL_TEST_GENERATE_SUBIMAGE_TEST(z, n, data) \
+ void BOOST_GIL_TEST_NAME_SUBIMAGE_TEST(n, data) () \
+ { \
+ std::string filename_strip(tiff_in_GM + "tiger-" + BOOST_PP_STRINGIZE(data) + "-strip-"); \
+ std::string filename_tile(tiff_in_GM + "tiger-" + BOOST_PP_STRINGIZE(data) + "-tile-"); \
+ std::string padding(""); \
+ if (BOOST_PP_LESS(n, 10) == 1) \
+ padding = "0"; \
+ filename_strip = filename_strip + padding + BOOST_PP_STRINGIZE(n) + ".tif"; \
+ filename_tile = filename_tile + padding + BOOST_PP_STRINGIZE(n) + ".tif"; \
+ gil::bit_aligned_image1_type<n, gil::gray_layout_t>::type img1, img2, img3; \
+ gil::point_t top_left(10, 10); \
+ gil::point_t dim(32, 32); \
+ gil::image_read_settings<gil::tiff_tag> settings(top_left, dim); \
+ gil::read_image(filename_strip, img1, settings); \
+ gil::read_image(filename_tile, img2, settings); \
+ gil::read_image(filename_strip, img3, gil::tiff_tag()); \
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img1), gil::const_view(img2))); \
+ BOOST_TEST(gil::equal_pixels( \
+ gil::const_view(img1), gil::subimage_view(gil::view(img3), top_left, dim))); \
+ }
+
+#define BOOST_GIL_TEST_CALL_SUBIMAGE_TEST(z, n, data) \
+ BOOST_GIL_TEST_NAME_SUBIMAGE_TEST(n, data);
+
+BOOST_PP_REPEAT_FROM_TO(1, 8, BOOST_GIL_TEST_GENERATE_SUBIMAGE_TEST, minisblack)
+BOOST_PP_REPEAT_FROM_TO(9, 16, BOOST_GIL_TEST_GENERATE_SUBIMAGE_TEST, minisblack)
+BOOST_PP_REPEAT_FROM_TO(17, 27, BOOST_GIL_TEST_GENERATE_SUBIMAGE_TEST, minisblack)
+// TODO: there is a bug somewhere when the number of bits is 27 up to 31.
+
+void test_subimage_test_8()
+{
+ gil::gray8_image_t img1, img2, img3;
+ gil::point_t top_left(10, 10);
+ gil::point_t dim(32, 32);
+
+ gil::image_read_settings<gil::tiff_tag> settings(top_left, dim);
+
+ gil::read_image(tiff_in_GM + "tiger-minisblack-strip-08.tif", img1, settings);
+ gil::read_image(tiff_in_GM + "tiger-minisblack-tile-08.tif", img2, settings);
+ gil::read_image(tiff_in_GM + "tiger-minisblack-strip-08.tif", img3, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img1), gil::const_view(img2)));
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img1), gil::subimage_view(gil::view(img3), top_left, dim)));
+}
+
+void test_subimage_test_16()
+{
+ gil::gray16_image_t img1, img2, img3;
+ gil::point_t top_left(10, 10);
+ gil::point_t dim(32, 32);
+
+ gil::image_read_settings<gil::tiff_tag> settings(top_left, dim);
+
+ gil::read_image(tiff_in_GM + "tiger-minisblack-strip-16.tif", img1, settings);
+ gil::read_image(tiff_in_GM + "tiger-minisblack-tile-16.tif", img2, settings);
+ gil::read_image(tiff_in_GM + "tiger-minisblack-strip-16.tif", img3, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img1), gil::const_view(img2)));
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img1), gil::subimage_view(gil::view(img3), top_left, dim)));
+}
+
+void test_subimage_test_32()
+{
+ using gray32_pixel_t = gil::pixel<unsigned int, gil::gray_layout_t>;
+ gil::image<gray32_pixel_t, false> img1, img2, img3;
+
+ gil::point_t top_left(10, 10);
+ gil::point_t dim(32, 32);
+
+ gil::image_read_settings<gil::tiff_tag> settings(top_left, dim);
+
+ gil::read_image(tiff_in_GM + "tiger-minisblack-strip-32.tif", img1, settings);
+ gil::read_image(tiff_in_GM + "tiger-minisblack-tile-32.tif", img2, settings);
+ gil::read_image(tiff_in_GM + "tiger-minisblack-strip-32.tif", img3, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img1), gil::const_view(img2)));
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img1), gil::subimage_view(gil::view(img3), top_left, dim)));
+}
+
+int main()
+{
+ test_subimage_test_8();
+ test_subimage_test_16();
+ test_subimage_test_32();
+
+ BOOST_PP_REPEAT_FROM_TO(1, 8, BOOST_GIL_TEST_CALL_SUBIMAGE_TEST, minisblack)
+ BOOST_PP_REPEAT_FROM_TO(9, 16, BOOST_GIL_TEST_CALL_SUBIMAGE_TEST, minisblack)
+ BOOST_PP_REPEAT_FROM_TO(17, 27, BOOST_GIL_TEST_CALL_SUBIMAGE_TEST, minisblack)
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_test.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_test.cpp
new file mode 100644
index 000000000..f0c9d9972
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_test.cpp
@@ -0,0 +1,306 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#define BOOST_FILESYSTEM_VERSION 3
+#define BOOST_GIL_IO_ADD_FS_PATH_SUPPORT
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+#include <boost/mp11.hpp>
+
+#include <fstream>
+#include <sstream>
+#include <string>
+
+#include "mandel_view.hpp"
+#include "paths.hpp"
+#include "subimage_test.hpp"
+
+namespace fs = boost::filesystem;
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
+
+void test_read_image_info()
+{
+ {
+ using backend_t = gil::get_reader_backend<std::string const, gil::tiff_tag>::type;
+ backend_t backend = gil::read_image_info(tiff_filename, gil::tiff_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000u);
+ BOOST_TEST_EQ(backend._info._height, 600u);
+ }
+ {
+ std::ifstream in(tiff_filename.c_str(), std::ios::binary);
+
+ using backend_t = gil::get_reader_backend<std::ifstream, gil::tiff_tag>::type;
+ backend_t backend = gil::read_image_info(in, gil::tiff_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000u);
+ BOOST_TEST_EQ(backend._info._height, 600u);
+ }
+ {
+ TIFF* file = TIFFOpen(tiff_filename.c_str(), "r");
+
+ using backend_t = gil::get_reader_backend<FILE*, gil::tiff_tag>::type;
+ backend_t backend = gil::read_image_info(file, gil::tiff_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000u);
+ BOOST_TEST_EQ(backend._info._height, 600u);
+ }
+ {
+ fs::path my_path(tiff_filename);
+
+ using backend_t = gil::get_reader_backend<fs::path, gil::tiff_tag>::type;
+ backend_t backend = gil::read_image_info(my_path, gil::tiff_tag());
+
+ BOOST_TEST_EQ(backend._info._width, 1000u);
+ BOOST_TEST_EQ(backend._info._height, 600u);
+ }
+}
+
+void test_read_image()
+{
+ {
+ gil::rgba8_image_t img;
+ gil::read_image(tiff_filename, img, gil::tiff_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+ {
+ std::ifstream in(tiff_filename.c_str(), std::ios::binary);
+
+ gil::rgba8_image_t img;
+ gil::read_image(in, img, gil::tiff_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+ {
+ TIFF* file = TIFFOpen(tiff_filename.c_str(), "r");
+
+ gil::rgba8_image_t img;
+ gil::read_image(file, img, gil::tiff_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+}
+
+void test_read_and_convert_image()
+{
+ {
+ gil::rgb8_image_t img;
+ gil::read_and_convert_image(tiff_filename, img, gil::tiff_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+ {
+ std::ifstream in(tiff_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img;
+ gil::read_and_convert_image(in, img, gil::tiff_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+ {
+ TIFF* file = TIFFOpen(tiff_filename.c_str(), "r");
+
+ gil::rgb8_image_t img;
+ gil::read_and_convert_image(file, img, gil::tiff_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+}
+
+void test_read_and_convert_image_2()
+{
+ gil::gray8_image_t img;
+ gil::read_and_convert_image(tiff_filename, img, gil::tiff_tag());
+
+ gil::rgba8_image_t img2;
+ gil::read_image(tiff_filename, img2, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(
+ gil::const_view(img),
+ gil::color_converted_view<gil::gray8_pixel_t>(gil::const_view(img2))));
+}
+
+void test_read_view()
+{
+ {
+ gil::rgba8_image_t img(1000, 600);
+ gil::read_view(tiff_filename, gil::view(img), gil::tiff_tag());
+ }
+ {
+ std::ifstream in(tiff_filename.c_str(), std::ios::binary);
+
+ gil::rgba8_image_t img(1000, 600);
+ gil::read_view(in, gil::view(img), gil::tiff_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+ {
+ TIFF* file = TIFFOpen(tiff_filename.c_str(), "r");
+
+ gil::rgba8_image_t img(1000, 600);
+ gil::read_view(file, gil::view(img), gil::tiff_tag());
+ }
+}
+
+void test_read_and_convert_view()
+{
+ {
+ gil::rgb8_image_t img(1000, 600);
+ gil::read_and_convert_view(tiff_filename, gil::view(img), gil::tiff_tag());
+ }
+ {
+ std::ifstream in(tiff_filename.c_str(), std::ios::binary);
+
+ gil::rgb8_image_t img(1000, 600);
+ gil::read_and_convert_view(in, gil::view(img), gil::tiff_tag());
+
+ BOOST_TEST_EQ(img.width(), 1000u);
+ BOOST_TEST_EQ(img.height(), 600u);
+ }
+ {
+ TIFF* file = TIFFOpen(tiff_filename.c_str(), "r");
+
+ gil::rgb8_image_t img(1000, 600);
+ gil::read_and_convert_view(file, gil::view(img), gil::tiff_tag());
+ }
+}
+
+void test_write_view()
+{
+ auto const b = gil::rgb8_pixel_t(0, 0, 255);
+ auto const g = gil::rgb8_pixel_t(0, 255, 0);
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ {
+ std::string filename(tiff_out + "write_test_string.tif");
+
+ gil::write_view(filename, create_mandel_view(320, 240, b, g), gil::tiff_tag());
+ }
+ {
+ std::string filename(tiff_out + "write_test_ofstream.tif");
+ std::ofstream out(filename.c_str(), std::ios_base::binary);
+
+ gil::write_view(out, create_mandel_view(320, 240, b, g), gil::tiff_tag());
+ }
+ {
+ std::string filename(tiff_out + "write_test_tiff.tif");
+ TIFF* file = TIFFOpen(filename.c_str(), "w");
+
+ gil::write_view(file, create_mandel_view(320, 240, b, g), gil::tiff_tag());
+ }
+ {
+ std::string filename(tiff_out + "write_test_info.tif");
+
+ gil::image_write_info<gil::tiff_tag> info;
+ gil::write_view(filename, create_mandel_view(320, 240, b, g), info);
+ }
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_stream()
+{
+ // 1. Read an image.
+ std::ifstream in(tiff_filename.c_str(), std::ios::binary);
+
+ gil::rgba8_image_t img;
+ gil::read_image(in, img, gil::tiff_tag());
+
+ // 2. Write image to in-memory buffer.
+ std::stringstream out_buffer(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
+ gil::write_view(out_buffer, gil::view(img), gil::tiff_tag());
+
+ // 3. Copy in-memory buffer to another.
+ std::stringstream in_buffer(std::ios_base::in | std::ios_base::out | std::ios_base::binary);
+ in_buffer << out_buffer.rdbuf();
+
+ // 4. Read in-memory buffer to gil image
+ gil::rgba8_image_t dst;
+ gil::read_image(in_buffer, dst, gil::tiff_tag());
+
+ // 5. Write out image.
+ std::string filename(tiff_out + "stream_test.tif");
+ std::ofstream out(filename.c_str(), std::ios_base::binary);
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(out, gil::view(dst), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_stream_2()
+{
+ std::filebuf in_buf;
+ if (!in_buf.open(tiff_filename.c_str(), std::ios::in | std::ios::binary))
+ {
+ BOOST_TEST(false);
+ }
+ std::istream in(&in_buf);
+
+ gil::rgba8_image_t img;
+ gil::read_image(in, img, gil::tiff_tag());
+}
+
+void test_subimage()
+{
+ run_subimage_test<gil::rgba8_image_t, gil::tiff_tag>(
+ tiff_filename, gil::point_t(0, 0), gil::point_t(50, 50));
+
+ run_subimage_test<gil::rgba8_image_t, gil::tiff_tag>(
+ tiff_filename, gil::point_t(50, 50), gil::point_t(50, 50));
+}
+
+void test_dynamic_image()
+{
+ // FIXME: This test has been disabled for now because of compilation issues with MSVC10.
+
+ using my_img_types = mp11::mp_list
+ <
+ gil::gray8_image_t,
+ gil::gray16_image_t,
+ gil::rgb8_image_t,
+ gil::rgba8_image_t,
+ gil::gray1_image_t
+ >;
+ gil::any_image<my_img_types> image;
+
+ gil::read_image(tiff_filename.c_str(), image, gil::tiff_tag());
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "dynamic_image_test.tif", gil::view(image), gil::tiff_tag());
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+int main()
+{
+ test_read_image_info();
+ test_read_image();
+ test_read_and_convert_image();
+ test_read_and_convert_image_2();
+ test_read_view();
+ test_read_and_convert_view();
+ test_write_view();
+ test_stream();
+ test_stream_2();
+ test_subimage();
+ test_dynamic_image();
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_TEST_ALLOW_READING_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_float_test.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_float_test.cpp
new file mode 100644
index 000000000..c5236de96
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_float_test.cpp
@@ -0,0 +1,111 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "paths.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+void test_read_minisblack_float_tile_and_strip32()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-minisblack-float-strip-32.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-minisblack-float-tile-32.tif");
+
+ gil::gray32f_image_t img_strip, img_tile;
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+void test_read_minisblack_float_tile_and_strip64()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-minisblack-float-strip-64.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-minisblack-float-tile-64.tif");
+
+ // FIXME: boost/gil/extension/io/tiff/detail/is_allowed.hpp:229:49: error: ambiguous partial specializations of 'Format_Type
+ // discovered during https://github.com/boostorg/gil/issues/461
+ //gil::gray64f_image_t img_strip, img_tile;
+ //gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ //gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+ //BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+void test_read_rgb_float_tile_and_strip_planar32()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-float-strip-planar-32.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-rgb-float-tile-planar-32.tif");
+
+ gil::rgb32f_image_t img_strip, img_tile;
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+void test_read_rgb_float_tile_and_strip_contig32()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-float-strip-contig-32.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-rgb-float-tile-contig-32.tif");
+
+ gil::rgb32f_image_t img_strip, img_tile;
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+void test_read_rgb_float_tile_and_strip_contig64()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-float-strip-contig-64.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-rgb-float-tile-contig-64.tif");
+
+ // FIXME: boost/gil/extension/io/tiff/detail/is_allowed.hpp:229:49: error: ambiguous partial specializations of 'Format_Type
+ // discovered during https://github.com/boostorg/gil/issues/461
+ //gil::rgb64f_image_t img_strip, img_tile;
+ //gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ //gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+ //BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+void test_read_rgb_float_tile_and_strip64()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-float-strip-planar-64.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-rgb-float-tile-planar-64.tif");
+
+ // FIXME: boost/gil/extension/io/tiff/detail/is_allowed.hpp:229:49: error: ambiguous partial specializations of 'Format_Type
+ // discovered during https://github.com/boostorg/gil/issues/461
+ //gil::rgb64f_image_t img_strip, img_tile;
+ //gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ //gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+ //BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+int main()
+{
+ test_read_minisblack_float_tile_and_strip32();
+ test_read_minisblack_float_tile_and_strip64();
+ test_read_rgb_float_tile_and_strip_planar32();
+ test_read_rgb_float_tile_and_strip_contig32();
+ test_read_rgb_float_tile_and_strip_contig64();
+ test_read_rgb_float_tile_and_strip64();
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_test_1-10.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_test_1-10.cpp
new file mode 100644
index 000000000..9311b4c6e
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_test_1-10.cpp
@@ -0,0 +1,47 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "tiff_tiled_read_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+BOOST_PP_REPEAT_FROM_TO(1, 8, BOOST_GIL_TEST_GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_MINISBLACK, minisblack)
+BOOST_PP_REPEAT_FROM_TO(9, 11, BOOST_GIL_TEST_GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_MINISBLACK, minisblack)
+
+void test_read_tile_and_compare_with_minisblack_strip_8()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-minisblack-strip-08.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-minisblack-tile-08.tif");
+
+ gil::gray8_image_t img_strip, img_tile;
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+int main()
+{
+ test_read_tile_and_compare_with_minisblack_strip_8();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_test_11-20.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_test_11-20.cpp
new file mode 100644
index 000000000..2ae10db91
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_test_11-20.cpp
@@ -0,0 +1,48 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "tiff_tiled_read_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+BOOST_PP_REPEAT_FROM_TO(11, 16, BOOST_GIL_TEST_GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_MINISBLACK, minisblack )
+BOOST_PP_REPEAT_FROM_TO(17, 21, BOOST_GIL_TEST_GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_MINISBLACK, minisblack )
+
+void test_read_tile_and_compare_with_minisblack_strip_16()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-minisblack-strip-16.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-minisblack-tile-16.tif");
+
+ gil::gray16_image_t img_strip, img_tile;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+int main()
+{
+ test_read_tile_and_compare_with_minisblack_strip_16();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_test_21-31_32-64.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_test_21-31_32-64.cpp
new file mode 100644
index 000000000..cc166bcf2
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_test_21-31_32-64.cpp
@@ -0,0 +1,64 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+#include <string>
+
+#include "tiff_tiled_read_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+BOOST_PP_REPEAT_FROM_TO(21, 32, BOOST_GIL_TEST_GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_MINISBLACK, minisblack )
+
+void test_read_tile_and_compare_with_minisblack_strip_32()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-minisblack-strip-32.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-minisblack-tile-32.tif");
+
+ using gray32_pixel_t = gil::pixel<unsigned int, gil::gray_layout_t>;
+ gil::image<gray32_pixel_t, false> img_strip, img_tile;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST_EQ(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)), true);
+}
+
+void test_read_tile_and_compare_with_minisblack_strip_64()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-minisblack-strip-64.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-minisblack-tile-64.tif");
+
+ using gray64_pixel_t = gil::pixel<std::uint64_t, gil::gray_layout_t>;
+ gil::image<gray64_pixel_t, false> img_strip, img_tile;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST_EQ(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)), true);
+}
+
+int main()
+{
+ test_read_tile_and_compare_with_minisblack_strip_32();
+ test_read_tile_and_compare_with_minisblack_strip_64();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_write_test_1-10.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_write_test_1-10.cpp
new file mode 100644
index 000000000..d069d28c2
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_write_test_1-10.cpp
@@ -0,0 +1,56 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "tiff_tiled_write_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+BOOST_PP_REPEAT_FROM_TO(1, 8 , GENERATE_WRITE_TILE_BIT_ALIGNED_MINISBLACK, minisblack)
+BOOST_PP_REPEAT_FROM_TO(9, 11, GENERATE_WRITE_TILE_BIT_ALIGNED_MINISBLACK, minisblack)
+
+void test_write_minisblack_tile_and_compare_with_8()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-minisblack-strip-08.tif");
+
+ gil::gray8_image_t img_strip, img_saved;
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+
+ gil::image_write_info<gil::tiff_tag> info;
+ info._is_tiled = true;
+ info._tile_width = info._tile_length = 16;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(
+ tiff_out + "write_minisblack_tile_and_compare_with_8.tif", gil::view(img_strip), info);
+ gil::read_image(
+ tiff_out + "write_minisblack_tile_and_compare_with_8.tif", img_saved, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_saved)));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+int main()
+{
+ test_write_minisblack_tile_and_compare_with_8();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_write_test_11-20.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_write_test_11-20.cpp
new file mode 100644
index 000000000..f49f3b8b8
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_write_test_11-20.cpp
@@ -0,0 +1,54 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "tiff_tiled_write_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+BOOST_PP_REPEAT_FROM_TO(11, 16, GENERATE_WRITE_TILE_BIT_ALIGNED_MINISBLACK, minisblack)
+BOOST_PP_REPEAT_FROM_TO(17, 21, GENERATE_WRITE_TILE_BIT_ALIGNED_MINISBLACK, minisblack)
+
+void test_write_minisblack_tile_and_compare_with_16()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-minisblack-strip-16.tif");
+
+ gil::gray16_image_t img_strip, img_saved;
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+
+ gil::image_write_info<gil::tiff_tag> info;
+ info._is_tiled = true;
+ info._tile_width = info._tile_length = 16;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(tiff_out + "write_minisblack_tile_and_compare_with_16.tif", gil::view(img_strip), info);
+ gil::read_image(tiff_out + "write_minisblack_tile_and_compare_with_16.tif", img_saved, gil::tiff_tag());
+
+ BOOST_TEST_EQ(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_saved)), true);
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+int main()
+{
+ test_write_minisblack_tile_and_compare_with_16();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_write_test_21-31_32-64.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_write_test_21-31_32-64.cpp
new file mode 100644
index 000000000..ff457bc45
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_minisblack_write_test_21-31_32-64.cpp
@@ -0,0 +1,79 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+#include <string>
+
+#include "tiff_tiled_write_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+BOOST_PP_REPEAT_FROM_TO(21, 32, GENERATE_WRITE_TILE_BIT_ALIGNED_MINISBLACK, minisblack)
+
+void test_write_tile_and_compare_with_minisblack_strip_32()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-minisblack-strip-32.tif");
+
+ using gray32_pixel_t = gil::pixel<unsigned int, gil::gray_layout_t>;
+ gil::image<gray32_pixel_t, false> img_strip, img_saved;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+
+ gil::image_write_info<gil::tiff_tag> info;
+ info._is_tiled = true;
+ info._tile_width = info._tile_length = 16;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(
+ tiff_out + "write_minisblack_tile_and_compare_with_32.tif", gil::view(img_strip), info);
+ gil::read_image(tiff_out + "write_minisblack_tile_and_compare_with_32.tif", img_saved, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_saved)));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_write_tile_and_compare_with_minisblack_strip_64()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-minisblack-strip-64.tif");
+
+ using gray64_pixel_t = gil::pixel<std::uint64_t, gil::gray_layout_t>;
+ gil::image<gray64_pixel_t, false> img_strip, img_saved;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+
+ gil::image_write_info<gil::tiff_tag> info;
+ info._is_tiled = true;
+ info._tile_width = info._tile_length = 16;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ write_view(tiff_out + "write_minisblack_tile_and_compare_with_64.tif", gil::view(img_strip), info);
+ gil::read_image(tiff_out + "write_minisblack_tile_and_compare_with_64.tif", img_saved, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_saved)));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+int main()
+{
+ test_write_tile_and_compare_with_minisblack_strip_32();
+ test_write_tile_and_compare_with_minisblack_strip_64();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_test_1-8.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_test_1-8.cpp
new file mode 100644
index 000000000..c6cb6d1f6
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_test_1-8.cpp
@@ -0,0 +1,31 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "tiff_tiled_read_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+// CHH - not supported palette
+//BOOST_PP_REPEAT_FROM_TO(1, 9, GENERATE_TILE_STRIP_COMPARISON_PALETTE, palette )
+
+int main()
+{
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_test_8-16.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_test_8-16.cpp
new file mode 100644
index 000000000..5610b9689
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_test_8-16.cpp
@@ -0,0 +1,31 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "tiff_tiled_read_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+// CHH - not supported palette
+//BOOST_PP_REPEAT_FROM_TO(9, 17, GENERATE_TILE_STRIP_COMPARISON_PALETTE, palette )
+
+int main()
+{
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_write_test_1-8.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_write_test_1-8.cpp
new file mode 100644
index 000000000..e5b01296a
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_write_test_1-8.cpp
@@ -0,0 +1,31 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "tiff_tiled_write_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+// CHH - not supported palette
+//BOOST_PP_REPEAT_FROM_TO(1, 9, GENERATE_WRITE_TILE_BIT_ALIGNED_PALETTE, palette )
+
+int main()
+{
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_write_test_8-16.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_write_test_8-16.cpp
new file mode 100644
index 000000000..345b79dc6
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_palette_write_test_8-16.cpp
@@ -0,0 +1,31 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "tiff_tiled_write_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+// CHH - not supported palette
+//BOOST_PP_REPEAT_FROM_TO(9, 17, GENERATE_WRITE_TILE_BIT_ALIGNED_PALETTE, palette )
+
+int main()
+{
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_read_macros.hpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_read_macros.hpp
new file mode 100644
index 000000000..201a799dd
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_read_macros.hpp
@@ -0,0 +1,114 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifndef BOOST_GIL_TEST_EXTENSION_IO_TIFF_TIFF_TILED_READ_MACROS_HPP
+#define BOOST_GIL_TEST_EXTENSION_IO_TIFF_TIFF_TILED_READ_MACROS_HPP
+
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff/read.hpp>
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/stringize.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/comparison/less.hpp>
+#include <boost/preprocessor/repetition/repeat_from_to.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "paths.hpp"
+
+// TODO: Rename macros to use BOOST_GIL_ prefix. See https://github.com/boostorg/gil/issues/410 ~mloskot
+// TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+#define BOOST_GIL_TEST_NAME_TILE_STRIP_COMPARISON_BIT_ALIGNED_RGB(n, data) \
+ BOOST_PP_CAT( \
+ BOOST_PP_CAT( \
+ BOOST_PP_CAT( \
+ BOOST_PP_CAT( \
+ BOOST_PP_CAT(read_tile_and_compare_with_, BOOST_PP_TUPLE_ELEM(2, 0, data)), \
+ BOOST_PP_TUPLE_ELEM(2, 1, data)), \
+ _strip_), \
+ n), \
+ bit_bit_aligned)
+
+#define BOOST_GIL_TEST_GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_RGB(z, n, data) \
+ void BOOST_GIL_TEST_NAME_TILE_STRIP_COMPARISON_BIT_ALIGNED_RGB(n, data)() \
+ { \
+ namespace gil = boost::gil; \
+ std::string filename_strip( \
+ tiff_in_GM + "tiger-" + BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(2, 0, data)) + \
+ "-strip-" + BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(2, 1, data)) + "-"); \
+ std::string filename_tile( \
+ tiff_in_GM + "tiger-" + BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(2, 0, data)) + \
+ "-tile-" + BOOST_PP_STRINGIZE(BOOST_PP_TUPLE_ELEM(2, 1, data)) + "-"); \
+ std::string padding(""); \
+ if (BOOST_PP_LESS(n, 10) == 1) \
+ padding = "0"; \
+ filename_strip = filename_strip + padding + BOOST_PP_STRINGIZE(n) + ".tif"; \
+ filename_tile = filename_tile + padding + BOOST_PP_STRINGIZE(n) + ".tif"; \
+ gil::bit_aligned_image3_type<n, n, n, gil::rgb_layout_t>::type img_strip, img_tile; \
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag()); \
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag()); \
+ BOOST_TEST_EQ( \
+ gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)), true); \
+ }
+
+// Special case for minisblack images
+#define BOOST_GIL_TEST_NAME_TILE_TILE_STRIP_COMPARISON_BIT_ALIGNED_MINISBLACK(n, data) \
+ BOOST_PP_CAT( \
+ BOOST_PP_CAT(BOOST_PP_CAT(BOOST_PP_CAT(read_tile_and_compare_with_, data), _strip_), n), \
+ bit_bit_aligned)
+
+#define BOOST_GIL_TEST_GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_MINISBLACK(z, n, data) \
+ void BOOST_GIL_TEST_NAME_TILE_TILE_STRIP_COMPARISON_BIT_ALIGNED_MINISBLACK(n, data)() \
+ { \
+ namespace gil = boost::gil; \
+ std::string filename_strip(tiff_in_GM + "tiger-" + BOOST_PP_STRINGIZE(data) + "-strip-"); \
+ std::string filename_tile(tiff_in_GM + "tiger-" + BOOST_PP_STRINGIZE(data) + "-tile-"); \
+ std::string padding(""); \
+ if (BOOST_PP_LESS(n, 10) == 1) \
+ padding = "0"; \
+ filename_strip = filename_strip + padding + BOOST_PP_STRINGIZE(n) + ".tif"; \
+ filename_tile = filename_tile + padding + BOOST_PP_STRINGIZE(n) + ".tif"; \
+ gil::bit_aligned_image1_type<n, gil::gray_layout_t>::type img_strip, img_tile; \
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag()); \
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag()); \
+ BOOST_TEST_EQ( \
+ gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)), true); \
+ }
+
+// Special case for palette images
+#define BOOST_GIL_TEST_NAME_TILE_STRIP_COMPARISON_PALETTE(n, data) \
+ BOOST_PP_CAT( \
+ BOOST_PP_CAT(BOOST_PP_CAT(BOOST_PP_CAT(read_tile_and_compare_with_, data), _strip_), n), \
+ bit)
+
+#define BOOST_GIL_TEST_GENERATE_TILE_STRIP_COMPARISON_PALETTE(z, n, data) \
+ void BOOST_GIL_TEST_NAME_TILE_STRIP_COMPARISON_PALETTE(n, data)() \
+ { \
+ namespace gil = boost::gil; \
+ std::string filename_strip(tiff_in_GM + "tiger-" + BOOST_PP_STRINGIZE(data) + "-strip-"); \
+ std::string filename_tile(tiff_in_GM + "tiger-" + BOOST_PP_STRINGIZE(data) + "-tile-"); \
+ std::string padding(""); \
+ if (BOOST_PP_LESS(n, 10) == 1) \
+ padding = "0"; \
+ filename_strip = filename_strip + padding + BOOST_PP_STRINGIZE(n) + ".tif"; \
+ filename_tile = filename_tile + padding + BOOST_PP_STRINGIZE(n) + ".tif"; \
+ gil::rgb16_image_t img_strip, img_tile; \
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag()); \
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag()); \
+ BOOST_TEST_EQ( \
+ gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)), true); \
+ }
+
+#define BOOST_GIL_TEST_CALL_TILE_STRIP_COMPARISON_PALETTE(z, n, data) \
+ BOOST_GIL_TEST_NAME_TILE_STRIP_COMPARISON_PALETTE(n, data);
+
+
+#endif // BOOST_GIL_TEST_EXTENSION_IO_TIFF_TIFF_TILED_READ_MACROS_HPP
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_test_1-10.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_test_1-10.cpp
new file mode 100644
index 000000000..8f9e09f90
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_test_1-10.cpp
@@ -0,0 +1,48 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "tiff_tiled_read_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+BOOST_PP_REPEAT_FROM_TO(1, 8, BOOST_GIL_TEST_GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_RGB, (rgb, contig))
+BOOST_PP_REPEAT_FROM_TO(9, 11, BOOST_GIL_TEST_GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_RGB, (rgb, contig))
+
+void test_read_tile_and_compare_with_rgb_contig_strip_8()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-strip-contig-08.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-rgb-tile-contig-08.tif");
+
+ gil::rgb8_image_t img_strip, img_tile;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+int main()
+{
+ test_read_tile_and_compare_with_rgb_contig_strip_8();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_test_11-20.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_test_11-20.cpp
new file mode 100644
index 000000000..f82139194
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_test_11-20.cpp
@@ -0,0 +1,49 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "tiff_tiled_read_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+// FIXME: The (rgb, contig) construct does not seem to work! ~mloskot
+BOOST_PP_REPEAT_FROM_TO(11, 16, GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_RGB, (rgb, contig))
+BOOST_PP_REPEAT_FROM_TO(17, 21, GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_RGB, (rgb, contig))
+
+void test_read_tile_and_compare_with_rgb_contig_strip_16()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-strip-contig-16.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-rgb-tile-contig-16.tif");
+
+ gil::rgb16_image_t img_strip, img_tile;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+int main()
+{
+ test_read_tile_and_compare_with_rgb_contig_strip_8();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_test_21-31_32_64.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_test_21-31_32_64.cpp
new file mode 100644
index 000000000..13f6a71f5
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_test_21-31_32_64.cpp
@@ -0,0 +1,65 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+#include <string>
+
+#include "tiff_tiled_read_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+// FIXME: The (rgb, planar) construct does not seem to work! ~mloskot
+BOOST_PP_REPEAT_FROM_TO(21, 32, GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_RGB, (rgb, contig))
+
+void test_read_tile_and_compare_with_rgb_contig_strip_32()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-strip-contig-32.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-rgb-tile-contig-32.tif");
+
+ using rgb32_pixel_t = gil::pixel<unsigned int, gil::rgb_layout_t>;
+ gil::image<rgb32_pixel_t, false> img_strip, img_tile;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+void test_read_tile_and_compare_with_rgb_contig_strip_64()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-strip-contig-64.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-rgb-tile-contig-64.tif");
+
+ using rgb64_pixel_t = gil::pixel<std::uint64_t, gil::rgb_layout_t>;
+ gil::image<rgb64_pixel_t, false> img_strip, img_tile;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+int main()
+{
+ test_read_tile_and_compare_with_rgb_contig_strip_32();
+ test_read_tile_and_compare_with_rgb_contig_strip_64();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_write_test_1-10.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_write_test_1-10.cpp
new file mode 100644
index 000000000..222d036ae
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_write_test_1-10.cpp
@@ -0,0 +1,59 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "tiff_tiled_write_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+BOOST_PP_REPEAT_FROM_TO(1, 8, GENERATE_WRITE_TILE_BIT_ALIGNED_RGB, rgb)
+BOOST_PP_REPEAT_FROM_TO(9, 11, GENERATE_WRITE_TILE_BIT_ALIGNED_RGB, rgb)
+
+void test_write_tile_and_compare_with_rgb_strip_contig_8()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-strip-contig-08.tif");
+
+ gil::rgb8_image_t img_strip, img_saved;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+
+ gil::image_write_info<gil::tiff_tag> info;
+ info._is_tiled = true;
+ info._tile_width = info._tile_length = 16;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(
+ tiff_out + "write_tile_and_compare_with_rgb_strip_contig_8.tif", gil::view(img_strip),
+ info);
+ gil::read_image(
+ tiff_out + "write_tile_and_compare_with_rgb_strip_contig_8.tif", img_saved,
+ gil::tiff_tag());
+
+ BOOST_TEST_EQ(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_saved)), true);
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+int main()
+{
+ test_write_tile_and_compare_with_rgb_strip_contig_8();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_write_test_11-20.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_write_test_11-20.cpp
new file mode 100644
index 000000000..257d75811
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_write_test_11-20.cpp
@@ -0,0 +1,59 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "tiff_tiled_write_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+BOOST_PP_REPEAT_FROM_TO(11, 16, GENERATE_WRITE_TILE_BIT_ALIGNED_RGB, rgb)
+BOOST_PP_REPEAT_FROM_TO(17, 21, GENERATE_WRITE_TILE_BIT_ALIGNED_RGB, rgb)
+
+void test_write_tile_and_compare_with_rgb_strip_contig_16()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-strip-contig-16.tif");
+
+ gil::rgb16_image_t img_strip, img_saved;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+
+ gil::image_write_info<gil::tiff_tag> info;
+ info._is_tiled = true;
+ info._tile_width = info._tile_length = 16;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(
+ tiff_out + "write_tile_and_compare_with_rgb_strip_contig_16.tif", gil::view(img_strip),
+ info);
+ gil::read_image(
+ tiff_out + "write_tile_and_compare_with_rgb_strip_contig_16.tif", img_saved,
+ gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_saved)));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+int main()
+{
+ test_write_tile_and_compare_with_rgb_strip_contig_16();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_write_test_21-31_32_64.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_write_test_21-31_32_64.cpp
new file mode 100644
index 000000000..54ff02819
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_contig_write_test_21-31_32_64.cpp
@@ -0,0 +1,86 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+#include <string>
+
+#include "tiff_tiled_write_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+BOOST_PP_REPEAT_FROM_TO(21, 31, GENERATE_WRITE_TILE_BIT_ALIGNED_RGB, rgb)
+
+void test_write_tile_and_compare_with_rgb_strip_contig_32()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-strip-contig-32.tif");
+
+ using rgb32_pixel_t = gil::pixel<unsigned int, gil::rgb_layout_t>;
+ gil::image<rgb32_pixel_t, false> img_strip, img_saved;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+
+ gil::image_write_info<gil::tiff_tag> info;
+ info._is_tiled = true;
+ info._tile_width = info._tile_length = 16;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(
+ tiff_out + "write_tile_and_compare_with_rgb_strip_contig_32.tif", gil::view(img_strip),
+ info);
+ gil::read_image(
+ tiff_out + "write_tile_and_compare_with_rgb_strip_contig_32.tif", img_saved,
+ gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_saved)));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+void test_write_tile_and_compare_with_rgb_strip_contig_64()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-strip-contig-64.tif");
+
+ using rgb64_pixel_t = gil::pixel<std::uint64_t, gil::rgb_layout_t>;
+ gil::image<rgb64_pixel_t, false> img_strip, img_saved;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+
+ gil::image_write_info<gil::tiff_tag> info;
+ info._is_tiled = true;
+ info._tile_width = info._tile_length = 16;
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+ gil::write_view(
+ tiff_out + "write_tile_and_compare_with_rgb_strip_contig_64.tif", gil::view(img_strip),
+ info);
+ gil::read_image(
+ tiff_out + "write_tile_and_compare_with_rgb_strip_contig_64.tif", img_saved,
+ gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_saved)));
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+}
+
+int main()
+{
+ test_write_tile_and_compare_with_rgb_strip_contig_32();
+ test_write_tile_and_compare_with_rgb_strip_contig_64();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_planar_test_1-10.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_planar_test_1-10.cpp
new file mode 100644
index 000000000..ba54b1647
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_planar_test_1-10.cpp
@@ -0,0 +1,49 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "tiff_tiled_read_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+// FIXME: The (rgb, planar) construct does not seem to work! ~mloskot
+BOOST_PP_REPEAT_FROM_TO(1, 8, GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_RGB, (rgb, planar))
+BOOST_PP_REPEAT_FROM_TO(9, 11, GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_RGB, (rgb, planar))
+
+void test_read_tile_and_compare_with_rgb_planar_strip_8()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-strip-planar-08.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-rgb-tile-planar-08.tif");
+
+ gil::rgb8_image_t img_strip, img_tile;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+int main()
+{
+ test_read_tile_and_compare_with_rgb_planar_strip_8();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_planar_test_11-20.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_planar_test_11-20.cpp
new file mode 100644
index 000000000..69438c8ff
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_planar_test_11-20.cpp
@@ -0,0 +1,48 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "tiff_tiled_read_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+BOOST_PP_REPEAT_FROM_TO(11, 16, GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_RGB, (rgb, planar))
+BOOST_PP_REPEAT_FROM_TO(17, 21, GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_RGB, (rgb, planar))
+
+void test_read_tile_and_compare_with_rgb_planar_strip_16()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-strip-planar-16.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-rgb-tile-planar-16.tif");
+
+ gil::rgb16_image_t img_strip, img_tile;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+int main()
+{
+ test_read_tile_and_compare_with_rgb_planar_strip_16();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_planar_test_21-31_32_64.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_planar_test_21-31_32_64.cpp
new file mode 100644
index 000000000..bc5b02f8a
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_rgb_planar_test_21-31_32_64.cpp
@@ -0,0 +1,65 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+#include <string>
+
+#include "tiff_tiled_read_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+// FIXME: The (rgb, planar) construct does not seem to work! ~mloskot
+BOOST_PP_REPEAT_FROM_TO(21, 32, GENERATE_TILE_STRIP_COMPARISON_BIT_ALIGNED_RGB, (rgb, planar))
+
+void test_read_tile_and_compare_with_rgb_planar_strip_32()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-strip-planar-32.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-rgb-tile-planar-32.tif");
+
+ using rgb32_pixel_t = gil::pixel<unsigned int, gil::rgb_layout_t>;
+ gil::image<rgb32_pixel_t, false> img_strip, img_tile;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+void test_read_tile_and_compare_with_rgb_planar_strip_64()
+{
+ std::string filename_strip(tiff_in_GM + "tiger-rgb-strip-planar-64.tif");
+ std::string filename_tile(tiff_in_GM + "tiger-rgb-tile-planar-64.tif");
+
+ using rgb64_pixel_t = gil::pixel<std::uint64_t, gil::rgb_layout_t>;
+ gil::image<rgb64_pixel_t, false> img_strip, img_tile;
+
+ gil::read_image(filename_strip, img_strip, gil::tiff_tag());
+ gil::read_image(filename_tile, img_tile, gil::tiff_tag());
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_tile)));
+}
+
+int main()
+{
+ test_read_tile_and_compare_with_rgb_planar_strip_32();
+ test_read_tile_and_compare_with_rgb_planar_strip_64();
+
+ // TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_test.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_test.cpp
new file mode 100644
index 000000000..6a29d1c7a
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_test.cpp
@@ -0,0 +1,84 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <string>
+
+#include "tiff_tiled_read_macros.hpp"
+
+namespace gil = boost::gil;
+
+#ifdef BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
+
+void test_read_info_tile_minisblack_float()
+{
+ using backend_t = gil::get_reader_backend<std::string const, gil::tiff_tag>::type;
+ backend_t backend =
+ gil::read_image_info(tiff_in_GM + "tiger-minisblack-float-tile-16.tif", gil::tiff_tag());
+
+ BOOST_TEST_EQ(backend._info._tile_width, 16);
+ BOOST_TEST_EQ(backend._info._tile_length, 16);
+}
+
+void test_read_info_tile_minisblack()
+{
+ using backend_t = gil::get_reader_backend<std::string const, gil::tiff_tag>::type;
+ backend_t backend =
+ gil::read_image_info(tiff_in_GM + "tiger-minisblack-tile-08.tif", gil::tiff_tag());
+
+ BOOST_TEST_EQ(backend._info._tile_width, 16);
+ BOOST_TEST_EQ(backend._info._tile_length, 16);
+}
+
+void test_read_info_tile_palette()
+{
+ using backend_t = gil::get_reader_backend<std::string const, gil::tiff_tag>::type;
+ backend_t backend =
+ gil::read_image_info(tiff_in_GM + "tiger-palette-tile-08.tif", gil::tiff_tag());
+
+ BOOST_TEST_EQ(backend._info._tile_width, 16);
+ BOOST_TEST_EQ(backend._info._tile_length, 16);
+}
+
+void test_read_info_tile_rgb()
+{
+ using backend_t = gil::get_reader_backend<std::string const, gil::tiff_tag>::type;
+ backend_t backend =
+ gil::read_image_info(tiff_in_GM + "tiger-rgb-tile-contig-08.tif", gil::tiff_tag());
+
+ BOOST_TEST_EQ(backend._info._tile_width, 16);
+ BOOST_TEST_EQ(backend._info._tile_length, 16);
+}
+
+void test_read_info_tile_planar()
+{
+ using backend_t = gil::get_reader_backend<std::string const, gil::tiff_tag>::type;
+ backend_t backend =
+ gil::read_image_info(tiff_in_GM + "tiger-rgb-tile-planar-08.tif", gil::tiff_tag());
+
+ BOOST_TEST_EQ(backend._info._tile_width, 16);
+ BOOST_TEST_EQ(backend._info._tile_length, 16);
+}
+
+int main()
+{
+ test_read_info_tile_minisblack_float();
+ test_read_info_tile_minisblack();
+ test_read_info_tile_palette();
+ test_read_info_tile_rgb();
+ test_read_info_tile_planar();
+
+ return boost::report_errors();
+}
+
+#else
+int main() {}
+#endif // BOOST_GIL_IO_USE_TIFF_GRAPHICSMAGICK_TEST_SUITE_IMAGES
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_write_macros.hpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_write_macros.hpp
new file mode 100644
index 000000000..2e3fd1147
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_tiled_write_macros.hpp
@@ -0,0 +1,177 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifndef BOOST_GIL_TEST_EXTENSION_IO_TIFF_TIFF_TILED_WRITE_MACROS_HPP
+#define BOOST_GIL_TEST_EXTENSION_IO_TIFF_TIFF_TILED_WRITE_MACROS_HPP
+
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/stringize.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/comparison/less.hpp>
+#include <boost/preprocessor/repetition/repeat_from_to.hpp>
+
+#include <string>
+
+#include "paths.hpp"
+
+// TODO: Rename macros to use BOOST_GIL_ prefix. See https://github.com/boostorg/gil/issues/410 ~mloskot
+// TODO: Make sure generated test cases are executed. See tiff_subimage_test.cpp. ~mloskot
+
+#ifdef BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+
+#define GENERATE_WRITE_TILE_BIT_ALIGNED_RGB(z, n, data) \
+ void BOOST_PP_CAT( \
+ BOOST_PP_CAT( \
+ BOOST_PP_CAT(BOOST_PP_CAT(write_rgb_tile_and_compare_with_, data), _strip_), n), \
+ bit_bit_aligned)() \
+ { \
+ namespace gil = boost::gil; \
+ std::string filename(std::string("tiger-") + BOOST_PP_STRINGIZE(data) + "-strip-contig-"); \
+ std::string path(tiff_in_GM); \
+ std::string padding(""); \
+ if (BOOST_PP_LESS(n, 10) == 1) \
+ padding = "0"; \
+ filename += padding + BOOST_PP_STRINGIZE(n) + ".tif"; \
+ path += filename; \
+ gil::bit_aligned_image3_type<n, n, n, gil::rgb_layout_t>::type img_strip, img_saved; \
+ gil::read_image(path, img_strip, gil::tiff_tag()); \
+ gil::image_write_info<gil::tiff_tag> info; \
+ info._is_tiled = true; \
+ info._tile_width = info._tile_length = 16; \
+ gil::write_view(tiff_out + filename, gil::view(img_strip), info); \
+ gil::read_image(tiff_out + filename, img_saved, gil::tiff_tag()); \
+ BOOST_TEST_EQ( \
+ gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_saved)), true); \
+ }
+
+// Special case for minisblack images
+#define GENERATE_WRITE_TILE_BIT_ALIGNED_MINISBLACK(z, n, data) \
+ void BOOST_PP_CAT( \
+ BOOST_PP_CAT( \
+ BOOST_PP_CAT(BOOST_PP_CAT(write_minisblack_tile_and_compare_with_, data), _strip_), \
+ n), \
+ bit_bit_aligned)() \
+ { \
+ namespace gil = boost::gil; \
+ std::string filename(std::string("tiger-") + BOOST_PP_STRINGIZE(data) + "-strip-"); \
+ std::string path(tiff_in_GM); \
+ std::string padding(""); \
+ if (BOOST_PP_LESS(n, 10) == 1) \
+ padding = "0"; \
+ filename = filename + padding + BOOST_PP_STRINGIZE(n) + ".tif"; \
+ path += filename; \
+ gil::bit_aligned_image1_type<n, gil::gray_layout_t>::type img_strip, img_saved; \
+ gil::read_image(path, img_strip, gil::tiff_tag()); \
+ gil::image_write_info<gil::tiff_tag> info; \
+ info._is_tiled = true; \
+ info._tile_width = info._tile_length = 16; \
+ gil::write_view(tiff_out + filename, gil::view(img_strip), info); \
+ gil::read_image(tiff_out + filename, img_saved, gil::tiff_tag()); \
+ BOOST_TEST_EQ( \
+ gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_saved)), true); \
+ }
+
+// Special case for palette images
+#define GENERATE_WRITE_TILE_BIT_ALIGNED_PALETTE(z, n, data) \
+ void BOOST_PP_CAT( \
+ BOOST_PP_CAT( \
+ BOOST_PP_CAT(BOOST_PP_CAT(write_palette_tile_and_compare_with_, data), _strip_), n), \
+ bit)() \
+ { \
+ namespace gil = boost::gil; \
+ std::string filename(std::string("tiger-") + BOOST_PP_STRINGIZE(data) + "-strip-"); \
+ std::string path(tiff_in_GM); \
+ std::string padding(""); \
+ if (BOOST_PP_LESS(n, 10) == 1) \
+ padding = "0"; \
+ filename = filename + padding + BOOST_PP_STRINGIZE(n) + ".tif"; \
+ path += filename; \
+ gil::rgb16_image_t img_strip, img_saved; \
+ gil::read_image(path, img_strip, gil::tiff_tag()); \
+ gil::image_write_info<gil::tiff_tag> info; \
+ info._is_tiled = true; \
+ info._tile_width = info._tile_length = 16; \
+ gil::write_view(tiff_out + filename, gil::view(img_strip), info); \
+ gil::read_image(tiff_out + filename, img_saved, gil::tiff_tag()); \
+ BOOST_TEST_EQ( \
+ gil::equal_pixels(gil::const_view(img_strip), gil::const_view(img_saved)), true); \
+ }
+
+#else
+
+#define GENERATE_WRITE_TILE_BIT_ALIGNED_RGB(z, n, data) \
+ void BOOST_PP_CAT( \
+ BOOST_PP_CAT( \
+ BOOST_PP_CAT(BOOST_PP_CAT(write_rgb_tile_and_compare_with_, data), _strip_), n), \
+ bit_bit_aligned)() \
+ { \
+ namespace gil = boost::gil; \
+ std::string filename(std::string("tiger-") + BOOST_PP_STRINGIZE(data) + "-strip-contig-"); \
+ std::string path(tiff_in_GM); \
+ std::string padding(""); \
+ if (BOOST_PP_LESS(n, 10) == 1) \
+ padding = "0"; \
+ filename += padding + BOOST_PP_STRINGIZE(n) + ".tif"; \
+ path += filename; \
+ gil::bit_aligned_image3_type<n, n, n, gil::rgb_layout_t>::type img_strip, img_saved; \
+ gil::read_image(path, img_strip, gil::tiff_tag()); \
+ gil::image_write_info<gil::tiff_tag> info; \
+ info._is_tiled = true; \
+ info._tile_width = info._tile_length = 16; \
+ }
+
+// Special case for minisblack images
+#define GENERATE_WRITE_TILE_BIT_ALIGNED_MINISBLACK(z, n, data) \
+ voidBOOST_PP_CAT( \
+ BOOST_PP_CAT( \
+ BOOST_PP_CAT(BOOST_PP_CAT(write_minisblack_tile_and_compare_with_, data), _strip_), \
+ n), \
+ bit_bit_aligned)() \
+ { \
+ namespace gil = boost::gil; \
+ std::string filename(std::string("tiger-") + BOOST_PP_STRINGIZE(data) + "-strip-"); \
+ std::string path(tiff_in_GM); \
+ std::string padding(""); \
+ if (BOOST_PP_LESS(n, 10) == 1) \
+ padding = "0"; \
+ filename = filename + padding + BOOST_PP_STRINGIZE(n) + ".tif"; \
+ path += filename; \
+ gil::bit_aligned_image1_type<n, gil::gray_layout_t>::type img_strip, img_saved; \
+ gil::read_image(path, img_strip, gil::tiff_tag()); \
+ gil::image_write_info<gil::tiff_tag> info; \
+ info._is_tiled = true; \
+ info._tile_width = info._tile_length = 16; \
+ }
+
+// Special case for palette images
+#define GENERATE_WRITE_TILE_BIT_ALIGNED_PALETTE(z, n, data) \
+ void BOOST_PP_CAT( \
+ BOOST_PP_CAT( \
+ BOOST_PP_CAT(BOOST_PP_CAT(write_palette_tile_and_compare_with_, data), _strip_), n), \
+ bit)() \
+ { \
+ namespace gil = boost::gil; \
+ std::string filename(std::string("tiger-") + BOOST_PP_STRINGIZE(data) + "-strip-"); \
+ std::string path(tiff_in_GM); \
+ std::string padding(""); \
+ if (BOOST_PP_LESS(n, 10) == 1) \
+ padding = "0"; \
+ filename = filename + padding + BOOST_PP_STRINGIZE(n) + ".tif"; \
+ path += filename; \
+ gil::rgb16_image_t img_strip, img_saved; \
+ gil::read_image(path, img_strip, gil::tiff_tag()); \
+ gil::image_write_info<gil::tiff_tag> info; \
+ info._is_tiled = true; \
+ info._tile_width = info._tile_length = 16; \
+ }
+
+#endif // BOOST_GIL_IO_TEST_ALLOW_WRITING_IMAGES
+
+#endif // BOOST_GIL_TEST_EXTENSION_IO_TIFF_TIFF_TILED_WRITE_MACROS_HPP
diff --git a/src/boost/libs/gil/test/extension/io/tiff/tiff_write_test.cpp b/src/boost/libs/gil/test/extension/io/tiff/tiff_write_test.cpp
new file mode 100644
index 000000000..0f97a6e17
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/io/tiff/tiff_write_test.cpp
@@ -0,0 +1,31 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/io/tiff.hpp>
+#include <boost/gil/io/typedefs.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "color_space_write_test.hpp"
+#include "mandel_view.hpp"
+#include "paths.hpp"
+
+namespace gil = boost::gil;
+
+void test_rgb_color_space_write()
+{
+ color_space_write_test<gil::tiff_tag>(
+ tiff_out + "rgb_color_space_test.tif", tiff_out + "bgr_color_space_test.tif");
+}
+
+int main()
+{
+ test_rgb_color_space_write();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/numeric/CMakeLists.txt b/src/boost/libs/gil/test/extension/numeric/CMakeLists.txt
new file mode 100644
index 000000000..4702c52c8
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/CMakeLists.txt
@@ -0,0 +1,39 @@
+#
+# Copyright (c) 2017 Mateusz Loskot <mateusz at loskot dot net>
+# All rights reserved.
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+message(STATUS "Boost.GIL: Configuring tests in test/extension/numeric")
+
+foreach(_name
+ channel_numeric_operations
+ convolve
+ convolve_2d
+ convolve_cols
+ convolve_rows
+ extend_boundary
+ kernel
+ kernel_fixed
+ matrix3x2
+ pixel_numeric_operations
+ pixel_numeric_operations_float
+ resample)
+ set(_test t_ext_numeric_${_name})
+ set(_target test_ext_numeric_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
diff --git a/src/boost/libs/gil/test/extension/numeric/Jamfile b/src/boost/libs/gil/test/extension/numeric/Jamfile
new file mode 100644
index 000000000..9662357c4
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/Jamfile
@@ -0,0 +1,28 @@
+# Boost.GIL (Generic Image Library) - Numeric tests
+#
+# Copyright (c) 2013 Christian Henning
+# Copyright (c) 2019 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+alias headers : [ generate_self_contained_headers extension/numeric ] ;
+
+compile-fail kernel_1d_fixed_even_size_fail.cpp ;
+
+run channel_numeric_operations.cpp ;
+run convolve.cpp ;
+run convolve_2d.cpp ;
+run convolve_cols.cpp ;
+run convolve_rows.cpp ;
+run extend_boundary.cpp ;
+run kernel.cpp ;
+run kernel_fixed.cpp ;
+run matrix3x2.cpp ;
+run pixel_numeric_operations.cpp ;
+run pixel_numeric_operations_float.cpp ;
+run resample.cpp ;
+
diff --git a/src/boost/libs/gil/test/extension/numeric/channel_numeric_operations.cpp b/src/boost/libs/gil/test/extension/numeric/channel_numeric_operations.cpp
new file mode 100644
index 000000000..4f75cbbc6
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/channel_numeric_operations.cpp
@@ -0,0 +1,484 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/numeric/channel_numeric_operations.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <tuple>
+#include <type_traits>
+
+#include "test_utility_output_stream.hpp"
+#include "core/channel/test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+struct test_plus_integer_same_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ gil::channel_plus_t<channel_t, channel_t, channel_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel_t(0));
+ BOOST_TEST_EQ(f(100, 27), channel_t(127));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_plus_integer_same_types{});
+ }
+};
+
+struct test_plus_integer_mixed_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ {
+ using channel1_t = channel_t;
+ using channel2_t = std::uint8_t; // duplicates only one of fixture::channel_integer_types
+ gil::channel_plus_t<channel1_t, channel2_t, channel1_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel1_t(0));
+ BOOST_TEST_EQ(f(100, 27), channel_t(127));
+ }
+ {
+ using channel1_t = std::uint8_t; // duplicates only one of fixture::channel_integer_types
+ using channel2_t = channel_t;
+ gil::channel_plus_t<channel1_t, channel2_t, channel2_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel2_t(0));
+ BOOST_TEST_EQ(f(100, 27), channel_t(127));
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_plus_integer_mixed_types{});
+ }
+};
+
+struct test_plus_integer_signed_types_with_overflow
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ // Signed integer overflow is UB, so just check addition does not yield mathematically
+ // expected value but is constrained by the range of representable values for given type.
+
+ auto const max_value = gil::channel_traits<channel_t>::max_value();
+ gil::channel_plus_t<channel_t, channel_t, channel_t> f;
+ BOOST_TEST_NE(f(max_value, 1), std::int64_t(max_value) + 1);
+ BOOST_TEST_NE(f(max_value, max_value), std::int64_t(max_value) + max_value);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_signed_types>(test_plus_integer_signed_types_with_overflow{});
+ }
+};
+
+struct test_plus_integer_unsigned_types_with_wraparound
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ // The C Standard, 6.2.5, paragraph 9 [ISO/IEC 9899:2011], states:
+ // A computation involving unsigned operands can never overflow, because a result that
+ // cannot be represented by the resulting unsigned integer type is reduced modulo the number
+ // that is one greater than the largest value that can be represented by the resulting type.
+
+ auto const max_value = gil::channel_traits<channel_t>::max_value();
+ auto const min_value = gil::channel_traits<channel_t>::min_value();
+ gil::channel_plus_t<channel_t, channel_t, channel_t> f;
+ BOOST_TEST_EQ(f(max_value, 1), min_value);
+ BOOST_TEST_EQ(f(max_value, max_value), max_value - 1);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_unsigned_types>(test_plus_integer_unsigned_types_with_wraparound{});
+ }
+};
+
+struct test_minus_integer_same_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ gil::channel_minus_t<channel_t, channel_t, channel_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel_t(0));
+ BOOST_TEST_EQ(f(100, 27), channel_t(73));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_minus_integer_same_types{});
+ }
+};
+
+struct test_minus_integer_mixed_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ {
+ using channel1_t = channel_t;
+ using channel2_t = std::uint8_t; // duplicates only one of fixture::channel_integer_types
+ gil::channel_minus_t<channel1_t, channel2_t, channel1_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel1_t(0));
+ BOOST_TEST_EQ(f(100, 27), channel_t(73));
+ }
+ {
+ using channel1_t = std::uint8_t; // duplicates only one of fixture::channel_integer_types
+ using channel2_t = channel_t;
+ gil::channel_minus_t<channel1_t, channel2_t, channel2_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel2_t(0));
+ BOOST_TEST_EQ(f(100, 27), channel_t(73));
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_minus_integer_mixed_types{});
+ }
+};
+
+struct test_multiplies_integer_same_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ gil::channel_multiplies_t<channel_t, channel_t, channel_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel_t(0));
+ BOOST_TEST_EQ(f(1, 1), channel_t(1));
+ BOOST_TEST_EQ(f(4, 2), channel_t(8));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_multiplies_integer_same_types{});
+ }
+};
+
+struct test_multiplies_integer_mixed_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ {
+ using channel1_t = channel_t;
+ using channel2_t = std::uint8_t; // duplicates only one of fixture::channel_integer_types
+ gil::channel_multiplies_t<channel1_t, channel2_t, channel1_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel1_t(0));
+ BOOST_TEST_EQ(f(4, 2), channel_t(8));
+ }
+ {
+ using channel1_t = std::uint8_t; // duplicates only one of fixture::channel_integer_types
+ using channel2_t = channel_t;
+ gil::channel_multiplies_t<channel1_t, channel2_t, channel2_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel2_t(0));
+ BOOST_TEST_EQ(f(4, 2), channel_t(8));
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_multiplies_integer_mixed_types{});
+ }
+};
+
+struct test_divides_integer_same_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ gil::channel_divides_t<channel_t, channel_t, channel_t> f;
+ BOOST_TEST_EQ(f(0, 1), channel_t(0));
+ BOOST_TEST_EQ(f(1, 1), channel_t(1));
+ BOOST_TEST_EQ(f(4, 2), channel_t(2));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_divides_integer_same_types{});
+ }
+};
+
+struct test_divides_integer_mixed_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ {
+ using channel1_t = channel_t;
+ using channel2_t = std::uint8_t; // duplicates only one of fixture::channel_integer_types
+ gil::channel_divides_t<channel1_t, channel2_t, channel1_t> f;
+ BOOST_TEST_EQ(f(0, 1), channel1_t(0));
+ BOOST_TEST_EQ(f(4, 2), channel_t(2));
+ }
+ {
+ using channel1_t = std::uint8_t; // duplicates only one of fixture::channel_integer_types
+ using channel2_t = channel_t;
+ gil::channel_divides_t<channel1_t, channel2_t, channel2_t> f;
+ BOOST_TEST_EQ(f(0, 1), channel2_t(0));
+ BOOST_TEST_EQ(f(4, 2), channel_t(2));
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_divides_integer_mixed_types{});
+ }
+};
+
+struct test_plus_scalar_integer_same_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ gil::channel_plus_scalar_t<channel_t, int, channel_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel_t(0));
+ BOOST_TEST_EQ(f(100, 27), channel_t(127));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_plus_scalar_integer_same_types{});
+ }
+};
+
+struct test_plus_scalar_integer_mixed_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ using channel_result_t = std::uint8_t;
+ gil::channel_plus_scalar_t<channel_t, int, channel_result_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel_result_t(0));
+ BOOST_TEST_EQ(f(100, 27), channel_result_t(127));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_plus_scalar_integer_mixed_types{});
+ }
+};
+
+struct test_minus_scalar_integer_same_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ gil::channel_minus_scalar_t<channel_t, int, channel_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel_t(0));
+ BOOST_TEST_EQ(f(100, 27), channel_t(73));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_minus_scalar_integer_same_types{});
+ }
+};
+
+struct test_minus_scalar_integer_mixed_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ using channel_result_t = std::uint8_t;
+ gil::channel_minus_scalar_t<channel_t, int, std::uint8_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel_result_t(0));
+ BOOST_TEST_EQ(f(100, 27), channel_result_t(73));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_minus_scalar_integer_mixed_types{});
+ }
+};
+
+struct test_multiplies_scalar_integer_same_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ gil::channel_multiplies_scalar_t<channel_t, channel_t, channel_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel_t(0));
+ BOOST_TEST_EQ(f(1, 1), channel_t(1));
+ BOOST_TEST_EQ(f(4, 2), channel_t(8));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_multiplies_scalar_integer_same_types{});
+ }
+};
+
+struct test_multiplies_scalar_integer_mixed_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ using channel_result_t = std::uint8_t;
+ gil::channel_multiplies_scalar_t<channel_t, int, channel_result_t> f;
+ BOOST_TEST_EQ(f(0, 0), channel_result_t(0));
+ BOOST_TEST_EQ(f(4, 2), channel_result_t(8));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_multiplies_scalar_integer_mixed_types{});
+ }
+};
+
+struct test_divides_scalar_integer_same_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ gil::channel_divides_scalar_t<channel_t, channel_t, channel_t> f;
+ BOOST_TEST_EQ(f(0, 1), channel_t(0));
+ BOOST_TEST_EQ(f(1, 1), channel_t(1));
+ BOOST_TEST_EQ(f(4, 2), channel_t(2));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_divides_scalar_integer_same_types{});
+ }
+};
+
+struct test_divides_scalar_integer_mixed_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ using channel_result_t = std::uint8_t; // duplicates only one of fixture::channel_integer_types
+ gil::channel_divides_scalar_t<channel_t, int, channel_result_t> f;
+ BOOST_TEST_EQ(f(0, 1), channel_t(0));
+ BOOST_TEST_EQ(f(4, 2), channel_t(2));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_divides_scalar_integer_mixed_types{});
+ }
+};
+
+struct test_halves_integer_same_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ gil::channel_halves_t<channel_t> f;
+ {
+ channel_t c(0);
+ f(c);
+ BOOST_TEST_EQ(c, channel_t(0));
+ }
+ {
+ channel_t c(2);
+ f(c);
+ BOOST_TEST_EQ(c, channel_t(1));
+ }
+ {
+ channel_t c(4);
+ f(c);
+ BOOST_TEST_EQ(c, channel_t(2));
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_halves_integer_same_types{});
+ }
+};
+
+struct test_zeros_integer_same_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ gil::channel_zeros_t<channel_t> f;
+ {
+ channel_t c(0);
+ f(c);
+ BOOST_TEST_EQ(c, channel_t(0));
+ }
+ {
+ channel_t c(2);
+ f(c);
+ BOOST_TEST_EQ(c, channel_t(0));
+ }
+ {
+ channel_t c(4);
+ f(c);
+ BOOST_TEST_EQ(c, channel_t(0));
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_zeros_integer_same_types{});
+ }
+};
+
+struct test_assigns_integer_same_types
+{
+ template <typename Channel>
+ void operator()(Channel const&)
+ {
+ using channel_t = Channel;
+ gil::channel_assigns_t<channel_t, channel_t> f;
+ {
+ channel_t c1(10);
+ channel_t c2(20);
+ f(c1, c2);
+ BOOST_TEST_EQ(c2, c1);
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::channel_integer_types>(test_assigns_integer_same_types{});
+ }
+};
+
+int main()
+{
+ test_plus_integer_same_types::run();
+ test_plus_integer_mixed_types::run();
+ test_plus_integer_signed_types_with_overflow::run();
+ test_plus_integer_unsigned_types_with_wraparound::run();
+
+ test_minus_integer_same_types::run();
+ test_minus_integer_mixed_types::run();
+
+ test_multiplies_integer_same_types::run();
+ test_multiplies_integer_mixed_types::run();
+
+ test_divides_integer_same_types::run();
+ test_divides_integer_mixed_types::run();
+
+ test_plus_scalar_integer_same_types::run();
+ test_plus_scalar_integer_mixed_types::run();
+
+ test_minus_scalar_integer_same_types::run();
+ test_minus_scalar_integer_mixed_types::run();
+
+ test_multiplies_scalar_integer_same_types::run();
+ test_multiplies_scalar_integer_mixed_types::run();
+
+ test_divides_scalar_integer_same_types::run();
+ test_divides_scalar_integer_mixed_types::run();
+
+ test_halves_integer_same_types::run();
+ test_zeros_integer_same_types::run();
+ test_assigns_integer_same_types::run();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/numeric/convolve.cpp b/src/boost/libs/gil/test/extension/numeric/convolve.cpp
new file mode 100644
index 000000000..7fe008ea0
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/convolve.cpp
@@ -0,0 +1,121 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/numeric/convolve.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <tuple>
+#include <type_traits>
+
+#include "test_fixture.hpp"
+#include "core/test_fixture.hpp"
+#include "core/image/test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+struct test_image_1x1_kernel_1x1_identity
+{
+ template <typename Image>
+ void operator()(Image const&)
+ {
+ using image_t = Image;
+ auto const img = fixture::create_image<image_t>(1, 1, 7);
+ image_t img_out(img);
+
+ using pixel_t = typename image_t::value_type;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ auto const kernel = fixture::create_kernel<channel_t>({1});
+ gil::detail::convolve_1d<pixel_t>(gil::const_view(img_out), kernel, gil::view(img_out));
+
+ // 1x1 kernel reduces convolution to multiplication
+ BOOST_TEST(gil::const_view(img).front() == gil::const_view(img_out).front());
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_image_1x1_kernel_1x1_identity{});
+ }
+};
+
+struct test_image_1x1_kernel_3x3_identity
+{
+ template <typename Image>
+ void operator()(Image const&)
+ {
+ using image_t = Image;
+ auto const img = fixture::create_image<Image>(1, 1, 7);
+ image_t img_out(img);
+
+ using pixel_t = typename image_t::value_type;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ auto const kernel = fixture::create_kernel<channel_t>({0, 0, 0, 0, 1, 0, 0, 0, 0});
+ gil::detail::convolve_1d<pixel_t>(gil::const_view(img_out), kernel, gil::view(img_out));
+
+ BOOST_TEST(gil::const_view(img).front() == gil::const_view(img_out).front());
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_image_1x1_kernel_3x3_identity{});
+ }
+};
+
+struct test_image_3x3_kernel_3x3_identity
+{
+ template <typename Image>
+ void operator()(Image const&)
+ {
+ using image_t = Image;
+ using pixel_t = typename image_t::value_type;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ auto const img = fixture::generate_image<image_t>(3, 3, fixture::random_value<channel_t>{});
+ image_t img_out(img);
+
+ auto const kernel = fixture::create_kernel<channel_t>({0, 0, 0, 0, 1, 0, 0, 0, 0});
+ gil::detail::convolve_1d<pixel_t>(gil::const_view(img_out), kernel, gil::view(img_out));
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img), gil::const_view(img_out)));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_image_3x3_kernel_3x3_identity{});
+ }
+};
+
+struct test_image_5x5_kernel_3x3_identity
+{
+ template <typename Image>
+ void operator()(Image const&)
+ {
+ using image_t = Image;
+ using pixel_t = typename image_t::value_type;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ auto const img = fixture::generate_image<image_t>(5, 5, fixture::random_value<channel_t>{});
+ image_t img_out(img);
+
+ auto const kernel = fixture::create_kernel<channel_t>({0, 0, 0, 0, 1, 0, 0, 0, 0});
+ gil::detail::convolve_1d<pixel_t>(gil::const_view(img_out), kernel, gil::view(img_out));
+ // TODO: Test different boundary options
+
+ BOOST_TEST(gil::equal_pixels(gil::const_view(img), gil::const_view(img_out)));
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_image_5x5_kernel_3x3_identity{});
+ }
+};
+
+int main()
+{
+ test_image_1x1_kernel_1x1_identity::run();
+ test_image_1x1_kernel_3x3_identity::run();
+ test_image_3x3_kernel_3x3_identity::run();
+ test_image_5x5_kernel_3x3_identity::run();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/numeric/convolve_2d.cpp b/src/boost/libs/gil/test/extension/numeric/convolve_2d.cpp
new file mode 100644
index 000000000..fbfce5f96
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/convolve_2d.cpp
@@ -0,0 +1,68 @@
+//
+// Copyright 2019 Miral Shah <miralshah2211@gmail.com>
+//
+// Use, modification and distribution are subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/numeric/convolve.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstddef>
+
+namespace gil = boost::gil;
+
+std::uint8_t img[] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 255, 0, 0, 0, 255, 0, 0,
+ 0, 0, 0, 255, 0, 255, 0, 0, 0,
+ 0, 0, 0, 0, 255, 0, 0, 0, 0,
+ 0, 0, 0, 255, 0, 255, 0, 0, 0,
+ 0, 0, 255, 0, 0, 0, 255, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+std::uint8_t output[] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 28, 28, 28, 0, 28, 28, 28, 0,
+ 0, 28, 56, 56, 56, 56, 56, 28, 0,
+ 0, 28, 56, 85, 85, 85, 56, 28, 0,
+ 0, 0, 56, 85, 141, 85, 56, 0, 0,
+ 0, 28, 56, 85, 85, 85, 56, 28, 0,
+ 0, 28, 56, 56, 56, 56, 56, 28, 0,
+ 0, 28, 28, 28, 0, 28, 28, 28, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+void test_convolve_2d_with_normalized_mean_filter()
+{
+ gil::gray8c_view_t src_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t*>(img), 9);
+
+ gil::image<gil::gray8_pixel_t> temp_img(src_view.width(), src_view.height());
+ typename gil::image<gil::gray8_pixel_t>::view_t temp_view = view(temp_img);
+ gil::gray8_view_t dst_view(temp_view);
+
+ std::vector<float> v(9, 1.0f / 9.0f);
+ gil::detail::kernel_2d<float> kernel(v.begin(), v.size(), 1, 1);
+
+ gil::detail::convolve_2d(src_view, kernel, dst_view);
+
+ gil::gray8c_view_t out_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t*>(output), 9);
+
+ BOOST_TEST(gil::equal_pixels(out_view, dst_view));
+}
+
+int main()
+{
+ test_convolve_2d_with_normalized_mean_filter();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/numeric/convolve_cols.cpp b/src/boost/libs/gil/test/extension/numeric/convolve_cols.cpp
new file mode 100644
index 000000000..c9e5576db
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/convolve_cols.cpp
@@ -0,0 +1,73 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/numeric/convolve.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <tuple>
+#include <type_traits>
+
+#include "test_fixture.hpp"
+#include "core/image/test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+struct test_image_1x1_kernel_1x1_identity
+{
+ template <typename Image>
+ void operator()(Image const&)
+ {
+ using image_t = Image;
+ auto const img = fixture::create_image<image_t>(1, 1, 7);
+ auto img_out = fixture::create_image<image_t>(1, 1, 0);
+
+ using pixel_t = typename image_t::value_type;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ auto const kernel = fixture::create_kernel<channel_t>({1});
+ gil::convolve_cols<pixel_t>(const_view(img), kernel, view(img_out));
+
+ // 1x1 kernel reduces convolution to multiplication
+ BOOST_TEST(gil::const_view(img).front() == gil::const_view(img_out).front());
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_image_1x1_kernel_1x1_identity{});
+ }
+};
+
+struct test_image_1x1_kernel_3x3_identity
+{
+ template <typename Image>
+ void operator()(Image const&)
+ {
+ using image_t = Image;
+ auto const img = fixture::create_image<image_t>(1, 1, 7);
+ auto img_out = fixture::create_image<image_t>(1, 1, 0);
+
+ using pixel_t = typename image_t::value_type;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ auto const kernel = fixture::create_kernel<channel_t>({0, 0, 0, 0, 1, 0, 0, 0, 0});
+ gil::convolve_cols<pixel_t>(const_view(img), kernel, view(img_out));
+
+ BOOST_TEST(gil::const_view(img).front() == gil::const_view(img_out).front());
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_image_1x1_kernel_3x3_identity{});
+ }
+};
+
+int main()
+{
+ test_image_1x1_kernel_1x1_identity::run();
+ test_image_1x1_kernel_3x3_identity::run();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/numeric/convolve_rows.cpp b/src/boost/libs/gil/test/extension/numeric/convolve_rows.cpp
new file mode 100644
index 000000000..d9b735479
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/convolve_rows.cpp
@@ -0,0 +1,73 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/numeric/convolve.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <tuple>
+#include <type_traits>
+
+#include "test_fixture.hpp"
+#include "core/image/test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+struct test_image_1x1_kernel_1x1_identity
+{
+ template <typename Image>
+ void operator()(Image const&)
+ {
+ using image_t = Image;
+ auto const img = fixture::create_image<image_t>(1, 1, 7);
+ auto img_out = fixture::create_image<image_t>(1, 1, 0);
+
+ using pixel_t = typename image_t::value_type;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ auto const kernel = fixture::create_kernel<channel_t>({1});
+ gil::convolve_rows<pixel_t>(const_view(img), kernel, view(img_out));
+
+ // 1x1 kernel reduces convolution to multiplication
+ BOOST_TEST(gil::const_view(img).front() == gil::const_view(img_out).front());
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_image_1x1_kernel_1x1_identity{});
+ }
+};
+
+struct test_image_1x1_kernel_3x3_identity
+{
+ template <typename Image>
+ void operator()(Image const&)
+ {
+ using image_t = Image;
+ auto const img = fixture::create_image<image_t>(1, 1, 7);
+ auto img_out = fixture::create_image<image_t>(1, 1, 0);
+
+ using pixel_t = typename image_t::value_type;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ auto const kernel = fixture::create_kernel<channel_t>({0, 0, 0, 0, 1, 0, 0, 0, 0});
+ gil::convolve_rows<pixel_t>(const_view(img), kernel, view(img_out));
+
+ BOOST_TEST(gil::const_view(img).front() == gil::const_view(img_out).front());
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::image_types>(test_image_1x1_kernel_3x3_identity{});
+ }
+};
+
+int main()
+{
+ test_image_1x1_kernel_1x1_identity::run();
+ test_image_1x1_kernel_3x3_identity::run();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/numeric/extend_boundary.cpp b/src/boost/libs/gil/test/extension/numeric/extend_boundary.cpp
new file mode 100644
index 000000000..f432ad69b
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/extend_boundary.cpp
@@ -0,0 +1,252 @@
+//
+// Copyright 2019 Pranam Lashkari <plashkari628@gmail.com>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/numeric/algorithm.hpp>
+#include <boost/gil/extension/numeric/convolve.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+namespace gil = boost::gil;
+
+std::uint8_t img[] =
+{
+ 1, 2, 3, 4, 5, 6, 7, 8, 9,
+ 10, 0, 0, 0, 0, 0, 0, 0, 32,
+ 11, 0, 255, 0, 0, 0, 255, 0, 31,
+ 12, 0, 0, 255, 0, 255, 0, 0, 30,
+ 13, 0, 0, 0, 255, 0, 0, 0, 29,
+ 14, 0, 0, 255, 0, 255, 0, 0, 28,
+ 15, 0, 255, 0, 0, 0, 255, 0, 27,
+ 16, 0, 0, 0, 0, 0, 0, 0, 26,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25
+};
+
+std::uint8_t row_output_constant[] =
+{
+ 1, 2, 3, 4, 5, 6, 7, 8, 9,
+ 1, 2, 3, 4, 5, 6, 7, 8, 9,
+ 1, 2, 3, 4, 5, 6, 7, 8, 9,
+ 10, 0, 0, 0, 0, 0, 0, 0, 32,
+ 11, 0, 255, 0, 0, 0, 255, 0, 31,
+ 12, 0, 0, 255, 0, 255, 0, 0, 30,
+ 13, 0, 0, 0, 255, 0, 0, 0, 29,
+ 14, 0, 0, 255, 0, 255, 0, 0, 28,
+ 15, 0, 255, 0, 0, 0, 255, 0, 27,
+ 16, 0, 0, 0, 0, 0, 0, 0, 26,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25
+};
+
+std::uint8_t row_output_zero[] =
+{
+ 0, 0, 0, 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, 2, 3, 4, 5, 6, 7, 8, 9,
+ 10, 0, 0, 0, 0, 0, 0, 0, 32,
+ 11, 0, 255, 0, 0, 0, 255, 0, 31,
+ 12, 0, 0, 255, 0, 255, 0, 0, 30,
+ 13, 0, 0, 0, 255, 0, 0, 0, 29,
+ 14, 0, 0, 255, 0, 255, 0, 0, 28,
+ 15, 0, 255, 0, 0, 0, 255, 0, 27,
+ 16, 0, 0, 0, 0, 0, 0, 0, 26,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+std::uint8_t col_output_constant[] =
+{
+ 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9,
+ 10, 10, 0, 0, 0, 0, 0, 0, 0, 32, 32,
+ 11, 11, 0, 255, 0, 0, 0, 255, 0, 31, 31,
+ 12, 12, 0, 0, 255, 0, 255, 0, 0, 30, 30,
+ 13, 13, 0, 0, 0, 255, 0, 0, 0, 29, 29,
+ 14, 14, 0, 0, 255, 0, 255, 0, 0, 28, 28,
+ 15, 15, 0, 255, 0, 0, 0, 255, 0, 27, 27,
+ 16, 16, 0, 0, 0, 0, 0, 0, 0, 26, 26,
+ 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 25
+};
+
+std::uint8_t col_output_zero[] =
+{
+ 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0,
+ 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0,
+ 0, 0, 11, 0, 255, 0, 0, 0, 255, 0, 31, 0, 0,
+ 0, 0, 12, 0, 0, 255, 0, 255, 0, 0, 30, 0, 0,
+ 0, 0, 13, 0, 0, 0, 255, 0, 0, 0, 29, 0, 0,
+ 0, 0, 14, 0, 0, 255, 0, 255, 0, 0, 28, 0, 0,
+ 0, 0, 15, 0, 255, 0, 0, 0, 255, 0, 27, 0, 0,
+ 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0,
+ 0, 0, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0
+};
+
+std::uint8_t boundary_output_constant[] =
+{
+ 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9,
+ 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9,
+ 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9,
+ 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 32, 32, 32,
+ 11, 11, 11, 0, 255, 0, 0, 0, 255, 0, 31, 31, 31,
+ 12, 12, 12, 0, 0, 255, 0, 255, 0, 0, 30, 30, 30,
+ 13, 13, 13, 0, 0, 0, 255, 0, 0, 0, 29, 29, 29,
+ 14, 14, 14, 0, 0, 255, 0, 255, 0, 0, 28, 28, 28,
+ 15, 15, 15, 0, 255, 0, 0, 0, 255, 0, 27, 27, 27,
+ 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26,
+ 17, 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 25, 25,
+ 17, 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 25, 25,
+ 17, 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 25, 25
+};
+
+std::uint8_t boundary_output_zero[] =
+{
+ 0, 0, 0, 0, 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, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0,
+ 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0,
+ 0, 0, 11, 0, 255, 0, 0, 0, 255, 0, 31, 0, 0,
+ 0, 0, 12, 0, 0, 255, 0, 255, 0, 0, 30, 0, 0,
+ 0, 0, 13, 0, 0, 0, 255, 0, 0, 0, 29, 0, 0,
+ 0, 0, 14, 0, 0, 255, 0, 255, 0, 0, 28, 0, 0,
+ 0, 0, 15, 0, 255, 0, 0, 0, 255, 0, 27, 0, 0,
+ 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0,
+ 0, 0, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+void test_extend_row_with_constant()
+{
+ gil::gray8c_view_t src_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t *>(img), 9);
+
+ gil::gray8c_view_t out_view =
+ gil::interleaved_view(9, 13, reinterpret_cast<const gil::gray8_pixel_t *>(row_output_constant), 9);
+
+ auto output = gil::extend_row(src_view, 2, gil::boundary_option::extend_constant);
+
+ BOOST_TEST(gil::equal_pixels(out_view, gil::view(output)));
+}
+
+void test_extend_row_with_zero()
+{
+ gil::gray8c_view_t src_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t *>(img), 9);
+
+ gil::gray8c_view_t out_view =
+ gil::interleaved_view(9, 15, reinterpret_cast<const gil::gray8_pixel_t *>(row_output_zero), 9);
+
+ auto output = gil::extend_row(src_view, 3, gil::boundary_option::extend_zero);
+
+ BOOST_TEST(gil::equal_pixels(out_view, gil::view(output)));
+}
+
+void test_extend_row_with_padded()
+{
+ gil::gray8c_view_t src_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t *>(img), 9);
+
+ auto src_sub_view = gil::subimage_view(src_view, 0, 1, 9, 7);
+
+ auto output = gil::extend_row(src_sub_view, 1, gil::boundary_option::extend_padded);
+
+ BOOST_TEST(gil::equal_pixels(src_view, gil::view(output)));
+}
+
+void test_extend_col_with_constant()
+{
+ gil::gray8c_view_t src_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t *>(img), 9);
+
+ gil::gray8c_view_t out_view =
+ gil::interleaved_view(11, 9, reinterpret_cast<const gil::gray8_pixel_t *>(col_output_constant), 11);
+
+ auto output = gil::extend_col(src_view, 1, gil::boundary_option::extend_constant);
+
+ BOOST_TEST(gil::equal_pixels(out_view, gil::view(output)));
+}
+
+void test_extend_col_with_zero()
+{
+ gil::gray8c_view_t src_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t *>(img), 9);
+
+ gil::gray8c_view_t out_view =
+ gil::interleaved_view(13, 9, reinterpret_cast<const gil::gray8_pixel_t *>(col_output_zero), 13);
+
+ auto output = gil::extend_col(src_view, 2, gil::boundary_option::extend_zero);
+
+ BOOST_TEST(gil::equal_pixels(out_view, gil::view(output)));
+}
+
+void test_extend_col_with_padded()
+{
+ gil::gray8c_view_t src_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t *>(img), 9);
+
+ auto src_sub_view = gil::subimage_view(src_view, 1, 0, 7, 9);
+
+ auto output = gil::extend_col(src_sub_view, 1, gil::boundary_option::extend_padded);
+
+ BOOST_TEST(gil::equal_pixels(src_view, gil::view(output)));
+}
+
+void test_extend_img_with_constant()
+{
+ gil::gray8c_view_t src_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t *>(img), 9);
+
+ gil::gray8c_view_t out_view =
+ gil::interleaved_view(13, 13, reinterpret_cast<const gil::gray8_pixel_t *>(boundary_output_constant), 13);
+
+ auto output = gil::extend_boundary(src_view, 2, gil::boundary_option::extend_constant);
+
+ BOOST_TEST(gil::equal_pixels(out_view, gil::view(output)));
+}
+
+void test_extend_img_with_zero()
+{
+ gil::gray8c_view_t src_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t *>(img), 9);
+
+ gil::gray8c_view_t out_view =
+ gil::interleaved_view(13, 13, reinterpret_cast<const gil::gray8_pixel_t *>(boundary_output_zero), 13);
+
+ auto output = gil::extend_boundary(src_view, 2, gil::boundary_option::extend_zero);
+
+ BOOST_TEST(gil::equal_pixels(out_view, gil::view(output)));
+}
+
+void test_extend_img_with_padded()
+{
+ gil::gray8c_view_t src_view =
+ gil::interleaved_view(9, 9, reinterpret_cast<const gil::gray8_pixel_t *>(img), 9);
+
+ auto src_sub_view = gil::subimage_view(src_view, 1, 1, 7, 7);
+
+ auto output = gil::extend_boundary(src_sub_view, 1, gil::boundary_option::extend_padded);
+
+ BOOST_TEST(gil::equal_pixels(src_view, gil::view(output)));
+}
+
+int main()
+{
+ test_extend_row_with_constant();
+ test_extend_row_with_zero();
+ test_extend_row_with_padded();
+ test_extend_col_with_constant();
+ test_extend_col_with_zero();
+ test_extend_col_with_padded();
+ test_extend_img_with_constant();
+ test_extend_img_with_zero();
+ test_extend_img_with_padded();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/numeric/kernel.cpp b/src/boost/libs/gil/test/extension/numeric/kernel.cpp
new file mode 100644
index 000000000..c60e570a6
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/kernel.cpp
@@ -0,0 +1,174 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+// Copyright 2019 Miral Shah <miralshah2211@gmail.com>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#define BOOST_DISABLE_ASSERTS 1 // kernel_1d_adaptor assertions are too strict
+#include <boost/gil.hpp>
+#include <boost/gil/extension/numeric/kernel.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <vector>
+
+namespace gil = boost::gil;
+
+void test_kernel_1d_default_constructor()
+{
+ gil::kernel_1d<int> k;
+ BOOST_TEST_EQ(k.center(), 0);
+ BOOST_TEST_EQ(k.left_size(), 0);
+ BOOST_TEST_EQ(static_cast<int>(k.right_size()), -1);
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), 0);
+}
+
+void test_kernel_2d_default_constructor()
+{
+ gil::detail::kernel_2d<int> k;
+ BOOST_TEST_EQ(k.center_y(), 0);
+ BOOST_TEST_EQ(k.center_x(), 0);
+
+ //BOOST_TEST_EQ(k.left_size(), 0);
+ //BOOST_TEST_EQ(k.right_size(), -1);
+ BOOST_TEST_EQ(k.upper_size(), 0);
+ BOOST_TEST_EQ(static_cast<int>(k.lower_size()), -1);
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), 0);
+}
+
+void test_kernel_1d_parameterized_constructor()
+{
+ gil::kernel_1d<int> k(9, 4);
+ BOOST_TEST_EQ(k.center(), 4);
+ BOOST_TEST_EQ(k.left_size(), 4);
+ BOOST_TEST_EQ(k.right_size(), 4);
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), 9);
+}
+
+void test_kernel_2d_parameterized_constructor()
+{
+ gil::detail::kernel_2d<int> k(9, 4, 4);
+ BOOST_TEST_EQ(k.center_y(), 4);
+ BOOST_TEST_EQ(k.center_x(), 4);
+ BOOST_TEST_EQ(k.left_size(), 4);
+ BOOST_TEST_EQ(k.right_size(), 4);
+ BOOST_TEST_EQ(k.upper_size(), 4);
+ BOOST_TEST_EQ(k.lower_size(), 4);
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), 9);
+}
+
+void test_kernel_1d_parameterized_constructor_with_iterator()
+{
+ std::vector<int> v(9);
+ gil::kernel_1d<int> k(v.cbegin(), v.size(), 4);
+ BOOST_TEST_EQ(k.center(), 4);
+ BOOST_TEST_EQ(k.left_size(), 4);
+ BOOST_TEST_EQ(k.right_size(), 4);
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), 9);
+}
+
+void test_kernel_2d_parameterized_constructor_with_iterator()
+{
+ std::vector<int> v(81);
+ gil::detail::kernel_2d<int> k(v.cbegin(), v.size(), 4, 4);
+ BOOST_TEST_EQ(k.center_y(), 4);
+ BOOST_TEST_EQ(k.center_x(), 4);
+ BOOST_TEST_EQ(k.left_size(), 4);
+ BOOST_TEST_EQ(k.right_size(), 4);
+ BOOST_TEST_EQ(k.upper_size(), 4);
+ BOOST_TEST_EQ(k.lower_size(), 4);
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), 9);
+}
+
+void test_kernel_1d_copy_constructor()
+{
+ gil::kernel_1d<int> d(9, 4);
+ gil::kernel_1d<int> k(d);
+ BOOST_TEST_EQ(k.center(), 4);
+ BOOST_TEST_EQ(k.center(), d.center());
+ BOOST_TEST_EQ(k.left_size(), d.left_size());
+ BOOST_TEST_EQ(k.right_size(), d.right_size());
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), d.size());
+}
+
+void test_kernel_2d_copy_constructor()
+{
+ gil::detail::kernel_2d<int> d(9, 4, 4);
+ gil::detail::kernel_2d<int> k(d);
+ BOOST_TEST_EQ(k.center_y(), 4);
+ BOOST_TEST_EQ(k.center_x(), 4);
+ BOOST_TEST_EQ(k.center_y(), d.center_y());
+ BOOST_TEST_EQ(k.center_x(), d.center_x());
+ BOOST_TEST_EQ(k.left_size(), d.left_size());
+ BOOST_TEST_EQ(k.right_size(), d.right_size());
+ BOOST_TEST_EQ(k.lower_size(), d.lower_size());
+ BOOST_TEST_EQ(k.upper_size(), d.upper_size());
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), d.size());
+}
+
+void test_kernel_1d_assignment_operator()
+{
+ gil::kernel_1d<int> d(9, 4);
+ gil::kernel_1d<int> k;
+ k = d;
+ BOOST_TEST_EQ(k.center(), 4);
+ BOOST_TEST_EQ(k.center(), d.center());
+ BOOST_TEST_EQ(k.left_size(), d.left_size());
+ BOOST_TEST_EQ(k.right_size(), d.right_size());
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), d.size());
+}
+
+void test_kernel_2d_assignment_operator()
+{
+ gil::detail::kernel_2d<int> d(9, 4, 4);
+ gil::detail::kernel_2d<int> k;
+ k = d;
+ BOOST_TEST_EQ(k.center_y(), 4);
+ BOOST_TEST_EQ(k.center_x(), 4);
+ BOOST_TEST_EQ(k.center_y(), d.center_y());
+ BOOST_TEST_EQ(k.center_x(), d.center_x());
+ BOOST_TEST_EQ(k.left_size(), d.left_size());
+ BOOST_TEST_EQ(k.right_size(), d.right_size());
+ BOOST_TEST_EQ(k.lower_size(), d.lower_size());
+ BOOST_TEST_EQ(k.upper_size(), d.upper_size());
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), d.size());
+}
+
+void test_kernel_1d_reverse_kernel()
+{
+ gil::kernel_1d<int> d(12, 4);
+ BOOST_TEST_EQ(d.center(), 4);
+ auto k = gil::reverse_kernel(d);
+ BOOST_TEST_EQ(k.center(), d.right_size());
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), d.size());
+}
+
+int main()
+{
+ test_kernel_1d_default_constructor();
+ test_kernel_2d_default_constructor();
+ test_kernel_1d_parameterized_constructor();
+ test_kernel_2d_parameterized_constructor();
+ test_kernel_1d_parameterized_constructor_with_iterator();
+ test_kernel_2d_parameterized_constructor_with_iterator();
+ test_kernel_1d_copy_constructor();
+ test_kernel_2d_copy_constructor();
+ test_kernel_1d_assignment_operator();
+ test_kernel_2d_assignment_operator();
+ test_kernel_1d_reverse_kernel();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/numeric/kernel_1d_fixed_even_size_fail.cpp b/src/boost/libs/gil/test/extension/numeric/kernel_1d_fixed_even_size_fail.cpp
new file mode 100644
index 000000000..a8be85fcd
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/kernel_1d_fixed_even_size_fail.cpp
@@ -0,0 +1,16 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/extension/numeric/kernel.hpp>
+
+namespace gil = boost::gil;
+
+int main()
+{
+ gil::kernel_1d_fixed<int, 0> k0;
+ gil::kernel_1d_fixed<int, 4> k4;
+}
diff --git a/src/boost/libs/gil/test/extension/numeric/kernel_fixed.cpp b/src/boost/libs/gil/test/extension/numeric/kernel_fixed.cpp
new file mode 100644
index 000000000..cfd075eaf
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/kernel_fixed.cpp
@@ -0,0 +1,183 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+// Copyright 2019 Miral Shah <miralshah2211@gmail.com>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#define BOOST_DISABLE_ASSERTS 1 // kernel_1d_adaptor assertions are too strict
+#include <boost/gil.hpp>
+#include <boost/gil/extension/numeric/kernel.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <vector>
+
+namespace gil = boost::gil;
+
+void test_kernel_1d_fixed_default_constructor()
+{
+ gil::kernel_1d_fixed<int, 9> k;
+ BOOST_TEST_EQ(k.center(), 0);
+ BOOST_TEST_EQ(k.left_size(), 0);
+ BOOST_TEST_EQ(k.right_size(), 8); // TODO: Why not 0 or -1 if not set?
+ // std::array interface
+ BOOST_TEST_EQ(k.size(), 9);
+}
+
+void test_kernel_2d_fixed_default_constructor()
+{
+ gil::detail::kernel_2d_fixed<int, 9> k;
+ BOOST_TEST_EQ(k.center_x(), 0);
+ BOOST_TEST_EQ(k.center_y(), 0);
+ BOOST_TEST_EQ(k.left_size(), 0);
+ BOOST_TEST_EQ(k.right_size(), 8); // TODO: Why not 0 or -1 if not set?
+ BOOST_TEST_EQ(k.upper_size(), 0);
+ BOOST_TEST_EQ(k.lower_size(), 8);
+ // std::array interface
+ BOOST_TEST_EQ(k.size(), 9);
+}
+
+void test_kernel_1d_fixed_parameterized_constructor()
+{
+ gil::kernel_1d_fixed<int, 9> k(4);
+ BOOST_TEST_EQ(k.center(), 4);
+ BOOST_TEST_EQ(k.left_size(), 4);
+ BOOST_TEST_EQ(k.right_size(), 4);
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), 9);
+}
+
+void test_kernel_2d_fixed_parameterized_constructor()
+{
+ gil::detail::kernel_2d_fixed<int, 9> k(4, 4);
+ BOOST_TEST_EQ(k.center_x(), 4);
+ BOOST_TEST_EQ(k.center_y(), 4);
+ BOOST_TEST_EQ(k.left_size(), 4);
+ BOOST_TEST_EQ(k.right_size(), 4);
+ BOOST_TEST_EQ(k.upper_size(), 4);
+ BOOST_TEST_EQ(k.lower_size(), 4);
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), 9);
+}
+
+void test_kernel_1d_fixed_parameterized_constructor_with_iterator()
+{
+ // FIXME: The constructor should throw if v.size() < k.size()
+ std::vector<int> v(9);
+ gil::kernel_1d_fixed<int, 9> k(v.cbegin(), 4);
+ BOOST_TEST_EQ((gil::kernel_1d_fixed<int, 9>::static_size), 9);
+ BOOST_TEST_EQ(k.center(), 4);
+ BOOST_TEST_EQ(k.left_size(), 4);
+ BOOST_TEST_EQ(k.right_size(), 4);
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), 9);
+}
+
+void test_kernel_2d_fixed_parameterized_constructor_with_iterator()
+{
+// // FIXME: The constructor should throw if v.size() < k.size()
+ std::array<int, 81> v;
+ gil::detail::kernel_2d_fixed<int, 9> k(v.cbegin(), 4, 4);
+ BOOST_TEST_EQ((gil::detail::kernel_2d_fixed<int, 9>::static_size), 9);
+ BOOST_TEST_EQ(k.center_y(), 4);
+ BOOST_TEST_EQ(k.center_x(), 4);
+ BOOST_TEST_EQ(k.left_size(), 4);
+ BOOST_TEST_EQ(k.right_size(), 4);
+ BOOST_TEST_EQ(k.upper_size(), 4);
+ BOOST_TEST_EQ(k.lower_size(), 4);
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), 9);
+}
+
+void test_kernel_1d_fixed_copy_constructor()
+{
+ gil::kernel_1d_fixed<int, 9> d(4);
+ gil::kernel_1d_fixed<int, 9> k(d);
+ BOOST_TEST_EQ((gil::kernel_1d_fixed<int, 9>::static_size), 9);
+ BOOST_TEST_EQ(k.center(), 4);
+ BOOST_TEST_EQ(k.center(), d.center());
+ BOOST_TEST_EQ(k.left_size(), d.left_size());
+ BOOST_TEST_EQ(k.right_size(), d.right_size());
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), d.size());
+}
+
+void test_kernel_2d_fixed_copy_constructor()
+{
+ gil::detail::kernel_2d_fixed<int, 9> d(4, 4);
+ gil::detail::kernel_2d_fixed<int, 9> k(d);
+ BOOST_TEST_EQ((gil::detail::kernel_2d_fixed<int, 9>::static_size), 9);
+ BOOST_TEST_EQ(k.center_x(), 4);
+ BOOST_TEST_EQ(k.center_y(), 4);
+ BOOST_TEST_EQ(k.center_x(), d.center_x());
+ BOOST_TEST_EQ(k.center_y(), d.center_y());
+ BOOST_TEST_EQ(k.left_size(), d.left_size());
+ BOOST_TEST_EQ(k.right_size(), d.right_size());
+ BOOST_TEST_EQ(k.lower_size(), d.lower_size());
+ BOOST_TEST_EQ(k.upper_size(), d.upper_size());
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), d.size());
+}
+
+void test_kernel_1d_fixed_assignment_operator()
+{
+ gil::kernel_1d_fixed<int, 9> d(4);
+ gil::kernel_1d_fixed<int, 9> k;
+ k = d;
+ BOOST_TEST_EQ((gil::kernel_1d_fixed<int, 9>::static_size), 9);
+ BOOST_TEST_EQ(k.center(), 4);
+ BOOST_TEST_EQ(k.center(), d.center());
+ BOOST_TEST_EQ(k.left_size(), d.left_size());
+ BOOST_TEST_EQ(k.right_size(), d.right_size());
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), d.size());
+}
+
+void test_kernel_2d_fixed_assignment_operator()
+{
+ gil::detail::kernel_2d_fixed<int, 9> d(4, 4);
+ gil::detail::kernel_2d_fixed<int, 9> k;
+ k = d;
+ BOOST_TEST_EQ((gil::detail::kernel_2d_fixed<int, 9>::static_size), 9);
+ BOOST_TEST_EQ(k.center_x(), 4);
+ BOOST_TEST_EQ(k.center_y(), 4);
+ BOOST_TEST_EQ(k.center_x(), d.center_x());
+ BOOST_TEST_EQ(k.center_y(), d.center_y());
+ BOOST_TEST_EQ(k.left_size(), d.left_size());
+ BOOST_TEST_EQ(k.right_size(), d.right_size());
+ BOOST_TEST_EQ(k.lower_size(), d.lower_size());
+ BOOST_TEST_EQ(k.upper_size(), d.upper_size());
+ // std::vector interface
+ BOOST_TEST_EQ(k.size(), d.size());
+}
+
+void test_kernel_1d_fixed_reverse_kernel()
+{
+ std::array<int, 3> values = {{1, 2, 3}};
+ gil::kernel_1d_fixed<int, 3> k(values.begin(), 1);
+ BOOST_TEST_EQ((gil::kernel_1d_fixed<int, 3>::static_size), 3);
+ BOOST_TEST_ALL_EQ(k.begin(), k.end(), values.begin(), values.end());
+
+ std::array<int, 3> values_rev = {{3, 2, 1}};
+ auto const k_rev = gil::reverse_kernel(k);
+ BOOST_TEST_ALL_EQ(k_rev.begin(), k_rev.end(), values_rev.begin(), values_rev.end());
+}
+
+int main()
+{
+ test_kernel_1d_fixed_default_constructor();
+ test_kernel_2d_fixed_default_constructor();
+ test_kernel_1d_fixed_parameterized_constructor();
+ test_kernel_2d_fixed_parameterized_constructor();
+ test_kernel_1d_fixed_parameterized_constructor_with_iterator();
+ test_kernel_2d_fixed_parameterized_constructor_with_iterator();
+ test_kernel_1d_fixed_copy_constructor();
+ test_kernel_2d_fixed_copy_constructor();
+ test_kernel_1d_fixed_assignment_operator();
+ test_kernel_2d_fixed_assignment_operator();
+ test_kernel_1d_fixed_reverse_kernel();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/numeric/matrix3x2.cpp b/src/boost/libs/gil/test/extension/numeric/matrix3x2.cpp
new file mode 100644
index 000000000..f1c19cd04
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/matrix3x2.cpp
@@ -0,0 +1,191 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/numeric/affine.hpp>
+#include <boost/gil/extension/numeric/resample.hpp>
+#include <boost/gil/extension/numeric/sampler.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cmath>
+
+namespace gil = boost::gil;
+
+// FIXME: Remove when https://github.com/boostorg/core/issues/38 happens
+#define BOOST_GIL_TEST_IS_CLOSE(a, b, epsilon) BOOST_TEST_LT(std::fabs((a) - (b)), (epsilon))
+
+namespace {
+constexpr double HALF_PI = 1.57079632679489661923;
+}
+
+void test_matrix3x2_default_constructor()
+{
+ gil::matrix3x2<int> m1;
+ BOOST_TEST_EQ(m1.a, 1);
+ BOOST_TEST_EQ(m1.b, 0);
+ BOOST_TEST_EQ(m1.c, 0);
+ BOOST_TEST_EQ(m1.d, 1);
+ BOOST_TEST_EQ(m1.e, 0);
+ BOOST_TEST_EQ(m1.f, 0);
+}
+
+void test_matrix3x2_parameterized_constructor()
+{
+ gil::matrix3x2<int> m1(1, 2, 3, 4, 5, 6);
+ BOOST_TEST_EQ(m1.a, 1);
+ BOOST_TEST_EQ(m1.b, 2);
+ BOOST_TEST_EQ(m1.c, 3);
+ BOOST_TEST_EQ(m1.d, 4);
+ BOOST_TEST_EQ(m1.e, 5);
+ BOOST_TEST_EQ(m1.f, 6);
+}
+
+void test_matrix3x2_copy_constructor()
+{
+ gil::matrix3x2<int> m1(1, 2, 3, 4, 5, 6);
+ gil::matrix3x2<int> m2(m1);
+ BOOST_TEST_EQ(m2.a, 1);
+ BOOST_TEST_EQ(m2.b, 2);
+ BOOST_TEST_EQ(m2.c, 3);
+ BOOST_TEST_EQ(m2.d, 4);
+ BOOST_TEST_EQ(m2.e, 5);
+ BOOST_TEST_EQ(m2.f, 6);
+}
+
+void test_matrix3x2_assignment_operator()
+{
+ gil::matrix3x2<int> m1(1, 2, 3, 4, 5, 6);
+ gil::matrix3x2<int> m2;
+ m2 = m1;
+ BOOST_TEST_EQ(m2.a, 1);
+ BOOST_TEST_EQ(m2.b, 2);
+ BOOST_TEST_EQ(m2.c, 3);
+ BOOST_TEST_EQ(m2.d, 4);
+ BOOST_TEST_EQ(m2.e, 5);
+ BOOST_TEST_EQ(m2.f, 6);
+}
+
+void test_matrix3x2_multiplication_assignment()
+{
+ gil::matrix3x2<int> m1;
+ gil::matrix3x2<int> m2;
+ m2 *= m1;
+ BOOST_TEST_EQ(m2.a, 1);
+ BOOST_TEST_EQ(m2.b, 0);
+ BOOST_TEST_EQ(m2.c, 0);
+ BOOST_TEST_EQ(m2.d, 1);
+ BOOST_TEST_EQ(m2.e, 0);
+ BOOST_TEST_EQ(m2.f, 0);
+
+ gil::matrix3x2<int> m3(0, 0, 0, 0, 0, 0);
+ m2 *= m3;
+ BOOST_TEST_EQ(m2.a, 0);
+ BOOST_TEST_EQ(m2.b, 0);
+ BOOST_TEST_EQ(m2.c, 0);
+ BOOST_TEST_EQ(m2.d, 0);
+ BOOST_TEST_EQ(m2.e, 0);
+ BOOST_TEST_EQ(m2.f, 0);
+}
+
+void test_matrix3x2_matrix3x2_multiplication()
+{
+ gil::matrix3x2<int> m1;
+ gil::matrix3x2<int> m2(0, 0, 0, 0, 0, 0);
+ gil::matrix3x2<int> m3;
+ m3 = m1 * m2;
+ BOOST_TEST_EQ(m3.a, 0);
+ BOOST_TEST_EQ(m3.b, 0);
+ BOOST_TEST_EQ(m3.c, 0);
+ BOOST_TEST_EQ(m3.d, 0);
+ BOOST_TEST_EQ(m3.e, 0);
+ BOOST_TEST_EQ(m3.f, 0);
+}
+
+void test_matrix3x2_vector_multiplication()
+{
+ gil::matrix3x2<int> m1;
+ gil::point<int> v1{2, 4};
+
+ gil::point<int> v2 = v1 * m1;
+ BOOST_TEST_EQ(v2.x, 2);
+ BOOST_TEST_EQ(v2.y, 4);
+
+ gil::point<int> v3 = gil::transform(m1, v1);
+ BOOST_TEST_EQ(v3.x, 2);
+ BOOST_TEST_EQ(v3.y, 4);
+}
+
+void test_matrix3x2_get_rotate()
+{
+ auto m1 = gil::matrix3x2<double>::get_rotate(HALF_PI);
+ BOOST_GIL_TEST_IS_CLOSE(m1.a, std::cos(HALF_PI), 0.03);
+ BOOST_TEST_EQ(m1.b, 1);
+ BOOST_TEST_EQ(m1.c, -1);
+ BOOST_GIL_TEST_IS_CLOSE(m1.d, std::cos(HALF_PI), 0.03);
+ BOOST_TEST_EQ(m1.e, 0);
+ BOOST_TEST_EQ(m1.f, 0);
+}
+
+void test_matrix3x2_get_scale()
+{
+ gil::matrix3x2<int> m1;
+ m1 = gil::matrix3x2<int>::get_scale(2);
+ BOOST_TEST_EQ(m1.a, 2);
+ BOOST_TEST_EQ(m1.b, 0);
+ BOOST_TEST_EQ(m1.c, 0);
+ BOOST_TEST_EQ(m1.d, 2);
+ BOOST_TEST_EQ(m1.e, 0);
+ BOOST_TEST_EQ(m1.f, 0);
+ m1 = gil::matrix3x2<int>::get_scale(2, 4);
+ BOOST_TEST_EQ(m1.a, 2);
+ BOOST_TEST_EQ(m1.d, 4);
+ m1 = gil::matrix3x2<int>::get_scale(gil::point<int>{4, 8});
+ BOOST_TEST_EQ(m1.a, 4);
+ BOOST_TEST_EQ(m1.d, 8);
+}
+
+void test_matrix3x2_get_translate()
+{
+ gil::matrix3x2<int> m1;
+ m1 = gil::matrix3x2<int>::get_translate(2, 4);
+ BOOST_TEST_EQ(m1.a, 1);
+ BOOST_TEST_EQ(m1.b, 0);
+ BOOST_TEST_EQ(m1.c, 0);
+ BOOST_TEST_EQ(m1.d, 1);
+ BOOST_TEST_EQ(m1.e, 2);
+ BOOST_TEST_EQ(m1.f, 4);
+ m1 = gil::matrix3x2<int>::get_translate(gil::point<int>{4, 8});
+ BOOST_TEST_EQ(m1.e, 4);
+ BOOST_TEST_EQ(m1.f, 8);
+}
+
+void test_matrix3x2_transform()
+{
+ gil::matrix3x2<int> m1;
+ gil::point<int> v1{2, 4};
+ gil::point<int> v2 = gil::transform(m1, v1);
+ BOOST_TEST_EQ(v2.x, 2);
+ BOOST_TEST_EQ(v2.y, 4);
+}
+
+int main()
+{
+ test_matrix3x2_default_constructor();
+ test_matrix3x2_parameterized_constructor();
+ test_matrix3x2_copy_constructor();
+ test_matrix3x2_assignment_operator();
+ test_matrix3x2_multiplication_assignment();
+ test_matrix3x2_matrix3x2_multiplication();
+ test_matrix3x2_vector_multiplication();
+ test_matrix3x2_get_rotate();
+ test_matrix3x2_get_scale();
+ test_matrix3x2_get_translate();
+ test_matrix3x2_transform();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/numeric/pixel_numeric_operations.cpp b/src/boost/libs/gil/test/extension/numeric/pixel_numeric_operations.cpp
new file mode 100644
index 000000000..5f18ebfbb
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/pixel_numeric_operations.cpp
@@ -0,0 +1,343 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/numeric/pixel_numeric_operations.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <tuple>
+#include <type_traits>
+
+#include "test_utility_output_stream.hpp"
+#include "core/test_fixture.hpp" // random_value
+#include "core/pixel/test_fixture.hpp"
+
+namespace gil = boost::gil;
+namespace fixture = boost::gil::test::fixture;
+
+struct test_plus_integer_same_types
+{
+ template <typename Pixel>
+ void operator()(Pixel const&)
+ {
+ using pixel_t = Pixel;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ gil::pixel_plus_t<pixel_t, pixel_t, pixel_t> f;
+ {
+ pixel_t p0;
+ gil::static_fill(p0, static_cast<channel_t>(0));
+ BOOST_TEST_EQ(f(p0, p0), p0);
+ }
+ {
+ pixel_t p1;
+ gil::static_fill(p1, static_cast<channel_t>(1));
+ pixel_t r2;
+ gil::static_fill(r2, static_cast<channel_t>(2));
+ BOOST_TEST_EQ(f(p1, p1), r2);
+ }
+ {
+ // Generates pixels with consecutive channel values: {1} or {1,2,3} or {1,2,3,4} etc.
+ fixture::consecutive_value<channel_t> g(1);
+ pixel_t p;
+ gil::static_generate(p, [&g]() { return g(); });
+ auto const r = f(p, p);
+ BOOST_TEST_NE(r, p);
+ BOOST_TEST_EQ(gil::at_c<0>(r), (gil::at_c<0>(p) + gil::at_c<0>(p)));
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_integer_types>(test_plus_integer_same_types{});
+ }
+};
+
+struct test_minus_integer_same_types
+{
+ template <typename Pixel>
+ void operator()(Pixel const&)
+ {
+ using pixel_t = Pixel;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ gil::pixel_minus_t<pixel_t, pixel_t, pixel_t> f;
+
+ pixel_t p0;
+ gil::static_fill(p0, static_cast<channel_t>(0));
+ BOOST_TEST_EQ(f(p0, p0), p0);
+ {
+ pixel_t p1, p2;
+ gil::static_fill(p1, static_cast<channel_t>(1));
+ gil::static_fill(p2, static_cast<channel_t>(2));
+ pixel_t r1;
+ gil::static_fill(r1, static_cast<channel_t>(1));
+ BOOST_TEST_EQ(f(p2, p1), r1);
+ }
+ {
+ // Generates pixels with consecutive channel values: {1} or {1,2,3} or {1,2,3,4} etc.
+ fixture::consecutive_value<channel_t> g(1);
+ pixel_t p;
+ gil::static_generate(p, [&g]() { return g(); });
+ BOOST_TEST_EQ(f(p, p), p0);
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_integer_types>(test_minus_integer_same_types{});
+ }
+};
+
+struct test_pixel_multiplies_scalar_integer_same_types
+{
+ template <typename Pixel>
+ void operator()(Pixel const&)
+ {
+ using pixel_t = Pixel;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ gil::pixel_multiplies_scalar_t<pixel_t, channel_t, pixel_t> f;
+
+ pixel_t p0;
+ gil::static_fill(p0, static_cast<channel_t>(0));
+ BOOST_TEST_EQ(f(p0, 0), p0);
+
+ {
+ pixel_t p1;
+ gil::static_fill(p1, static_cast<channel_t>(1));
+ BOOST_TEST_EQ(f(p1, 0), p0);
+ BOOST_TEST_EQ(f(p1, 1), p1);
+ }
+ {
+ // Generates pixels with consecutive channel values: {1} or {1,2,3} or {1,2,3,4} etc.
+ fixture::consecutive_value<channel_t> g(1);
+ pixel_t p;
+ gil::static_generate(p, [&g]() { return g(); });
+
+ // check first channel value is doubled
+ auto const r = f(p, 2);
+ BOOST_TEST_NE(r, p);
+ BOOST_TEST_EQ(gil::at_c<0>(r), (gil::at_c<0>(p) * 2));
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_integer_types>(test_pixel_multiplies_scalar_integer_same_types{});
+ }
+};
+
+struct test_pixel_multiply_integer_same_types
+{
+ template <typename Pixel>
+ void operator()(Pixel const&)
+ {
+ using pixel_t = Pixel;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ gil::pixel_multiply_t<pixel_t, pixel_t, pixel_t> f;
+
+ pixel_t p0;
+ gil::static_fill(p0, static_cast<channel_t>(0));
+ BOOST_TEST_EQ(f(p0, p0), p0);
+
+ pixel_t p1;
+ gil::static_fill(p1, static_cast<channel_t>(1));
+ BOOST_TEST_EQ(f(p1, p1), p1);
+
+ pixel_t p2;
+ gil::static_fill(p2, static_cast<channel_t>(2));
+ BOOST_TEST_EQ(f(p1, p2), p2);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_integer_types>(test_pixel_multiply_integer_same_types{});
+ }
+};
+
+struct test_pixel_divides_scalar_integer_same_types
+{
+ template <typename Pixel>
+ void operator()(Pixel const&)
+ {
+ using pixel_t = Pixel;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ gil::pixel_divides_scalar_t<pixel_t, channel_t, pixel_t> f;
+
+ pixel_t p0;
+ gil::static_fill(p0, static_cast<channel_t>(0));
+ BOOST_TEST_EQ(f(p0, 1), p0);
+
+ pixel_t p1;
+ gil::static_fill(p1, static_cast<channel_t>(1));
+ BOOST_TEST_EQ(f(p1, 1), p1);
+
+ pixel_t p2;
+ gil::static_fill(p2, static_cast<channel_t>(2));
+ BOOST_TEST_EQ(f(p2, 2), p1);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_integer_types>(test_pixel_divides_scalar_integer_same_types{});
+ }
+};
+
+struct test_pixel_divide_integer_same_types
+{
+ template <typename Pixel>
+ void operator()(Pixel const&)
+ {
+ using pixel_t = Pixel;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ gil::pixel_divide_t<pixel_t, pixel_t, pixel_t> f;
+
+ pixel_t p0;
+ gil::static_fill(p0, static_cast<channel_t>(0));
+ pixel_t p1;
+ gil::static_fill(p1, static_cast<channel_t>(1));
+ BOOST_TEST_EQ(f(p0, p1), p0);
+ BOOST_TEST_EQ(f(p1, p1), p1);
+
+ pixel_t p2;
+ gil::static_fill(p2, static_cast<channel_t>(2));
+ BOOST_TEST_EQ(f(p2, p1), p2);
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_integer_types>(test_pixel_divide_integer_same_types{});
+ }
+};
+
+struct test_pixel_halves_integer_same_types
+{
+ template <typename Pixel>
+ void operator()(Pixel const&)
+ {
+ using pixel_t = Pixel;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ gil::pixel_halves_t<pixel_t> f;
+
+ pixel_t p0;
+ gil::static_fill(p0, static_cast<channel_t>(0));
+ pixel_t p1;
+ gil::static_fill(p1, static_cast<channel_t>(1));
+
+ {
+ auto p = p0;
+ BOOST_TEST_EQ(f(p), p0);
+ }
+ {
+ auto p = p1;
+ BOOST_TEST_EQ(f(p), p0); // truncates toward Zero
+ }
+ {
+ pixel_t p2;
+ gil::static_fill(p2, static_cast<channel_t>(2));
+ BOOST_TEST_EQ(f(p2), p1);
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_integer_types>(test_pixel_halves_integer_same_types{});
+ }
+};
+
+struct test_pixel_zeros_integer_same_types
+{
+ template <typename Pixel>
+ void operator()(Pixel const&)
+ {
+ using pixel_t = Pixel;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ gil::pixel_zeros_t<pixel_t> f;
+
+ pixel_t p0;
+ gil::static_fill(p0, static_cast<channel_t>(0));
+ {
+ auto p = p0;
+ BOOST_TEST_EQ(f(p), p0);
+ }
+ {
+ fixture::consecutive_value<channel_t> g(1);
+ pixel_t p;
+ gil::static_generate(p, [&g]() { return g(); });
+ BOOST_TEST_EQ(f(p), p0);
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_integer_types>(test_pixel_zeros_integer_same_types{});
+ }
+};
+
+struct test_zero_channels_integer_same_types
+{
+ template <typename Pixel>
+ void operator()(Pixel const&)
+ {
+ using pixel_t = Pixel;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+
+ pixel_t p0;
+ gil::static_fill(p0, static_cast<channel_t>(0));
+ {
+ auto p = p0;
+ gil::zero_channels(p);
+ BOOST_TEST_EQ(p, p0);
+ }
+ {
+ fixture::consecutive_value<channel_t> g(1);
+ pixel_t p;
+ gil::static_generate(p, [&g]() { return g(); });
+ gil::zero_channels(p);
+ BOOST_TEST_EQ(p, p0);
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_integer_types>(test_zero_channels_integer_same_types{});
+ }
+};
+
+struct test_pixel_assigns_integer_same_types
+{
+ template <typename Pixel>
+ void operator()(Pixel const&)
+ {
+ using pixel_t = Pixel;
+ using channel_t = typename gil::channel_type<pixel_t>::type;
+ gil::pixel_assigns_t<pixel_t, pixel_t> f;
+
+ {
+ pixel_t p0, r;
+ gil::static_fill(p0, static_cast<channel_t>(0));
+ f(p0, r);
+ BOOST_TEST_EQ(p0, r);
+ }
+ {
+ fixture::consecutive_value<channel_t> g(1);
+ pixel_t p, r;
+ gil::static_generate(p, [&g]() { return g(); });
+ f(p, r);
+ BOOST_TEST_EQ(p, r);
+ }
+ }
+ static void run()
+ {
+ boost::mp11::mp_for_each<fixture::pixel_integer_types>(test_pixel_assigns_integer_same_types{});
+ }
+};
+int main()
+{
+ test_plus_integer_same_types::run();
+ test_minus_integer_same_types::run();
+ test_pixel_multiplies_scalar_integer_same_types::run();
+ test_pixel_multiply_integer_same_types::run();
+ test_pixel_divides_scalar_integer_same_types::run();
+ test_pixel_divide_integer_same_types::run();
+ test_pixel_halves_integer_same_types::run();
+ test_pixel_zeros_integer_same_types::run();
+ test_zero_channels_integer_same_types::run();
+ test_pixel_assigns_integer_same_types::run();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/numeric/pixel_numeric_operations_float.cpp b/src/boost/libs/gil/test/extension/numeric/pixel_numeric_operations_float.cpp
new file mode 100644
index 000000000..79caa7a75
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/pixel_numeric_operations_float.cpp
@@ -0,0 +1,97 @@
+//
+// Copyright 2013 Krzysztof Czainski
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/numeric/resample.hpp>
+#include <boost/gil/extension/numeric/sampler.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cmath>
+
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+
+// FIXME: Remove when https://github.com/boostorg/core/issues/38 happens
+#define BOOST_GIL_TEST_IS_CLOSE(a, b, epsilon) BOOST_TEST_LT(std::fabs((a) - (b)), (epsilon))
+
+void test_plus()
+{
+ gil::rgb8_pixel_t a(10, 20, 30);
+ gil::bgr8_pixel_t b(30, 20, 10);
+
+ gil::pixel_plus_t<gil::rgb8_pixel_t, gil::bgr8_pixel_t, gil::rgb8_pixel_t> op;
+ gil::rgb8_pixel_t c = op(a, b);
+
+ BOOST_TEST_EQ(get_color(c, gil::red_t()), 20);
+ BOOST_TEST_EQ(get_color(c, gil::green_t()), 40);
+ BOOST_TEST_EQ(get_color(c, gil::blue_t()), 60);
+
+ gil::pixel_plus_t<gil::rgb8_pixel_t, gil::bgr8_pixel_t, gil::bgr8_pixel_t> op2;
+ gil::bgr8_pixel_t d = op2(a, b);
+
+ BOOST_TEST_EQ(get_color(d, gil::red_t()), 20);
+ BOOST_TEST_EQ(get_color(d, gil::green_t()), 40);
+ BOOST_TEST_EQ(get_color(d, gil::blue_t()), 60);
+}
+
+void test_multiply()
+{
+ gil::rgb32f_pixel_t a(1.f, 2.f, 3.f);
+ gil::bgr32f_pixel_t b(2.f, 2.f, 2.f);
+
+ gil::pixel_multiply_t<
+ gil::rgb32f_pixel_t, gil::bgr32f_pixel_t, gil::rgb32f_pixel_t>
+ op;
+ gil::rgb32f_pixel_t c = op(a, b);
+
+ float epsilon = 1e-6f;
+ BOOST_GIL_TEST_IS_CLOSE(get_color(c, gil::red_t()), 2.f, epsilon);
+ BOOST_GIL_TEST_IS_CLOSE(get_color(c, gil::green_t()), 4.f, epsilon);
+ BOOST_GIL_TEST_IS_CLOSE(get_color(c, gil::blue_t()), 6.f, epsilon);
+}
+
+void test_divide()
+{
+ // integer
+ {
+ gil::rgb8_pixel_t a(10, 20, 30);
+ gil::bgr8_pixel_t b(2, 2, 2);
+
+ gil::pixel_divide_t<gil::rgb8_pixel_t, gil::bgr8_pixel_t, gil::rgb8_pixel_t> op;
+ gil::rgb32f_pixel_t c = op(a, b);
+
+ BOOST_TEST_EQ(get_color(c, gil::red_t()), 5);
+ BOOST_TEST_EQ(get_color(c, gil::green_t()), 10);
+ BOOST_TEST_EQ(get_color(c, gil::blue_t()), 15);
+ }
+
+ // float
+ {
+ gil::rgb32f_pixel_t a(1.f, 2.f, 3.f);
+ gil::bgr32f_pixel_t b(2.f, 2.f, 2.f);
+
+ gil::pixel_divide_t<gil::rgb32f_pixel_t, gil::bgr32f_pixel_t, gil::rgb32f_pixel_t> op;
+ gil::rgb32f_pixel_t c = op(a, b);
+
+ float epsilon = 1e-6f;
+ BOOST_GIL_TEST_IS_CLOSE(get_color(c, gil::red_t()), 0.5f, epsilon);
+ BOOST_GIL_TEST_IS_CLOSE(get_color(c, gil::green_t()), 1.f, epsilon);
+ BOOST_GIL_TEST_IS_CLOSE(get_color(c, gil::blue_t()), 1.5f, epsilon);
+ }
+}
+
+int main()
+{
+ test_plus();
+ test_multiply();
+ test_divide();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/numeric/resample.cpp b/src/boost/libs/gil/test/extension/numeric/resample.cpp
new file mode 100644
index 000000000..fa8616253
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/resample.cpp
@@ -0,0 +1,103 @@
+//
+// Copyright 2013 Krzysztof Czainski
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/numeric/resample.hpp>
+#include <boost/gil/extension/numeric/sampler.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cmath>
+
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+
+// FIXME: Remove when https://github.com/boostorg/core/issues/38 happens
+#define BOOST_GIL_TEST_IS_CLOSE(a, b, epsilon) BOOST_TEST_LT(std::fabs((a) - (b)), (epsilon))
+
+template <class F, class I>
+struct test_map_fn
+{
+ using point_t = gil::point<F>;
+ using result_type = point_t;
+ result_type operator()(gil::point<I> const &src) const
+ {
+ F x = static_cast<F>(src.x) - 0.5;
+ F y = static_cast<F>(src.y) - 0.5;
+ return {x, y};
+ }
+};
+
+namespace boost { namespace gil {
+
+// NOTE: I suggest this could be the default behavior:
+
+template <typename T>
+struct mapping_traits;
+
+template <class F, class I>
+struct mapping_traits<test_map_fn<F, I>>
+{
+ using result_type = typename test_map_fn<F, I>::result_type;
+};
+
+template <class F, class I>
+inline point<F> transform(test_map_fn<F, I> const &mf, point<I> const &src)
+{
+ return mf(src);
+}
+
+}} // namespace boost::gil
+
+void test_bilinear_sampler_test()
+{
+ // R G B
+ // G W R
+ // B R G
+ gil::rgb8_image_t img(3, 3);
+ gil::rgb8_view_t v = view(img);
+ v(0, 0) = v(1, 2) = v(2, 1) = gil::rgb8_pixel_t(128, 0, 0);
+ v(0, 1) = v(1, 0) = v(2, 2) = gil::rgb8_pixel_t(0, 128, 0);
+ v(0, 2) = v(2, 0) = gil::rgb8_pixel_t(0, 0, 128);
+ v(1, 1) = gil::rgb8_pixel_t(128, 128, 128);
+
+ gil::rgb8_image_t dims(4, 4);
+ gil::rgb8c_view_t dv = gil::const_view(dims);
+
+ test_map_fn<double, gil::rgb8_image_t::coord_t> mf;
+
+ gil::resample_pixels(gil::const_view(img), gil::view(dims), mf, gil::bilinear_sampler());
+
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(128, 0, 0), dv(0, 0));
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(64, 64, 0), dv(0, 1));
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(0, 64, 64), dv(0, 2));
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(0, 0, 128), dv(0, 3));
+
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(64, 64, 0), dv(1, 0));
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(64, 96, 32), dv(1, 1));
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(64, 64, 64), dv(1, 2));
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(64, 0, 64), dv(1, 3));
+
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(0, 64, 64), dv(2, 0));
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(64, 64, 64), dv(2, 1));
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(96, 64, 32), dv(2, 2));
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(64, 64, 0), dv(2, 3));
+
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(0, 0, 128), dv(3, 0));
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(64, 0, 64), dv(3, 1));
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(64, 64, 0), dv(3, 2));
+ BOOST_TEST_EQ(gil::rgb8_pixel_t(0, 128, 0), dv(3, 3));
+}
+
+int main()
+{
+ test_bilinear_sampler_test();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/numeric/test_fixture.hpp b/src/boost/libs/gil/test/extension/numeric/test_fixture.hpp
new file mode 100644
index 000000000..bfd5cf6f2
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/numeric/test_fixture.hpp
@@ -0,0 +1,30 @@
+//
+// Copyright 2019 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/numeric/kernel.hpp>
+#include <boost/assert.hpp>
+
+#include <initializer_list>
+#include <type_traits>
+
+namespace boost { namespace gil {
+
+namespace test { namespace fixture {
+
+template <typename T>
+auto create_kernel(std::initializer_list<T> const& values)
+ -> gil::kernel_1d<T>
+{
+ static_assert(std::is_arithmetic<T>::value,
+ "kernel value type should be integral or floating-point type");
+ BOOST_ASSERT_MSG((values.size() - 1) % 2 == 0, "expected odd number of kernel values");
+ gil::kernel_1d<T> kernel(values.begin(), values.size(), (values.size() - 1) / 2);
+ return kernel;
+}
+
+}}}} // namespace boost::gil::test::fixture
diff --git a/src/boost/libs/gil/test/extension/toolbox/CMakeLists.txt b/src/boost/libs/gil/test/extension/toolbox/CMakeLists.txt
new file mode 100644
index 000000000..70df68db4
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/CMakeLists.txt
@@ -0,0 +1,64 @@
+#
+# Copyright (c) 2017 Mateusz Loskot <mateusz at loskot dot net>
+# All rights reserved.
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+message(STATUS "Boost.GIL: Configuring tests in test/extension/toolbox")
+
+foreach(_name
+ channel_type
+ channel_view
+ color_convert_cmyka
+ color_convert_gray
+ color_convert_gray_alpha
+ color_convert_hsl
+ color_convert_hsv
+ color_convert_lab
+ color_convert_luminance
+ color_convert_xyz
+ get_num_bits
+ get_pixel_type
+ is_bit_aligned
+ is_homogeneous
+ pixel_bit_size
+ subchroma_image)
+ set(_test t_ext_toolbox_${_name})
+ set(_target test_ext_toolbox_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name})
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
+
+# FIXME: https://github.com/boostorg/gil/issues/235
+foreach(_name
+ indexed_image)
+ set(_test t_ext_toolbox_${_name})
+ set(_target test_ext_toolbox_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name})
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
diff --git a/src/boost/libs/gil/test/extension/toolbox/Jamfile b/src/boost/libs/gil/test/extension/toolbox/Jamfile
new file mode 100644
index 000000000..a68af63f3
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/Jamfile
@@ -0,0 +1,33 @@
+# Boost.GIL (Generic Image Library) - Toolbox tests
+#
+# Copyright (c) 2012 Christian Henning
+# Copyright (c) 2012-202 Mateusz Loskot <mateusz@loskot.net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+import testing ;
+
+alias headers : [ generate_self_contained_headers extension/toolbox ] ;
+
+compile channel_type.cpp ;
+compile get_num_bits.cpp ;
+compile get_pixel_type.cpp ;
+compile is_bit_aligned.cpp ;
+compile is_homogeneous.cpp ;
+compile pixel_bit_size.cpp ;
+
+run channel_view.cpp ;
+run color_convert_cmyka.cpp ;
+run color_convert_gray.cpp ;
+run color_convert_gray_alpha.cpp ;
+run color_convert_hsl.cpp ;
+run color_convert_hsv.cpp ;
+run color_convert_lab.cpp ;
+run color_convert_luminance.cpp ;
+run color_convert_xyz.cpp ;
+run indexed_image.cpp ;
+
+# TODO: Add subchroma_image.cpp after fixing run-time failure,
+# for details see https://github.com/boostorg/gil/pull/164
+#run subchroma_image.cpp ;
diff --git a/src/boost/libs/gil/test/extension/toolbox/channel_type.cpp b/src/boost/libs/gil/test/extension/toolbox/channel_type.cpp
new file mode 100644
index 000000000..ac615dd69
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/channel_type.cpp
@@ -0,0 +1,42 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/extension/toolbox/metafunctions/channel_type.hpp>
+#include <boost/gil/extension/toolbox/metafunctions/is_bit_aligned.hpp>
+
+#include <boost/gil/channel.hpp>
+#include <boost/gil/detail/is_channel_integral.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+void test_channel_type()
+{
+ static_assert(std::is_same
+ <
+ unsigned char,
+ gil::channel_type<gil::rgb8_pixel_t>::type
+ >::value, "");
+
+ // float32_t is a scoped_channel_value object
+ static_assert(std::is_same
+ <
+ gil::float32_t,
+ gil::channel_type<gil::rgba32f_pixel_t>::type
+ >::value, "");
+
+ // channel_type for bit_aligned images doesn't work with standard gil.
+ using image_t = gil::bit_aligned_image4_type<4, 4, 4, 4, gil::rgb_layout_t>::type;
+ using channel_t = gil::channel_type<image_t::view_t::reference>::type;
+ static_assert(gil::detail::is_channel_integral<channel_t>::value, "");
+}
+
+int main()
+{
+ test_channel_type();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/channel_view.cpp b/src/boost/libs/gil/test/extension/toolbox/channel_view.cpp
new file mode 100644
index 000000000..e29de6d4b
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/channel_view.cpp
@@ -0,0 +1,44 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/metafunctions/channel_view.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+void test_channel_view()
+{
+ using kth_channel_view_t
+ = gil::kth_channel_view_type<0, gil::rgb8_view_t::const_t>::type;
+ using channel_view_t
+ = gil::channel_view_type<gil::red_t, gil::rgb8_view_t::const_t>::type;
+
+ static_assert(std::is_same
+ <
+ kth_channel_view_t,
+ channel_view_t
+ >::value,
+ "");
+
+ gil::rgb8_image_t img(100, 100);
+ kth_channel_view_t const kth0 = gil::kth_channel_view<0>(gil::const_view(img));
+ BOOST_TEST_EQ(kth0.num_channels(), 1u);
+
+ channel_view_t const red = gil::channel_view<gil::red_t>(gil::const_view(img));
+ BOOST_TEST_EQ(red.num_channels(), 1u);
+}
+
+int main()
+{
+ test_channel_view();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/color_convert_cmyka.cpp b/src/boost/libs/gil/test/extension/toolbox/color_convert_cmyka.cpp
new file mode 100644
index 000000000..1e7ff7cae
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/color_convert_cmyka.cpp
@@ -0,0 +1,32 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/color_spaces/cmyka.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+namespace gil = boost::gil;
+
+void test_cmyka_to_rgba()
+{
+ gil::cmyka8_pixel_t a(10, 20, 30, 40, 50);
+ gil::rgba8_pixel_t b;
+ gil::color_convert(a, b);
+
+ // TODO: no rgba to cmyka conversion implemented
+ //gil::cmyka8_pixel_t c;
+ //gil::color_convert( b, c );
+ //BOOST_ASSERT(gil::at_c<0>(a) == gil::at_c<0>(c));
+}
+
+int main()
+{
+ test_cmyka_to_rgba();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/color_convert_gray.cpp b/src/boost/libs/gil/test/extension/toolbox/color_convert_gray.cpp
new file mode 100644
index 000000000..e06b5d873
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/color_convert_gray.cpp
@@ -0,0 +1,30 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/color_converters/gray_to_rgba.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+
+void test_gray_to_rgba()
+{
+ gil::gray8_pixel_t a(45);
+ gil::rgba8_pixel_t b;
+ gil::color_convert(a, b);
+ BOOST_TEST_EQ(b, gil::rgba8_pixel_t(45, 45, 45, 255));
+}
+
+int main()
+{
+ test_gray_to_rgba();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/color_convert_gray_alpha.cpp b/src/boost/libs/gil/test/extension/toolbox/color_convert_gray_alpha.cpp
new file mode 100644
index 000000000..ac5b1662a
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/color_convert_gray_alpha.cpp
@@ -0,0 +1,49 @@
+//
+// Copyright 2013 Christian Henning
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/color_spaces/gray_alpha.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+
+void test_gray_alpha_to_gray()
+{
+ gil::gray_alpha8_pixel_t a(10, 20);
+ gil::gray8_pixel_t b;
+ gil::color_convert(a, b);
+ BOOST_TEST_EQ(b, gil::gray8_pixel_t(1));
+}
+
+void test_gray_alpha_to_rgb()
+{
+ gil::gray_alpha8_pixel_t a(10, 20);
+ gil::rgb8_pixel_t b;
+ gil::color_convert(a, b);
+ BOOST_TEST_EQ(b, gil::rgb8_pixel_t(1, 1, 1));
+}
+
+void test_gray_alpha_to_rgba()
+{
+ gil::gray_alpha8_pixel_t a(10, 20);
+ gil::rgba8_pixel_t b;
+ gil::color_convert(a, b);
+ BOOST_TEST_EQ(b, gil::rgba8_pixel_t(10, 10, 10, 20));
+}
+
+int main()
+{
+ test_gray_alpha_to_gray();
+ test_gray_alpha_to_rgb();
+ test_gray_alpha_to_rgba();
+
+ return boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/color_convert_hsl.cpp b/src/boost/libs/gil/test/extension/toolbox/color_convert_hsl.cpp
new file mode 100644
index 000000000..33c5c1962
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/color_convert_hsl.cpp
@@ -0,0 +1,87 @@
+//
+// Copyright 2013 Christian Henning
+// Copyright 2020 Mateusz Loskot <mateusz@loskot.net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/color_spaces/hsl.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+
+void test_rgb_to_hsl()
+{
+ gil::rgb8_pixel_t p{128, 0, 128};
+ gil::hsl32f_pixel_t h;
+ gil::color_convert(p, h);
+
+ BOOST_TEST_GT(gil::get_color(h, gil::hsl_color_space::hue_t()), 0.8); // 0.83333331
+ BOOST_TEST_EQ(gil::get_color(h, gil::hsl_color_space::saturation_t()), 1.0); // 1.00000000
+ BOOST_TEST_GT(gil::get_color(h, gil::hsl_color_space::lightness_t()), 0.25); // 0.25098040
+}
+
+void test_hsl_to_rgb()
+{
+ gil::rgb8_pixel_t p(64, 0, 64);
+ gil::hsl32f_pixel_t h;
+ gil::color_convert(p, h);
+
+ gil::rgb8_pixel_t b;
+ gil::color_convert(h, b);
+ BOOST_TEST_EQ(b, p);
+}
+
+void test_image_assign_hsl()
+{
+ std::ptrdiff_t const w = 320;
+ std::ptrdiff_t const h = 240;
+ gil::hsl32f_image_t hsl_img(w, h);
+
+ for (std::ptrdiff_t y = 0; y < h; y++)
+ {
+ gil::hsl32f_view_t::x_iterator hsl_x_it = view(hsl_img).row_begin(y);
+ float v = static_cast<float>(h - y) / h;
+ for (std::ptrdiff_t x = 0; x < w; x++)
+ {
+ float const hue = (x + 1.f) / w;
+ gil::hsl32f_pixel_t const p(hue, 1.0, v);
+ hsl_x_it[x] = p;
+ BOOST_TEST_EQ(gil::view(hsl_img)(x, y), p);
+ }
+ }
+}
+
+void test_copy_pixels_rgb_to_hsl()
+{
+ gil::rgb8_image_t rgb_img(320, 240);
+ gil::rgb8_pixel_t rgb_pix(64, 32, 64);
+ gil::fill_pixels(view(rgb_img), rgb_pix);
+ gil::hsl32f_image_t hsl_img(view(rgb_img).dimensions());
+ gil::copy_pixels(gil::color_converted_view<gil::hsl32f_pixel_t>(view(rgb_img)), view(hsl_img));
+
+ auto view = gil::view(hsl_img);
+ for (auto it = view.begin(), end = view.end(); it != end; ++it)
+ {
+ gil::rgb8_pixel_t p;
+ gil::color_convert(*it, p);
+ BOOST_TEST_EQ(p, rgb_pix);
+ }
+}
+
+int main()
+{
+ test_rgb_to_hsl();
+ test_hsl_to_rgb();
+ test_image_assign_hsl();
+ test_copy_pixels_rgb_to_hsl();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/color_convert_hsv.cpp b/src/boost/libs/gil/test/extension/toolbox/color_convert_hsv.cpp
new file mode 100644
index 000000000..175a7d989
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/color_convert_hsv.cpp
@@ -0,0 +1,95 @@
+//
+// Copyright 2013 Christian Henning
+// Copyright 2020 Mateusz Loskot <mateusz@loskot.net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/color_spaces/hsv.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <iostream>
+
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+
+void test_rgb_to_hsv()
+{
+ gil::rgb8_pixel_t p{128, 0, 128};
+ gil::hsv32f_pixel_t h;
+ gil::color_convert(p, h);
+
+ BOOST_TEST_GT(gil::get_color(h, gil::hsv_color_space::hue_t()), 0.80); // 0.83333331
+ BOOST_TEST_LT(gil::get_color(h, gil::hsv_color_space::hue_t()), 0.85);
+ BOOST_TEST_GE(gil::get_color(h, gil::hsv_color_space::saturation_t()), 1.0); // 1.00000000
+ BOOST_TEST_LT(gil::get_color(h, gil::hsv_color_space::saturation_t()), 1.1);
+ BOOST_TEST_GE(gil::get_color(h, gil::hsv_color_space::value_t()), 0.50); // 0.50196081
+ BOOST_TEST_LT(gil::get_color(h, gil::hsv_color_space::value_t()), 0.51);
+}
+
+void test_hsv_to_rgb()
+{
+ gil::rgb8_pixel_t p(128, 0, 128);
+ gil::hsv32f_pixel_t h;
+ gil::color_convert(p, h);
+
+ gil::rgb8_pixel_t b;
+ gil::color_convert(h, b);
+ BOOST_TEST_EQ(b, gil::rgb8_pixel_t(128, 0, 128));
+}
+
+
+void test_image_assign_hsv()
+{
+ std::ptrdiff_t const w = 320;
+ std::ptrdiff_t const h = 240;
+ gil::hsv32f_image_t hsv_img(w, h);
+
+ for (std::ptrdiff_t y = 0; y < h; y++)
+ {
+ gil::hsv32f_view_t::x_iterator hsv_x_it = view(hsv_img).row_begin(y);
+ float v = static_cast<float>(h - y) / h;
+ for (std::ptrdiff_t x = 0; x < w; x++)
+ {
+ float const hue = (x + 1.f) / w;
+ gil::hsv32f_pixel_t const p(hue, 1.0, v);
+ hsv_x_it[x] = p;
+ BOOST_TEST_EQ(gil::view(hsv_img)(x, y), p);
+ }
+ }
+}
+
+void test_copy_pixels_rgb_to_hsv()
+{
+ gil::rgb8_image_t rgb_img(320, 240);
+ gil::rgb8_pixel_t rgb_pix(64, 32, 64);
+ gil::fill_pixels(view(rgb_img), rgb_pix);
+ gil::hsv32f_image_t hsv_img(view(rgb_img).dimensions());
+ gil::copy_pixels(gil::color_converted_view<gil::hsv32f_pixel_t>(view(rgb_img)), view(hsv_img));
+
+ auto view = gil::view(hsv_img);
+ for (auto it = view.begin(), end = view.end(); it != end; ++it)
+ {
+ auto h = *it;
+ BOOST_TEST_GT(gil::get_color(h, gil::hsv_color_space::hue_t()), 0.80); // 0.8333333
+ BOOST_TEST_LT(gil::get_color(h, gil::hsv_color_space::hue_t()), 0.85);
+ BOOST_TEST_GE(gil::get_color(h, gil::hsv_color_space::saturation_t()), 0.5); // 0.5000000
+ BOOST_TEST_LT(gil::get_color(h, gil::hsv_color_space::saturation_t()), 0.51);
+ BOOST_TEST_GT(gil::get_color(h, gil::hsv_color_space::value_t()), 0.25); // 0.25
+ BOOST_TEST_LT(gil::get_color(h, gil::hsv_color_space::value_t()), 0.26);
+ }
+}
+
+int main()
+{
+ test_rgb_to_hsv();
+ test_hsv_to_rgb();
+ test_image_assign_hsv();
+ test_copy_pixels_rgb_to_hsv();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/color_convert_lab.cpp b/src/boost/libs/gil/test/extension/toolbox/color_convert_lab.cpp
new file mode 100644
index 000000000..0bd2f31dc
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/color_convert_lab.cpp
@@ -0,0 +1,140 @@
+//
+// Copyright 2013 Christian Henning
+// Copyright 2013 Davide Anastasia <davideanastasia@users.sourceforge.net>
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/color_spaces/lab.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cmath>
+
+namespace gil = boost::gil;
+
+// FIXME: Remove when https://github.com/boostorg/core/issues/38 happens
+#define BOOST_GIL_TEST_IS_CLOSE(a, b) BOOST_TEST_LT(std::fabs((a) - (b)), (0.0005f))
+
+void test_lab_to_xyz()
+{
+ {
+ gil::lab32f_pixel_t lab_pixel(40.366198f, 53.354489f, 26.117702f);
+ gil::xyz32f_pixel_t xyz_pixel;
+ gil::color_convert(lab_pixel, xyz_pixel);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(xyz_pixel[0]), 0.197823f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(xyz_pixel[1]), 0.114731f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(xyz_pixel[2]), 0.048848f);
+ }
+ {
+ gil::lab32f_pixel_t lab_pixel(50, 0, 0);
+ gil::xyz32f_pixel_t xyz_pixel;
+ gil::color_convert(lab_pixel, xyz_pixel);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(xyz_pixel[0]), 0.175064f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(xyz_pixel[1]), 0.184187f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(xyz_pixel[2]), 0.200548f);
+ }
+}
+
+void test_xyz_to_lab()
+{
+ gil::lab32f_pixel_t lab_pixel;
+ gil::xyz32f_pixel_t xyz_pixel(0.085703f, 0.064716f, 0.147082f);
+ gil::color_convert(xyz_pixel, lab_pixel);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[0]), 30.572438f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[1]), 23.4674f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[2]), -22.322275f);
+}
+
+void test_rgb_to_lab()
+{
+ {
+ gil::rgb32f_pixel_t rgb_pixel(0.75f, 0.5f, 0.25f);
+ gil::lab32f_pixel_t lab_pixel;
+ gil::color_convert(rgb_pixel, lab_pixel);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[0]), 58.7767f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[1]), 18.5851f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[2]), 43.7975f);
+ }
+ {
+ gil::rgb32f_pixel_t rgb_pixel(1.f, 0.f, 0.f);
+ gil::lab32f_pixel_t lab_pixel;
+ gil::color_convert(rgb_pixel, lab_pixel);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[0]), 53.2408f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[1]), 80.0925f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[2]), 67.2032f);
+ }
+ {
+ gil::rgb32f_pixel_t rgb_pixel(0.f, 1.f, 0.f);
+ gil::lab32f_pixel_t lab_pixel;
+ gil::color_convert(rgb_pixel, lab_pixel);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[0]), 87.7347f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[1]), -86.1827f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[2]), 83.1793f);
+ }
+ {
+ gil::rgb32f_pixel_t rgb_pixel(0.f, 0.f, 1.f);
+ gil::lab32f_pixel_t lab_pixel;
+ gil::color_convert(rgb_pixel, lab_pixel);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[0]), 32.2970f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[1]), 79.1875f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[2]), -107.8602f);
+ }
+ {
+ gil::rgb32f_pixel_t rgb_pixel(1.f, 1.f, 1.f);
+ gil::lab32f_pixel_t lab_pixel;
+ gil::color_convert(rgb_pixel, lab_pixel);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[0]), 100.f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[1]), 0.f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[2]), 0.f);
+ }
+}
+
+void test_lab_to_rgb()
+{
+ {
+ gil::lab32f_pixel_t lab_pixel(75.f, 20.f, 40.f);
+ gil::rgb32f_pixel_t rgb_pixel;
+ gil::color_convert(lab_pixel, rgb_pixel);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[0]), 0.943240f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[1]), 0.663990f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[2]), 0.437893f);
+ }
+ {
+ gil::lab32f_pixel_t lab_pixel(100.f, 0.f, 0.f);
+ gil::rgb32f_pixel_t rgb_pixel;
+ gil::color_convert(lab_pixel, rgb_pixel);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[0]), 1.f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[1]), 1.f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[2]), 1.f);
+ }
+ {
+ gil::lab32f_pixel_t lab_pixel(56.8140f, -42.3665f, 10.6728f);
+ gil::rgb32f_pixel_t rgb_pixel;
+ gil::color_convert(lab_pixel, rgb_pixel);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[0]), 0.099999f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[1]), 0.605568f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[2]), 0.456662f);
+ }
+ {
+ gil::lab32f_pixel_t lab_pixel(50.5874f, 4.0347f, 50.5456f);
+ gil::rgb32f_pixel_t rgb_pixel;
+ gil::color_convert(lab_pixel, rgb_pixel);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[0]), 0.582705f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[1]), 0.454891f);
+ BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[2]), 0.1f);
+ }
+}
+
+int main()
+{
+ test_lab_to_xyz();
+ test_xyz_to_lab();
+ test_rgb_to_lab();
+ test_lab_to_rgb();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/color_convert_luminance.cpp b/src/boost/libs/gil/test/extension/toolbox/color_convert_luminance.cpp
new file mode 100644
index 000000000..36851b6e3
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/color_convert_luminance.cpp
@@ -0,0 +1,38 @@
+//
+// Copyright 2013 Christian Henning
+// Copyright 2013 Davide Anastasia <davideanastasia@users.sourceforge.net>
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/color_converters/rgb_to_luminance.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+
+struct double_zero { static double apply() { return 0.0; } };
+struct double_one { static double apply() { return 1.0; } };
+
+using gray64f_pixel_t = gil::pixel<double, gil::gray_layout_t>;
+using rgb64f_pixel_t = gil::pixel<double, gil::rgb_layout_t>;
+
+void test_rgb_to_luminance()
+{
+ rgb64f_pixel_t a(10, 20, 30);
+ gray64f_pixel_t b;
+ gil::color_convert(a, b);
+ BOOST_TEST_EQ(b, b);
+}
+
+int main()
+{
+ test_rgb_to_luminance();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/color_convert_xyz.cpp b/src/boost/libs/gil/test/extension/toolbox/color_convert_xyz.cpp
new file mode 100644
index 000000000..8121822d9
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/color_convert_xyz.cpp
@@ -0,0 +1,219 @@
+//
+// Copyright 2013 Christian Henning
+// Copyright 2013 Davide Anastasia <davideanastasia@users.sourceforge.net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/color_spaces/xyz.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+#include <limits>
+
+#ifndef BOOST_GIL_TEST_DEBUG_OSTREAM
+#include <iostream>
+#define BOOST_GIL_TEST_DEBUG_OSTREAM std::cout
+#endif
+
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+
+const float SKEW = 0.0001f;
+
+void test_rgb32f_xyz32f_1()
+{
+ gil::xyz32f_pixel_t xyz32f;
+ gil::rgb32f_pixel_t p32f(.934351f, 0.785446f, .105858f), p32f_b;
+ gil::color_convert(p32f, xyz32f);
+ gil::color_convert(xyz32f, p32f_b);
+
+ BOOST_GIL_TEST_DEBUG_OSTREAM
+ << p32f[0] << " "
+ << p32f[1] << " "
+ << p32f[2] << " -> "
+ << xyz32f[0] << " "
+ << xyz32f[1] << " "
+ << xyz32f[2] << " -> "
+ << p32f_b[0] << " "
+ << p32f_b[1] << " "
+ << p32f_b[2]
+ << '\n';
+
+ BOOST_TEST_LT(std::fabs(p32f[0] - p32f_b[0]), SKEW);
+ BOOST_TEST_LT(std::fabs(p32f[1] - p32f_b[1]), SKEW);
+ BOOST_TEST_LT(std::fabs(p32f[2] - p32f_b[2]), SKEW);
+ BOOST_TEST_LT(std::fabs(xyz32f[0] - 0.562669), SKEW);
+ BOOST_TEST_LT(std::fabs(xyz32f[1] - 0.597462), SKEW);
+ BOOST_TEST_LT(std::fabs(xyz32f[2] - 0.096050), SKEW);
+}
+
+void test_rgb32f_xyz32f_2()
+{
+ gil::xyz32f_pixel_t xyz32f;
+ gil::rgb32f_pixel_t p32f(.694617f, 0.173810f, 0.218710f), p32f_b;
+ gil::color_convert(p32f, xyz32f);
+ gil::color_convert(xyz32f, p32f_b);
+
+ BOOST_GIL_TEST_DEBUG_OSTREAM
+ << p32f[0] << " "
+ << p32f[1] << " "
+ << p32f[2] << " -> "
+ << xyz32f[0] << " "
+ << xyz32f[1] << " "
+ << xyz32f[2] << " -> "
+ << p32f_b[0] << " "
+ << p32f_b[1] << " "
+ << p32f_b[2]
+ << '\n';
+
+ BOOST_TEST_LT(std::fabs(p32f[0] - p32f_b[0]), SKEW);
+ BOOST_TEST_LT(std::fabs(p32f[1] - p32f_b[1]), SKEW);
+ BOOST_TEST_LT(std::fabs(p32f[2] - p32f_b[2]), SKEW);
+ BOOST_TEST_LT(std::fabs(xyz32f[0] - 0.197823), SKEW);
+ BOOST_TEST_LT(std::fabs(xyz32f[1] - 0.114731), SKEW);
+ BOOST_TEST_LT(std::fabs(xyz32f[2] - 0.048848), SKEW);
+}
+
+void test_xyz32f_rgb32f_1()
+{
+ gil::xyz32f_pixel_t xyz32f(.332634f, .436288f, .109853f), xyz32f_b;
+ gil::rgb32f_pixel_t p32f;
+ gil::color_convert(xyz32f, p32f);
+ gil::color_convert(p32f, xyz32f_b);
+
+ BOOST_GIL_TEST_DEBUG_OSTREAM
+ << xyz32f[0] << " "
+ << xyz32f[1] << " "
+ << xyz32f[2] << " -> "
+ << p32f[0] << " "
+ << p32f[1] << " "
+ << p32f[2] << " -> "
+ << xyz32f_b[0] << " "
+ << xyz32f_b[1] << " "
+ << xyz32f_b[2]
+ << '\n';
+
+ BOOST_TEST_LT(std::fabs(xyz32f_b[0] - xyz32f[0]), SKEW);
+ BOOST_TEST_LT(std::fabs(xyz32f_b[1] - xyz32f[1]), SKEW);
+ BOOST_TEST_LT(std::fabs(xyz32f_b[2] - xyz32f[2]), SKEW);
+ BOOST_TEST_LT(std::fabs(p32f[0] - 0.628242), SKEW);
+ BOOST_TEST_LT(std::fabs(p32f[1] - 0.735771), SKEW);
+ BOOST_TEST_LT(std::fabs(p32f[2] - 0.236473), SKEW);
+}
+
+void test_xyz32f_rgb32f_2()
+{
+ gil::xyz32f_pixel_t xyz32f(.375155f, .352705f, .260025f), xyz32f_b;
+ gil::rgb32f_pixel_t p32f;
+ gil::color_convert(xyz32f, p32f);
+ gil::color_convert(p32f, xyz32f_b);
+
+ BOOST_GIL_TEST_DEBUG_OSTREAM
+ << xyz32f[0] << " "
+ << xyz32f[1] << " "
+ << xyz32f[2] << " -> "
+ << p32f[0] << " "
+ << p32f[1] << " "
+ << p32f[2] << " -> "
+ << xyz32f_b[0] << " "
+ << xyz32f_b[1] << " "
+ << xyz32f_b[2]
+ << '\n';
+
+ BOOST_TEST_LT(std::fabs(xyz32f_b[0] - xyz32f[0]), SKEW);
+ BOOST_TEST_LT(std::fabs(xyz32f_b[1] - xyz32f[1]), SKEW);
+ BOOST_TEST_LT(std::fabs(xyz32f_b[2] - xyz32f[2]), SKEW);
+ BOOST_TEST_LT(std::fabs(p32f[0] - 0.763580), SKEW);
+ BOOST_TEST_LT(std::fabs(p32f[1] - 0.591622), SKEW);
+ BOOST_TEST_LT(std::fabs(p32f[2] - 0.510392), SKEW);
+}
+
+void test_rgb8u_xyz32f_1()
+{
+ gil::xyz32f_pixel_t xyz32f;
+ gil::rgb8_pixel_t p8u(177, 44, 56), p8u_b;
+ gil::color_convert(p8u, xyz32f);
+ gil::color_convert(xyz32f, p8u_b);
+
+ BOOST_GIL_TEST_DEBUG_OSTREAM
+ << static_cast<int>(p8u[0]) << " "
+ << static_cast<int>(p8u[1]) << " "
+ << static_cast<int>(p8u[2]) << " -> "
+ << xyz32f[0] << " "
+ << xyz32f[1] << " "
+ << xyz32f[2] << " -> "
+ << static_cast<int>(p8u_b[0]) << " "
+ << static_cast<int>(p8u_b[1]) << " "
+ << static_cast<int>(p8u_b[2])
+ << '\n';
+
+ BOOST_TEST_EQ(p8u[0], p8u_b[0]);
+ BOOST_TEST_EQ(p8u[1], p8u_b[1]);
+ BOOST_TEST_EQ(p8u[2], p8u_b[2]);
+}
+
+void test_rgb8u_xyz32f_2()
+{
+ gil::xyz32f_pixel_t xyz32f;
+ gil::rgb8_pixel_t p8u(72, 90, 165), p8u_b;
+ gil::color_convert(p8u, xyz32f);
+ gil::color_convert(xyz32f, p8u_b);
+
+ BOOST_GIL_TEST_DEBUG_OSTREAM
+ << static_cast<int>(p8u[0]) << " "
+ << static_cast<int>(p8u[1]) << " "
+ << static_cast<int>(p8u[2]) << " -> "
+ << xyz32f[0] << " "
+ << xyz32f[1] << " "
+ << xyz32f[2] << " -> "
+ << static_cast<int>(p8u_b[0]) << " "
+ << static_cast<int>(p8u_b[1]) << " "
+ << static_cast<int>(p8u_b[2])
+ << '\n';
+
+ BOOST_TEST_EQ(p8u[0], p8u_b[0]);
+ BOOST_TEST_EQ(p8u[1], p8u_b[1]);
+ BOOST_TEST_EQ(p8u[2], p8u_b[2]);
+}
+
+void test_rgb16u_xyz32f_1()
+{
+ gil::xyz32f_pixel_t xyz32f;
+ gil::rgb16_pixel_t p16u(12564, 20657, 200), p16u_b;
+ gil::color_convert(p16u, xyz32f);
+ gil::color_convert(xyz32f, p16u_b);
+
+ BOOST_GIL_TEST_DEBUG_OSTREAM
+ << static_cast<int>(p16u[0]) << " "
+ << static_cast<int>(p16u[1]) << " "
+ << static_cast<int>(p16u[2]) << " -> "
+ << xyz32f[0] << " "
+ << xyz32f[1] << " "
+ << xyz32f[2] << " -> "
+ << static_cast<int>(p16u_b[0]) << " "
+ << static_cast<int>(p16u_b[1]) << " "
+ << static_cast<int>(p16u_b[2])
+ << '\n';
+
+ BOOST_TEST_EQ(p16u[0], p16u_b[0]);
+ BOOST_TEST_EQ(p16u[1], p16u_b[1]);
+ BOOST_TEST_EQ(p16u[2], p16u_b[2]);
+}
+
+int main()
+{
+ test_rgb32f_xyz32f_1();
+ test_rgb32f_xyz32f_2();
+ test_xyz32f_rgb32f_1();
+ test_xyz32f_rgb32f_2();
+ test_rgb8u_xyz32f_1();
+ test_rgb8u_xyz32f_2();
+ test_rgb16u_xyz32f_1();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/get_num_bits.cpp b/src/boost/libs/gil/test/extension/toolbox/get_num_bits.cpp
new file mode 100644
index 000000000..84234eb83
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/get_num_bits.cpp
@@ -0,0 +1,41 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/metafunctions/channel_type.hpp>
+#include <boost/gil/extension/toolbox/metafunctions/get_num_bits.hpp>
+
+namespace gil = boost::gil;
+
+void test_get_num_bits()
+{
+ using image_t = gil::bit_aligned_image4_type<4, 4, 4, 4, gil::rgb_layout_t>::type;
+
+ using channel_t = gil::channel_type<image_t::view_t::reference>::type;
+ static_assert(gil::get_num_bits<channel_t>::value == 4, "");
+
+ using const_channel_t = gil::channel_type<image_t::const_view_t::reference>::type;
+ static_assert(gil::get_num_bits<const_channel_t>::value == 4, "");
+
+ using bits_t = gil::packed_channel_value<23>;
+ static_assert(gil::get_num_bits<bits_t>::value == 23, "");
+ static_assert(gil::get_num_bits<bits_t const>::value == 23, "");
+
+ static_assert(gil::get_num_bits<unsigned char >::value == 8, "");
+ static_assert(gil::get_num_bits<unsigned char const>::value == 8, "");
+
+ using gray8_channel_t = gil::channel_type<gil::gray8_image_t::view_t::value_type>::type;
+ static_assert(gil::get_num_bits<gray8_channel_t>::value == 8, "");
+
+ using rgba32_channel_t = gil::channel_type<gil::rgba32_image_t::view_t::value_type>::type;
+ static_assert(gil::get_num_bits<rgba32_channel_t>::value == 32, "");
+}
+
+int main()
+{
+ test_get_num_bits();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/get_pixel_type.cpp b/src/boost/libs/gil/test/extension/toolbox/get_pixel_type.cpp
new file mode 100644
index 000000000..720197b1f
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/get_pixel_type.cpp
@@ -0,0 +1,39 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/metafunctions/get_pixel_type.hpp>
+
+#include <type_traits>
+
+namespace gil = boost::gil;
+
+void test_bit_aligned_image()
+{
+ using image_t = gil::bit_aligned_image3_type<4, 15, 4, gil::rgb_layout_t>::type;
+ static_assert(std::is_same
+ <
+ gil::get_pixel_type<image_t::view_t>::type,
+ image_t::view_t::reference
+ >::value, "");
+}
+
+void test_rgb8_image()
+{
+ using image_t = gil::rgb8_image_t;
+ static_assert(std::is_same
+ <
+ gil::get_pixel_type<image_t::view_t>::type,
+ image_t::view_t::value_type
+ >::value, "");
+}
+
+int main()
+{
+ test_bit_aligned_image();
+ test_rgb8_image();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/indexed_image.cpp b/src/boost/libs/gil/test/extension/toolbox/indexed_image.cpp
new file mode 100644
index 000000000..5e78fa23f
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/indexed_image.cpp
@@ -0,0 +1,154 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/image_types/indexed_image.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstdint>
+
+#include "test_utility_output_stream.hpp"
+
+namespace gil = boost::gil;
+
+void test_index_image()
+{
+ auto const pixel_generator = []() -> gil::rgb8_pixel_t {
+ static int i = 0;
+ i = (i > 255) ? 0 : (i + 1);
+ auto const i8 = static_cast<std::uint8_t>(i);
+ return gil::rgb8_pixel_t(i8, i8, i8);
+ };
+
+ {
+ gil::indexed_image<std::uint8_t, gil::rgb8_pixel_t> img(640, 480);
+ gil::fill_pixels(gil::view(img), gil::rgb8_pixel_t(255, 0, 0));
+
+ gil::rgb8_pixel_t const p = *gil::view(img).xy_at(10, 10);
+ BOOST_TEST_EQ(p[0], 255);
+ }
+ {
+ using image_t = gil::indexed_image<gil::gray8_pixel_t, gil::rgb8_pixel_t>;
+ image_t img(640, 480, 256);
+
+ gil::generate_pixels(img.get_indices_view(), []() -> gil::gray8_pixel_t {
+ static int i = 0;
+ i = (i > 255) ? 0 : (i + 1);
+ auto const i8 = static_cast<std::uint8_t>(i);
+ return gil::gray8_pixel_t(i8);
+ });
+ gil::generate_pixels(img.get_palette_view(), pixel_generator);
+
+ gil::gray8_pixel_t index{0};
+ index = *img.get_indices_view().xy_at(0, 0); // verify values along first row
+ BOOST_TEST_EQ(static_cast<int>(index), (0 + 1));
+ index = *img.get_indices_view().xy_at(128, 0);
+ BOOST_TEST_EQ(static_cast<int>(index), (128 + 1));
+ // verify wrapping of value by the pixels generator above
+ index = *img.get_indices_view().xy_at(255, 0);
+ BOOST_TEST_EQ(static_cast<int>(index), 0);
+
+ // access via member function
+ gil::rgb8_pixel_t const pixel1 = *img.get_palette_view().xy_at(index, 0);
+ BOOST_TEST_EQ(pixel1[0], pixel1[1]);
+ BOOST_TEST_EQ(pixel1[1], pixel1[2]);
+
+ // access via free function
+ gil::rgb8_pixel_t const pixel2 = *gil::view(img).xy_at(10, 1);
+ BOOST_TEST_EQ(pixel2[0], pixel2[1]);
+ BOOST_TEST_EQ(pixel2[1], pixel2[2]);
+ }
+ {
+ using image_t = gil::indexed_image<gil::gray8_pixel_t, gil::rgb8_pixel_t>;
+ image_t img(640, 480, 256);
+
+ gil::generate_pixels(img.get_indices_view(), []() -> uint8_t
+ {
+ static int i = 0;
+ i = (i > 255) ? 0 : (i + 1);
+ return static_cast<std::uint8_t>(i);
+ });
+ gil::generate_pixels(img.get_palette_view(), pixel_generator);
+
+ std::uint8_t index = *img.get_indices_view().xy_at(128, 0);
+ BOOST_TEST_EQ(static_cast<int>(index), (128 + 1));
+
+ gil::rgb8_pixel_t const pixel1 = *img.get_palette_view().xy_at(index, 0);
+ BOOST_TEST_EQ(pixel1[0], pixel1[1]);
+ BOOST_TEST_EQ(pixel1[1], pixel1[2]);
+
+ gil::rgb8_pixel_t const pixel2 = *view(img).xy_at(10, 1);
+ BOOST_TEST_EQ(pixel2[0], pixel2[1]);
+ BOOST_TEST_EQ(pixel2[1], pixel2[2]);
+ }
+ {
+ using image_t = gil::indexed_image<std::uint8_t, gil::rgb8_pixel_t>;
+ image_t img(640, 480, 256);
+
+ for (image_t::y_coord_t y = 0; y < gil::view(img).height(); ++y)
+ {
+ image_t::view_t::x_iterator it = gil::view(img).row_begin(y);
+ for (image_t::x_coord_t x = 0; x < gil::view(img).width(); ++x)
+ {
+ gil::rgb8_pixel_t p = *it;
+ boost::ignore_unused(p);
+ it++;
+ }
+ }
+
+ // TODO: No checks? ~mloskot
+ }
+}
+
+void test_index_image_view()
+{
+ // generate some data
+ std::size_t const width = 640;
+ std::size_t const height = 480;
+ std::size_t const num_colors = 3;
+ std::uint8_t const index = 2;
+
+ // indices
+ std::vector<std::uint8_t> indices(width * height, index);
+
+ // colors
+ std::vector<gil::rgb8_pixel_t> palette(num_colors);
+ palette[0] = gil::rgb8_pixel_t(10, 20, 30);
+ palette[1] = gil::rgb8_pixel_t(40, 50, 60);
+ palette[2] = gil::rgb8_pixel_t(70, 80, 90);
+
+ // create image views from raw memory
+ auto indices_view = gil::interleaved_view(width, height,
+ (gil::gray8_image_t::view_t::x_iterator) indices.data(),
+ width); // row size in bytes
+
+ auto palette_view = gil::interleaved_view(100, 1,
+ (gil::rgb8_image_t::view_t::x_iterator) palette.data(),
+ num_colors * 3); // row size in bytes
+
+ auto ii_view = gil::view(indices_view, palette_view);
+
+ auto p = ii_view(gil::point_t(0, 0));
+ auto q = *ii_view.at(gil::point_t(0, 0));
+
+ BOOST_TEST_EQ(gil::get_color(p, gil::red_t()), 70);
+ BOOST_TEST_EQ(gil::get_color(p, gil::green_t()), 80);
+ BOOST_TEST_EQ(gil::get_color(p, gil::blue_t()), 90);
+
+ BOOST_TEST_EQ(gil::get_color(q, gil::red_t()), 70);
+ BOOST_TEST_EQ(gil::get_color(q, gil::green_t()), 80);
+ BOOST_TEST_EQ(gil::get_color(q, gil::blue_t()), 90);
+}
+
+int main()
+{
+ test_index_image();
+ test_index_image_view();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/is_bit_aligned.cpp b/src/boost/libs/gil/test/extension/toolbox/is_bit_aligned.cpp
new file mode 100644
index 000000000..2c4cd9c79
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/is_bit_aligned.cpp
@@ -0,0 +1,24 @@
+//
+// Copyright 2013 Christian Henning
+// Copyright 2020 Mateusz Loskot <mateusz@loskot.net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/metafunctions/is_bit_aligned.hpp>
+
+namespace gil = boost::gil;
+
+void test_is_bit_aligned()
+{
+ using image_t = gil::bit_aligned_image1_type< 4, gil::gray_layout_t>::type;
+ static_assert(gil::is_bit_aligned<image_t::view_t::value_type>::value, "");
+}
+
+int main()
+{
+ test_is_bit_aligned();
+}
+
diff --git a/src/boost/libs/gil/test/extension/toolbox/is_homogeneous.cpp b/src/boost/libs/gil/test/extension/toolbox/is_homogeneous.cpp
new file mode 100644
index 000000000..09615fe2f
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/is_homogeneous.cpp
@@ -0,0 +1,26 @@
+//
+// Copyright 2013 Christian Henning
+// Copyright 2020 Mateusz Loskot <mateusz@loskot.net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/metafunctions/is_homogeneous.hpp>
+
+namespace gil = boost::gil;
+
+void test_is_homogeneous()
+{
+ static_assert(gil::is_homogeneous<gil::rgb8_pixel_t>::value, "");
+ static_assert(gil::is_homogeneous<gil::cmyk16c_planar_ref_t>::value, "");
+
+ using image_t = gil::bit_aligned_image1_type< 4, gil::gray_layout_t>::type;
+ static_assert(gil::is_homogeneous<image_t::view_t::reference>::value, "");
+}
+
+int main()
+{
+ test_is_homogeneous();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/pixel_bit_size.cpp b/src/boost/libs/gil/test/extension/toolbox/pixel_bit_size.cpp
new file mode 100644
index 000000000..bbd8e3920
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/pixel_bit_size.cpp
@@ -0,0 +1,26 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/metafunctions.hpp>
+#include <boost/gil/extension/toolbox/metafunctions/pixel_bit_size.hpp>
+
+namespace gil = boost::gil;
+
+void test_pixel_bit_size()
+{
+ using image_t = gil::bit_aligned_image5_type
+ <
+ 16, 16, 16, 8, 8, gil::devicen_layout_t<5>
+ >::type;
+ static_assert(gil::pixel_bit_size<image_t::view_t::reference>::value == 64, "");
+}
+
+int main()
+{
+ test_pixel_bit_size();
+}
diff --git a/src/boost/libs/gil/test/extension/toolbox/subchroma_image.cpp b/src/boost/libs/gil/test/extension/toolbox/subchroma_image.cpp
new file mode 100644
index 000000000..1ec43fcbf
--- /dev/null
+++ b/src/boost/libs/gil/test/extension/toolbox/subchroma_image.cpp
@@ -0,0 +1,106 @@
+//
+// Copyright 2013 Christian Henning
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+#include <boost/gil/extension/toolbox/color_spaces/ycbcr.hpp>
+#include <boost/gil/extension/toolbox/image_types/subchroma_image.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+#include <boost/mp11.hpp>
+
+#include <vector>
+
+namespace gil = boost::gil;
+namespace mp11 = boost::mp11;
+
+void test_subchroma_image()
+{
+ {
+ gil::ycbcr_601_8_pixel_t a(10, 20, 30);
+ gil::rgb8_pixel_t b;
+ gil::bgr8_pixel_t c;
+
+ gil::color_convert(a, b);
+ gil::color_convert(a, c);
+ BOOST_TEST(gil::static_equal(b, c));
+
+ gil::color_convert(b, a);
+ }
+ {
+ gil::ycbcr_709_8_pixel_t a(10, 20, 30);
+ gil::rgb8_pixel_t b;
+ gil::bgr8_pixel_t c;
+
+ gil::color_convert(a, b);
+ gil::color_convert(a, c);
+ BOOST_TEST(gil::static_equal(b, c));
+
+ gil::color_convert(b, a);
+ }
+
+ {
+ using pixel_t = gil::rgb8_pixel_t;
+ using image_t = gil::subchroma_image<pixel_t>;
+ image_t img(320, 240);
+ gil::fill_pixels(view(img), pixel_t(10, 20, 30));
+
+ // TODO: Add BOOST_TEST checkpoints
+ }
+ {
+ using pixel_t = gil::rgb8_pixel_t;
+
+ gil::subchroma_image<pixel_t, mp11::mp_list_c<int, 4, 4, 4>> a(640, 480);
+ static_assert(a.ss_X == 1 && a.ss_Y == 1, "");
+ gil::subchroma_image<pixel_t, mp11::mp_list_c<int, 4, 4, 0>> b(640, 480);
+ static_assert(b.ss_X == 1 && b.ss_Y == 2, "");
+ gil::subchroma_image<pixel_t, mp11::mp_list_c<int, 4, 2, 2>> c(640, 480);
+ static_assert(c.ss_X == 2 && c.ss_Y == 1, "");
+ gil::subchroma_image<pixel_t, mp11::mp_list_c<int, 4, 2, 0>> d(640, 480);
+ static_assert(d.ss_X == 2 && d.ss_Y == 2, "");
+ gil::subchroma_image<pixel_t, mp11::mp_list_c<int, 4, 1, 1>> e(640, 480);
+ static_assert(e.ss_X == 4 && e.ss_Y == 1, "");
+ gil::subchroma_image<pixel_t, mp11::mp_list_c<int, 4, 1, 0>> f(640, 480);
+ static_assert(f.ss_X == 4 && f.ss_Y == 2, "");
+
+ gil::fill_pixels(view(a), pixel_t(10, 20, 30));
+ gil::fill_pixels(view(b), pixel_t(10, 20, 30));
+ gil::fill_pixels(view(c), pixel_t(10, 20, 30));
+ gil::fill_pixels(view(d), pixel_t(10, 20, 30));
+ gil::fill_pixels(view(e), pixel_t(10, 20, 30));
+ gil::fill_pixels(view(f), pixel_t(10, 20, 30));
+
+ // TODO: Add BOOST_TEST checkpoints
+ }
+ {
+ using pixel_t = gil::ycbcr_601_8_pixel_t;
+ using factors_t = mp11::mp_list_c<int, 4, 2, 2>;
+ using image_t = gil::subchroma_image<pixel_t, factors_t>;
+
+ std::size_t const y_width = 320;
+ std::size_t const y_height = 240;
+
+ std::size_t image_size = (y_width * y_height)
+ + (y_width / image_t::ss_X) * (y_height / image_t::ss_Y)
+ + (y_width / image_t::ss_X) * (y_height / image_t::ss_Y);
+
+ std::vector<unsigned char> data(image_size); // TODO: Initialize? --mloskot
+
+ image_t::view_t v = gil::subchroma_view<pixel_t, factors_t>(y_width, y_height, &data.front());
+ //gil::rgb8_pixel_t p; // TODO: Why RGB?? --mloskot
+ //p = *v.xy_at(0, 0);
+ auto p = *v.xy_at(0, 0);
+
+ // TODO: Add BOOST_TEST checkpoints
+ }
+}
+
+int main()
+{
+ test_subchroma_image();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/header/CMakeLists.txt b/src/boost/libs/gil/test/header/CMakeLists.txt
new file mode 100644
index 000000000..61af9cf81
--- /dev/null
+++ b/src/boost/libs/gil/test/header/CMakeLists.txt
@@ -0,0 +1,106 @@
+#
+# Copyright (c) 2018 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+
+# List headers in order: concepts, core, io, extensions
+file(GLOB_RECURSE _hpp_concepts RELATIVE
+ "${CMAKE_SOURCE_DIR}/include/boost/gil"
+ "${CMAKE_SOURCE_DIR}/include/boost/gil/concepts/*.hpp")
+list(APPEND _headers ${_hpp_concepts})
+
+file(GLOB _hpp_core RELATIVE
+ "${CMAKE_SOURCE_DIR}/include/boost/gil"
+ "${CMAKE_SOURCE_DIR}/include/boost/gil/*.hpp")
+list(APPEND _headers ${_hpp_core})
+
+list(APPEND _ext_dirs extension/dynamic_image/)
+if(BOOST_GIL_ENABLE_EXT_NUMERIC)
+ list(APPEND _ext_dirs extension/numeric)
+endif()
+if(BOOST_GIL_ENABLE_EXT_TOOLBOX)
+ list(APPEND _ext_dirs extension/toolbox)
+endif()
+if(BOOST_GIL_ENABLE_EXT_IO)
+ list(APPEND _ext_dirs io)
+ list(APPEND _ext_dirs extension/io)
+endif()
+
+foreach(_dir ${_ext_dirs})
+ file(GLOB_RECURSE _hpp RELATIVE
+ "${CMAKE_SOURCE_DIR}/include/boost/gil"
+ "${CMAKE_SOURCE_DIR}/include/boost/gil/${_dir}/*.hpp")
+ list(APPEND _headers ${_hpp})
+endforeach()
+
+if(NOT BOOST_GIL_ENABLE_EXT_IO_RAW)
+ list(FILTER _headers EXCLUDE REGEX "\\/raw[\\.\\/]")
+endif()
+
+#-----------------------------------------------------------------------------
+# Target: test_headers_self_contained
+# Bundles all targets of self-contained header tests,
+# functional equivalent to self-contained header tests defined in Jamfile.
+#-----------------------------------------------------------------------------
+message(STATUS "Boost.GIL: Configuring self-contained header tests for all headers")
+add_custom_target(test_headers_self_contained)
+
+file(READ ${CMAKE_CURRENT_LIST_DIR}/main.cpp _main_content)
+
+foreach(_header ${_headers})
+ string(REPLACE ".hpp" "" _target ${_header})
+ string(REPLACE "/" "-" _target ${_target})
+ set(_cpp ${CMAKE_BINARY_DIR}/test/headers/${_target}.cpp)
+ set(_target test_header_${_target})
+
+ string(REPLACE "BOOST_GIL_TEST_HEADER" "${_header}" _content "${_main_content}")
+ file(WRITE ${_cpp} "${_content}")
+ unset(_content)
+
+ add_executable(${_target})
+
+ target_sources(${_target}
+ PRIVATE
+ ${_cpp}
+ ${CMAKE_SOURCE_DIR}/include/boost/gil/${_header})
+ unset(_cpp)
+
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+
+ add_dependencies(test_headers_self_contained ${_target})
+
+ unset(_target)
+endforeach()
+
+#-----------------------------------------------------------------------------
+# Target: test_headers_all_in_one
+# Verifies compilation of all headers included in one translation unit.
+# An extra advantage is that such translation unit can be analysed with clang-tidy, etc.
+#-----------------------------------------------------------------------------
+message(STATUS "Boost.GIL: Configuring all-in-one headers test for all headers")
+
+set(_cpp ${CMAKE_BINARY_DIR}/test/headers/test_headers_all_in_one.cpp)
+file(WRITE ${_cpp} "// All headers included in one translation unit\n")
+foreach(_header ${_headers})
+ file(APPEND ${_cpp} "#include <boost/gil/${_header}>\n")
+endforeach()
+unset(_headers)
+file(APPEND ${_cpp} "int main() { return 0; }\n")
+
+add_executable(test_headers_all_in_one)
+
+target_sources(test_headers_all_in_one PRIVATE ${_cpp})
+unset(_cpp)
+
+target_link_libraries(test_headers_all_in_one
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
diff --git a/src/boost/libs/gil/test/header/main.cpp b/src/boost/libs/gil/test/header/main.cpp
new file mode 100644
index 000000000..1466f825c
--- /dev/null
+++ b/src/boost/libs/gil/test/header/main.cpp
@@ -0,0 +1,19 @@
+//
+// Copyright (c) 2018 Mateusz Loskot <mateusz@loskot.net>
+// Copyright (c) 2007-2015 Andrey Semashev
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// This file contains a test boilerplate for checking that every public header
+// is self-contained and does not have any missing #include-s.
+
+#define BOOST_GIL_TEST_INCLUDE_HEADER() <boost/gil/BOOST_GIL_TEST_HEADER>
+
+#include BOOST_GIL_TEST_INCLUDE_HEADER()
+
+int main()
+{
+ return 0;
+}
diff --git a/src/boost/libs/gil/test/legacy/CMakeLists.txt b/src/boost/libs/gil/test/legacy/CMakeLists.txt
new file mode 100644
index 000000000..de870c968
--- /dev/null
+++ b/src/boost/libs/gil/test/legacy/CMakeLists.txt
@@ -0,0 +1,64 @@
+#
+# Copyright (c) 2019 Mateusz Loskot <mateusz at loskot dot net>
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+#
+# *** IMPORTANT MAINTENANCE RULES ***
+# These are GIL's original, comprehensive, all-in-one test suites.
+# * Keep as reference.
+# * Do NOT extend.
+# * Do NOT refactor.
+# * Modify only if absolutely necessary (a bug found in the tests).
+# See the accompanying README.md
+#
+message(STATUS "Boost.GIL: Configuring tests in test/legacy")
+
+foreach(_name
+ channel
+ pixel
+ pixel_iterator)
+ set(_test t_legacy_${_name})
+ set(_target test_legacy_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE ${_name}.cpp error_if.cpp)
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target})
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
+
+# Add extra source files accompanying image.cpp
+foreach(_name
+ image)
+ set(_test t_legacy_${_name})
+ set(_target test_legacy_${_name})
+
+ add_executable(${_target} "")
+ target_sources(${_target} PRIVATE
+ ${_name}.cpp
+ error_if.cpp
+ sample_image.cpp)
+
+ target_link_libraries(${_target}
+ PRIVATE
+ gil_compile_options
+ gil_include_directories
+ gil_dependencies)
+ target_compile_definitions(${_target} PRIVATE BOOST_GIL_USE_CONCEPT_CHECK)
+ add_test(NAME ${_test} COMMAND ${_target}
+ ${CMAKE_CURRENT_SOURCE_DIR}/gil_reference_checksums.txt)
+
+ unset(_name)
+ unset(_target)
+ unset(_test)
+endforeach()
diff --git a/src/boost/libs/gil/test/legacy/Jamfile b/src/boost/libs/gil/test/legacy/Jamfile
new file mode 100644
index 000000000..048ab8c49
--- /dev/null
+++ b/src/boost/libs/gil/test/legacy/Jamfile
@@ -0,0 +1,26 @@
+# Boost.GIL (Generic Image Library) - legacy tests
+#
+# Copyright (c) 2007-2015 Andrey Semashev
+# Copyright (c) 2008 Lubomir Bourdev, Hailin Jin
+#
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or
+# copy at http://www.boost.org/LICENSE_1_0.txt)
+#
+# *** IMPORTANT MAINTENANCE RULES ***
+# These are GIL's original, comprehensive, all-in-one test suites.
+# * Keep as reference.
+# * Do NOT extend.
+# * Do NOT refactor.
+# * Modify only if absolutely necessary (a bug found in the tests).
+# See the accompanying README.md
+
+import testing ;
+
+run image.cpp sample_image.cpp error_if.cpp : : gil_reference_checksums.txt ;
+run channel.cpp error_if.cpp ;
+run pixel.cpp error_if.cpp ;
+run pixel_iterator.cpp error_if.cpp ;
+
+alias perf : [ run performance.cpp ] ;
+explicit perf ;
diff --git a/src/boost/libs/gil/test/legacy/README.md b/src/boost/libs/gil/test/legacy/README.md
new file mode 100644
index 000000000..76bc42828
--- /dev/null
+++ b/src/boost/libs/gil/test/legacy/README.md
@@ -0,0 +1,16 @@
+# Boost.GIL Legacy Tests
+
+These are GIL's original, comprehensive, all-in-one test suits.
+
+Rules of maintenance:
+
+* Run the legacy tests as part of CI builds and regression tests.
+* Keep as reference.
+* Do NOT extend.
+* Do NOT refactor.
+* Modify ONLY if absolutely necessary (a bug found in the tests).
+
+Add new test suites, with new test cases, even if their
+functional coverage is the same as of the legacy tests.
+
+See [CONTRIBUTING.md](../../CONTRIBUTING.md).
diff --git a/src/boost/libs/gil/test/legacy/channel.cpp b/src/boost/libs/gil/test/legacy/channel.cpp
new file mode 100644
index 000000000..b4225d20e
--- /dev/null
+++ b/src/boost/libs/gil/test/legacy/channel.cpp
@@ -0,0 +1,408 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil/channel.hpp>
+#include <boost/gil/channel_algorithm.hpp>
+#include <boost/gil/typedefs.hpp>
+
+#include <cstdint>
+#include <exception>
+#include <iostream>
+#include <type_traits>
+
+#if defined(BOOST_CLANG)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wfloat-equal"
+#elif BOOST_GCC >= 40700
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wfloat-equal"
+#elif BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(push)
+#pragma warning(disable:4512) //assignment operator could not be generated
+#endif
+
+using namespace boost::gil;
+using namespace std;
+
+void error_if(bool);
+
+auto c8_min = channel_traits<uint8_t>::min_value();
+auto c8_max = channel_traits<uint8_t>::max_value();
+auto c8s_min = channel_traits<int8_t>::min_value();
+auto c8s_max = channel_traits<int8_t>::max_value();
+auto c16_min = channel_traits<uint16_t>::min_value();
+auto c16_max = channel_traits<uint16_t>::max_value();
+auto c16s_min = channel_traits<int16_t>::min_value();
+auto c16s_max = channel_traits<int16_t>::max_value();
+auto c32_min = channel_traits<uint32_t>::min_value();
+auto c32_max = channel_traits<uint32_t>::max_value();
+auto c32s_min = channel_traits<int32_t>::min_value();
+auto c32s_max = channel_traits<int32_t>::max_value();
+auto c32f_min = channel_traits<float32_t>::min_value();
+auto c32f_max = channel_traits<float32_t>::max_value();
+
+
+template <typename ChannelTestCore>
+struct do_test : public ChannelTestCore {
+ using channel_t = typename ChannelTestCore::channel_t;
+ using channel_value_t = typename channel_traits<channel_t>::value_type;
+
+ do_test() : ChannelTestCore() {
+ error_if(this->_min_v != channel_traits<channel_t>::min_value());
+ error_if(this->_max_v != channel_traits<channel_t>::max_value());
+ }
+
+ void test_all() {
+ test_channel_invert();
+ test_channel_convert();
+ test_channel_multiply();
+ test_channel_math();
+ }
+
+ void test_mutable(std::false_type) {}
+ void test_mutable(std::true_type) {
+ channel_value_t mv=this->_min_v;
+ ++this->_min_v; this->_min_v++;
+ --this->_min_v; this->_min_v--;
+ error_if(mv!=this->_min_v);
+
+ this->_min_v+=1;
+ this->_min_v-=1;
+ error_if(mv!=this->_min_v);
+
+ this->_min_v*=1;
+ this->_min_v/=1;
+ error_if(mv!=this->_min_v);
+
+ this->_min_v = 1; // assignable to scalar
+ this->_min_v = mv; // and to value type
+
+ // test swap
+ channel_value_t v1=this->_min_v;
+ channel_value_t v2=this->_max_v;
+ swap(this->_min_v, this->_max_v);
+
+ channel_value_t v3=this->_min_v;
+ channel_value_t v4=this->_max_v;
+ error_if(v1!=v4 || v2!=v3);
+ }
+
+ void test_channel_math() {
+ error_if(this->_min_v >= this->_max_v);
+ error_if(this->_max_v <= this->_min_v);
+ error_if(this->_min_v > this->_max_v);
+ error_if(this->_max_v < this->_min_v);
+ error_if(this->_max_v == this->_min_v);
+ error_if(!(this->_max_v != this->_min_v));
+
+ error_if(this->_min_v * 1 != this->_min_v);
+ error_if(this->_min_v / 1 != this->_min_v);
+
+ error_if((this->_min_v + 1) + 1 != (this->_min_v + 2));
+ error_if((this->_max_v - 1) - 1 != (this->_max_v - 2));
+
+ error_if(this->_min_v != 1 && this->_min_v==1); // comparable to integral
+
+
+ test_mutable(std::integral_constant<bool, channel_traits<channel_t>::is_mutable>());
+ }
+
+
+ void test_channel_invert() {
+ error_if(channel_invert(this->_min_v) != this->_max_v);
+ error_if(channel_invert(this->_max_v) != this->_min_v);
+ }
+
+ void test_channel_multiply() {
+ error_if(channel_multiply(this->_min_v, this->_min_v) != this->_min_v);
+ error_if(channel_multiply(this->_max_v, this->_max_v) != this->_max_v);
+ error_if(channel_multiply(this->_max_v, this->_min_v) != this->_min_v);
+ }
+
+ void test_channel_convert() {
+ channel_value_t v_min, v_max;
+
+ v_min=channel_convert<channel_t>(c8_min);
+ v_max=channel_convert<channel_t>(c8_max);
+ error_if(v_min!=this->_min_v || v_max!=this->_max_v);
+
+ v_min=channel_convert<channel_t>(c8s_min);
+ v_max=channel_convert<channel_t>(c8s_max);
+ error_if(v_min!=this->_min_v || v_max!=this->_max_v);
+
+ v_min=channel_convert<channel_t>(c16_min);
+ v_max=channel_convert<channel_t>(c16_max);
+ error_if(v_min!=this->_min_v || v_max!=this->_max_v);
+
+ v_min=channel_convert<channel_t>(c16s_min);
+ v_max=channel_convert<channel_t>(c16s_max);
+ error_if(v_min!=this->_min_v || v_max!=this->_max_v);
+
+ v_min=channel_convert<channel_t>(c32_min);
+ v_max=channel_convert<channel_t>(c32_max);
+ error_if(v_min!=this->_min_v || v_max!=this->_max_v);
+
+ v_min=channel_convert<channel_t>(c32s_min);
+ v_max=channel_convert<channel_t>(c32s_max);
+ error_if(v_min!=this->_min_v || v_max!=this->_max_v);
+
+ v_min=channel_convert<channel_t>(c32f_min);
+ v_max=channel_convert<channel_t>(c32f_max);
+ error_if(v_min!=this->_min_v || v_max!=this->_max_v);
+ }
+};
+
+// Different core classes depending on the different types of channels - channel values, references and subbyte references
+// The cores ensure there are two members, _min_v and _max_v initialized with the minimum and maximum channel value.
+// The different channel types have different ways to initialize them, thus require different cores
+
+// For channel values simply initialize the value directly
+template <typename ChannelValue>
+class value_core {
+protected:
+ using channel_t = ChannelValue;
+ channel_t _min_v;
+ channel_t _max_v;
+
+ value_core()
+ : _min_v(channel_traits<ChannelValue>::min_value())
+ , _max_v(channel_traits<ChannelValue>::max_value())
+ {
+ boost::function_requires<ChannelValueConcept<ChannelValue> >();
+ }
+};
+
+// For channel references we need to have separate channel values
+template <typename ChannelRef>
+class reference_core : public value_core<typename channel_traits<ChannelRef>::value_type>
+{
+ using parent_t = value_core<typename channel_traits<ChannelRef>::value_type>;
+
+protected:
+ using channel_t = ChannelRef;
+ channel_t _min_v;
+ channel_t _max_v;
+
+ reference_core()
+ : parent_t()
+ , _min_v(parent_t::_min_v)
+ , _max_v(parent_t::_max_v)
+ {
+ boost::function_requires<ChannelConcept<ChannelRef> >();
+ }
+};
+
+// For subbyte channel references we need to store the bit buffers somewhere
+template <typename ChannelSubbyteRef, typename ChannelMutableRef = ChannelSubbyteRef>
+class packed_reference_core {
+protected:
+ using channel_t = ChannelSubbyteRef;
+ using integer_t = typename channel_t::integer_t;
+ channel_t _min_v, _max_v;
+
+ integer_t _min_buf, _max_buf;
+
+ packed_reference_core() : _min_v(&_min_buf), _max_v(&_max_buf) {
+ ChannelMutableRef b1(&_min_buf), b2(&_max_buf);
+ b1 = channel_traits<channel_t>::min_value();
+ b2 = channel_traits<channel_t>::max_value();
+
+ boost::function_requires<ChannelConcept<ChannelSubbyteRef> >();
+ }
+};
+
+template <typename ChannelSubbyteRef, typename ChannelMutableRef = ChannelSubbyteRef>
+class packed_dynamic_reference_core {
+protected:
+ using channel_t = ChannelSubbyteRef;
+ channel_t _min_v, _max_v;
+
+ typename channel_t::integer_t _min_buf, _max_buf;
+
+ packed_dynamic_reference_core(int first_bit1=1, int first_bit2=2) : _min_v(&_min_buf,first_bit1), _max_v(&_max_buf,first_bit2) {
+ ChannelMutableRef b1(&_min_buf,1), b2(&_max_buf,2);
+ b1 = channel_traits<channel_t>::min_value();
+ b2 = channel_traits<channel_t>::max_value();
+
+ boost::function_requires<ChannelConcept<ChannelSubbyteRef> >();
+ }
+};
+
+
+template <typename ChannelValue>
+void test_channel_value() {
+ do_test<value_core<ChannelValue> >().test_all();
+}
+
+template <typename ChannelRef>
+void test_channel_reference() {
+ do_test<reference_core<ChannelRef> >().test_all();
+}
+
+template <typename ChannelSubbyteRef>
+void test_packed_channel_reference() {
+ do_test<packed_reference_core<ChannelSubbyteRef,ChannelSubbyteRef> >().test_all();
+}
+
+template <typename ChannelSubbyteRef, typename MutableRef>
+void test_const_packed_channel_reference() {
+ do_test<packed_reference_core<ChannelSubbyteRef,MutableRef> >().test_all();
+}
+
+template <typename ChannelSubbyteRef>
+void test_packed_dynamic_channel_reference() {
+ do_test<packed_dynamic_reference_core<ChannelSubbyteRef,ChannelSubbyteRef> >().test_all();
+}
+
+template <typename ChannelSubbyteRef, typename MutableRef>
+void test_const_packed_dynamic_channel_reference() {
+ do_test<packed_dynamic_reference_core<ChannelSubbyteRef,MutableRef> >().test_all();
+}
+
+template <typename ChannelValue>
+void test_channel_value_impl() {
+ test_channel_value<ChannelValue>();
+ test_channel_reference<ChannelValue&>();
+ test_channel_reference<const ChannelValue&>();
+}
+
+/////////////////////////////////////////////////////////
+///
+/// A channel archetype - to test the minimum requirements of the concept
+///
+/////////////////////////////////////////////////////////
+
+struct channel_value_archetype;
+struct channel_archetype {
+ // equality comparable
+ friend bool operator==(const channel_archetype&,const channel_archetype&) { return true; }
+ friend bool operator!=(const channel_archetype&,const channel_archetype&) { return false; }
+ // less-than comparable
+ friend bool operator<(const channel_archetype&,const channel_archetype&) { return false; }
+ // convertible to a scalar
+ operator std::uint8_t() const { return 0; }
+
+
+ channel_archetype& operator++() { return *this; }
+ channel_archetype& operator--() { return *this; }
+ channel_archetype operator++(int) { return *this; }
+ channel_archetype operator--(int) { return *this; }
+
+ template <typename Scalar> channel_archetype operator+=(Scalar) { return *this; }
+ template <typename Scalar> channel_archetype operator-=(Scalar) { return *this; }
+ template <typename Scalar> channel_archetype operator*=(Scalar) { return *this; }
+ template <typename Scalar> channel_archetype operator/=(Scalar) { return *this; }
+
+ using value_type = channel_value_archetype;
+ using reference = channel_archetype;
+ using const_reference = channel_archetype const;
+ using pointer = channel_value_archetype *;
+ using const_pointer = channel_value_archetype const*;
+ static constexpr bool is_mutable=true;
+
+ static value_type min_value();
+ static value_type max_value();
+};
+
+
+struct channel_value_archetype : public channel_archetype {
+ channel_value_archetype() {} // default constructible
+ channel_value_archetype(const channel_value_archetype&) {} // copy constructible
+ channel_value_archetype& operator=(const channel_value_archetype&){return *this;} // assignable
+ channel_value_archetype(std::uint8_t) {}
+};
+
+channel_value_archetype channel_archetype::min_value() { return channel_value_archetype(); }
+channel_value_archetype channel_archetype::max_value() { return channel_value_archetype(); }
+
+
+void test_packed_channel_reference()
+{
+ using channel16_0_5_reference_t = packed_channel_reference<std::uint16_t, 0, 5, true>;
+ using channel16_5_6_reference_t = packed_channel_reference<std::uint16_t, 5, 6, true>;
+ using channel16_11_5_reference_t = packed_channel_reference<std::uint16_t, 11, 5, true>;
+
+ std::uint16_t data=0;
+ channel16_0_5_reference_t channel1(&data);
+ channel16_5_6_reference_t channel2(&data);
+ channel16_11_5_reference_t channel3(&data);
+
+ channel1=channel_traits<channel16_0_5_reference_t>::max_value();
+ channel2=channel_traits<channel16_5_6_reference_t>::max_value();
+ channel3=channel_traits<channel16_11_5_reference_t>::max_value();
+ error_if(data!=65535);
+
+ test_packed_channel_reference<channel16_0_5_reference_t>();
+ test_packed_channel_reference<channel16_5_6_reference_t>();
+ test_packed_channel_reference<channel16_11_5_reference_t>();
+}
+
+void test_packed_dynamic_channel_reference()
+{
+ using channel16_5_reference_t = packed_dynamic_channel_reference<std::uint16_t, 5, true>;
+ using channel16_6_reference_t = packed_dynamic_channel_reference<std::uint16_t, 6, true>;
+
+ std::uint16_t data=0;
+ channel16_5_reference_t channel1(&data,0);
+ channel16_6_reference_t channel2(&data,5);
+ channel16_5_reference_t channel3(&data,11);
+
+ channel1=channel_traits<channel16_5_reference_t>::max_value();
+ channel2=channel_traits<channel16_6_reference_t>::max_value();
+ channel3=channel_traits<channel16_5_reference_t>::max_value();
+ error_if(data!=65535);
+
+ test_packed_dynamic_channel_reference<channel16_5_reference_t>();
+}
+
+void test_channel() {
+ test_channel_value_impl<uint8_t>();
+ test_channel_value_impl<int8_t>();
+ test_channel_value_impl<uint16_t>();
+ test_channel_value_impl<int16_t>();
+ test_channel_value_impl<uint32_t>();
+ test_channel_value_impl<int16_t>();
+
+ test_channel_value_impl<float32_t>();
+
+ test_packed_channel_reference();
+ test_packed_dynamic_channel_reference();
+
+ // Do only compile-time tests for the archetype (because asserts like val1<val2 fail)
+ boost::function_requires<MutableChannelConcept<channel_archetype> >();
+
+ do_test<value_core<channel_value_archetype> >();
+ do_test<reference_core<channel_archetype> >();
+ do_test<reference_core<const channel_archetype&> >();
+}
+
+int main()
+{
+ try
+ {
+ test_channel();
+
+ return EXIT_SUCCESS;
+ }
+ catch (std::exception const& e)
+ {
+ std::cerr << e.what() << std::endl;
+ return EXIT_FAILURE;
+ }
+ catch (...)
+ {
+ return EXIT_FAILURE;
+ }
+}
+
+// TODO:
+// - provide algorithm performance overloads for scoped channel and packed channels
+// - Update concepts and documentation
+// - What to do about pointer types?!
+// - Performance!!
+// - is channel_convert the same as native?
+// - is operator++ on float32_t the same as native? How about if operator++ is defined in scoped_channel to do _value++?
diff --git a/src/boost/libs/gil/test/legacy/error_if.cpp b/src/boost/libs/gil/test/legacy/error_if.cpp
new file mode 100644
index 000000000..532d9062c
--- /dev/null
+++ b/src/boost/libs/gil/test/legacy/error_if.cpp
@@ -0,0 +1,13 @@
+// Copyright 2008 Lubomir Bourdev and Hailin Jin
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#include <exception>
+
+void error_if(bool condition) {
+ if (condition)
+ throw std::exception();
+}
+
diff --git a/src/boost/libs/gil/test/legacy/gil_reference_checksums.txt b/src/boost/libs/gil/test/legacy/gil_reference_checksums.txt
new file mode 100644
index 000000000..ca123231d
--- /dev/null
+++ b/src/boost/libs/gil/test/legacy/gil_reference_checksums.txt
@@ -0,0 +1,125 @@
+bgr121_basic_red_x 7f6e24e7
+bgr121_basic_white_x e4aaa1d3
+bgr121_histogram_histogram ca580192
+bgr121_views_0th_k_channel daa9f7e3
+bgr121_views_90ccw c64d6d20
+bgr121_views_90cw 8565efd8
+bgr121_views_cropped 43305e15
+bgr121_views_flipped_lr 2d68e448
+bgr121_views_flipped_ud 8f7f7d00
+bgr121_views_gray8 bbabe219
+bgr121_views_my_gray8 3086d22f
+bgr121_views_original 7e5bb87d
+bgr121_views_rot180 68f37202
+bgr121_views_subsampled ac6ca178
+bgr121_views_transpose da2ff80
+bgr8_basic_red_x 7f6e24e7
+bgr8_basic_white_x e4aaa1d3
+bgr8_histogram_histogram badcdd58
+bgr8_views_0th_k_channel 4638e58d
+bgr8_views_0th_n_channel 4638e58d
+bgr8_views_90ccw 8c4980e5
+bgr8_views_90cw e4c69665
+bgr8_views_cropped ff56b05e
+bgr8_views_flipped_lr 63849267
+bgr8_views_flipped_ud c4dcc848
+bgr8_views_gray8 3817178f
+bgr8_views_my_gray8 b33a27b9
+bgr8_views_original 423f1dde
+bgr8_views_rot180 150f1206
+bgr8_views_subsampled 92439ee7
+bgr8_views_transpose c9a890a0
+color_converted_0th_k_channel 3817178f
+color_converted_0th_n_channel 3817178f
+color_converted_90ccw dc403b3
+color_converted_90cw c6fc34de
+color_converted_cropped 666252a
+color_converted_flipped_lr 7ab2d721
+color_converted_flipped_ud 8ad49b3
+color_converted_gray8 3817178f
+color_converted_my_gray8 3817178f
+color_converted_original 3817178f
+color_converted_rot180 b5d0763b
+color_converted_subsampled 28286169
+color_converted_transpose 366b8392
+dynamic_ 423f1dde
+dynamic_fliplr 63849267
+dynamic_flipud c4dcc848
+dynamic_subimage a974d099
+dynamic_subimage_subsampled180rot 4055263a
+gray8_basic_red_x ab461c6a
+gray8_basic_white_x be81c274
+gray8_histogram_histogram badcdd58
+gray8_views_0th_k_channel 3817178f
+gray8_views_0th_n_channel 3817178f
+gray8_views_90ccw dc403b3
+gray8_views_90cw c6fc34de
+gray8_views_cropped 666252a
+gray8_views_flipped_lr 7ab2d721
+gray8_views_flipped_ud 8ad49b3
+gray8_views_gray8 3817178f
+gray8_views_my_gray8 3817178f
+gray8_views_original 3817178f
+gray8_views_rot180 b5d0763b
+gray8_views_subsampled 28286169
+gray8_views_transpose 366b8392
+mandelLuminosityGradient 4ebf3906
+planarrgb8_basic_red_x 7f6e24e7
+planarrgb8_basic_white_x e4aaa1d3
+planarrgb8_histogram_histogram badcdd58
+planarrgb8_views_0th_k_channel 1f48996f
+planarrgb8_views_0th_n_channel 1f48996f
+planarrgb8_views_90ccw 8c4980e5
+planarrgb8_views_90cw e4c69665
+planarrgb8_views_cropped ff56b05e
+planarrgb8_views_flipped_lr 63849267
+planarrgb8_views_flipped_ud c4dcc848
+planarrgb8_views_gray8 3817178f
+planarrgb8_views_my_gray8 b33a27b9
+planarrgb8_views_original 423f1dde
+planarrgb8_views_rot180 150f1206
+planarrgb8_views_subsampled 92439ee7
+planarrgb8_views_transpose c9a890a0
+rgb8_basic_red_x 7f6e24e7
+rgb8_basic_white_x e4aaa1d3
+rgb8_histogram_histogram badcdd58
+rgb8_views_0th_k_channel 1f48996f
+rgb8_views_0th_n_channel 1f48996f
+rgb8_views_90ccw 8c4980e5
+rgb8_views_90cw e4c69665
+rgb8_views_cropped ff56b05e
+rgb8_views_flipped_lr 63849267
+rgb8_views_flipped_ud c4dcc848
+rgb8_views_gray8 3817178f
+rgb8_views_my_gray8 b33a27b9
+rgb8_views_original 423f1dde
+rgb8_views_rot180 150f1206
+rgb8_views_subsampled 92439ee7
+rgb8_views_transpose c9a890a0
+subsampled_0th_k_channel 2c19afc1
+subsampled_0th_n_channel 2c19afc1
+subsampled_90ccw d4649279
+subsampled_90cw e74f0f0e
+subsampled_cropped a5f07581
+subsampled_flipped_lr 8f22df7
+subsampled_flipped_ud 26383f1d
+subsampled_gray8 c95e3def
+subsampled_my_gray8 91ea1379
+subsampled_original 64cf9a6b
+subsampled_rot180 6059029b
+subsampled_subsampled 59aef23b
+subsampled_transpose ec4b368a
+virtual_0th_k_channel 79bca658
+virtual_0th_n_channel 79bca658
+virtual_90ccw 965db1f7
+virtual_90cw a81d80e3
+virtual_cropped ffb4af2c
+virtual_flipped_lr 9d1478c2
+virtual_flipped_ud 18dc9b78
+virtual_gray8 962f6f6f
+virtual_histogram 8deb06eb
+virtual_my_gray8 150bb50d
+virtual_original 927686d4
+virtual_rot180 4dee193e
+virtual_subsampled e99b8073
+virtual_transpose 923e345f
diff --git a/src/boost/libs/gil/test/legacy/image.cpp b/src/boost/libs/gil/test/legacy/image.cpp
new file mode 100644
index 000000000..67b5e0a6a
--- /dev/null
+++ b/src/boost/libs/gil/test/legacy/image.cpp
@@ -0,0 +1,612 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifdef _MSC_VER
+#pragma warning(disable : 4244) // conversion from 'gil::image<V,Alloc>::coord_t' to 'int', possible loss of data (visual studio compiler doesn't realize that the two types are the same)
+#pragma warning(disable : 4503) // decorated name length exceeded, name was truncated
+#pragma warning(disable : 4701) // potentially uninitialized local variable 'result' used in boost/crc.hpp
+#endif
+
+#include <boost/gil.hpp>
+#include <boost/gil/extension/dynamic_image/dynamic_image_all.hpp>
+
+#include <boost/core/ignore_unused.hpp>
+#include <boost/crc.hpp>
+#include <boost/mp11.hpp>
+
+#include <ios>
+#include <iostream>
+#include <fstream>
+#include <map>
+#include <stdexcept>
+#include <string>
+#include <type_traits>
+#include <vector>
+
+using namespace boost::gil;
+using namespace std;
+using namespace boost;
+
+extern rgb8c_planar_view_t sample_view;
+void error_if(bool condition);
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(push)
+#pragma warning(disable:4127) //conditional expression is constant
+#endif
+
+// When BOOST_GIL_GENERATE_REFERENCE_DATA is defined, the reference data is generated and saved.
+// When it is undefined, regression tests are checked against it
+//#define BOOST_GIL_GENERATE_REFERENCE_DATA
+
+////////////////////////////////////////////////////
+///
+/// Some algorithms to use in testing
+///
+////////////////////////////////////////////////////
+
+template <typename GrayView, typename R>
+void gray_image_hist(GrayView const& img_view, R& hist)
+{
+ for (auto it = img_view.begin(); it != img_view.end(); ++it)
+ ++hist[*it];
+
+ // Alternatively, prefer the algorithm with lambda
+ // for_each_pixel(img_view, [&hist](gray8_pixel_t const& pixel) {
+ // ++hist[pixel];
+ // });
+}
+
+template <typename V, typename R>
+void get_hist(const V& img_view, R& hist) {
+ gray_image_hist(color_converted_view<gray8_pixel_t>(img_view), hist);
+}
+
+// testing custom color conversion
+template <typename C1, typename C2>
+struct my_color_converter_impl : public default_color_converter_impl<C1,C2> {};
+template <typename C1>
+struct my_color_converter_impl<C1,gray_t> {
+ template <typename P1, typename P2>
+ void operator()(const P1& src, P2& dst) const {
+ default_color_converter_impl<C1,gray_t>()(src,dst);
+ get_color(dst,gray_color_t())=channel_invert(get_color(dst,gray_color_t()));
+ }
+};
+
+struct my_color_converter {
+ template <typename SrcP,typename DstP>
+ void operator()(const SrcP& src,DstP& dst) const {
+ using src_cs_t = typename color_space_type<SrcP>::type;
+ using dst_cs_t = typename color_space_type<DstP>::type;
+ my_color_converter_impl<src_cs_t,dst_cs_t>()(src,dst);
+ }
+};
+
+/// Models a Unary Function
+/// \tparam P models PixelValueConcept
+template <typename P>
+struct mandelbrot_fn
+{
+ using point_t = boost::gil::point_t;
+ using const_t = mandelbrot_fn<P>;
+ using value_type = P;
+ using reference = value_type;
+ using const_reference = value_type;
+ using argument_type = point_t;
+ using result_type = reference;
+ static constexpr bool is_mutable = false;
+
+ value_type _in_color,_out_color;
+ point_t _img_size;
+ static const int MAX_ITER=100; // max number of iterations
+
+ mandelbrot_fn() {}
+ mandelbrot_fn(const point_t& sz, const value_type& in_color, const value_type& out_color) : _in_color(in_color), _out_color(out_color), _img_size(sz) {}
+
+ result_type operator()(const point_t& p) const {
+ // normalize the coords to (-2..1, -1.5..1.5)
+ // (actually make y -1.0..2 so it is asymmetric, so we can verify some view factory methods)
+ double t=get_num_iter(point<double>(p.x/(double)_img_size.x*3-2, p.y/(double)_img_size.y*3-1.0f));//1.5f));
+ t=pow(t,0.2);
+
+ value_type ret;
+ for (std::size_t k=0; k<num_channels<P>::value; ++k)
+ ret[k]=(typename channel_type<value_type>::type)(_in_color[k]*t + _out_color[k]*(1-t));
+ return ret;
+ }
+
+private:
+ double get_num_iter(const point<double>& p) const {
+ point<double> Z(0,0);
+ for (int i=0; i<MAX_ITER; ++i) {
+ Z = point<double>(Z.x*Z.x - Z.y*Z.y + p.x, 2*Z.x*Z.y + p.y);
+ if (Z.x*Z.x + Z.y*Z.y > 4)
+ return i/(double)MAX_ITER;
+ }
+ return 0;
+ }
+};
+
+template <typename T>
+void x_gradient(const T& src, const gray8s_view_t& dst) {
+ for (int y=0; y<src.height(); ++y) {
+ typename T::x_iterator src_it = src.row_begin(y);
+ gray8s_view_t::x_iterator dst_it = dst.row_begin(y);
+
+ for (int x=1; x<src.width()-1; ++x)
+ dst_it[x] = (src_it[x+1] - src_it[x-1]) / 2;
+ }
+}
+
+// A quick test whether a view is homogeneous
+
+template <typename Pixel>
+struct pixel_is_homogeneous : public std::true_type {};
+
+template <typename P, typename C, typename L>
+struct pixel_is_homogeneous<packed_pixel<P,C,L> > : public std::false_type {};
+
+template <typename View>
+struct view_is_homogeneous : public pixel_is_homogeneous<typename View::value_type> {};
+
+////////////////////////////////////////////////////
+///
+/// Tests image view transformations and algorithms
+///
+////////////////////////////////////////////////////
+class image_test {
+public:
+ virtual void initialize() {}
+ virtual void finalize() {}
+ virtual ~image_test() {}
+
+ void run();
+protected:
+ virtual void check_view_impl(const rgb8c_view_t& view, const string& name)=0;
+ template <typename View>
+ void check_view(const View& img_view, const string& name) {
+ rgb8_image_t rgb_img(img_view.dimensions());
+ copy_and_convert_pixels(img_view,view(rgb_img));
+ check_view_impl(const_view(rgb_img), name);
+ }
+private:
+ template <typename Img> void basic_test(const string& prefix);
+ template <typename View> void view_transformations_test(const View& img_view, const string& prefix);
+ template <typename View> void homogeneous_view_transformations_test(const View& img_view, const string& prefix, std::true_type);
+ template <typename View> void homogeneous_view_transformations_test(const View& img_view, const string& prefix, std::false_type)
+ {
+ boost::ignore_unused(img_view);
+ boost::ignore_unused(prefix);
+ }
+ template <typename View> void histogram_test(const View& img_view, const string& prefix);
+ void virtual_view_test();
+ void packed_image_test();
+ void dynamic_image_test();
+ template <typename Img> void image_all_test(const string& prefix);
+};
+
+// testing image iterators, clone, fill, locators, color convert
+template <typename Img>
+void image_test::basic_test(const string& prefix) {
+ using View = typename Img::view_t;
+
+ // make a 20x20 image
+ Img img(typename View::point_t(20,20));
+ const View& img_view=view(img);
+
+ // fill it with red
+ rgb8_pixel_t red8(255,0,0), green8(0,255,0), blue8(0,0,255), white8(255,255,255);
+ typename View::value_type red,green,blue,white;
+ color_convert(red8,red);
+ default_color_converter()(red8,red);
+ red=color_convert_deref_fn<rgb8_ref_t,typename Img::view_t::value_type>()(red8);
+
+ color_convert(green8,green);
+ color_convert(blue8,blue);
+ color_convert(white8,white);
+ fill(img_view.begin(),img_view.end(),red);
+
+ color_convert(red8,img_view[0]);
+
+ // pointer to first pixel of second row
+ typename View::reference rt=img_view.at(0,0)[img_view.width()];
+ typename View::x_iterator ptr=&rt;
+ typename View::reference rt2=*(img_view.at(0,0)+img_view.width());
+ typename View::x_iterator ptr2=&rt2;
+ error_if(ptr!=ptr2);
+ error_if(img_view.x_at(0,0)+10!=10+img_view.x_at(0,0));
+
+ // draw a blue line along the diagonal
+ typename View::xy_locator loc=img_view.xy_at(0,img_view.height()-1);
+ for (int y=0; y<img_view.height(); ++y) {
+ *loc=blue;
+ ++loc.x();
+ loc.y()--;
+ }
+
+ // draw a green dotted line along the main diagonal with step of 3
+ loc=img_view.xy_at(img_view.width()-1,img_view.height()-1);
+ while (loc.x()>=img_view.x_at(0,0)) {
+ *loc=green;
+ loc-=typename View::point_t(3,3);
+ }
+
+ // Clone and make every red pixel white
+ Img imgWhite(img);
+ for (typename View::iterator it=view(imgWhite).end(); (it-1)!=view(imgWhite).begin(); --it) {
+ if (*(it-1)==red)
+ *(it-1)=white;
+ }
+
+ check_view(img_view,prefix+"red_x");
+ check_view(view(imgWhite),prefix+"white_x");
+}
+
+template <typename View>
+void image_test::histogram_test(const View& img_view, const string& prefix) {
+// vector<int> histogram(255,0);
+// get_hist(cropped,histogram.begin());
+ unsigned char histogram[256];
+ fill(histogram,histogram+256,0);
+ get_hist(img_view,histogram);
+ gray8c_view_t hist_view=interleaved_view(256,1,(const gray8_pixel_t*)histogram,256);
+ check_view(hist_view,prefix+"histogram");
+}
+
+template <typename View>
+void image_test::view_transformations_test(const View& img_view, const string& prefix) {
+ check_view(img_view,prefix+"original");
+
+ check_view(subimage_view(img_view, iround(img_view.dimensions()/4), iround(img_view.dimensions()/2)),prefix+"cropped");
+ check_view(color_converted_view<gray8_pixel_t>(img_view),prefix+"gray8");
+ check_view(color_converted_view<gray8_pixel_t>(img_view,my_color_converter()),prefix+"my_gray8");
+ check_view(transposed_view(img_view),prefix+"transpose");
+ check_view(rotated180_view(img_view),prefix+"rot180");
+ check_view(rotated90cw_view(img_view),prefix+"90cw");
+ check_view(rotated90ccw_view(img_view),prefix+"90ccw");
+ check_view(flipped_up_down_view(img_view),prefix+"flipped_ud");
+ check_view(flipped_left_right_view(img_view),prefix+"flipped_lr");
+ check_view(subsampled_view(img_view,typename View::point_t(2,1)),prefix+"subsampled");
+ check_view(kth_channel_view<0>(img_view),prefix+"0th_k_channel");
+ homogeneous_view_transformations_test(img_view, prefix, view_is_homogeneous<View>());
+}
+
+template <typename View>
+void image_test::homogeneous_view_transformations_test(const View& img_view, const string& prefix, std::true_type) {
+ check_view(nth_channel_view(img_view,0),prefix+"0th_n_channel");
+}
+
+void image_test::virtual_view_test()
+{
+ using deref_t = mandelbrot_fn<rgb8_pixel_t>;
+ using point_t = deref_t::point_t;
+ using locator_t = virtual_2d_locator<deref_t, false>;
+ using my_virt_view_t = image_view<locator_t>;
+
+ boost::function_requires<PixelLocatorConcept<locator_t> >();
+ gil_function_requires<StepIteratorConcept<locator_t::x_iterator> >();
+
+ point_t dims(200,200);
+ my_virt_view_t mandel(dims, locator_t(point_t(0,0), point_t(1,1), deref_t(dims, rgb8_pixel_t(255,0,255), rgb8_pixel_t(0,255,0))));
+
+ gray8s_image_t img(dims);
+ fill_pixels(view(img),0); // our x_gradient algorithm doesn't change the first & last column, so make sure they are 0
+ x_gradient(color_converted_view<gray8_pixel_t>(mandel), view(img));
+ check_view(color_converted_view<gray8_pixel_t>(const_view(img)), "mandelLuminosityGradient");
+
+ view_transformations_test(mandel,"virtual_");
+ histogram_test(mandel,"virtual_");
+}
+
+// Test alignment and packed images
+void image_test::packed_image_test()
+{
+ using bgr131_image_t = bit_aligned_image3_type<1,3,1, bgr_layout_t>::type;
+ using bgr131_pixel_t = bgr131_image_t::value_type;
+ bgr131_pixel_t fill_val(1,3,1);
+
+ bgr131_image_t bgr131_img(3,10);
+ fill_pixels(view(bgr131_img), fill_val);
+
+ bgr131_image_t bgr131a_img(3,10,1);
+ copy_pixels(const_view(bgr131_img), view(bgr131a_img));
+
+ bgr131_image_t bgr131b_img(3,10,4);
+ copy_pixels(const_view(bgr131_img), view(bgr131b_img));
+
+ error_if(bgr131_img!=bgr131a_img || bgr131a_img!=bgr131b_img);
+}
+
+void image_test::dynamic_image_test()
+{
+ using any_image_t = any_image
+ <
+ mp11::mp_list
+ <
+ gray8_image_t,
+ bgr8_image_t,
+ argb8_image_t,
+ rgb8_image_t,
+ rgb8_planar_image_t
+ >
+ >;
+ rgb8_planar_image_t img(sample_view.dimensions());
+ copy_pixels(sample_view, view(img));
+ any_image_t any_img=any_image_t(img);
+
+ check_view(view(any_img), "dynamic_");
+ check_view(flipped_left_right_view(view(any_img)), "dynamic_fliplr");
+ check_view(flipped_up_down_view(view(any_img)), "dynamic_flipud");
+
+ any_image_t::view_t subimageView=subimage_view(view(any_img),0,0,10,15);
+
+ check_view(subimageView, "dynamic_subimage");
+ check_view(subsampled_view(rotated180_view(view(any_img)), 2,1), "dynamic_subimage_subsampled180rot");
+}
+
+template <typename Img>
+void image_test::image_all_test(const string& prefix) {
+ basic_test<Img>(prefix+"basic_");
+
+ Img img;
+ img.recreate(sample_view.dimensions());
+ copy_and_convert_pixels(sample_view,view(img));
+
+ view_transformations_test(view(img), prefix+"views_");
+
+ histogram_test(const_view(img),prefix+"histogram_");
+}
+
+void image_test::run() {
+ initialize();
+
+ image_all_test<bgr8_image_t>("bgr8_");
+ image_all_test<rgb8_image_t>("rgb8_");
+ image_all_test<rgb8_planar_image_t>("planarrgb8_");
+ image_all_test<gray8_image_t>("gray8_");
+
+// FIXME: https://github.com/boostorg/gil/issues/447
+// Disable bgc121_image_t drawing as work around for a mysterious bug
+// revealing itself when using MSVC 64-bit optimized build.
+#if !(defined(NDEBUG) && defined (_MSC_VER) && defined(_WIN64))
+ using bgr121_ref_t = bit_aligned_pixel_reference
+ <
+ boost::uint8_t,
+ mp11::mp_list_c<int, 1, 2, 1>,
+ bgr_layout_t,
+ true
+ > const;
+ using bgr121_image_t = image<bgr121_ref_t, false>;
+ image_all_test<bgr121_image_t>("bgr121_");
+#endif
+
+ // TODO: Remove?
+ view_transformations_test(subsampled_view(sample_view, point_t(1,2)), "subsampled_");
+ view_transformations_test(color_converted_view<gray8_pixel_t>(sample_view),"color_converted_");
+
+ virtual_view_test();
+ packed_image_test();
+ dynamic_image_test();
+
+ finalize();
+}
+
+////////////////////////////////////////////////////
+///
+/// Performs or generates image tests using checksums
+///
+////////////////////////////////////////////////////
+
+class checksum_image_mgr : public image_test
+{
+protected:
+ using crc_map_t = map<string, boost::crc_32_type::value_type>;
+ crc_map_t _crc_map;
+};
+
+////////////////////////////////////////////////////
+///
+/// Performs image tests by comparing image pixel checksums against a reference
+///
+////////////////////////////////////////////////////
+
+class checksum_image_test : public checksum_image_mgr {
+public:
+ checksum_image_test(const char* filename) : _filename(filename) {}
+private:
+ const char* _filename;
+ void initialize() override;
+ void check_view_impl(const rgb8c_view_t& v, const string& name) override;
+};
+
+// Load the checksums from the reference file and create the start image
+void checksum_image_test::initialize() {
+ boost::crc_32_type::value_type crc_result;
+ fstream checksum_ref(_filename,ios::in);
+ while (true) {
+ string crc_name;
+ checksum_ref >> crc_name >> std::hex >> crc_result;
+ if(checksum_ref.fail()) break;
+ if (!crc_name.empty() && crc_name[0] == '#')
+ {
+ crc_result = 0; // skip test case
+ crc_name = crc_name.substr(1);
+ }
+ _crc_map[crc_name]=crc_result;
+ }
+ checksum_ref.close();
+}
+
+// Create a checksum for the given view and compare it with the reference checksum. Throw exception if different
+void checksum_image_test::check_view_impl(const rgb8c_view_t& img_view, const string& name) {
+ boost::crc_32_type checksum_acumulator;
+ checksum_acumulator.process_bytes(img_view.row_begin(0),img_view.size()*3);
+ unsigned int const crc_expect = _crc_map[name];
+ if (crc_expect == 0)
+ {
+ cerr << "Skipping checksum check for " << name << " (crc=0)" << endl;
+ return;
+ }
+
+ boost::crc_32_type::value_type const crc = checksum_acumulator.checksum();
+ if (crc==crc_expect) {
+ cerr << "Checking checksum for " << name << " (crc=" << std::hex << crc << ")" << endl;
+ }
+ else {
+ cerr << "Checksum error in " << name
+ << " (crc=" << std::hex << crc << " != " << std::hex << crc_expect << ")" << endl;
+ error_if(true);
+ }
+}
+
+////////////////////////////////////////////////////
+///
+/// Generates a set of reference checksums to compare against
+///
+////////////////////////////////////////////////////
+
+class checksum_image_generate : public checksum_image_mgr {
+public:
+ checksum_image_generate(const char* filename) : _filename(filename) {}
+private:
+ const char* _filename;
+ void check_view_impl(const rgb8c_view_t& img_view, const string& name) override;
+ void finalize() override;
+};
+
+// Add the checksum of the given view to the map of checksums
+void checksum_image_generate::check_view_impl(const rgb8c_view_t& img_view, const string& name) {
+ boost::crc_32_type result;
+ result.process_bytes(img_view.row_begin(0),img_view.size()*3);
+ cerr << "Generating checksum for " << name << endl;
+ _crc_map[name] = result.checksum();
+}
+
+// Save the checksums into the reference file
+void checksum_image_generate::finalize() {
+ fstream checksum_ref(_filename,ios::out);
+ for (crc_map_t::const_iterator it=_crc_map.begin(); it!=_crc_map.end(); ++it) {
+ checksum_ref << it->first << " " << std::hex << it->second << "\r\n";
+ }
+ checksum_ref.close();
+}
+
+////////////////////////////////////////////////////
+///
+/// Performs or generates image tests using image I/O
+///
+////////////////////////////////////////////////////
+
+extern const string in_dir;
+extern const string out_dir;
+extern const string ref_dir;
+
+const string in_dir=""; // directory of source images
+const string out_dir=in_dir+"image-out/"; // directory where to write output
+const string ref_dir=in_dir+"image-ref/"; // reference directory to compare written with actual output
+
+void static_checks() {
+ gil_function_requires<ImageConcept<rgb8_image_t> >();
+
+ static_assert(view_is_basic<rgb8_step_view_t>::value, "");
+ static_assert(view_is_basic<cmyk8c_planar_step_view_t>::value, "");
+ static_assert(view_is_basic<rgb8_planar_view_t>::value, "");
+
+ static_assert(view_is_step_in_x<rgb8_step_view_t>::value, "");
+ static_assert(view_is_step_in_x<cmyk8c_planar_step_view_t>::value, "");
+ static_assert(!view_is_step_in_x<rgb8_planar_view_t>::value, "");
+
+ static_assert(!is_planar<rgb8_step_view_t>::value, "");
+ static_assert(is_planar<cmyk8c_planar_step_view_t>::value, "");
+ static_assert(is_planar<rgb8_planar_view_t>::value, "");
+
+ static_assert(view_is_mutable<rgb8_step_view_t>::value, "");
+ static_assert(!view_is_mutable<cmyk8c_planar_step_view_t>::value, "");
+ static_assert(view_is_mutable<rgb8_planar_view_t>::value, "");
+
+ static_assert(std::is_same
+ <
+ derived_view_type<cmyk8c_planar_step_view_t>::type,
+ cmyk8c_planar_step_view_t
+ >::value, "");
+ static_assert(std::is_same
+ <
+ derived_view_type
+ <
+ cmyk8c_planar_step_view_t, std::uint16_t, rgb_layout_t
+ >::type,
+ rgb16c_planar_step_view_t
+ >::value, "");
+ static_assert(std::is_same
+ <
+ derived_view_type
+ <
+ cmyk8c_planar_step_view_t, use_default, rgb_layout_t, std::false_type, use_default, std::false_type
+ >::type,
+ rgb8c_step_view_t
+ >::value, "");
+
+ // test view get raw data (mostly compile-time test)
+ {
+ rgb8_image_t rgb8(100,100);
+ unsigned char* data=interleaved_view_get_raw_data(view(rgb8));
+ const unsigned char* cdata=interleaved_view_get_raw_data(const_view(rgb8));
+ error_if(data!=cdata);
+ }
+
+ {
+ rgb16s_planar_image_t rgb8(100,100);
+ short* data=planar_view_get_raw_data(view(rgb8),1);
+ const short* cdata=planar_view_get_raw_data(const_view(rgb8),1);
+ error_if(data!=cdata);
+ }
+}
+
+using image_test_t = checksum_image_test;
+using image_generate_t = checksum_image_generate;
+
+#ifdef BOOST_GIL_GENERATE_REFERENCE_DATA
+using image_mgr_t = image_generate_t;
+#else
+using image_mgr_t = image_test_t;
+#endif
+
+void test_image(const char* ref_checksum) {
+ image_mgr_t mgr(ref_checksum);
+
+ cerr << "Reading checksums from " << ref_checksum << endl;
+ mgr.run();
+ static_checks();
+}
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ throw std::runtime_error("No file with reference checksums specified");
+
+ std::string local_name = argv[1];
+ std::ifstream file_is_there(local_name.c_str());
+ if (!file_is_there)
+ throw std::runtime_error("Unable to open gil_reference_checksums.txt");
+
+ test_image(local_name.c_str());
+
+ return EXIT_SUCCESS;
+ }
+ catch (std::exception const& e)
+ {
+ std::cerr << e.what() << std::endl;
+ return EXIT_FAILURE;
+ }
+ catch (...)
+ {
+ return EXIT_FAILURE;
+ }
+}
diff --git a/src/boost/libs/gil/test/legacy/performance.cpp b/src/boost/libs/gil/test/legacy/performance.cpp
new file mode 100644
index 000000000..31a35de15
--- /dev/null
+++ b/src/boost/libs/gil/test/legacy/performance.cpp
@@ -0,0 +1,520 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <cstddef>
+#include <ctime>
+#include <iostream>
+
+// GIL performance test suite
+//
+// Available tests:
+// fill_pixels() on rgb8_image_t with rgb8_pixel_t
+// fill_pixels() on rgb8_planar_image_t with rgb8_pixel_t
+// fill_pixels() on rgb8_image_t with bgr8_pixel_t
+// fill_pixels() on rgb8_planar_image_t with bgr8_pixel_t
+// for_each_pixel() on rgb8_image_t
+// for_each_pixel() on rgb8_planar_t
+// copy_pixels() between rgb8_image_t and rgb8_image_t
+// copy_pixels() between rgb8_image_t and bgr8_image_t
+// copy_pixels() between rgb8_planar_image_t and rgb8_planar_image_t
+// copy_pixels() between rgb8_image_t and rgb8_planar_image_t
+// copy_pixels() between rgb8_planar_image_t and rgb8_image_t
+// transform_pixels() between rgb8_image_t and rgb8_image_t
+// transform_pixels() between rgb8_planar_image_t and rgb8_planar_image_t
+// transform_pixels() between rgb8_planar_image_t and rgb8_image_t
+// transform_pixels() between rgb8_image_t and rgb8_planar_image_t
+
+using namespace boost::gil;
+
+// returns time in milliseconds per call
+template <typename Op>
+double measure_time(Op op, std::size_t num_loops) {
+ clock_t begin=clock();
+ for (std::size_t ii=0; ii<num_loops; ++ii) op();
+ return double(clock()-begin)/double(num_loops);
+}
+
+// image dimension
+std::size_t width=1000, height=400;
+
+// macros for standard GIL views
+#define RGB_VIEW(T) image_view<memory_based_2d_locator<memory_based_step_iterator<pixel<T,rgb_layout_t>*>>>
+#define BGR_VIEW(T) image_view<memory_based_2d_locator<memory_based_step_iterator<pixel<T,bgr_layout_t>*>>>
+#define RGB_PLANAR_VIEW(T) image_view<memory_based_2d_locator<memory_based_step_iterator<planar_pixel_iterator<T*,rgb_t>>>>
+
+template <typename View, typename P>
+struct fill_gil_t {
+ View _v;
+ P _p;
+ fill_gil_t(const View& v_in,const P& p_in) : _v(v_in), _p(p_in) {}
+ void operator()() const {fill_pixels(_v,_p);}
+};
+template <typename View, typename P> struct fill_nongil_t;
+template <typename T, typename P>
+struct fill_nongil_t<RGB_VIEW(T), P>
+{
+ using View = RGB_VIEW(T);
+ View _v;
+ P _p;
+ fill_nongil_t(const View& v_in,const P& p_in) : _v(v_in), _p(p_in) {}
+ void operator()() const {
+ T* first=(T*)_v.row_begin(0);
+ T* last=first+_v.size()*3;
+ while(first!=last) {
+ first[0]=boost::gil::at_c<0>(_p);
+ first[1]=boost::gil::at_c<1>(_p);
+ first[2]=boost::gil::at_c<2>(_p);
+ first+=3;
+ }
+ }
+};
+template <typename T1, typename T2>
+struct fill_nongil_t<RGB_VIEW(T1), pixel<T2,bgr_layout_t>>
+{
+ using View = RGB_VIEW(T1);
+ using P = pixel<T2, bgr_layout_t>;
+ View _v;
+ P _p;
+ fill_nongil_t(const View& v_in,const P& p_in) : _v(v_in), _p(p_in) {}
+ void operator()() const {
+ T1* first=(T1*)_v.row_begin(0);
+ T1* last=first+_v.size()*3;
+ while(first!=last) {
+ first[0]=boost::gil::at_c<2>(_p);
+ first[1]=boost::gil::at_c<1>(_p);
+ first[2]=boost::gil::at_c<0>(_p);
+ first+=3;
+ }
+ }
+};
+template <typename T1, typename T2>
+struct fill_nongil_t<RGB_PLANAR_VIEW(T1), pixel<T2,rgb_layout_t>>
+{
+ using View = RGB_PLANAR_VIEW(T1);
+ using P = pixel<T2, rgb_layout_t>;
+ View _v;
+ P _p;
+ fill_nongil_t(const View& v_in,const P& p_in) : _v(v_in), _p(p_in) {}
+ void operator()() const {
+ std::size_t size=_v.size();
+ T1* first;
+ first=(T1*)boost::gil::at_c<0>(_v.row_begin(0));
+ std::fill(first,first+size,boost::gil::at_c<0>(_p));
+ first=(T1*)boost::gil::at_c<1>(_v.row_begin(0));
+ std::fill(first,first+size,boost::gil::at_c<1>(_p));
+ first=(T1*)boost::gil::at_c<2>(_v.row_begin(0));
+ std::fill(first,first+size,boost::gil::at_c<2>(_p));
+ }
+};
+
+template <typename T1, typename T2>
+struct fill_nongil_t<RGB_PLANAR_VIEW(T1), pixel<T2,bgr_layout_t>>
+{
+ using View = RGB_PLANAR_VIEW(T1);
+ using P = pixel<T2,bgr_layout_t>;
+ View _v;
+ P _p;
+ fill_nongil_t(const View& v_in,const P& p_in) : _v(v_in), _p(p_in) {}
+ void operator()() const {
+ std::size_t size=_v.size();
+ T1* first;
+ first=(T1*)boost::gil::at_c<0>(_v.row_begin(0));
+ std::fill(first,first+size,boost::gil::at_c<2>(_p));
+ first=(T1*)boost::gil::at_c<1>(_v.row_begin(0));
+ std::fill(first,first+size,boost::gil::at_c<1>(_p));
+ first=(T1*)boost::gil::at_c<2>(_v.row_begin(0));
+ std::fill(first,first+size,boost::gil::at_c<1>(_p));
+ }
+};
+
+template <typename View, typename P>
+void test_fill(std::size_t trials) {
+ image<typename View::value_type, is_planar<View>::value> im(width,height);
+ std::cout << "GIL: "<< measure_time(fill_gil_t<View,P>(view(im),P()),trials) << std::endl;
+ std::cout << "Non-GIL: "<< measure_time(fill_nongil_t<View,P>(view(im),P()),trials) << std::endl;
+};
+
+template <typename T>
+struct rgb_fr_t {
+ void operator()(pixel<T,rgb_layout_t>& p) const {p[0]=0;p[1]=1;p[2]=2;}
+ void operator()(const planar_pixel_reference<T&,rgb_t>& p) const {p[0]=0;p[1]=1;p[2]=2;}
+};
+template <typename View, typename F>
+struct for_each_gil_t {
+ View _v;
+ F _f;
+ for_each_gil_t(const View& v_in,const F& f_in) : _v(v_in), _f(f_in) {}
+ void operator()() const {for_each_pixel(_v,_f);}
+};
+template <typename View, typename F> struct for_each_nongil_t;
+template <typename T, typename T2>
+struct for_each_nongil_t<RGB_VIEW(T), rgb_fr_t<T2>>
+{
+ using View = RGB_VIEW(T);
+ using F = rgb_fr_t<T2>;
+ View _v;
+ F _f;
+ for_each_nongil_t(const View& v_in,const F& f_in) : _v(v_in), _f(f_in) {}
+ void operator()() const {
+ T* first=(T*)_v.row_begin(0);
+ T* last=first+_v.size()*3;
+ while(first!=last) {
+ first[0]=0;
+ first[1]=1;
+ first[2]=2;
+ first+=3;
+ }
+ }
+};
+template <typename T1, typename T2>
+struct for_each_nongil_t<RGB_PLANAR_VIEW(T1), rgb_fr_t<T2>>
+{
+ using View = RGB_PLANAR_VIEW(T1);
+ using F = rgb_fr_t<T2>;
+ View _v;
+ F _f;
+ for_each_nongil_t(const View& v_in,const F& f_in) : _v(v_in), _f(f_in) {}
+ void operator()() const {
+ T1 *first0, *first1, *first2, *last0;
+ first0=(T1*)boost::gil::at_c<0>(_v.row_begin(0));
+ first1=(T1*)boost::gil::at_c<1>(_v.row_begin(0));
+ first2=(T1*)boost::gil::at_c<2>(_v.row_begin(0));
+ last0=first0+_v.size();
+ while(first0!=last0) {
+ *first0++=0;
+ *first1++=1;
+ *first2++=2;
+ }
+ }
+};
+
+template <typename View, typename F>
+void test_for_each(std::size_t trials) {
+ image<typename View::value_type, is_planar<View>::value> im(width,height);
+ std::cout << "GIL: "<<measure_time(for_each_gil_t<View,F>(view(im),F()),trials) << std::endl;
+ std::cout << "Non-GIL: "<<measure_time(for_each_nongil_t<View,F>(view(im),F()),trials) << std::endl;
+}
+
+// copy
+template <typename View1, typename View2>
+struct copy_gil_t {
+ View1 _v1;
+ View2 _v2;
+ copy_gil_t(const View1& v1_in,const View2& v2_in) : _v1(v1_in), _v2(v2_in) {}
+ void operator()() const {copy_pixels(_v1,_v2);}
+};
+template <typename View1, typename View2> struct copy_nongil_t;
+template <typename T1, typename T2>
+struct copy_nongil_t<RGB_VIEW(T1),RGB_VIEW(T2)>
+{
+ using View1 = RGB_VIEW(T1);
+ using View2 = RGB_VIEW(T2);
+ View1 _v1;
+ View2 _v2;
+ copy_nongil_t(const View1& v1_in,const View2& v2_in) : _v1(v1_in), _v2(v2_in) {}
+ void operator()() const {
+ T1* first1=(T1*)_v1.row_begin(0);
+ T1* last1=first1+_v1.size()*3;
+ T2* first2=(T2*)_v2.row_begin(0);
+ std::copy(first1,last1,first2);
+ }
+};
+template <typename T1, typename T2>
+struct copy_nongil_t<RGB_VIEW(T1),BGR_VIEW(T2)>
+{
+ using View1 = RGB_VIEW(T1);
+ using View2 = BGR_VIEW(T2);
+ View1 _v1;
+ View2 _v2;
+ copy_nongil_t(const View1& v1_in,const View2& v2_in) : _v1(v1_in), _v2(v2_in) {}
+ void operator()() const {
+ T1* first1=(T1*)_v1.row_begin(0);
+ T1* last1=first1+_v1.size()*3;
+ T2* first2=(T2*)_v2.row_begin(0);
+ while(first1!=last1) {
+ first2[2]=first1[0];
+ first2[1]=first1[1];
+ first2[0]=first1[2];
+ first1+=3; first2+=3;
+ }
+ }
+};
+template <typename T1, typename T2>
+struct copy_nongil_t<RGB_PLANAR_VIEW(T1),RGB_PLANAR_VIEW(T2)>
+{
+ using View1 = RGB_PLANAR_VIEW(T1);
+ using View2 = RGB_PLANAR_VIEW(T2);
+ View1 _v1;
+ View2 _v2;
+ copy_nongil_t(const View1& v1_in,const View2& v2_in) : _v1(v1_in), _v2(v2_in) {}
+ void operator()() const {
+ std::size_t size=_v1.size();
+ T1* first10=(T1*)boost::gil::at_c<0>(_v1.row_begin(0));
+ T1* first11=(T1*)boost::gil::at_c<1>(_v1.row_begin(0));
+ T1* first12=(T1*)boost::gil::at_c<2>(_v1.row_begin(0));
+ T2* first20=(T2*)boost::gil::at_c<0>(_v2.row_begin(0));
+ T2* first21=(T2*)boost::gil::at_c<1>(_v2.row_begin(0));
+ T2* first22=(T2*)boost::gil::at_c<2>(_v2.row_begin(0));
+ std::copy(first10,first10+size,first20);
+ std::copy(first11,first11+size,first21);
+ std::copy(first12,first12+size,first22);
+ }
+};
+template <typename T1, typename T2>
+struct copy_nongil_t<RGB_VIEW(T1),RGB_PLANAR_VIEW(T2)>
+{
+ using View1 = RGB_VIEW(T1);
+ using View2 = RGB_PLANAR_VIEW(T2);
+ View1 _v1;
+ View2 _v2;
+ copy_nongil_t(const View1& v1_in,const View2& v2_in) : _v1(v1_in), _v2(v2_in) {}
+ void operator()() const {
+ T1* first=(T1*)_v1.row_begin(0);
+ T1* last=first+_v1.size()*3;
+ T2* first0=(T2*)boost::gil::at_c<0>(_v2.row_begin(0));
+ T2* first1=(T2*)boost::gil::at_c<1>(_v2.row_begin(0));
+ T2* first2=(T2*)boost::gil::at_c<2>(_v2.row_begin(0));
+ while(first!=last) {
+ *first0++=first[0];
+ *first1++=first[1];
+ *first2++=first[2];
+ first+=3;
+ }
+ }
+};
+template <typename T1, typename T2>
+struct copy_nongil_t<RGB_PLANAR_VIEW(T1),RGB_VIEW(T2)>
+{
+ using View1 = RGB_PLANAR_VIEW(T1);
+ using View2 = RGB_VIEW(T2);
+ View1 _v1;
+ View2 _v2;
+ copy_nongil_t(const View1& v1_in,const View2& v2_in) : _v1(v1_in), _v2(v2_in) {}
+ void operator()() const {
+ T1* first=(T1*)_v2.row_begin(0);
+ T1* last=first+_v2.size()*3;
+ T2* first0=(T2*)boost::gil::at_c<0>(_v1.row_begin(0));
+ T2* first1=(T2*)boost::gil::at_c<1>(_v1.row_begin(0));
+ T2* first2=(T2*)boost::gil::at_c<2>(_v1.row_begin(0));
+ while(first!=last) {
+ first[0]=*first0++;
+ first[1]=*first1++;
+ first[2]=*first2++;
+ first+=3;
+ }
+ }
+};
+template <typename View1, typename View2>
+void test_copy(std::size_t trials) {
+ image<typename View1::value_type, is_planar<View1>::value> im1(width,height);
+ image<typename View2::value_type, is_planar<View2>::value> im2(width,height);
+ std::cout << "GIL: " <<measure_time(copy_gil_t<View1,View2>(view(im1),view(im2)),trials) << std::endl;
+ std::cout << "Non-GIL: "<<measure_time(copy_nongil_t<View1,View2>(view(im1),view(im2)),trials) << std::endl;
+}
+
+// transform()
+template <typename T,typename Pixel>
+struct bgr_to_rgb_t {
+ pixel<T,rgb_layout_t> operator()(const Pixel& p) const {
+ return pixel<T,rgb_layout_t>(T(get_color(p,blue_t())*0.1f),
+ T(get_color(p,green_t())*0.2f),
+ T(get_color(p,red_t())*0.3f));
+ }
+};
+template <typename View1, typename View2, typename F>
+struct transform_gil_t {
+ View1 _v1;
+ View2 _v2;
+ F _f;
+ transform_gil_t(const View1& v1_in,const View2& v2_in,const F& f_in) : _v1(v1_in),_v2(v2_in),_f(f_in) {}
+ void operator()() const {transform_pixels(_v1,_v2,_f);}
+};
+template <typename View1, typename View2, typename F> struct transform_nongil_t;
+template <typename T1, typename T2, typename F>
+struct transform_nongil_t<RGB_VIEW(T1),RGB_VIEW(T2),F>
+{
+ using View1 = RGB_VIEW(T1);
+ using View2 = RGB_VIEW(T2);
+ View1 _v1;
+ View2 _v2;
+ F _f;
+ transform_nongil_t(const View1& v1_in,const View2& v2_in,const F& f_in) : _v1(v1_in),_v2(v2_in),_f(f_in) {}
+ void operator()() const {
+ T1* first1=(T1*)_v1.row_begin(0);
+ T2* first2=(T1*)_v2.row_begin(0);
+ T1* last1=first1+_v1.size()*3;
+ while(first1!=last1) {
+ first2[0]=T2(first1[2]*0.1f);
+ first2[1]=T2(first1[1]*0.2f);
+ first2[2]=T2(first1[0]*0.3f);
+ first1+=3; first2+=3;
+ }
+ }
+};
+template <typename T1, typename T2, typename F>
+struct transform_nongil_t<RGB_PLANAR_VIEW(T1),RGB_PLANAR_VIEW(T2),F>
+{
+ using View1 = RGB_PLANAR_VIEW(T1);
+ using View2 = RGB_PLANAR_VIEW(T2);
+ View1 _v1;
+ View2 _v2;
+ F _f;
+ transform_nongil_t(const View1& v1_in,const View2& v2_in,const F& f_in) : _v1(v1_in),_v2(v2_in),_f(f_in) {}
+ void operator()() const {
+ T1* first10=(T1*)boost::gil::at_c<0>(_v1.row_begin(0));
+ T1* first11=(T1*)boost::gil::at_c<1>(_v1.row_begin(0));
+ T1* first12=(T1*)boost::gil::at_c<2>(_v1.row_begin(0));
+ T1* first20=(T2*)boost::gil::at_c<0>(_v2.row_begin(0));
+ T1* first21=(T2*)boost::gil::at_c<1>(_v2.row_begin(0));
+ T1* first22=(T2*)boost::gil::at_c<2>(_v2.row_begin(0));
+ T1* last10=first10+_v1.size();
+ while(first10!=last10) {
+ *first20++=T2(*first12++*0.1f);
+ *first21++=T2(*first11++*0.2f);
+ *first22++=T2(*first10++*0.3f);
+ }
+ }
+};
+template <typename T1, typename T2, typename F>
+struct transform_nongil_t<RGB_VIEW(T1),RGB_PLANAR_VIEW(T2),F>
+{
+ using View1 = RGB_VIEW(T1);
+ using View2 = RGB_PLANAR_VIEW(T2);
+ View1 _v1;
+ View2 _v2;
+ F _f;
+ transform_nongil_t(const View1& v1_in,const View2& v2_in,const F& f_in) : _v1(v1_in),_v2(v2_in),_f(f_in) {}
+ void operator()() const {
+ T1* first1=(T1*)_v1.row_begin(0);
+ T1* last1=first1+_v1.size()*3;
+ T1* first20=(T2*)boost::gil::at_c<0>(_v2.row_begin(0));
+ T1* first21=(T2*)boost::gil::at_c<1>(_v2.row_begin(0));
+ T1* first22=(T2*)boost::gil::at_c<2>(_v2.row_begin(0));
+ while(first1!=last1) {
+ *first20++=T2(first1[2]*0.1f);
+ *first21++=T2(first1[1]*0.2f);
+ *first22++=T2(first1[0]*0.3f);
+ first1+=3;
+ }
+ }
+};
+template <typename T1, typename T2, typename F>
+struct transform_nongil_t<RGB_PLANAR_VIEW(T1),RGB_VIEW(T2),F>
+{
+ using View1 = RGB_PLANAR_VIEW(T1);
+ using View2 = RGB_VIEW(T2);
+ View1 _v1;
+ View2 _v2;
+ F _f;
+ transform_nongil_t(const View1& v1_in,const View2& v2_in,const F& f_in) : _v1(v1_in),_v2(v2_in),_f(f_in) {}
+ void operator()() const {
+ T1* first10=(T1*)boost::gil::at_c<0>(_v1.row_begin(0));
+ T1* first11=(T1*)boost::gil::at_c<1>(_v1.row_begin(0));
+ T1* first12=(T1*)boost::gil::at_c<2>(_v1.row_begin(0));
+ T2* first2=(T1*)_v2.row_begin(0);
+ T1* last2=first2+_v1.size()*3;
+ while(first2!=last2) {
+ first2[0]=T2(*first12++*0.1f);
+ first2[1]=T2(*first11++*0.2f);
+ first2[2]=T2(*first10++*0.3f);
+ first2+=3;
+ }
+ }
+};
+
+template <typename View1, typename View2, typename F>
+void test_transform(std::size_t trials) {
+ image<typename View1::value_type, is_planar<View1>::value> im1(width,height);
+ image<typename View2::value_type, is_planar<View2>::value> im2(width,height);
+ //std::cout << "GIL: " <<measure_time(transform_gil_t<View1,View2,F>(view(im1),view(im2),F()),trials) << std::endl;
+ //std::cout << "Non-GIL: "<<measure_time(transform_nongil_t<View1,View2,F>(view(im1),view(im2),F()),trials) << std::endl;
+}
+
+void test_performance()
+{
+#ifdef NDEBUG
+ std::size_t num_trials=1000;
+#else
+ std::size_t num_trials=1;
+#endif
+
+ // fill()
+ std::cout<<"test fill_pixels() on rgb8_image_t with rgb8_pixel_t"<<std::endl;
+ test_fill<rgb8_view_t,rgb8_pixel_t>(num_trials);
+ std::cout<<std::endl;
+
+ std::cout<<"test fill_pixels() on rgb8_planar_image_t with rgb8_pixel_t"<<std::endl;
+ test_fill<rgb8_planar_view_t,rgb8_pixel_t>(num_trials);
+ std::cout<<std::endl;
+
+ std::cout<<"test fill_pixels() on rgb8_image_t with bgr8_pixel_t"<<std::endl;
+ test_fill<rgb8_view_t,bgr8_pixel_t>(num_trials);
+ std::cout<<std::endl;
+
+ std::cout<<"test fill_pixels() on rgb8_planar_image_t with bgr8_pixel_t"<<std::endl;
+ test_fill<rgb8_planar_view_t,bgr8_pixel_t>(num_trials);
+ std::cout<<std::endl;
+
+ // for_each()
+ std::cout<<"test for_each_pixel() on rgb8_image_t"<<std::endl;
+ test_for_each<rgb8_view_t,rgb_fr_t<uint8_t> >(num_trials);
+ std::cout<<std::endl;
+
+ std::cout<<"test for_each_pixel() on rgb8_planar_image_t"<<std::endl;
+ test_for_each<rgb8_planar_view_t,rgb_fr_t<uint8_t> >(num_trials);
+ std::cout<<std::endl;
+
+ // copy()
+ std::cout<<"test copy_pixels() between rgb8_image_t and rgb8_image_t"<<std::endl;
+ test_copy<rgb8_view_t,rgb8_view_t>(num_trials);
+ std::cout<<std::endl;
+
+ std::cout<<"test copy_pixels() between rgb8_image_t and bgr8_image_t"<<std::endl;
+ test_copy<rgb8_view_t,bgr8_view_t>(num_trials);
+ std::cout<<std::endl;
+
+ std::cout<<"test copy_pixels() between rgb8_planar_image_t and rgb8_planar_image_t"<<std::endl;
+ test_copy<rgb8_planar_view_t,rgb8_planar_view_t>(num_trials);
+ std::cout<<std::endl;
+
+ std::cout<<"test copy_pixels() between rgb8_image_t and rgb8_planar_image_t"<<std::endl;
+ test_copy<rgb8_view_t,rgb8_planar_view_t>(num_trials);
+ std::cout<<std::endl;
+
+ std::cout<<"test copy_pixels() between rgb8_planar_image_t and rgb8_image_t"<<std::endl;
+ test_copy<rgb8_planar_view_t,rgb8_view_t>(num_trials);
+ std::cout<<std::endl;
+
+ // transform()
+ std::cout<<"test transform_pixels() between rgb8_image_t and rgb8_image_t"<<std::endl;
+ test_transform<rgb8_view_t,rgb8_view_t,bgr_to_rgb_t<uint8_t,pixel<uint8_t,rgb_layout_t> > >(num_trials);
+ std::cout<<std::endl;
+
+ std::cout<<"test transform_pixels() between rgb8_planar_image_t and rgb8_planar_image_t"<<std::endl;
+ test_transform<rgb8_planar_view_t,rgb8_planar_view_t,bgr_to_rgb_t<uint8_t,planar_pixel_reference<uint8_t,rgb_t> > >(num_trials);
+ std::cout<<std::endl;
+
+ std::cout<<"test transform_pixels() between rgb8_image_t and rgb8_planar_image_t"<<std::endl;
+ test_transform<rgb8_view_t,rgb8_planar_view_t,bgr_to_rgb_t<uint8_t,pixel<uint8_t,rgb_layout_t> > >(num_trials);
+ std::cout<<std::endl;
+
+ std::cout<<"test transform_pixels() between rgb8_planar_image_t and rgb8_image_t"<<std::endl;
+ test_transform<rgb8_planar_view_t,rgb8_view_t,bgr_to_rgb_t<uint8_t,planar_pixel_reference<uint8_t,rgb_t> > >(num_trials);
+ std::cout<<std::endl;
+}
+
+int main()
+{
+
+ test_performance();
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/legacy/pixel.cpp b/src/boost/libs/gil/test/legacy/pixel.cpp
new file mode 100644
index 000000000..743f1b157
--- /dev/null
+++ b/src/boost/libs/gil/test/legacy/pixel.cpp
@@ -0,0 +1,322 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+
+#include <boost/core/ignore_unused.hpp>
+#include <boost/mp11.hpp>
+
+#include <exception>
+#include <iostream>
+#include <iterator>
+#include <type_traits>
+
+using namespace boost::gil;
+using std::swap;
+using namespace boost;
+
+void error_if(bool condition);
+
+struct increment {
+ template <typename Incrementable> void operator()(Incrementable& x) const { ++x; }
+};
+
+struct prev
+{
+ template <typename Subtractable>
+ auto operator()(const Subtractable& x) const -> typename channel_traits<Subtractable>::value_type
+ {
+ using return_type = typename channel_traits<Subtractable>::value_type;
+ return static_cast<return_type>(x - 1);
+ }
+};
+
+struct set_to_one{ int operator()() const { return 1; } };
+
+// Construct with two pixel types. They must be compatible and the second must be mutable
+template <typename C1, typename C2>
+struct do_basic_test : public C1, public C2
+{
+ using pixel1_t = typename C1::type;
+ using pixel2_t = typename C2::type;
+ using pixel1_value_t = typename C1::pixel_t::value_type;
+ using pixel2_value_t = typename C2::pixel_t::value_type;
+ using pixel_value_t = pixel1_value_t;
+
+ do_basic_test(const pixel_value_t& v) : C1(v), C2(v) {}
+
+ void test_all() {
+ test_heterogeneous();
+
+ // test homogeneous algorithms - fill, max, min
+ static const int num_chan = num_channels<typename C2::pixel_t>::value;
+ static_fill(C2::_pixel, gil::at_c<0>(C1::_pixel)+1);
+ error_if(gil::at_c<0>(C2::_pixel) != gil::at_c<num_chan-1>(C2::_pixel));
+
+ C2::_pixel = C1::_pixel;
+ error_if(static_max(C2::_pixel) != static_max(C1::_pixel));
+ error_if(static_min(C2::_pixel) != static_min(C1::_pixel));
+ error_if(static_max(C2::_pixel) < static_min(C2::_pixel));
+
+ // test operator[]
+ C2::_pixel[0] = C1::_pixel[0]+1;
+ error_if(C2::_pixel[0] != C1::_pixel[0]+1);
+ }
+
+ void test_heterogeneous() {
+ // Both must be pixel types (not necessarily pixel values). The second must be mutable. They must be compatible
+ boost::function_requires<PixelConcept<typename C1::pixel_t> >();
+ boost::function_requires<MutablePixelConcept<typename C2::pixel_t> >();
+ boost::function_requires<PixelsCompatibleConcept<typename C1::pixel_t,typename C2::pixel_t> >();
+
+ C2::_pixel = C1::_pixel; // test operator=
+ error_if(C1::_pixel != C2::_pixel); // test operator==
+
+ // construct a pixel value from it
+ pixel1_value_t v1(C1::_pixel);
+ pixel2_value_t v2(C2::_pixel);
+ error_if(v1 != v2);
+
+ // construct from a pixel value
+ pixel1_t c1(v1);
+ pixel2_t c2(v2);
+ error_if(c1 != c2);
+
+ // Invert the first semantic channel.
+ C2::_pixel = C1::_pixel;
+ semantic_at_c<0>(C2::_pixel) = channel_invert(semantic_at_c<0>(C2::_pixel));
+ error_if(C1::_pixel == C2::_pixel); // now they must not be equal
+
+ // test pixel algorithms
+ C2::_pixel = C1::_pixel;
+ static_for_each(C2::_pixel, increment());
+ static_transform(C2::_pixel, C2::_pixel, prev());
+ error_if(C1::_pixel!=C2::_pixel);
+
+ static_generate(C2::_pixel, set_to_one());
+ error_if(gil::at_c<0>(C2::_pixel) != 1);
+
+ // Test swap if both are mutable and if their value type is the same
+ // (We know the second one is mutable)
+ using p1_ref = typename boost::add_reference<typename C1::type>::type;
+ using is_swappable = std::integral_constant
+ <
+ bool,
+ pixel_reference_is_mutable<p1_ref>::value &&
+ std::is_same<pixel1_value_t, pixel2_value_t>::value
+ >;
+ test_swap(is_swappable{});
+ }
+
+ void test_swap(std::false_type) {}
+ void test_swap(std::true_type) {
+ // test swap
+ static_fill(C1::_pixel, 0);
+ static_fill(C2::_pixel, 1);
+ pixel_value_t pv1(C1::_pixel);
+ pixel_value_t pv2(C2::_pixel);
+ error_if(C2::_pixel == C1::_pixel);
+ swap(C1::_pixel, C2::_pixel);
+ error_if(C1::_pixel != pv2 || C2::_pixel != pv1);
+ }
+};
+
+template <typename PixelValue, int Tag=0>
+class value_core
+{
+public:
+ using type = PixelValue;
+ using pixel_t = type;
+ type _pixel;
+
+ value_core() : _pixel(0) {}
+ value_core(const type& val) : _pixel(val) { // test copy constructor
+ boost::function_requires<PixelValueConcept<pixel_t> >();
+ type p2; // test default constructor
+ boost::ignore_unused(p2);
+ }
+};
+
+template <typename PixelRef, int Tag=0>
+class reference_core : public value_core<typename std::remove_reference<PixelRef>::type::value_type, Tag>
+{
+public:
+ using type = PixelRef;
+ using pixel_t = typename std::remove_reference<PixelRef>::type;
+ using parent_t = value_core<typename pixel_t::value_type, Tag>;
+
+ type _pixel;
+
+ reference_core() : parent_t(), _pixel(parent_t::_pixel) {}
+ reference_core(const typename pixel_t::value_type& val) : parent_t(val), _pixel(parent_t::_pixel) {
+ boost::function_requires<PixelConcept<pixel_t> >();
+ }
+};
+
+// Use a subset of pixel models that covers all color spaces, channel depths, reference/value, planar/interleaved, const/mutable
+// color conversion will be invoked on pairs of them. Having an exhaustive binary check would be too big/expensive.
+using representative_pixels_t = mp11::mp_list
+<
+ value_core<gray8_pixel_t>,
+ reference_core<gray16_pixel_t&>,
+ value_core<bgr8_pixel_t>,
+ reference_core<rgb8_planar_ref_t>,
+ value_core<argb32_pixel_t>,
+ reference_core<cmyk32f_pixel_t&>,
+ reference_core<abgr16c_ref_t>, // immutable reference
+ reference_core<rgb32fc_planar_ref_t>
+>;
+
+template <typename Pixel1>
+struct ccv2 {
+ template <typename P1, typename P2>
+ void color_convert_compatible(const P1& p1, P2& p2, std::true_type) {
+ using value_t = typename P1::value_type;
+ p2 = p1;
+ value_t converted;
+ color_convert(p1, converted);
+ error_if(converted != p2);
+ }
+
+ template <typename P1, typename P2>
+ void color_convert_compatible(const P1& p1, P2& p2, std::false_type) {
+ color_convert(p1,p2);
+ }
+
+ template <typename P1, typename P2>
+ void color_convert_impl(const P1& p1, P2& p2) {
+ using is_compatible = typename pixels_are_compatible<P1,P2>::type;
+ color_convert_compatible(p1, p2, is_compatible());
+ }
+
+ template <typename Pixel2>
+ void operator()(Pixel2) {
+ // convert from Pixel1 to Pixel2 (or, if Pixel2 is immutable, to its value type)
+ using p2_is_mutable = pixel_reference_is_mutable<typename Pixel2::type>;
+ using pixel_model_t = typename std::remove_reference<typename Pixel2::type>::type;
+ using p2_value_t = typename pixel_model_t::value_type;
+ using pixel2_mutable = mp11::mp_if<p2_is_mutable, Pixel2, value_core<p2_value_t>>;
+
+ Pixel1 p1;
+ pixel2_mutable p2;
+
+ color_convert_impl(p1._pixel, p2._pixel);
+ }
+};
+
+struct ccv1 {
+ template <typename Pixel>
+ void operator()(Pixel) {
+ mp11::mp_for_each<representative_pixels_t>(ccv2<Pixel>());
+ }
+};
+
+void test_color_convert() {
+ mp11::mp_for_each<representative_pixels_t>(ccv1());
+}
+
+void test_packed_pixel()
+{
+ using rgb565_pixel_t = packed_pixel_type<uint16_t, mp11::mp_list_c<unsigned,5,6,5>, rgb_layout_t>::type;
+ boost::function_requires<PixelValueConcept<rgb565_pixel_t> >();
+ static_assert(sizeof(rgb565_pixel_t) == 2, "");
+
+ // define a bgr556 pixel
+ using bgr556_pixel_t = packed_pixel_type<uint16_t, mp11::mp_list_c<unsigned,5,6,5>, bgr_layout_t>::type;
+ boost::function_requires<PixelValueConcept<bgr556_pixel_t> >();
+
+ // Create a zero packed pixel and a full regular unpacked pixel.
+ rgb565_pixel_t r565;//((uint16_t)0);
+ rgb8_pixel_t rgb_full(255,255,255);
+
+ // Convert all channels of the unpacked pixel to the packed one & ensure the packed one is full
+ get_color(r565,red_t()) = channel_convert<kth_element_type<rgb565_pixel_t, 0>::type>(get_color(rgb_full,red_t()));
+ get_color(r565,green_t()) = channel_convert<kth_element_type<rgb565_pixel_t, 1>::type>(get_color(rgb_full,green_t()));
+ get_color(r565,blue_t()) = channel_convert<kth_element_type<rgb565_pixel_t, 2>::type>(get_color(rgb_full,blue_t()));
+ error_if(r565 != rgb565_pixel_t((uint16_t)65535));
+
+ // rgb565 is compatible with bgr556. Test interoperability
+ boost::function_requires<PixelsCompatibleConcept<rgb565_pixel_t,bgr556_pixel_t> >();
+
+ do_basic_test<value_core<rgb565_pixel_t,0>, value_core<bgr556_pixel_t,1> >(r565).test_heterogeneous();
+
+ color_convert(r565,rgb_full);
+ color_convert(rgb_full,r565);
+
+ // Test bit-aligned pixel reference
+ using bgr121_ref_t = const bit_aligned_pixel_reference<std::uint8_t, mp11::mp_list_c<int,1,2,1>, bgr_layout_t, true>;
+ using rgb121_ref_t = const bit_aligned_pixel_reference<std::uint8_t, mp11::mp_list_c<int,1,2,1>, rgb_layout_t, true>;
+ using rgb121_pixel_t = rgb121_ref_t::value_type;
+ rgb121_pixel_t p121;
+ do_basic_test<reference_core<bgr121_ref_t,0>, reference_core<rgb121_ref_t,1> >(p121).test_heterogeneous();
+ do_basic_test<value_core<rgb121_pixel_t,0>, reference_core<rgb121_ref_t,1> >(p121).test_heterogeneous();
+
+ static_assert(pixel_reference_is_proxy<rgb8_planar_ref_t>::value, "");
+ static_assert(pixel_reference_is_proxy<bgr121_ref_t>::value, "");
+
+ static_assert(!pixel_reference_is_proxy<rgb8_pixel_t>::value, "");
+ static_assert(!pixel_reference_is_proxy<rgb8_pixel_t&>::value, "");
+ static_assert(!pixel_reference_is_proxy<rgb8_pixel_t const&>::value, "");
+
+ static_assert(pixel_reference_is_mutable<rgb8_pixel_t&>::value, "");
+ static_assert(!pixel_reference_is_mutable<rgb8_pixel_t const&>::value, "");
+
+ static_assert(pixel_reference_is_mutable<rgb8_planar_ref_t>::value, "");
+ static_assert(pixel_reference_is_mutable<rgb8_planar_ref_t const&>::value, "");
+
+ static_assert(!pixel_reference_is_mutable<rgb8c_planar_ref_t>::value, "");
+ static_assert(!pixel_reference_is_mutable<rgb8c_planar_ref_t const&>::value, "");
+
+ static_assert(pixel_reference_is_mutable<bgr121_ref_t>::value, "");
+ static_assert(!pixel_reference_is_mutable<bgr121_ref_t::const_reference>::value, "");
+}
+
+void test_pixel() {
+ test_packed_pixel();
+ rgb8_pixel_t rgb8(1,2,3);
+
+ do_basic_test<value_core<rgb8_pixel_t,0>, reference_core<rgb8_pixel_t&,1> >(rgb8).test_all();
+ do_basic_test<value_core<bgr8_pixel_t,0>, reference_core<rgb8_planar_ref_t,1> >(rgb8).test_all();
+ do_basic_test<reference_core<rgb8_planar_ref_t,0>, reference_core<bgr8_pixel_t&,1> >(rgb8).test_all();
+ do_basic_test<reference_core<const rgb8_pixel_t&,0>, reference_core<rgb8_pixel_t&,1> >(rgb8).test_all();
+
+ test_color_convert();
+
+ // Semantic vs physical channel accessors. Named channel accessors
+ bgr8_pixel_t bgr8(rgb8);
+ error_if(bgr8[0] == rgb8[0]);
+ error_if(dynamic_at_c(bgr8,0) == dynamic_at_c(rgb8,0));
+ error_if(gil::at_c<0>(bgr8) == gil::at_c<0>(rgb8));
+ error_if(semantic_at_c<0>(bgr8) != semantic_at_c<0>(rgb8));
+ error_if(get_color(bgr8,blue_t()) != get_color(rgb8,blue_t()));
+
+ // Assigning a grayscale channel to a pixel
+ gray16_pixel_t g16(34);
+ g16 = 8;
+ uint16_t g = get_color(g16,gray_color_t());
+ error_if(g != 8);
+ error_if(g16 != 8);
+}
+
+
+int main()
+{
+ try
+ {
+ test_pixel();
+ return EXIT_SUCCESS;
+ }
+ catch (std::exception const& e)
+ {
+ std::cerr << e.what() << std::endl;
+ return EXIT_FAILURE;
+ }
+ catch (...)
+ {
+ return EXIT_FAILURE;
+ }
+}
diff --git a/src/boost/libs/gil/test/legacy/pixel_iterator.cpp b/src/boost/libs/gil/test/legacy/pixel_iterator.cpp
new file mode 100644
index 000000000..1b4a6d2a4
--- /dev/null
+++ b/src/boost/libs/gil/test/legacy/pixel_iterator.cpp
@@ -0,0 +1,355 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifdef _MSC_VER
+#pragma warning(disable : 4244) // 'argument': conversion from 'int' to 'unsigned char', possible loss of data
+#endif
+
+#include <boost/gil.hpp>
+
+#include <boost/assert.hpp>
+#include <boost/mp11.hpp>
+
+#include <exception>
+#include <iostream>
+#include <type_traits>
+#include <vector>
+
+using namespace boost::gil;
+using namespace std;
+
+void test_pixel_iterator()
+{
+ boost::function_requires<Point2DConcept<point<int>>>();
+
+ boost::function_requires<MutablePixelIteratorConcept<bgr8_ptr_t> >();
+ boost::function_requires<MutablePixelIteratorConcept<cmyk8_planar_ptr_t> >();
+ boost::function_requires<PixelIteratorConcept<rgb8c_planar_step_ptr_t> >();
+ boost::function_requires<MutableStepIteratorConcept<rgb8_step_ptr_t> >();
+
+ boost::function_requires<MutablePixelLocatorConcept<rgb8_step_loc_t> >();
+ boost::function_requires<PixelLocatorConcept<rgb8c_planar_step_loc_t> >();
+
+ boost::function_requires<MutableStepIteratorConcept<cmyk8_planar_step_ptr_t> >();
+ boost::function_requires<StepIteratorConcept<gray8c_step_ptr_t> >();
+
+ boost::function_requires<MutablePixelLocatorConcept<memory_based_2d_locator<rgb8_step_ptr_t> > >();
+
+ using bgr121_ref_t = bit_aligned_pixel_reference
+ <
+ std::uint8_t,
+ boost::mp11::mp_list_c<int,1,2,1>,
+ bgr_layout_t,
+ true
+ > const;
+ using bgr121_ptr_t = bit_aligned_pixel_iterator<bgr121_ref_t>;
+
+ boost::function_requires<MutablePixelIteratorConcept<bgr121_ptr_t> >();
+ boost::function_requires<PixelBasedConcept<bgr121_ptr_t> >();
+ boost::function_requires<MemoryBasedIteratorConcept<bgr121_ptr_t> >();
+ boost::function_requires<HasDynamicXStepTypeConcept<bgr121_ptr_t> >();
+
+// TEST dynamic_step_t
+ static_assert(std::is_same<cmyk16_step_ptr_t, dynamic_x_step_type<cmyk16_step_ptr_t>::type>::value, "");
+ static_assert(std::is_same<cmyk16_planar_step_ptr_t, dynamic_x_step_type<cmyk16_planar_ptr_t>::type>::value, "");
+
+ static_assert(std::is_same<iterator_type<uint8_t,gray_layout_t,false,false,false>::type,gray8c_ptr_t>::value, "");
+
+// TEST iterator_is_step
+ static_assert(iterator_is_step<cmyk16_step_ptr_t>::value, "");
+ static_assert(iterator_is_step<cmyk16_planar_step_ptr_t>::value, "");
+ static_assert(!iterator_is_step<cmyk16_planar_ptr_t>::value, "");
+
+ using ccv_rgb_g_fn = color_convert_deref_fn<rgb8c_ref_t, gray8_pixel_t>;
+ using ccv_g_rgb_fn = color_convert_deref_fn<gray8c_ref_t, rgb8_pixel_t>;
+ gil_function_requires<PixelDereferenceAdaptorConcept<ccv_rgb_g_fn> >();
+ gil_function_requires<PixelDereferenceAdaptorConcept<deref_compose<ccv_rgb_g_fn,ccv_g_rgb_fn> > >();
+
+ using rgb2gray_ptr = dereference_iterator_adaptor<rgb8_ptr_t, ccv_rgb_g_fn>;
+ static_assert(!iterator_is_step<rgb2gray_ptr>::value, "");
+
+ using rgb2gray_step_ptr = dynamic_x_step_type<rgb2gray_ptr>::type;
+ static_assert(std::is_same<rgb2gray_step_ptr, dereference_iterator_adaptor<rgb8_step_ptr_t, ccv_rgb_g_fn>>::value, "");
+
+ make_step_iterator(rgb2gray_ptr(),2);
+
+ using rgb2gray_step_ptr1 = dereference_iterator_adaptor<rgb8_step_ptr_t, ccv_rgb_g_fn>;
+ static_assert(iterator_is_step<rgb2gray_step_ptr1>::value, "");
+ static_assert(std::is_same<rgb2gray_step_ptr1, dynamic_x_step_type<rgb2gray_step_ptr1>::type>::value, "");
+
+ using rgb2gray_step_ptr2 = memory_based_step_iterator<dereference_iterator_adaptor<rgb8_ptr_t, ccv_rgb_g_fn>>;
+ static_assert(iterator_is_step<rgb2gray_step_ptr2 >::value, "");
+ static_assert(std::is_same<rgb2gray_step_ptr2, dynamic_x_step_type<rgb2gray_step_ptr2>::type>::value, "");
+ make_step_iterator(rgb2gray_step_ptr2(),2);
+
+// bit_aligned iterators test
+
+ // Mutable reference to a BGR232 pixel
+ using bgr232_ref_t = bit_aligned_pixel_reference
+ <
+ std::uint8_t,
+ boost::mp11::mp_list_c<unsigned, 2, 3, 2>,
+ bgr_layout_t,
+ true
+ > const;
+
+ // A mutable iterator over BGR232 pixels
+ using bgr232_ptr_t = bit_aligned_pixel_iterator<bgr232_ref_t>;
+
+ // BGR232 pixel value. It is a packed_pixel of size 1 byte. (The last bit is unused)
+ using bgr232_pixel_t = std::iterator_traits<bgr232_ptr_t>::value_type;
+ static_assert(sizeof(bgr232_pixel_t) == 1, "");
+
+ bgr232_pixel_t red(0,0,3); // = 0RRGGGBB, = 01100000
+
+ // a buffer of 7 bytes fits exactly 8 BGR232 pixels.
+ unsigned char pix_buffer[7];
+ std::fill(pix_buffer,pix_buffer+7,0);
+ bgr232_ptr_t pix_it(&pix_buffer[0],0); // start at bit 0 of the first pixel
+ for (int i=0; i<8; ++i) {
+ *pix_it++ = red;
+ }
+
+ // test cross byte pixel values - meaning when a pixel value is stretched over two bytes
+ using gray3_image_t = bit_aligned_image1_type<3, gray_layout_t>::type;
+ using image_t = gray3_image_t;
+
+ using view_t = image_t::view_t;
+ using ref_t = view_t::reference;
+
+ using iterator_t = bit_aligned_pixel_iterator<ref_t>;
+
+ std::vector< unsigned char > buf( 4 );
+ // bit pattern is: 1011 0110 0110 1101 1101 1011
+ // each byte is read right to left
+ buf[0] = 182;
+ buf[1] = 109;
+ buf[2] = 219;
+
+ iterator_t it( &buf[0], 0 );
+
+ ref_t p1 = *it; it++;
+ ref_t p2 = *it; it++;
+ ref_t p3 = *it; it++;
+ ref_t p4 = *it; it++;
+ ref_t p5 = *it; it++;
+ ref_t p6 = *it; it++;
+ ref_t p7 = *it; it++;
+ ref_t p8 = *it; it++;
+
+ unsigned char v1 = get_color( p1, gray_color_t() );
+ unsigned char v2 = get_color( p2, gray_color_t() );
+ unsigned char v3 = get_color( p3, gray_color_t() );
+ unsigned char v4 = get_color( p4, gray_color_t() );
+ unsigned char v5 = get_color( p5, gray_color_t() );
+ unsigned char v6 = get_color( p6, gray_color_t() );
+ unsigned char v7 = get_color( p7, gray_color_t() );
+ unsigned char v8 = get_color( p8, gray_color_t() );
+
+ // all values should be 110b ( 6 );
+ BOOST_ASSERT(v1 == 6);
+ BOOST_ASSERT(v2 == 6);
+ BOOST_ASSERT(v3 == 6);
+ BOOST_ASSERT(v4 == 6);
+ BOOST_ASSERT(v5 == 6);
+ BOOST_ASSERT(v6 == 6);
+ BOOST_ASSERT(v7 == 6);
+ BOOST_ASSERT(v8 == 6);
+}
+
+// TODO: Make better tests. Use some code from below.
+
+/*
+template <typename Pixel>
+void invert_pixel1(Pixel& pix) {
+ at_c<0>(pix)=0;
+}
+
+template <typename T> inline void ignore_unused_variable_warning(const T&){}
+
+void test_pixel_iterator() {
+ rgb8_pixel_t rgb8(1,2,3);
+ rgba8_pixel_t rgba8;
+
+ rgb8_ptr_t ptr1=&rgb8;
+ memunit_advance(ptr1, 3);
+ const rgb8_ptr_t ptr2=memunit_advanced(ptr1,10);
+
+ memunit_distance(ptr1,ptr2);
+ const rgb8_pixel_t& ref=memunit_advanced_ref(ptr1,10); ignore_unused_variable_warning(ref);
+
+ rgb8_planar_ptr_t planarPtr1(&rgb8);
+ rgb8_planar_ptr_t planarPtr2(&rgb8);
+ memunit_advance(planarPtr1,10);
+ memunit_distance(planarPtr1,planarPtr2);
+ rgb8_planar_ptr_t planarPtr3=memunit_advanced(planarPtr1,10);
+
+// planarPtr2=&rgba8;
+
+ planar_pixel_reference<uint8_t&,rgb_t> pxl=*(planarPtr1+5);
+ rgb8_pixel_t pv2=pxl;
+ rgb8_pixel_t pv3=*(planarPtr1+5);
+ rgb8_pixel_t pv=planarPtr1[5];
+
+ assert(*(planarPtr1+5)==planarPtr1[5]);
+
+ rgb8_planar_ref_t planarRef=memunit_advanced_ref(planarPtr1,10);
+
+ rgb8_step_ptr_t stepIt(&rgb8,5);
+ stepIt++;
+ rgb8_step_ptr_t stepIt2=stepIt+10;
+ stepIt2=stepIt;
+
+ rgb8_step_ptr_t stepIt3(&rgb8,5);
+
+ rgb8_pixel_t& ref1=stepIt3[5];
+// bool v=std::is_pod<iterator_traits<memory_based_step_iterator<rgb8_ptr_t> >::value_type>::value;
+// v=std::is_pod<rgb8_pixel_t>::value;
+// v=std::is_pod<int>::value;
+
+ rgb8_step_ptr_t rgb8StepIt(ptr1, 10);
+ rgb8_step_ptr_t rgb8StepIt2=rgb8StepIt;
+ rgb8StepIt=rgb8StepIt2;
+ ++rgb8StepIt;
+ rgb8_ref_t reff=*rgb8StepIt; ignore_unused_variable_warning(reff);
+ rgb8StepIt+=10;
+ std::ptrdiff_t dst=rgb8StepIt2-rgb8StepIt; ignore_unused_variable_warning(dst);
+
+ rgb8_pixel_t val1=ref1;
+ rgb8_ptr_t ptr=&ref1;
+
+ invert_pixel1(*planarPtr1);
+// invert_pixel1(*ptr);
+ rgb8c_planar_ptr_t r8cpp;
+// invert_pixel1(*r8cpp);
+
+ rgb8_pixel_t& val21=stepIt3[5];
+ rgb8_pixel_t val22=val21;
+
+ rgb8_pixel_t val2=stepIt3[5];
+ rgb8_ptr_t ptr11=&(stepIt3[5]); ignore_unused_variable_warning(ptr11);
+ rgb8_ptr_t ptr3=&*(stepIt3+5); ignore_unused_variable_warning(ptr3);
+
+ rgb8_step_ptr_t stepIt4(ptr,5);
+ ++stepIt4;
+
+ rgb8_step_ptr_t stepIt5;
+ if (stepIt4==stepIt5) {
+ int st=0;ignore_unused_variable_warning(st);
+ }
+
+ iterator_from_2d<rgb8_loc_t> pix_img_it(rgb8_loc_t(ptr, 20), 5);
+ ++pix_img_it;
+ pix_img_it+=10;
+ rgb8_pixel_t& refr=*pix_img_it;
+ refr=rgb8_pixel_t(1,2,3);
+ *pix_img_it=rgb8_pixel_t(1,2,3);
+ pix_img_it[3]=rgb8_pixel_t(1,2,3);
+ *(pix_img_it+3)=rgb8_pixel_t(1,2,3);
+
+ iterator_from_2d<rgb8c_loc_t> pix_img_it_c(rgb8c_loc_t(rgb8c_ptr_t(ptr),20), 5);
+ ++pix_img_it_c;
+ pix_img_it_c+=10;
+ // *pix_img_it_c=rgb8_pixel_t(1,2,3); // error: assigning though const iterator
+ using dif_t = iterator_from_2d<rgb8_loc_t>::difference_type;
+ dif_t dt=0;
+ std::ptrdiff_t tdt=dt; ignore_unused_variable_warning(tdt);
+
+ // memory_based_step_iterator<rgb8_pixel_t> stepIt3Err=stepIt+10; // error: non-const from const iterator
+
+ memory_based_2d_locator<rgb8_step_ptr_t> xy_locator(ptr,27);
+
+ xy_locator.x()++;
+// memory_based_step_iterator<rgb8_pixel_t>& yit=xy_locator.y();
+ xy_locator.y()++;
+ xy_locator+=point<std::ptrdiff_t>(3,4);
+ // *xy_locator=(xy_locator(-1,0)+xy_locator(0,1))/2;
+ rgb8_pixel_t& rf=*xy_locator; ignore_unused_variable_warning(rf);
+
+ make_step_iterator(rgb8_ptr_t(),3);
+ make_step_iterator(rgb8_planar_ptr_t(),3);
+ make_step_iterator(rgb8_planar_step_ptr_t(),3);
+
+ // Test operator-> on planar ptrs
+ {
+ rgb8c_planar_ptr_t cp(&rgb8);
+ rgb8_planar_ptr_t p(&rgb8);
+// get_color(p,red_t()) = get_color(cp,green_t()); // does not compile - cannot assign a non-const pointer to a const pointer. Otherwise you will be able to modify the value through it.
+ }
+// xy_locator.y()++;
+
+ // dimensions to explore
+ //
+ // values, references, pointers
+ // color spaces (rgb,cmyk,gray)
+ // channel ordering (bgr vs rgb)
+ // planar vs interleaved
+
+// Pixel POINTERS
+// using RGB8ConstPtr = iterator_traits<rgb8_ptr_t>::pointer const;
+ using RGB8ConstPtr = rgb8_ptr_t const;
+ using RGB8ConstPlanarPtr = rgb8_planar_ptr_t const;
+// using RGB8ConstPlanarPtr = iterator_traits<rgb8_planar_ptr_t>::pointer const;
+
+// constructing from values, references and other pointers
+ RGB8ConstPtr rgb8_const_ptr=NULL; ignore_unused_variable_warning(rgb8_const_ptr);
+ rgb8_ptr_t rgb8ptr=&rgb8;
+
+ rgb8=bgr8_pixel_t(30,20,10);
+ rgb8_planar_ptr_t rgb8_pptr=&rgb8;
+ ++rgb8_pptr;
+ rgb8_pptr--;
+ rgb8_pptr[0]=rgb8;
+ RGB8ConstPlanarPtr rgb8_const_planar_ptr=&rgb8;
+
+ rgb8c_planar_ptr_t r8c=&rgb8;
+ r8c=&rgb8;
+
+ rgb8_pptr=&rgb8;
+
+ // rgb8_const_planar_ptr=&rgb16p; // error: incompatible bit depth
+
+ // iterator_traits<CMYK8>::pointer cmyk8_ptr_t=&rgb8; // error: incompatible pointer type
+
+ RGB8ConstPtr rgb8_const_ptr_err=rgb8ptr; // const pointer from non-regular pointer
+ignore_unused_variable_warning(rgb8_const_ptr_err);
+// dereferencing pointers to obtain references
+ rgb8_ref_t rgb8ref_2=*rgb8ptr; ignore_unused_variable_warning(rgb8ref_2);
+ assert(rgb8ref_2==rgb8);
+ // RGB8Ref rgb8ref_2_err=*rgb8_const_planar_ptr; // error: non-const reference from const pointer
+
+ rgb8_planar_ref_t rgb8planarref_3=*rgb8_pptr; // planar reference from planar pointer
+ assert(rgb8planarref_3==rgb8);
+ // RGB8Ref rgb8ref_3=*rgb8_planar_ptr_t; // error: non-planar reference from planar pointer
+
+ const rgb8_pixel_t crgb8=rgb8;
+ *rgb8_pptr=rgb8;
+ *rgb8_pptr=crgb8;
+
+ memunit_advance(rgb8_pptr,3);
+ memunit_advance(rgb8_pptr,-3);
+}
+*/
+
+int main()
+{
+ try
+ {
+ test_pixel_iterator();
+
+ return EXIT_SUCCESS;
+ }
+ catch (std::exception const& e)
+ {
+ std::cerr << e.what() << std::endl;
+ return EXIT_FAILURE;
+ }
+ catch (...)
+ {
+ return EXIT_FAILURE;
+ }
+}
diff --git a/src/boost/libs/gil/test/legacy/recreate_image.cpp b/src/boost/libs/gil/test/legacy/recreate_image.cpp
new file mode 100644
index 000000000..7ca616cdb
--- /dev/null
+++ b/src/boost/libs/gil/test/legacy/recreate_image.cpp
@@ -0,0 +1,108 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifdef _MSC_VER
+//#pragma warning(disable : 4244) // conversion from 'gil::image<V,Alloc>::coord_t' to 'int', possible loss of data (visual studio compiler doesn't realize that the two types are the same)
+#pragma warning(disable : 4503) // decorated name length exceeded, name was truncated
+#endif
+
+#include <boost/gil/extension/dynamic_image/dynamic_image_all.hpp>
+
+#include <boost/core/lightweight_test.hpp>
+
+#include <ios>
+#include <iostream>
+#include <fstream>
+#include <map>
+#include <string>
+#include <type_traits>
+#include <vector>
+
+using namespace boost::gil;
+using namespace std;
+using namespace boost;
+
+///////////////////////////////////////////////////////////////
+
+std::size_t is_planar_impl( const std::size_t size_in_units
+ , const std::size_t channels_in_image
+ , std::true_type
+ )
+{
+ return size_in_units * channels_in_image;
+}
+
+std::size_t is_planar_impl( const std::size_t size_in_units
+ , const std::size_t
+ , std::false_type
+ )
+{
+ return size_in_units;
+}
+
+template< typename View >
+std::size_t get_row_size_in_memunits( typename View::x_coord_t width)
+{ // number of units per row
+ std::size_t size_in_memunits = width * memunit_step( typename View::x_iterator() );
+
+ return size_in_memunits;
+}
+
+
+template< typename View
+ , bool IsPlanar
+ >
+std::size_t total_allocated_size_in_bytes( const typename View::point_t& dimensions )
+{
+
+ using x_iterator = typename View::x_iterator;
+
+ // when value_type is a non-pixel, like int or float, num_channels< ... > doesn't work.
+ const std::size_t _channels_in_image = mp11::mp_eval_if< is_pixel< typename View::value_type >
+ , num_channels< View >
+ , std::integral_constant<int, 1>
+ >::type::value;
+
+ std::size_t size_in_units = is_planar_impl( get_row_size_in_memunits< View >( dimensions.x ) * dimensions.y
+ , _channels_in_image
+ , typename std::conditional< IsPlanar, std::true_type, std::false_type >::type()
+ );
+
+ // return the size rounded up to the nearest byte
+ std::size_t btm = byte_to_memunit< typename View::x_iterator >::value;
+
+
+ return ( size_in_units + btm - 1 )
+ / btm;
+}
+
+
+void test_recreate_image()
+{
+ auto tasib_1 = total_allocated_size_in_bytes<rgb8_view_t, false>({640, 480});
+ auto tasib_2 = total_allocated_size_in_bytes<rgb8_view_t, false>({320, 200});
+
+ rgb8_image_t img( 640, 480 );
+ img.recreate( 320, 200 );
+}
+
+int main()
+{
+ test_recreate_image();
+
+ return ::boost::report_errors();
+}
+
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(push)
+#pragma warning(disable:4127) //conditional expression is constant
+#endif
+
+#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)
+#pragma warning(pop)
+#endif
diff --git a/src/boost/libs/gil/test/legacy/sample_image.cpp b/src/boost/libs/gil/test/legacy/sample_image.cpp
new file mode 100644
index 000000000..bbcdf0179
--- /dev/null
+++ b/src/boost/libs/gil/test/legacy/sample_image.cpp
@@ -0,0 +1,159 @@
+//
+// Copyright 2005-2007 Adobe Systems Incorporated
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/gil.hpp>
+
+unsigned char halfdome[][3174]={
+{
+ 47,47,48,48,48,48,48,47,51,50,49,51,50,60,110,150,143,93,164,168,125,137,53,54,56,54,52,50,52,51,50,51,53,52,51,51,52,53,51,51,52,52,51,51,50,52,51,53,51,52,51,53,52,54,57,57,59,57,59,59,60,60,177,185,206,221,230,224,227,
+ 50,52,48,51,50,51,52,51,53,51,53,53,56,54,59,59,61,64,149,149,153,65,58,57,57,57,55,55,56,57,55,57,56,56,53,54,56,55,53,55,54,56,56,55,54,54,56,54,55,57,56,54,57,57,59,70,178,75,67,191,132,194,226,201,226,226,227,237,222,
+ 54,54,55,54,53,54,55,54,56,58,57,59,59,59,59,61,61,61,62,64,65,65,85,61,58,59,60,61,60,61,58,60,58,60,59,60,59,58,60,60,57,59,59,58,60,61,59,57,58,60,60,62,61,63,192,210,223,223,231,222,226,218,208,204,205,206,205,215,207,
+ 58,57,57,59,58,58,60,58,60,60,59,58,62,63,64,64,62,63,66,66,67,67,65,66,64,62,64,61,62,63,65,64,63,63,64,60,63,63,62,64,62,64,63,65,63,64,63,62,61,64,63,84,119,69,146,179,202,221,217,208,205,209,206,212,201,182,178,184,183,
+ 60,61,62,60,61,64,64,62,65,63,65,66,69,65,66,67,69,67,69,69,67,70,71,70,69,69,68,68,67,70,70,69,69,68,69,67,66,68,67,75,70,67,89,65,67,67,67,66,66,67,68,78,93,159,188,178,161,185,196,215,196,187,174,172,170,174,175,171,171,
+ 66,66,65,66,68,69,67,68,67,70,68,70,72,72,73,73,73,73,74,75,75,75,76,74,75,75,74,75,76,75,75,74,75,75,74,75,76,90,157,157,158,177,163,182,161,72,76,70,71,71,72,74,75,80,117,129,143,166,200,194,191,210,215,200,182,181,176,182,196,
+ 72,72,71,72,72,71,74,72,74,73,73,77,77,78,77,79,77,80,78,79,82,80,81,92,81,91,80,80,81,81,81,79,81,79,116,123,103,96,87,80,105,115,140,82,97,97,130,169,162,124,77,78,80,79,81,83,83,142,192,202,211,182,203,191,194,176,169,184,184,
+ 75,76,75,73,77,77,79,76,79,77,79,80,81,84,84,83,85,86,87,166,241,96,89,88,89,88,100,88,88,87,92,203,91,173,178,162,179,87,86,85,83,84,84,82,83,82,85,83,85,94,81,83,81,83,84,135,183,187,192,176,180,208,193,216,203,196,196,207,191,
+ 79,80,79,81,81,82,82,86,83,84,85,88,89,95,244,238,93,128,222,227,245,248,231,99,159,98,183,196,95,97,183,215,215,223,230,230,228,117,92,90,90,90,88,87,87,86,87,87,88,86,89,89,90,91,101,231,214,189,221,165,166,192,184,193,194,176,170,159,157,
+ 84,84,86,86,86,88,88,88,90,90,91,94,217,244,246,248,249,188,223,223,224,231,232,222,226,218,189,171,190,199,223,179,199,204,205,202,203,205,188,101,97,93,94,93,93,95,96,106,115,97,96,98,209,234,217,224,242,242,242,217,214,191,139,183,179,179,164,154,143,
+ 89,89,89,92,91,91,93,95,94,96,115,226,208,212,235,241,245,212,196,200,201,209,203,192,183,187,219,192,198,211,214,224,200,197,184,181,186,203,190,218,189,131,173,189,160,188,173,175,185,197,199,201,192,237,211,196,225,241,242,230,238,222,222,221,218,188,168,184,197,
+ 95,98,98,98,99,101,102,161,161,143,215,193,232,200,200,204,227,208,228,214,212,226,48,195,213,193,191,203,201,206,229,232,210,183,225,221,234,232,234,197,206,189,204,200,193,201,191,200,206,215,223,202,196,186,189,181,209,211,215,183,236,232,176,209,217,231,181,177,178,
+ 103,101,105,106,153,171,197,209,204,218,184,169,199,197,210,213,202,209,215,222,234,203,120,41,195,197,187,197,186,208,193,198,198,196,197,200,201,198,202,210,222,190,178,198,211,232,226,220,204,189,190,199,188,194,193,170,169,187,190,209,225,219,208,225,212,207,199,191,203,
+ 109,109,111,150,205,175,184,193,175,161,165,121,134,130,126,160,203,190,184,161,147,204,61,89,193,201,198,185,215,192,183,193,189,209,189,174,172,172,170,178,197,188,186,214,227,229,143,163,160,182,193,207,189,209,190,191,176,184,197,171,180,181,207,218,218,212,176,170,170,
+ 118,182,143,213,169,184,183,192,201,179,193,212,203,182,154,196,205,163,201,193,191,117,59,45,179,193,228,204,203,186,202,189,159,162,166,180,195,195,191,218,205,177,201,200,199,204,228,183,202,209,202,203,199,212,217,189,207,183,186,192,188,188,175,177,183,179,186,179,184,
+ 126,155,183,185,189,188,185,197,175,183,192,192,188,151,172,86,190,196,184,178,128,111,57,56,135,192,188,198,195,150,180,202,214,224,211,205,182,197,199,195,211,196,181,194,206,194,194,194,192,211,197,198,201,191,197,194,197,192,189,186,181,177,169,190,171,163,171,175,160,
+ 133,134,136,136,163,146,116,166,186,181,205,201,93,132,137,198,207,190,69,119,127,110,70,66,153,192,180,164,168,179,188,199,189,177,183,188,189,160,177,190,194,193,192,194,124,175,193,186,178,180,207,209,187,178,144,97,131,159,105,200,114,125,135,141,179,199,172,108,117,
+ 120,151,138,128,163,112,124,96,103,139,102,149,213,197,208,214,193,80,104,154,107,125,84,63,141,161,163,175,183,186,190,183,201,79,86,204,191,207,194,207,184,169,141,146,171,181,128,125,83,91,101,114,127,163,120,119,114,122,126,140,87,115,113,125,186,104,83,68,84,
+ 118,133,167,92,126,109,124,173,137,181,150,147,166,203,176,178,82,81,123,109,137,146,60,56,146,193,156,175,180,175,194,203,185,178,82,84,74,113,105,65,64,127,65,70,140,92,83,82,80,80,82,79,84,74,99,138,84,76,109,77,142,123,76,83,71,74,55,54,34,
+ 182,127,117,134,158,163,201,189,166,149,192,147,191,164,175,165,120,174,99,109,167,130,153,62,180,131,96,193,203,204,191,215,183,141,70,70,66,68,73,73,71,61,74,85,95,66,63,133,154,135,89,113,89,102,69,124,68,85,77,56,51,72,94,34,60,37,90,39,34,
+ 149,167,135,154,108,173,152,148,184,153,157,182,167,194,176,161,202,148,120,132,149,174,156,125,147,74,133,220,225,187,116,218,209,216,70,69,72,68,61,59,60,63,70,73,63,64,81,59,84,99,80,95,70,90,52,76,162,144,87,67,65,68,98,116,90,55,140,156,58,
+ 91,120,142,143,157,191,188,196,151,209,199,189,177,188,81,77,44,102,112,126,155,70,200,127,88,107,87,59,95,101,153,145,203,188,62,129,124,63,66,58,60,62,67,58,60,68,62,63,77,64,63,64,71,130,97,92,105,72,67,71,158,166,144,152,160,127,125,140,115,
+ 133,164,135,143,168,172,196,181,211,206,197,165,144,56,91,59,46,57,65,157,146,89,177,128,59,53,76,59,63,58,132,122,126,183,209,68,59,74,69,74,77,76,78,49,57,57,72,64,67,81,100,69,146,137,153,69,140,166,83,173,175,169,171,166,41,149,154,120,172,
+ 101,131,158,153,167,86,82,193,163,204,140,129,105,111,44,46,32,157,150,190,120,52,120,163,144,71,68,84,81,87,160,160,106,123,121,97,69,75,79,70,60,57,73,60,61,61,94,77,73,131,115,126,121,96,130,169,128,128,145,180,159,64,139,106,147,45,27,33,20,
+ 67,80,168,201,199,68,148,210,111,132,85,63,139,88,101,60,92,96,66,104,76,47,103,165,115,82,49,89,113,88,127,168,178,133,81,90,84,60,63,105,64,80,64,67,54,62,70,89,88,57,86,129,159,154,202,146,143,126,60,57,69,66,144,32,28,33,62,27,35,
+ 98,101,82,151,129,73,80,129,134,102,116,66,81,53,87,110,95,87,144,69,123,118,106,95,88,69,69,108,91,151,158,132,137,71,158,179,184,145,65,72,64,91,72,73,76,65,60,52,57,63,119,73,67,128,114,80,123,134,172,158,108,114,28,27,28,22,33,27,52,
+ 158,127,109,79,90,75,74,169,97,94,124,61,121,160,171,150,102,60,47,115,136,121,155,81,142,141,135,114,114,144,78,118,79,76,67,123,90,125,77,148,103,77,68,96,73,68,50,62,60,98,101,113,117,117,122,143,97,51,64,60,51,28,37,44,35,30,40,52,74,
+ 139,174,90,111,108,143,123,135,128,113,129,123,139,132,96,55,47,57,69,95,102,76,124,76,52,59,148,131,119,68,86,152,100,105,128,89,139,116,118,131,125,151,93,66,66,61,61,61,58,65,81,68,87,88,102,96,90,111,72,71,79,29,42,37,46,44,49,61,96,
+ 128,159,122,75,55,64,168,129,93,116,109,122,140,149,161,48,58,55,93,96,87,122,76,74,57,66,144,143,57,61,87,130,96,115,131,54,105,117,87,89,79,168,139,156,108,106,80,60,60,87,69,101,85,72,66,90,84,91,91,101,127,41,37,65,65,48,30,70,128,
+ 153,175,59,54,52,155,159,113,143,118,113,127,149,121,148,81,162,97,120,140,57,51,57,58,80,56,124,164,81,58,100,140,60,112,118,98,106,93,65,89,65,129,61,144,119,182,171,78,148,70,101,91,85,90,78,106,89,109,118,131,117,54,75,100,86,47,78,181,134,
+ 60,50,51,52,48,148,87,156,170,141,146,159,77,51,144,174,102,112,161,49,58,73,46,63,64,63,60,135,129,122,87,121,122,174,105,79,96,55,56,60,108,39,46,67,51,144,123,136,59,91,80,99,84,62,92,101,103,99,128,136,215,127,110,139,121,74,135,181,175,
+ 55,51,55,54,105,173,137,149,186,92,84,79,91,92,96,190,101,164,72,50,75,51,67,56,72,93,118,53,63,57,82,159,182,150,127,53,57,69,59,58,54,62,78,71,96,132,90,72,55,63,83,119,86,131,65,66,114,140,95,130,160,135,158,124,133,94,135,147,140,
+ 56,64,47,127,175,145,131,132,178,110,84,71,127,64,136,118,93,86,139,66,116,79,55,64,50,80,133,72,95,161,164,163,163,106,68,52,58,40,60,42,42,84,86,110,88,129,73,72,43,49,49,84,116,93,78,76,132,110,147,126,122,132,82,139,138,79,62,175,158,
+ 50,53,56,59,170,124,166,103,147,89,116,125,101,126,122,156,100,151,165,128,146,54,73,143,66,128,147,149,145,139,144,162,161,109,94,55,46,85,54,57,69,47,63,59,127,65,85,44,99,71,55,70,37,87,119,109,70,122,161,145,148,179,129,119,77,129,134,160,141,
+ 99,53,76,140,161,77,119,137,163,68,89,92,58,138,122,153,129,88,137,134,134,99,95,116,130,117,155,120,136,108,165,158,207,58,87,77,43,55,51,119,59,43,71,63,83,61,86,45,34,72,112,59,162,56,39,66,124,132,139,201,164,172,69,75,92,89,139,150,50,
+ 48,49,56,85,83,51,103,106,118,87,104,190,118,110,143,154,74,144,119,103,117,109,155,141,102,104,96,134,111,89,155,154,121,66,43,42,31,41,54,53,70,52,62,47,97,102,71,57,48,42,60,77,84,72,49,62,56,121,67,173,55,203,53,95,56,54,57,103,57,
+ 48,55,119,169,97,101,106,123,84,55,144,135,116,143,84,114,116,148,102,128,104,114,109,65,93,104,106,164,128,128,145,185,115,51,135,165,75,70,112,152,108,92,57,55,60,59,54,57,120,86,69,136,110,132,62,73,78,88,72,94,57,92,168,55,107,53,43,50,28,
+ 51,51,66,75,71,56,127,117,50,100,145,138,100,128,73,158,105,112,112,170,102,66,92,107,144,140,142,146,147,167,140,116,135,126,175,126,75,118,95,115,62,117,105,70,80,46,75,105,121,127,112,56,89,101,109,52,102,53,51,81,55,157,144,130,47,42,63,82,47,
+ 76,57,122,66,98,54,48,82,65,133,111,135,108,92,146,48,147,123,146,103,102,94,140,100,90,112,100,146,148,151,171,117,160,114,135,128,95,121,129,105,83,128,135,82,118,91,81,60,102,121,107,97,89,117,93,51,52,35,72,48,59,55,57,41,38,56,60,7,24,
+ 97,144,102,119,53,129,63,74,104,145,134,70,109,108,131,103,86,106,108,67,115,92,127,109,66,81,160,128,165,177,120,123,157,78,114,95,149,161,102,135,94,115,129,127,108,66,64,100,84,156,127,67,89,128,88,123,38,35,42,41,50,58,47,57,134,130,111,68,68,
+ 115,121,134,46,126,62,107,158,98,79,113,72,82,147,149,109,117,120,103,109,127,109,130,119,92,103,175,143,124,140,110,111,57,110,124,103,128,142,122,83,109,94,152,92,105,101,46,86,88,131,160,88,108,89,88,156,128,66,59,56,69,83,71,100,76,106,116,43,28,
+ 118,115,62,176,98,129,95,67,62,60,88,77,90,100,113,71,83,141,88,124,124,130,102,125,103,139,109,117,179,128,54,75,102,65,158,117,124,60,112,54,71,168,127,62,145,62,107,87,98,90,136,79,130,147,126,113,69,60,116,50,78,84,80,80,57,132,117,34,101,
+ 126,86,127,113,141,148,92,74,81,58,60,62,118,118,49,68,152,116,125,170,119,115,148,125,119,53,87,156,78,145,71,134,52,105,101,80,50,54,93,49,124,107,107,101,55,64,72,113,64,105,133,143,93,137,157,118,70,29,61,76,60,78,105,59,48,53,42,123,70,
+ 45,49,104,155,135,81,157,85,73,139,91,63,99,116,84,107,59,60,144,108,69,122,128,120,144,65,96,116,121,136,152,120,91,130,144,104,63,51,64,104,78,148,78,50,53,59,64,110,75,97,133,162,85,105,146,48,118,110,88,95,52,58,59,74,42,44,7,61,67,
+ 47,49,75,70,86,99,80,63,174,60,94,121,66,87,115,31,50,111,118,97,101,101,121,110,128,97,131,168,125,134,155,79,150,134,103,68,97,59,86,105,125,140,124,113,40,50,53,82,72,84,104,120,154,162,42,61,35,77,60,42,103,78,58,107,52,52,8,28,59,
+ 49,44,44,40,69,203,93,106,97,105,98,131,68,112,131,112,119,153,80,88,94,108,126,151,133,115,153,124,141,147,115,88,116,62,132,112,133,69,66,130,151,163,66,58,82,92,73,57,103,115,95,156,118,158,62,65,51,93,32,88,55,103,100,120,81,47,66,29,38,
+},
+{
+ 93,93,93,93,93,94,94,94,93,94,95,94,95,100,129,161,158,123,175,178,145,151,98,96,96,96,96,97,95,96,96,95,96,94,95,95,96,95,96,94,94,95,95,96,96,95,96,96,96,96,96,97,98,97,97,99,99,102,100,101,102,104,193,199,213,228,236,229,233,
+ 96,96,97,97,96,97,97,97,97,99,99,99,99,101,100,102,104,106,163,163,162,109,102,100,101,100,101,100,100,99,100,99,100,100,100,100,100,100,99,99,99,100,99,99,99,100,99,99,100,100,100,100,100,100,102,107,186,108,108,195,143,205,229,211,233,234,235,242,231,
+ 100,101,101,101,101,102,102,102,102,102,102,103,103,105,105,106,106,106,107,109,108,108,119,106,106,105,105,105,104,104,104,104,104,104,104,102,104,104,103,103,103,102,103,103,102,103,103,103,104,103,102,103,104,106,198,218,227,228,235,224,231,226,215,211,213,213,214,224,215,
+ 105,105,105,105,106,106,106,107,107,107,108,108,108,108,109,110,111,110,110,111,111,111,111,111,111,111,111,110,109,110,109,110,109,109,108,109,108,107,108,107,108,107,107,107,107,106,107,107,107,107,107,121,133,112,162,188,211,226,223,217,214,217,214,219,209,192,188,194,193,
+ 110,110,110,110,111,111,111,112,112,113,113,114,113,114,114,114,114,114,114,115,116,115,116,116,116,116,116,115,115,115,114,115,115,115,114,114,114,113,113,116,114,114,123,114,112,112,113,113,112,112,113,118,131,176,195,187,175,195,204,220,204,191,184,183,181,186,185,181,178,
+ 115,115,116,115,115,115,116,116,117,117,118,118,119,119,118,120,120,120,120,121,121,121,122,122,122,121,121,121,120,122,122,121,120,121,120,119,121,128,165,166,166,185,171,189,169,117,119,118,118,118,119,119,122,124,150,153,163,176,208,202,199,218,220,205,189,190,186,192,205,
+ 119,120,120,120,121,122,121,122,122,123,123,123,123,125,125,126,126,125,126,128,128,129,129,132,128,132,129,128,128,128,128,128,128,128,144,148,136,133,130,127,140,145,156,127,133,135,157,176,170,145,123,123,124,125,127,128,129,161,200,204,214,190,212,200,200,186,179,196,193,
+ 124,125,125,126,126,126,126,127,127,128,128,130,131,131,131,133,132,132,134,168,242,138,137,136,136,136,141,135,135,135,136,206,137,180,185,173,185,133,131,131,130,130,130,130,132,129,129,131,131,134,129,130,131,131,132,160,193,195,199,186,190,215,201,224,211,204,204,213,199,
+ 130,131,131,131,131,131,132,132,133,134,134,135,137,140,246,242,139,156,227,231,245,248,234,144,168,143,195,208,143,142,192,220,218,223,234,234,229,148,139,138,137,136,136,135,135,135,134,134,135,136,136,136,137,139,143,235,218,195,221,183,184,200,190,200,203,187,181,172,169,
+ 134,135,136,136,137,137,137,138,138,140,140,142,225,246,248,249,250,195,227,228,226,232,235,224,229,222,197,178,195,202,225,187,204,208,208,205,208,208,194,145,143,142,142,142,142,141,143,147,148,143,143,143,220,237,222,228,243,243,243,221,219,198,165,192,189,189,175,163,156,
+ 141,141,142,142,142,143,144,144,145,145,151,230,212,217,240,243,247,218,201,204,205,212,207,198,189,192,220,197,202,214,218,227,204,202,190,188,194,205,194,219,193,161,181,196,174,198,183,185,192,202,203,207,206,237,215,202,230,242,243,231,238,224,226,225,220,196,178,191,200,
+ 147,147,147,147,148,149,151,180,178,164,219,199,236,206,205,208,230,212,228,217,217,230,62,187,211,194,191,199,199,207,230,233,214,190,226,222,234,233,234,200,209,194,206,202,196,202,194,203,209,219,224,204,198,192,193,188,213,215,214,188,240,235,185,212,223,233,188,184,187,
+ 151,152,153,154,171,182,204,214,209,221,193,183,204,201,213,215,206,214,218,225,232,206,124,57,195,197,182,185,177,200,197,199,199,199,202,205,205,203,206,213,222,196,188,200,212,232,226,221,205,197,195,202,192,198,197,177,177,192,196,212,226,221,212,225,213,209,202,196,209,
+ 157,158,159,169,207,186,193,199,187,178,179,163,165,164,163,169,207,199,190,169,147,209,72,95,193,197,192,181,212,190,191,198,195,211,195,182,178,180,176,183,201,191,192,215,226,229,172,183,181,191,198,209,195,209,193,198,184,191,201,178,187,186,210,218,219,214,183,178,180,
+ 163,191,169,218,182,194,193,201,205,193,202,214,208,192,173,200,209,173,200,190,192,120,67,60,183,189,216,198,195,180,189,190,168,170,177,185,199,199,195,220,206,189,205,205,203,208,228,194,206,211,203,207,202,212,218,194,208,189,191,194,195,194,183,185,188,187,192,186,190,
+ 168,175,191,195,196,195,193,202,188,190,200,200,195,175,184,109,192,199,186,175,135,121,69,68,137,189,180,196,186,148,177,191,215,225,212,207,189,200,203,200,213,199,189,198,207,198,196,198,196,211,200,200,203,196,200,198,201,196,194,192,188,184,178,194,181,173,178,181,170,
+ 173,173,173,173,163,171,130,180,193,188,209,207,101,138,139,191,199,200,86,121,130,115,79,77,155,189,172,162,166,179,181,190,195,187,188,194,195,174,186,197,201,200,198,197,137,186,197,193,187,188,207,210,194,184,161,119,147,168,130,204,130,146,147,145,179,202,183,129,127,
+ 132,155,139,136,166,129,123,109,115,149,111,150,207,188,209,215,207,98,106,154,108,127,89,75,140,163,164,175,180,185,181,177,176,94,100,206,196,207,191,203,184,172,145,147,172,180,136,130,103,105,113,125,142,162,131,132,129,137,138,143,106,123,122,140,182,111,97,90,100,
+ 128,141,168,108,135,124,130,175,144,176,149,153,169,210,178,182,106,96,121,112,138,148,68,66,149,190,152,172,177,166,180,195,179,177,94,98,91,118,113,84,84,130,81,87,143,105,101,100,98,97,97,98,99,96,114,140,104,99,122,96,148,130,96,98,90,90,79,77,54,
+ 179,141,130,151,164,162,199,192,164,150,193,149,191,169,175,169,126,164,101,113,169,132,149,73,178,132,101,188,199,189,182,208,175,138,81,81,79,83,84,84,83,80,91,95,103,80,77,134,154,135,98,120,101,111,90,124,86,96,88,72,68,87,103,55,78,59,97,60,54,
+ 152,167,143,161,122,172,164,148,183,156,155,169,168,197,182,164,200,152,122,134,150,169,152,118,138,80,135,210,216,180,115,214,201,207,81,81,86,82,74,73,74,77,83,84,76,74,93,77,88,102,86,103,81,102,77,95,163,152,97,83,86,86,109,120,93,65,145,150,70,
+ 105,131,147,147,158,187,190,195,152,207,192,191,180,186,91,78,57,105,114,130,158,75,190,126,84,106,92,68,97,102,142,145,200,176,75,129,123,73,79,76,72,76,79,70,73,76,73,76,88,77,76,74,84,125,103,96,112,82,86,88,162,170,150,154,161,126,126,139,120,
+ 137,161,143,149,167,170,196,182,209,206,194,169,155,66,101,71,59,70,72,154,151,95,169,129,67,62,78,67,73,68,128,121,123,181,197,79,71,82,80,83,86,83,85,61,71,71,81,76,77,89,101,78,140,134,149,76,137,163,99,173,176,169,175,168,61,147,152,123,173,
+ 113,129,155,158,167,97,100,195,165,208,147,142,107,115,59,61,49,150,147,184,126,66,121,158,143,76,68,85,80,88,151,152,108,124,125,102,79,77,85,79,72,67,81,73,74,72,98,86,83,130,115,125,122,99,133,166,127,131,149,180,152,85,140,116,152,44,38,44,33,
+ 79,96,169,201,195,85,145,207,114,136,88,82,140,88,105,72,94,92,74,110,83,61,109,162,104,86,53,89,106,89,124,161,165,129,85,93,88,71,71,107,74,87,73,76,67,74,79,96,93,65,94,128,158,151,195,134,141,128,71,73,83,74,147,44,40,42,79,36,46,
+ 115,107,98,148,135,92,99,138,138,111,116,72,86,59,91,100,100,95,142,80,121,119,109,98,89,73,71,109,91,151,153,128,132,72,151,168,176,142,72,80,73,95,78,84,84,76,71,69,71,76,123,82,76,131,114,85,126,132,173,158,112,120,39,37,41,34,44,36,58,
+ 159,131,116,90,99,84,90,170,106,98,125,72,121,157,172,152,104,69,56,116,141,126,153,88,135,137,129,111,115,141,80,116,79,76,70,122,89,121,79,144,105,81,74,98,78,75,65,75,74,98,103,112,116,112,120,140,97,60,72,70,59,41,48,60,48,44,52,60,74,
+ 145,171,96,121,115,135,125,143,137,113,132,124,144,128,97,66,63,69,80,97,111,81,124,79,57,67,142,129,119,72,89,150,101,105,127,92,137,115,118,129,120,145,94,70,73,70,73,72,70,76,87,73,92,91,106,96,92,111,79,75,82,45,57,49,57,59,56,73,103,
+ 132,164,131,88,76,82,169,124,102,113,112,125,144,152,165,65,66,68,99,106,100,122,80,77,61,71,139,142,63,67,84,128,97,112,130,59,108,117,89,90,82,166,137,146,108,108,86,70,72,95,75,99,86,72,71,92,84,93,94,102,126,52,48,75,74,59,41,83,129,
+ 155,177,77,75,73,154,163,117,147,124,114,130,147,136,140,85,159,102,124,138,65,60,63,65,83,62,123,163,84,62,104,137,63,113,118,100,105,95,70,90,70,128,66,141,117,175,162,77,145,74,102,91,87,92,75,108,89,111,119,128,117,67,87,105,95,57,85,187,139,
+ 79,70,72,71,71,141,93,157,174,148,154,161,89,63,141,167,101,108,162,57,69,76,55,72,69,69,65,129,126,120,88,120,122,172,105,80,92,62,66,64,111,48,55,75,55,132,122,136,66,96,83,102,85,70,92,99,108,103,128,138,213,131,115,140,127,80,140,183,171,
+ 71,71,74,71,108,174,138,150,190,116,81,93,95,94,101,191,105,164,79,59,76,61,70,64,73,90,116,60,70,61,84,153,178,150,129,60,63,74,67,67,62,67,81,74,93,129,92,77,63,67,82,118,90,124,71,69,115,142,95,131,159,133,161,120,135,90,141,139,141,
+ 70,77,68,135,172,147,126,137,172,111,90,76,129,70,136,117,93,91,123,71,116,80,65,73,54,78,128,74,98,156,162,161,158,107,73,59,62,51,66,54,53,85,89,111,85,121,77,74,53,59,60,86,110,86,84,80,134,118,148,125,111,129,83,143,139,90,68,175,161,
+ 65,70,75,74,170,129,165,111,146,95,121,128,106,129,123,159,102,147,164,123,143,62,79,141,68,124,145,149,144,135,145,158,159,109,94,60,55,86,61,62,76,59,70,62,120,71,89,52,100,72,63,74,50,88,119,112,75,126,160,145,153,177,125,126,82,132,134,161,140,
+ 108,68,82,147,153,84,123,143,169,80,93,95,71,140,129,155,133,92,130,133,138,104,102,116,127,118,153,120,136,109,163,157,205,62,88,81,51,62,54,119,66,52,75,67,84,61,88,53,46,74,113,66,153,60,45,71,120,124,140,200,165,171,72,82,97,92,144,153,58,
+ 66,69,70,94,97,63,106,110,122,91,112,187,121,110,144,158,78,144,116,102,113,109,149,141,102,104,96,133,114,90,155,156,121,71,51,51,43,48,61,61,72,60,66,56,97,104,77,65,53,46,65,73,90,79,56,70,60,116,72,158,62,206,65,100,67,62,65,107,78,
+ 69,74,131,165,105,104,102,136,88,68,145,137,118,149,91,119,116,137,105,126,100,112,106,71,95,104,102,161,128,125,144,184,118,57,132,162,76,76,96,145,107,90,63,64,66,66,64,66,107,85,69,120,97,121,66,76,81,92,73,94,65,94,169,65,113,61,56,71,41,
+ 70,65,77,85,77,69,131,121,61,105,146,134,106,123,78,163,109,112,110,166,105,69,97,109,138,142,143,142,145,167,137,115,136,119,168,124,77,116,93,114,64,108,107,68,83,51,73,105,117,126,111,54,86,91,101,60,99,59,60,83,61,160,145,130,60,57,69,86,62,
+ 89,70,130,74,102,67,61,86,74,137,107,132,111,93,150,62,142,114,145,106,101,92,131,98,88,110,105,146,143,151,173,117,153,111,131,124,96,115,125,104,81,120,134,86,111,86,81,64,101,112,93,93,88,117,93,57,58,41,73,55,66,60,66,52,52,69,75,14,32,
+ 98,152,102,119,68,134,73,83,112,146,139,80,110,112,140,108,91,102,108,72,114,100,119,108,72,85,161,129,161,174,122,120,155,81,110,91,144,153,97,131,89,113,125,127,109,71,69,103,90,139,113,68,89,126,90,109,43,48,53,49,58,65,59,67,133,127,113,81,81,
+ 124,132,136,59,119,75,108,170,103,89,116,82,92,147,152,114,118,125,98,115,127,108,130,124,94,105,178,129,120,140,112,110,63,104,120,95,126,135,116,82,98,97,152,89,109,99,52,90,83,123,151,90,110,85,86,141,132,66,67,58,67,89,71,103,86,106,110,61,40,
+ 127,119,71,171,97,140,100,73,72,67,88,86,94,104,115,80,84,142,87,120,122,125,106,122,101,138,111,116,179,126,63,78,96,69,154,114,118,66,115,62,70,164,117,64,140,65,96,90,96,92,129,81,116,144,117,113,74,66,120,58,78,84,81,85,67,129,117,41,113,
+ 144,92,126,117,148,152,96,82,85,68,69,72,123,119,56,74,156,118,119,160,115,113,141,123,122,58,84,150,87,143,76,132,58,103,99,81,57,64,94,57,118,105,96,100,59,67,74,107,68,105,134,140,91,137,153,123,74,37,65,82,66,80,101,68,54,63,50,119,79,
+ 61,65,107,166,132,96,154,93,81,140,99,70,107,127,87,100,67,71,149,104,75,120,128,121,139,69,94,113,123,136,146,115,83,125,134,101,67,54,70,95,79,144,81,58,59,65,70,114,78,98,130,153,83,99,136,56,116,109,95,95,62,68,59,76,49,58,14,83,72,
+ 64,66,82,69,93,109,91,73,169,69,101,125,69,80,117,41,60,113,119,93,99,98,118,108,127,95,124,163,124,134,148,80,142,127,107,67,95,67,84,101,121,137,122,101,49,57,63,88,81,88,100,109,147,146,49,69,46,66,67,46,97,79,66,110,60,66,17,36,74,
+ 72,62,59,59,78,204,94,110,100,109,100,137,82,121,131,117,113,146,84,88,98,106,120,149,126,116,150,121,141,140,112,88,108,68,121,109,127,73,70,121,134,150,71,65,88,87,70,60,102,108,96,154,120,152,68,68,58,88,36,87,61,103,96,123,79,57,65,40,51,
+},
+{
+ 144,146,144,145,144,144,144,146,145,144,144,145,145,148,160,176,176,160,188,190,166,170,147,147,147,146,145,144,146,145,144,145,145,144,144,145,145,143,143,144,145,143,144,143,143,145,144,144,145,144,144,146,145,146,148,148,150,149,152,151,152,154,206,207,222,236,242,236,238,
+ 148,147,147,147,148,147,148,148,148,148,149,149,149,149,152,152,152,154,177,179,178,153,150,149,149,150,150,149,149,148,149,149,149,148,148,148,148,147,149,146,147,147,148,147,148,147,148,148,148,149,149,149,149,150,150,156,201,156,156,209,174,213,236,216,236,237,239,244,235,
+ 153,152,154,152,153,151,151,152,152,152,152,153,153,155,154,154,154,154,156,155,156,155,159,155,155,154,154,153,154,154,154,153,152,152,152,153,152,152,152,151,151,152,150,150,151,152,151,151,151,150,153,153,153,154,206,222,231,232,238,230,235,229,221,217,219,220,220,227,221,
+ 157,155,155,157,156,156,157,156,156,157,157,157,158,158,158,157,158,158,159,159,158,158,159,158,159,158,158,158,158,156,157,156,156,157,157,156,156,155,155,154,155,154,154,155,155,155,154,154,155,155,156,161,165,157,176,196,215,229,226,219,216,220,219,223,214,201,197,200,202,
+ 161,160,160,161,160,159,160,160,160,161,161,162,163,162,162,162,162,161,163,162,163,163,162,162,162,162,162,163,163,160,161,162,161,161,161,160,160,160,159,161,158,160,163,159,159,158,159,158,158,159,159,162,167,184,198,194,187,201,208,221,207,201,191,190,188,192,192,190,190,
+ 165,165,164,164,165,165,164,165,166,165,166,165,165,166,166,164,166,166,167,167,166,167,167,167,166,167,167,167,167,166,167,167,166,166,166,166,164,166,176,177,177,192,183,195,180,163,162,162,162,163,163,163,164,166,175,175,179,187,211,207,203,219,221,209,197,197,194,198,208,
+ 169,169,168,168,167,167,169,169,168,168,167,169,170,171,170,170,170,171,170,169,171,172,171,171,170,173,171,171,171,171,170,171,170,169,175,169,170,171,170,168,172,170,174,168,169,167,177,184,180,171,166,166,167,168,169,170,171,182,205,210,217,197,215,203,204,194,187,201,200,
+ 172,173,172,173,172,173,172,172,172,173,173,172,173,174,174,174,174,174,176,192,242,178,177,176,176,176,176,176,176,175,176,212,175,190,193,188,193,174,172,172,171,171,171,171,171,171,170,171,172,172,171,171,171,172,173,182,200,202,204,193,196,215,205,224,214,207,207,215,205,
+ 177,176,175,176,176,176,175,175,177,176,177,177,178,180,245,241,180,184,227,232,243,246,235,183,190,181,202,213,181,181,200,219,217,223,233,233,228,180,178,176,176,176,176,176,175,174,175,175,176,175,175,176,177,179,178,234,222,202,223,197,196,203,198,204,206,193,189,181,180,
+ 179,180,178,180,179,178,179,179,179,180,180,183,228,245,247,248,247,201,227,227,225,231,234,223,228,221,201,186,199,208,224,194,204,208,208,207,209,209,200,181,181,180,180,180,178,180,177,179,180,179,179,179,220,233,221,228,238,238,238,222,220,205,190,197,195,194,182,173,167,
+ 182,183,182,182,183,184,184,184,185,185,186,231,215,218,240,242,245,219,204,205,206,211,206,201,193,195,220,200,203,213,217,224,205,204,193,191,195,205,197,218,197,184,190,200,191,202,191,193,199,206,207,208,208,233,216,206,228,237,238,229,233,223,224,223,220,199,185,195,204,
+ 187,187,187,187,188,189,189,198,196,188,220,204,234,208,207,210,229,213,227,216,216,225,76,179,203,188,186,189,190,207,225,227,213,193,223,219,229,228,230,201,208,195,206,201,196,203,198,203,209,218,220,205,200,195,197,191,213,214,215,194,234,230,189,211,221,228,194,190,191,
+ 190,191,189,189,188,195,207,213,210,220,199,191,205,204,213,213,208,212,216,221,226,207,127,71,190,192,177,176,169,189,198,201,200,200,202,206,205,203,206,212,219,198,197,200,209,224,221,216,204,199,196,202,194,199,199,183,184,195,196,211,221,218,211,221,212,208,203,198,210,
+ 194,193,192,192,211,194,198,203,194,191,191,194,190,190,193,183,208,201,194,173,146,207,79,100,187,189,182,173,200,185,194,199,197,210,196,186,182,184,180,185,200,194,194,212,221,223,195,195,195,196,199,207,197,208,197,199,188,192,201,184,189,189,208,214,214,212,186,185,187,
+ 195,203,195,217,193,199,199,204,207,199,204,213,208,200,187,203,209,180,195,184,188,121,77,73,179,179,202,189,186,175,175,193,176,178,181,187,199,199,196,215,205,197,205,204,202,207,221,203,207,210,204,205,202,209,214,195,205,193,195,196,196,194,188,189,192,189,194,189,193,
+ 199,193,198,200,201,199,198,203,194,199,202,202,199,195,198,117,187,194,184,169,132,121,79,79,136,184,172,189,177,144,169,178,210,216,208,205,193,200,202,200,208,199,192,199,204,199,197,199,198,208,200,200,203,198,201,198,200,198,195,193,191,192,186,196,187,183,184,186,179,
+ 200,198,198,198,165,190,137,190,198,191,207,206,105,143,133,180,184,195,104,118,129,114,85,87,154,185,164,158,161,172,171,177,195,192,191,194,195,183,190,199,200,201,199,198,154,192,198,196,192,192,203,205,197,191,174,139,154,174,150,202,149,155,157,153,174,197,186,149,148,
+ 140,157,143,139,163,134,132,117,123,150,112,151,196,181,204,207,202,112,106,149,111,128,94,88,138,161,161,171,174,180,171,166,155,100,101,201,195,204,184,192,179,171,147,148,170,175,140,133,111,114,120,134,153,161,139,148,146,148,147,152,123,131,131,147,173,122,115,111,121,
+ 140,153,170,120,136,128,130,168,146,170,148,155,171,209,178,182,120,110,117,111,136,148,75,75,145,182,144,162,169,155,167,182,168,172,97,101,95,115,113,92,90,128,91,95,141,114,108,107,108,107,105,107,108,107,123,143,128,123,139,119,148,134,107,108,104,106,103,101,71,
+ 174,145,131,150,166,160,193,185,160,145,190,146,188,169,175,170,134,158,100,114,168,133,142,80,170,122,101,177,190,173,172,196,161,129,82,81,79,80,82,84,88,85,92,93,99,77,77,128,150,129,100,120,106,113,101,128,104,109,102,86,84,101,114,73,91,75,109,74,68,
+ 154,164,144,156,125,166,159,149,179,157,150,166,169,191,182,165,190,145,118,132,149,162,143,103,125,67,130,195,203,167,104,203,190,196,74,75,75,76,73,72,74,75,79,80,75,76,91,72,84,98,82,96,76,98,98,112,161,151,115,102,103,103,121,124,91,73,134,144,72,
+ 112,140,152,153,159,181,183,188,154,202,185,188,179,182,87,74,55,103,111,130,157,78,178,116,80,98,82,55,85,93,131,138,189,162,69,119,111,69,70,67,69,70,73,69,70,74,71,72,83,70,72,70,76,114,92,90,104,96,103,106,162,167,150,154,160,127,120,134,119,
+ 140,161,148,152,167,164,190,177,203,201,191,167,156,62,95,65,53,57,63,148,151,96,163,116,53,55,72,56,60,51,120,115,116,171,180,66,65,74,70,73,81,77,79,61,64,67,78,73,73,82,101,70,132,125,140,73,132,154,115,168,173,166,173,166,66,143,152,125,169,
+ 115,127,155,158,167,95,96,188,164,204,150,137,112,114,54,56,47,141,136,179,130,77,118,151,137,61,64,72,63,75,136,140,99,118,109,88,64,72,75,65,65,62,73,64,68,69,94,75,76,126,112,122,121,103,129,154,119,125,149,176,150,83,136,113,151,56,46,56,40,
+ 82,96,169,195,188,85,139,201,113,129,92,77,138,87,101,69,85,89,61,92,75,72,101,156,89,64,50,75,91,76,112,151,147,115,68,73,72,61,63,102,63,76,68,63,61,66,70,84,83,65,91,127,153,145,181,123,133,121,63,70,84,76,145,57,54,55,83,47,54,
+ 111,114,103,149,135,84,92,136,136,107,110,68,79,69,93,101,101,91,134,69,119,115,100,91,77,56,54,101,81,147,142,116,119,61,136,154,159,130,55,67,63,84,70,68,74,67,63,60,62,63,117,79,69,127,114,82,120,127,168,153,111,114,54,50,55,45,61,47,67,
+ 158,133,115,90,103,88,91,163,106,98,125,64,120,151,167,150,103,62,53,108,135,125,149,74,125,124,119,99,111,132,67,112,67,63,60,110,79,117,68,132,88,62,56,86,72,65,56,62,61,99,102,109,111,105,114,131,87,57,69,67,57,54,60,73,63,56,61,67,78,
+ 144,169,98,125,113,141,124,142,135,114,131,126,143,126,96,61,56,60,74,82,109,79,113,66,49,53,129,125,112,54,81,142,90,91,121,84,124,110,107,113,113,135,70,52,58,58,59,60,59,61,72,67,88,88,95,90,78,103,75,71,88,57,68,62,69,69,69,79,102,
+ 136,159,131,99,77,82,167,121,94,114,114,124,142,150,159,61,59,59,94,102,93,121,60,52,46,46,131,138,53,52,62,124,97,105,126,54,102,105,79,78,73,154,124,134,95,91,65,54,56,85,64,96,74,67,49,80,85,91,89,103,124,65,62,85,84,72,52,81,127,
+ 153,173,75,73,72,154,164,120,146,121,113,128,144,133,128,77,152,91,122,135,52,44,43,45,64,51,114,158,73,48,96,130,58,106,117,92,103,84,53,78,53,112,52,132,103,161,152,58,130,67,94,91,82,83,72,98,78,107,115,129,115,79,93,109,98,67,88,178,133,
+ 80,70,71,74,71,140,96,152,170,145,153,158,80,55,130,160,97,97,158,46,51,59,44,48,48,49,53,122,120,107,72,108,118,163,105,74,89,46,41,45,101,40,38,48,47,125,109,127,47,81,74,100,84,62,94,95,100,94,123,137,202,132,118,139,128,76,138,177,165,
+ 71,70,74,75,111,173,130,147,184,108,77,91,91,85,100,185,102,151,62,47,58,42,52,46,53,68,109,50,52,47,71,140,174,144,125,46,51,58,43,44,46,52,60,53,89,122,78,54,43,46,65,104,74,116,57,55,110,140,97,129,154,132,158,121,135,95,139,138,132,
+ 71,79,70,133,168,145,124,137,165,110,87,70,128,64,128,106,85,83,110,61,104,66,45,53,45,65,122,62,93,152,155,153,152,105,62,42,49,39,50,38,46,82,86,106,74,115,62,59,38,40,41,61,101,76,63,68,129,104,144,120,118,124,77,141,139,91,67,172,156,
+ 67,68,72,73,170,129,163,114,143,93,124,125,105,128,123,149,103,137,152,115,139,51,70,136,56,113,138,144,138,130,139,152,151,99,84,54,46,75,43,49,57,39,52,52,112,55,73,40,83,51,52,60,37,77,105,97,56,120,155,141,145,172,126,124,83,131,133,159,133,
+ 109,70,82,147,155,80,123,145,168,76,96,99,66,140,129,152,132,85,126,130,136,100,90,111,121,114,148,113,127,106,160,152,198,53,79,67,35,43,40,109,51,36,59,48,84,55,85,38,36,59,104,44,139,48,38,54,114,116,138,194,160,166,57,66,98,88,140,149,47,
+ 66,65,72,93,94,61,106,114,123,90,113,182,119,111,141,154,75,140,113,101,109,104,143,139,101,102,88,129,105,83,152,150,113,60,40,40,37,35,45,40,71,44,47,47,96,103,52,42,45,38,53,61,81,58,42,47,45,111,50,153,50,201,52,88,50,64,52,94,39,
+ 65,70,128,162,101,103,108,135,93,60,138,137,117,145,92,116,115,134,102,123,95,97,92,61,85,99,95,158,121,114,139,178,106,46,118,150,63,66,84,139,96,84,49,43,48,49,41,44,87,72,51,106,93,111,54,65,68,74,62,80,46,94,157,56,110,50,43,40,18,
+ 68,64,75,81,74,60,133,120,56,106,147,131,108,123,70,163,101,108,107,160,94,56,87,101,133,136,139,137,141,165,136,110,132,112,159,120,60,102,90,109,55,103,101,61,84,43,63,100,107,122,103,57,82,87,94,47,87,49,53,76,60,151,142,127,47,43,62,46,35,
+ 87,62,127,69,101,60,58,87,67,140,108,131,112,90,150,56,140,110,138,95,98,84,121,92,88,105,95,140,136,148,168,114,149,107,125,121,90,110,122,103,76,109,123,67,100,75,65,46,100,106,89,91,88,113,92,49,46,49,66,44,50,46,47,39,42,48,31,6,14,
+ 101,153,109,119,59,130,65,76,112,146,136,77,102,113,143,107,93,100,105,58,112,91,108,96,65,83,155,120,155,168,120,117,147,72,105,90,139,149,93,123,84,109,108,123,106,54,50,96,80,133,106,68,83,123,78,97,41,44,49,43,50,50,43,47,121,124,99,56,39,
+ 123,133,137,56,119,72,105,163,107,86,109,74,91,147,153,114,118,121,98,112,126,99,125,118,94,97,167,115,118,135,110,106,52,102,115,92,122,134,110,82,87,81,148,78,108,96,40,78,75,106,143,80,107,86,83,131,125,71,65,48,59,77,67,92,76,99,107,27,26,
+ 126,123,66,172,98,141,98,72,60,61,78,82,94,107,117,71,88,142,75,117,120,124,102,120,103,136,102,110,176,120,50,74,90,57,149,107,114,56,111,43,64,158,111,56,132,61,90,82,90,89,122,71,110,137,112,99,69,69,115,45,71,79,80,73,48,123,115,24,83,
+ 138,98,128,121,148,153,102,81,77,62,61,65,121,121,51,64,146,116,120,156,114,110,137,117,119,51,66,146,79,137,66,118,48,97,94,66,44,48,88,44,106,103,91,96,45,54,56,98,50,105,128,138,82,131,150,117,73,43,70,80,66,67,100,47,46,48,23,111,45,
+ 59,60,102,164,133,95,150,100,85,140,99,62,108,125,88,103,63,58,148,102,67,118,124,119,137,60,83,110,121,127,137,107,82,123,124,95,55,45,54,90,65,134,66,42,46,51,58,101,64,94,129,145,77,94,129,52,104,109,93,89,51,50,49,63,42,42,7,37,53,
+ 59,59,76,71,96,113,89,71,170,66,103,123,71,86,117,49,50,108,121,93,100,97,117,106,126,97,121,158,122,132,143,72,132,117,99,57,88,58,75,98,114,134,116,94,38,42,42,64,71,77,95,109,141,132,40,72,52,71,63,49,93,79,53,100,42,61,7,16,32,
+ 60,56,58,54,70,201,97,116,107,114,103,139,80,123,133,118,110,142,70,87,97,103,118,146,121,108,143,117,136,135,110,86,110,64,108,96,121,66,57,116,123,148,58,53,76,73,57,46,101,103,95,151,114,143,59,74,60,89,38,88,66,99,96,121,65,44,52,20,28,
+},
+};
+
+using namespace boost::gil;
+extern rgb8c_planar_view_t sample_view;
+rgb8c_planar_view_t sample_view = planar_rgb_view(69,46,halfdome[0],halfdome[1],halfdome[2],69);
diff --git a/src/boost/libs/gil/test/test_utility_output_stream.cpp b/src/boost/libs/gil/test/test_utility_output_stream.cpp
new file mode 100644
index 000000000..eb46e2cd5
--- /dev/null
+++ b/src/boost/libs/gil/test/test_utility_output_stream.cpp
@@ -0,0 +1,68 @@
+//
+// Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#include <boost/core/lightweight_test.hpp>
+
+#include "test_utility_output_stream.hpp"
+
+#include <cstdint>
+#include <sstream>
+#include <type_traits>
+
+namespace utility = boost::gil::test::utility;
+
+int main()
+{
+ static_assert(
+ std::is_same<utility::printable_numeric_t<std::uint8_t>, int>::value,
+ "std::uint8_t not printable as int");
+ static_assert(
+ !std::is_same<utility::printable_numeric_t<std::uint64_t>, int>::value,
+ "std::uint64_t printable as int");
+ static_assert(
+ std::is_same<utility::printable_numeric_t<float>, double>::value,
+ "float not printable as double");
+
+ {
+ std::ostringstream oss;
+ utility::print_color_base p{oss};
+ p(std::int8_t{-128});
+ BOOST_TEST_EQ(oss.str(), "v0=-128");
+ }
+ {
+ std::ostringstream oss;
+ utility::print_color_base p{oss};
+ p(std::uint8_t{128});
+ BOOST_TEST_EQ(oss.str(), "v0=128");
+ }
+ {
+ std::ostringstream oss;
+ utility::print_color_base p{oss};
+ p(std::int16_t{-32768});
+ BOOST_TEST_EQ(oss.str(), "v0=-32768");
+ }
+ {
+ std::ostringstream oss;
+ utility::print_color_base p{oss};
+ p(std::uint16_t{32768});
+ BOOST_TEST_EQ(oss.str(), "v0=32768");
+ }
+ {
+ std::ostringstream oss;
+ utility::print_color_base p{oss};
+ p(float{1.2345f});
+ BOOST_TEST_EQ(oss.str(), "v0=1.2345");
+ }
+ {
+ std::ostringstream oss;
+ utility::print_color_base p{oss};
+ p(double{1.2345});
+ BOOST_TEST_EQ(oss.str(), "v0=1.2345");
+ }
+
+ return ::boost::report_errors();
+}
diff --git a/src/boost/libs/gil/test/test_utility_output_stream.hpp b/src/boost/libs/gil/test/test_utility_output_stream.hpp
new file mode 100644
index 000000000..e2a8a01bb
--- /dev/null
+++ b/src/boost/libs/gil/test/test_utility_output_stream.hpp
@@ -0,0 +1,133 @@
+//
+// Copyright 2019-2020 Mateusz Loskot <mateusz at loskot dot net>
+//
+// Distribtted under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+#ifndef BOOST_GIL_TEST_TEST_UTILITY_HPP
+#define BOOST_GIL_TEST_TEST_UTILITY_HPP
+
+#include <boost/gil/color_base_algorithm.hpp> // static_for_each
+#include <boost/gil/packed_pixel.hpp>
+#include <boost/gil/pixel.hpp>
+#include <boost/gil/planar_pixel_reference.hpp>
+#include <boost/gil/promote_integral.hpp>
+
+#include <boost/core/demangle.hpp>
+#include <boost/core/typeinfo.hpp>
+
+#include <cstdint>
+#include <ostream>
+#include <type_traits>
+
+// Utilities to make GIL primitives printable for BOOST_TEST_EQ and other macros
+
+namespace boost { namespace gil {
+
+namespace test { namespace utility {
+
+template <typename T>
+struct printable_numeric
+{
+ using type = typename std::conditional
+ <
+ std::is_integral<T>::value,
+ typename ::boost::gil::promote_integral<T>::type,
+ typename std::common_type<T, double>::type
+ >::type;
+
+ static_assert(std::is_arithmetic<T>::value, "T must be numeric type");
+ static_assert(sizeof(T) <= sizeof(type), "bit-size narrowing conversion");
+};
+
+template <typename T>
+using printable_numeric_t = typename printable_numeric<T>::type;
+
+struct print_color_base
+{
+ std::ostream& os_;
+ std::size_t element_index_{0};
+ print_color_base(std::ostream& os) : os_(os) {}
+
+ template <typename Element>
+ void operator()(Element const& c)
+ {
+ printable_numeric_t<Element> n{c};
+ if (element_index_ > 0) os_ << ", ";
+ os_ << "v" << element_index_ << "=" << n;
+ ++element_index_;
+ }
+
+ template <typename BitField, int FirstBit, int NumBits, bool IsMutable>
+ void operator()(gil::packed_channel_reference<BitField, FirstBit, NumBits, IsMutable> const& c)
+ {
+ printable_numeric_t<BitField> n{c.get()};
+ if (element_index_ > 0) os_ << ", ";
+ os_ << "v" << element_index_ << "=" << n;
+ ++element_index_;
+ }
+
+ template <typename BaseChannelValue, typename MinVal, typename MaxVal>
+ void operator()(gil::scoped_channel_value<BaseChannelValue, MinVal, MaxVal> const& c)
+ {
+ printable_numeric_t<BaseChannelValue> n{c};
+ if (element_index_ > 0) os_ << ", ";
+ os_ << "v" << element_index_ << "=" << n;
+ ++element_index_;
+ }
+};
+
+}} // namespace test::utility
+
+template <typename T>
+std::ostream& operator<<(std::ostream& os, point<T> const& p)
+{
+ os << "point<" << boost::core::demangled_name(typeid(T)) << ">";
+ os << "(" << p.x << ", " << p.y << ")" << std::endl;
+ return os;
+}
+
+template <typename ChannelValue, typename Layout>
+std::ostream& operator<<(std::ostream& os, pixel<ChannelValue, Layout> const& p)
+{
+ os << "pixel<"
+ << "\n\tChannel=" << boost::core::demangled_name(typeid(ChannelValue))
+ << ",\n\tLayout=" << boost::core::demangled_name(typeid(Layout))
+ << "\n>(";
+
+ static_for_each(p, test::utility::print_color_base{os});
+ os << ")" << std::endl;
+ return os;
+}
+
+template <typename BitField, typename ChannelRefs, typename Layout>
+std::ostream& operator<<(std::ostream& os, packed_pixel<BitField, ChannelRefs, Layout> const& p)
+{
+ os << "packed_pixel<"
+ << "\n\tBitField=" << boost::core::demangled_name(typeid(BitField))
+ << ",\n\tChannelRefs=" << boost::core::demangled_name(typeid(ChannelRefs))
+ << ",\n\tLayout=" << boost::core::demangled_name(typeid(Layout))
+ << ">(";
+
+ static_for_each(p, test::utility::print_color_base{os});
+ os << ")" << std::endl;
+ return os;
+}
+
+template <typename ChannelReference, typename ColorSpace>
+std::ostream& operator<<(std::ostream& os, planar_pixel_reference<ChannelReference, ColorSpace> const& p)
+{
+ os << "planar_pixel_reference<"
+ << "\nChannelReference=" << boost::core::demangled_name(typeid(ChannelReference))
+ << ",\nColorSpace=" << boost::core::demangled_name(typeid(ColorSpace))
+ << ">(";
+
+ static_for_each(p, test::utility::print_color_base{os});
+ os << ")" << std::endl;
+ return os;
+}
+
+}} // namespace boost::gil
+
+#endif