diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 18:45:59 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 18:45:59 +0000 |
commit | 19fcec84d8d7d21e796c7624e521b60d28ee21ed (patch) | |
tree | 42d26aa27d1e3f7c0b8bd3fd14e7d7082f5008dc /src/boost/libs/gil/test | |
parent | Initial commit. (diff) | |
download | ceph-6d07fdb6bb33b1af39833b850bb6cf8af79fe293.tar.xz ceph-6d07fdb6bb33b1af39833b850bb6cf8af79fe293.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/test')
298 files changed, 44399 insertions, 0 deletions
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 Binary files differnew file mode 100644 index 000000000..a72034764 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/g01bg.bmp 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 Binary files differnew file mode 100644 index 000000000..06189a6c6 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/g01bw.bmp 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 Binary files differnew file mode 100644 index 000000000..706b4a1dd --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/g01p1.bmp 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 Binary files differnew file mode 100644 index 000000000..2f05b4366 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/g01wb.bmp 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 Binary files differnew file mode 100644 index 000000000..a064f66a7 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/g04.bmp 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 Binary files differnew file mode 100644 index 000000000..4c1096b5e --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/g04p4.bmp 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 Binary files differnew file mode 100644 index 000000000..7239fa668 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/g04rle.bmp 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 Binary files differnew file mode 100644 index 000000000..3be9a2066 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08.bmp 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 Binary files differnew file mode 100644 index 000000000..71def41c6 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08offs.bmp 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 Binary files differnew file mode 100644 index 000000000..f7f9f5795 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08os2.bmp 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 Binary files differnew file mode 100644 index 000000000..a129bbc34 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08p256.bmp 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 Binary files differnew file mode 100644 index 000000000..9d3affd66 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08p64.bmp 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 Binary files differnew file mode 100644 index 000000000..45df3f836 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08pi256.bmp 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 Binary files differnew file mode 100644 index 000000000..52baf9180 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08pi64.bmp 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 Binary files differnew file mode 100644 index 000000000..f03d0f3dc --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08res11.bmp 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 Binary files differnew file mode 100644 index 000000000..61198e562 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08res21.bmp 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 Binary files differnew file mode 100644 index 000000000..1af0ecce3 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08res22.bmp 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 Binary files differnew file mode 100644 index 000000000..082f7f481 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08rle.bmp 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 Binary files differnew file mode 100644 index 000000000..4b2c521d5 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08s0.bmp 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 Binary files differnew file mode 100644 index 000000000..18960354d --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08w124.bmp 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 Binary files differnew file mode 100644 index 000000000..b348a7c21 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08w125.bmp 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 Binary files differnew file mode 100644 index 000000000..3628d6665 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/g08w126.bmp 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 Binary files differnew file mode 100644 index 000000000..639a57f87 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/g16bf555.bmp 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 Binary files differnew file mode 100644 index 000000000..cb0ea24f5 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/g16bf565.bmp 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 Binary files differnew file mode 100644 index 000000000..a5a3195cc --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/g16def555.bmp 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 Binary files differnew file mode 100644 index 000000000..d6d9e6afa --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/g24.bmp 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 Binary files differnew file mode 100644 index 000000000..0f41534e1 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/g32bf.bmp 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 Binary files differnew file mode 100644 index 000000000..9524f765b --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/g32def.bmp 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 Binary files differnew file mode 100644 index 000000000..24d396d57 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/bmp/test.bmp 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 Binary files differnew file mode 100644 index 000000000..793e31781 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/jpeg/EddDawson/36dpi.jpg 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 Binary files differnew file mode 100644 index 000000000..d221c054d --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/jpeg/test.jpg 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 Binary files differnew file mode 100644 index 000000000..bea4eb6f7 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/png/EddDawson/36dpi.png 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 Binary files differnew file mode 100644 index 000000000..39a7050d2 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbbn0g04.png 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 Binary files differnew file mode 100644 index 000000000..dd3168e5c --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbbn2c16.png 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 Binary files differnew file mode 100644 index 000000000..0ede3574d --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbbn3p08.png 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 Binary files differnew file mode 100644 index 000000000..85cec395c --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbgn2c16.png 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 Binary files differnew file mode 100644 index 000000000..8cf2e6fb6 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbgn3p08.png 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 Binary files differnew file mode 100644 index 000000000..5cca0d621 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbrn2c08.png 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 Binary files differnew file mode 100644 index 000000000..99bdeed2b --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tbwn0g16.png 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 Binary files differnew file mode 100644 index 000000000..fb3ef1d0c --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tm3n3p02.png 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 Binary files differnew file mode 100644 index 000000000..a6c9f35a8 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/png/PngSuite/tp1n3p08.png 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 Binary files differnew file mode 100644 index 000000000..c914fb4b8 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/png/grayalpha-with-tRNS-chunk.png 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 Binary files differnew file mode 100644 index 000000000..9fae9a157 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/png/grayscale-with-tRNS-chunk.png 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 Binary files differnew file mode 100644 index 000000000..bd731ed8f --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/png/test.png 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 Binary files differnew file mode 100644 index 000000000..468b839aa --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/pnm/p4.pnm 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 Binary files differnew file mode 100644 index 000000000..c07b78a82 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/pnm/p5.pnm 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 Binary files differnew file mode 100644 index 000000000..bf4a94710 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/pnm/p6.pnm 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 Binary files differnew file mode 100644 index 000000000..9299261ac --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/pnm/rgb.pnm 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 Binary files differnew file mode 100644 index 000000000..433d9c31a --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/raw/RAW_CANON_D30_SRGB.CRW 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 Binary files differnew file mode 100644 index 000000000..e957723c9 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/targa/24BPP_compressed.tga 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 Binary files differnew file mode 100644 index 000000000..98988a751 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/targa/24BPP_compressed_ul_origin.tga 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 Binary files differnew file mode 100644 index 000000000..410043fac --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/targa/24BPP_uncompressed.tga 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 Binary files differnew file mode 100644 index 000000000..e5cab05c0 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/targa/24BPP_uncompressed_ul_origin.tga 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 Binary files differnew file mode 100644 index 000000000..a54645541 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/targa/32BPP_compressed.tga 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 Binary files differnew file mode 100644 index 000000000..1fa4c636e --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/targa/32BPP_compressed_ul_origin.tga 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 Binary files differnew file mode 100644 index 000000000..fb38dc48b --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/targa/32BPP_uncompressed.tga 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 Binary files differnew file mode 100644 index 000000000..65e807408 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/targa/32BPP_uncompressed_ul_origin.tga 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 Binary files differnew file mode 100644 index 000000000..78ae4d3e2 --- /dev/null +++ b/src/boost/libs/gil/test/extension/io/images/tiff/test.tif 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 |