From bcecc9e74a7cd5328bf6e408854e2487cc2a5650 Mon Sep 17 00:00:00 2001 From: Alexandra Latysheva Date: Wed, 28 Oct 2020 15:40:57 +0000 Subject: [PATCH 01/10] init libpng --- oss-internship-2020/libpng/CMakeLists.txt | 112 ++++++++ oss-internship-2020/libpng/README.md | 0 .../libpng/examples/CMakeLists.txt | 51 ++++ .../libpng/examples/example1.cc | 90 +++++++ .../libpng/examples/example2.cc | 239 +++++++++++++++++ oss-internship-2020/libpng/images/pngtest.png | Bin 0 -> 8759 bytes .../libpng/images/pngtopng_pngtest.png | Bin 0 -> 6504 bytes .../libpng/images/red_ball.png | Bin 0 -> 71464 bytes .../libpng/images/rgbtobgr_red_ball.png | Bin 0 -> 71542 bytes .../libpng/images/test_output.png | Bin 0 -> 71464 bytes oss-internship-2020/libpng/sandboxed.h | 64 +++++ .../libpng/tests/CMakeLists.txt | 36 +++ .../libpng/tests/basic_test.cc | 91 +++++++ .../libpng/tests/extended_test.cc | 248 ++++++++++++++++++ oss-internship-2020/libpng/tests/helper.cc | 40 +++ oss-internship-2020/libpng/tests/helper.h | 18 ++ oss-internship-2020/libpng/tests/libpng.h | 92 +++++++ .../libpng/wrapper/CMakeLists.txt | 28 ++ oss-internship-2020/libpng/wrapper/func.cc | 57 ++++ oss-internship-2020/libpng/wrapper/func.h | 24 ++ 20 files changed, 1190 insertions(+) create mode 100644 oss-internship-2020/libpng/CMakeLists.txt create mode 100644 oss-internship-2020/libpng/README.md create mode 100644 oss-internship-2020/libpng/examples/CMakeLists.txt create mode 100644 oss-internship-2020/libpng/examples/example1.cc create mode 100644 oss-internship-2020/libpng/examples/example2.cc create mode 100644 oss-internship-2020/libpng/images/pngtest.png create mode 100644 oss-internship-2020/libpng/images/pngtopng_pngtest.png create mode 100644 oss-internship-2020/libpng/images/red_ball.png create mode 100644 oss-internship-2020/libpng/images/rgbtobgr_red_ball.png create mode 100644 oss-internship-2020/libpng/images/test_output.png create mode 100644 oss-internship-2020/libpng/sandboxed.h create mode 100644 oss-internship-2020/libpng/tests/CMakeLists.txt create mode 100644 oss-internship-2020/libpng/tests/basic_test.cc create mode 100644 oss-internship-2020/libpng/tests/extended_test.cc create mode 100644 oss-internship-2020/libpng/tests/helper.cc create mode 100644 oss-internship-2020/libpng/tests/helper.h create mode 100644 oss-internship-2020/libpng/tests/libpng.h create mode 100644 oss-internship-2020/libpng/wrapper/CMakeLists.txt create mode 100644 oss-internship-2020/libpng/wrapper/func.cc create mode 100644 oss-internship-2020/libpng/wrapper/func.h diff --git a/oss-internship-2020/libpng/CMakeLists.txt b/oss-internship-2020/libpng/CMakeLists.txt new file mode 100644 index 0000000..5d8e01f --- /dev/null +++ b/oss-internship-2020/libpng/CMakeLists.txt @@ -0,0 +1,112 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +cmake_minimum_required(VERSION 3.12) + +project(sandboxed_libpng CXX) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED True) + +# Set this on the command-line +set(SAPI_ROOT "" CACHE PATH "Path to the Sandboxed API source tree") +# To obtain a full SAPI_ROOT check out its source separately: +# git clone https://github.com/google/sandboxed-api.git /path/to/sapi_root +# Then configure: +# mkdir -p build && cd build +# cmake .. -G Ninja -DSAPI_ROOT=/path/to/sapi_root + +option(LIBPNG_SAPI_ENABLE_EXAMPLES "" OFF) +option(LIBPNG_SAPI_ENABLE_TESTS "" OFF) + +set(SAPI_ENABLE_EXAMPLES ${LIBPNG_SAPI_ENABLE_EXAMPLES} CACHE BOOL "" FORCE) +set(SAPI_ENABLE_TESTS ${LIBPNG_SAPI_ENABLE_TESTS} CACHE BOOL "" FORCE) + +set (CMAKE_FIND_LIBRARY_SUFFIXES .a $ {CMAKE_FIND_LIBRARY_SUFFIXES}) +find_package(PNG REQUIRED) +list(GET PNG_INCLUDE_DIRS 0 PNG_INCLUDE_DIR) + +add_subdirectory(wrapper) + +add_subdirectory( + "${SAPI_ROOT}" + "${CMAKE_BINARY_DIR}/sandboxed-api-build" + # Omit this to have the full Sandboxed API in IDE + EXCLUDE_FROM_ALL +) + +add_sapi_library(libpng_sapi + # List of functions that we want to include in the + # generated sandboxed API class + + FUNCTIONS png_image_free + png_image_finish_read + png_image_write_to_file + png_image_begin_read_from_file + + png_get_rowbytes + png_get_bit_depth + png_get_color_type + png_get_image_width + png_get_image_height + + png_set_IHDR + png_set_sig_bytes + png_set_interlace_handling + + png_read_info + png_read_image_wrapper + png_read_update_info + + png_write_end + png_write_info + png_write_image_wrapper + + png_create_info_struct + png_create_read_struct_wrapper + png_create_write_struct_wrapper + + png_init_io_wrapper + + png_sig_cmp + + png_fread + png_fdopen + png_rewind + png_fclose + + png_setjmp + + INPUTS "${PNG_INCLUDE_DIR}/png.h" + wrapper/func.h + # Header files or .cc files that should be parsed + LIBRARY wrapper + # Library dependency from the add_library() above + LIBRARY_NAME LibPNG # Name prefix for the generated header. Will be + # suffixed with "Api" and "Sandbox" as needed. + NAMESPACE "" # Optional C++ namespace to wrap the generated code +) + +target_include_directories(libpng_sapi INTERFACE + "${PROJECT_BINARY_DIR}" # To find the generated SAPI header +) + +if (LIBPNG_SAPI_ENABLE_EXAMPLES) + add_subdirectory(examples) +endif() + +if (LIBPNG_SAPI_ENABLE_TESTS) + add_subdirectory(tests) +endif() + diff --git a/oss-internship-2020/libpng/README.md b/oss-internship-2020/libpng/README.md new file mode 100644 index 0000000..e69de29 diff --git a/oss-internship-2020/libpng/examples/CMakeLists.txt b/oss-internship-2020/libpng/examples/CMakeLists.txt new file mode 100644 index 0000000..1206e87 --- /dev/null +++ b/oss-internship-2020/libpng/examples/CMakeLists.txt @@ -0,0 +1,51 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +add_executable(pngtopng + example1.cc + ../tests/libpng.h + ../sandboxed.h +) + +find_package(PNG REQUIRED) + +target_link_libraries(pngtopng PRIVATE + sapi::sapi + sandbox2::temp_file + libpng_sapi + "${PNG_LIBRARY}" +) + +target_include_directories(pngtopng INTERFACE + "${PNG_INCLUDE_DIR}" +) + + +add_executable(rgbtobgr + example2.cc + ../tests/libpng.h + ../sandboxed.h +) + +target_link_libraries(rgbtobgr PRIVATE + sapi::sapi + sandbox2::temp_file + libpng_sapi + "${PNG_LIBRARY}" +) + +target_include_directories(rgbtobgr INTERFACE + "${PNG_INCLUDE_DIR}" +) + diff --git a/oss-internship-2020/libpng/examples/example1.cc b/oss-internship-2020/libpng/examples/example1.cc new file mode 100644 index 0000000..49b7ff5 --- /dev/null +++ b/oss-internship-2020/libpng/examples/example1.cc @@ -0,0 +1,90 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include + +#include "../sandboxed.h" // NOLINT(build/include) +#include "../tests/libpng.h" // NOLINT(build/include) +#include "sandboxed_api/vars.h" + +absl::Status LibPNGMain(const std::string& infile, const std::string& outfile) { + LibPNGSapiSandbox sandbox; + sandbox.AddFile(infile); + sandbox.AddFile(outfile); + + SAPI_RETURN_IF_ERROR(sandbox.Init()); + LibPNGApi api(&sandbox); + + sapi::v::Struct image; + sapi::v::ConstCStr infile_var(infile.c_str()); + sapi::v::ConstCStr outfile_var(outfile.c_str()); + + image.mutable_data()->version = PNG_IMAGE_VERSION; + + SAPI_ASSIGN_OR_RETURN( + int result, api.png_image_begin_read_from_file(image.PtrBoth(), + infile_var.PtrBefore())); + if (!result) { + return absl::InternalError( + absl::StrCat("begin read error: ", image.mutable_data()->message)); + } + + image.mutable_data()->format = PNG_FORMAT_RGBA; + + auto buffer = malloc(PNG_IMAGE_SIZE(*image.mutable_data())); + if (!buffer) { + SAPI_RETURN_IF_ERROR(api.png_image_free(image.PtrBoth())); + return absl::OkStatus(); + } + + free(buffer); + sapi::v::Array buffer_(PNG_IMAGE_SIZE(*image.mutable_data())); + + SAPI_ASSIGN_OR_RETURN( + result, api.png_image_finish_read( + image.PtrBoth(), sapi::v::NullPtr().PtrBoth(), + buffer_.PtrBoth(), 0, sapi::v::NullPtr().PtrBoth())); + if (!result) { + return absl::InternalError( + absl::StrCat("finish read error: ", image.mutable_data()->message)); + } + + SAPI_ASSIGN_OR_RETURN( + result, api.png_image_write_to_file( + image.PtrBoth(), outfile_var.PtrBefore(), 0, + buffer_.PtrBoth(), 0, sapi::v::NullPtr().PtrBoth())); + if (!result) { + return absl::InternalError( + absl::StrCat("write error: ", image.mutable_data()->message)); + } + + return absl::OkStatus(); +} + +int main(int argc, const char** argv) { + if (argc != 3) { + LOG(ERROR) << "usage: example input-file output-file"; + return EXIT_FAILURE; + } + + auto status = LibPNGMain(argv[1], argv[2]); + if (!status.ok()) { + LOG(ERROR) << "LibPNGMain failed with error:\n" + << status.ToString() << '\n'; + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} + diff --git a/oss-internship-2020/libpng/examples/example2.cc b/oss-internship-2020/libpng/examples/example2.cc new file mode 100644 index 0000000..b791f69 --- /dev/null +++ b/oss-internship-2020/libpng/examples/example2.cc @@ -0,0 +1,239 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include + +#include "../sandboxed.h" // NOLINT(build/include) +#include "../tests/libpng.h" // NOLINT(build/include) + +struct Data { + Data() {} + + int width; + int height; + uint8_t color_type; + uint8_t bit_depth; + int number_of_passes; + size_t rowbytes; + std::unique_ptr> row_pointers; +}; + +absl::Status ReadPng(LibPNGApi& api, LibPNGSapiSandbox& sandbox, + absl::string_view infile, Data& d) { + sapi::v::Fd fd(open(infile.data(), O_RDONLY)); + + if (fd.GetValue() < 0) { + return absl::InternalError("Error opening input file"); + } + + SAPI_RETURN_IF_ERROR(sandbox.TransferToSandboxee(&fd)); + if (fd.GetRemoteFd() < 0) { + return absl::InternalError("Error receiving remote FD"); + } + + absl::StatusOr status_or_file; + sapi::v::ConstCStr rb_var("rb"); + SAPI_ASSIGN_OR_RETURN(status_or_file, + api.png_fdopen(fd.GetRemoteFd(), rb_var.PtrBefore())); + + sapi::v::RemotePtr file(status_or_file.value()); + if (!file.GetValue()) { + return absl::InternalError(absl::StrCat("Could not open ", infile)); + } + + sapi::v::Array header(8); + SAPI_RETURN_IF_ERROR( + api.png_fread(header.PtrBoth(), 1, header.GetSize(), &file)); + + SAPI_ASSIGN_OR_RETURN(int return_value, + api.png_sig_cmp(header.PtrBoth(), 0, header.GetSize())); + if (return_value != 0) { + return absl::InternalError(absl::StrCat(infile, " is not a PNG file")); + } + + absl::StatusOr status_or_png_structp; + sapi::v::ConstCStr ver_string_var(PNG_LIBPNG_VER_STRING); + SAPI_ASSIGN_OR_RETURN( + status_or_png_structp, + api.png_create_read_struct_wrapper(ver_string_var.PtrBefore(), + sapi::v::NullPtr().PtrBoth())); + + sapi::v::RemotePtr struct_ptr(status_or_png_structp.value()); + if (!struct_ptr.GetValue()) { + return absl::InternalError("png_create_read_struct_wrapper failed"); + } + + absl::StatusOr status_or_png_infop; + SAPI_ASSIGN_OR_RETURN(status_or_png_infop, + api.png_create_info_struct(&struct_ptr)); + + sapi::v::RemotePtr info_ptr(status_or_png_infop.value()); + if (!info_ptr.GetValue()) { + return absl::InternalError("png_create_info_struct failed"); + } + + SAPI_RETURN_IF_ERROR(api.png_setjmp(&struct_ptr)); + SAPI_RETURN_IF_ERROR(api.png_init_io_wrapper(&struct_ptr, &file)); + SAPI_RETURN_IF_ERROR(api.png_set_sig_bytes(&struct_ptr, header.GetSize())); + SAPI_RETURN_IF_ERROR(api.png_read_info(&struct_ptr, &info_ptr)); + + SAPI_ASSIGN_OR_RETURN(d.width, + api.png_get_image_width(&struct_ptr, &info_ptr)); + + SAPI_ASSIGN_OR_RETURN(d.height, + api.png_get_image_height(&struct_ptr, &info_ptr)); + + SAPI_ASSIGN_OR_RETURN(d.color_type, + api.png_get_color_type(&struct_ptr, &info_ptr)); + + SAPI_ASSIGN_OR_RETURN(d.bit_depth, + api.png_get_bit_depth(&struct_ptr, &info_ptr)); + + SAPI_ASSIGN_OR_RETURN(d.number_of_passes, + api.png_set_interlace_handling(&struct_ptr)); + + SAPI_RETURN_IF_ERROR(api.png_read_update_info(&struct_ptr, &info_ptr)); + SAPI_RETURN_IF_ERROR(api.png_setjmp(&struct_ptr)); + + SAPI_ASSIGN_OR_RETURN(d.rowbytes, + api.png_get_rowbytes(&struct_ptr, &info_ptr)); + d.row_pointers = + std::make_unique>(d.height * d.rowbytes); + + SAPI_RETURN_IF_ERROR(api.png_read_image_wrapper( + &struct_ptr, d.row_pointers->PtrAfter(), d.height, d.rowbytes)); + + SAPI_RETURN_IF_ERROR(api.png_fclose(&file)); + return absl::OkStatus(); +} + +absl::Status WritePng(LibPNGApi& api, LibPNGSapiSandbox& sandbox, + absl::string_view outfile, Data& d) { + sapi::v::Fd fd(open(outfile.data(), O_WRONLY)); + if (fd.GetValue() < 0) { + return absl::InternalError("Error opening output file"); + } + + SAPI_RETURN_IF_ERROR(sandbox.TransferToSandboxee(&fd)); + if (fd.GetRemoteFd() < 0) { + return absl::InternalError("Error receiving remote FD"); + } + + absl::StatusOr status_or_file; + sapi::v::ConstCStr wb_var("wb"); + SAPI_ASSIGN_OR_RETURN(status_or_file, + api.png_fdopen(fd.GetRemoteFd(), wb_var.PtrBefore())); + + sapi::v::RemotePtr file(status_or_file.value()); + if (!file.GetValue()) { + return absl::InternalError(absl::StrCat("Could not open ", outfile)); + } + + absl::StatusOr status_or_png_structp; + sapi::v::ConstCStr ver_string_var(PNG_LIBPNG_VER_STRING); + SAPI_ASSIGN_OR_RETURN( + status_or_png_structp, + api.png_create_write_struct_wrapper(ver_string_var.PtrBefore(), + sapi::v::NullPtr().PtrBoth())); + + sapi::v::RemotePtr struct_ptr(status_or_png_structp.value()); + if (!struct_ptr.GetValue()) { + return absl::InternalError("png_create_write_struct_wrapper failed"); + } + + absl::StatusOr status_or_png_infop; + SAPI_ASSIGN_OR_RETURN(status_or_png_infop, + api.png_create_info_struct(&struct_ptr)); + + sapi::v::RemotePtr info_ptr(status_or_png_infop.value()); + if (!info_ptr.GetValue()) { + return absl::InternalError("png_create_info_struct failed"); + } + + SAPI_RETURN_IF_ERROR(api.png_setjmp(&struct_ptr)); + SAPI_RETURN_IF_ERROR(api.png_init_io_wrapper(&struct_ptr, &file)); + + SAPI_RETURN_IF_ERROR(api.png_setjmp(&struct_ptr)); + SAPI_RETURN_IF_ERROR(api.png_set_IHDR( + &struct_ptr, &info_ptr, d.width, d.height, d.bit_depth, d.color_type, + PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE)); + + SAPI_RETURN_IF_ERROR(api.png_write_info(&struct_ptr, &info_ptr)); + + SAPI_RETURN_IF_ERROR(api.png_setjmp(&struct_ptr)); + SAPI_RETURN_IF_ERROR(api.png_write_image_wrapper( + &struct_ptr, d.row_pointers->PtrBefore(), d.height, d.rowbytes)); + + auto null = sapi::v::NullPtr(); + SAPI_RETURN_IF_ERROR(api.png_setjmp(&struct_ptr)); + SAPI_RETURN_IF_ERROR(api.png_write_end(&struct_ptr, &null)); + + SAPI_RETURN_IF_ERROR(api.png_fclose(&file)); + return absl::OkStatus(); +} + +absl::Status LibPNGMain(const std::string& infile, const std::string& outfile) { + LibPNGSapiSandbox sandbox; + sandbox.AddFile(infile); + sandbox.AddFile(outfile); + + SAPI_RETURN_IF_ERROR(sandbox.Init()); + LibPNGApi api(&sandbox); + + Data d; + SAPI_RETURN_IF_ERROR(ReadPng(api, sandbox, infile, d)); + + if (d.color_type != PNG_COLOR_TYPE_RGBA && + d.color_type != PNG_COLOR_TYPE_RGB) { + return absl::InternalError(absl::StrCat( + infile, " has unexpected color type. Expected RGB or RGBA")); + } + + size_t channel_count = 3; + if (d.color_type == PNG_COLOR_TYPE_RGBA) { + channel_count = 4; + } + + // RGB to BGR + for (size_t i = 0; i != d.height; ++i) { + for (size_t j = 0; j != d.width; ++j) { + uint8_t r = (*d.row_pointers)[i * d.rowbytes + j * channel_count]; + uint8_t g = (*d.row_pointers)[i * d.rowbytes + j * channel_count + 1]; + uint8_t b = (*d.row_pointers)[i * d.rowbytes + j * channel_count + 2]; + (*d.row_pointers)[i * d.rowbytes + j * channel_count] = b; + (*d.row_pointers)[i * d.rowbytes + j * channel_count + 2] = r; + } + } + + SAPI_RETURN_IF_ERROR(WritePng(api, sandbox, outfile, d)); + return absl::OkStatus(); +} + +int main(int argc, const char** argv) { + if (argc != 3) { + LOG(ERROR) << "Usage: example5 infile outfile"; + return EXIT_FAILURE; + } + + auto status = LibPNGMain(argv[1], argv[2]); + if (!status.ok()) { + LOG(ERROR) << "LibPNGMain failed with error:\n" + << status.ToString() << '\n'; + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} + diff --git a/oss-internship-2020/libpng/images/pngtest.png b/oss-internship-2020/libpng/images/pngtest.png new file mode 100644 index 0000000000000000000000000000000000000000..66df0c4e6f6d13981148bf2fbb85df2b797028a7 GIT binary patch literal 8759 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 XEN%cGySZ5AKccd{nq0Yz(bxY2;5`P= literal 0 HcmV?d00001 diff --git a/oss-internship-2020/libpng/images/pngtopng_pngtest.png b/oss-internship-2020/libpng/images/pngtopng_pngtest.png new file mode 100644 index 0000000000000000000000000000000000000000..86e065fe03e901dab1a9faa8a86cd856269d50bd GIT binary patch literal 6504 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 Hu0mjfWo3?}=URAb4OWd>0~jIGGXUcy)g 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¬utu50?M zc6ly{-ke-x0@3UYE4nk>5*d~=5S#h)`a2+mD^>irc=~jGU(JNlRnu+Dtx#TQL}KWR=m?y|x=^ zj0GwYQ*h-4?kXoF-|Hd1<7QNo-XQ;$uf7QGdx!>7LK)Y|VBdK&exeos6Q90Dzg|KO z8O6o!+v%QjI;bKHf2&RIK8;;FI2b3^YfA)~U#1Gq}vAzP_p2=i}U67S?BQWmq zNas&C(*^?H)`LVK07wVd99-e&70mHKTCL(~?QxxRN!8TmU+KJ3_b=s(T{1EGBztY^ zV8zGz_tD|{CFn)%69y~tf~bTGMj zf49rL@BQIgH&^fbXZuwvjeY8DCh=@+T}Fm2Q&aij{a{RC%=SOlpv+vlYT`=^0CLva z9O8$4I+qS&&)S#J|{;f3tY8(X2uABISMLL zaH>FqXpeZN8DD!GXfeZy=7hbrzUyqE6~+v1oDqAnS~scpY->B@8`i5&$a-=29UPxw zabavTjsVA<7m61f0N;W%-x_}Ys?uhWUUA-JGiRKJsMcQZl$g1nh$mHZ)3kd%YNVA7;Kn?khcJ#uo z={|;17$vi_iSIGy$p}>_`C|;9Vk>hE_cr;MM?&y1YJ&!^XG?> zllRcc3mxTZ6PxdK_v>+Zf1Jvt0QE%o zgUzjHJ5EO{ZAx10c}H>U|1kHmq&~f()F~oFyUosXVsN#oHb*&Q z{or70^5|jCqvuxVHlEZCWFkHEmX7GjPE?zDD}LlkQ##-)@$08X;fqz~bRA{ir)|(L z?~*SKh{?T``uUh!ju+p2HcYK{)-@vFIOlkOU%1kGszJiao0OxCj&6s-Gi{3C9nest zk>_UQc4+ggt)-lGegS@B{ujyk*Ea6w$)Yy;xx?^Z`p>mEUp?mE&dxbcP7Vq~6p5_TsB4y|&wMCY$|IT-v66@v;n8!N$TyJ*K$FmwRQ7R+h*{G-o7vKPef%zo75)xT!Dj4k8vG z{uf^K@J|GS<{K?SNQ#S#J1ufKKgGoe=Og=WlzrIMM$!UXygYh^zc|oEEYGZ>iva(* zIV7sB()>SZA$K3zzWPsG$GHApvDBi9EWQLvqMV6pJ=(6wlh95k+-xv`9&H!uaZ?gu zZ^kJ>Ra_Rsn#!+!nez#{{6})LkL3J&klCF=Jat zJkm+qDMDMkTu=K~yux{?qKaD4>t4MVim{#JjG*A(u)Q1xMTq6WUIy^E5CUMBr}J=1a6;4{RD(p+9`m`L61dt>pACF zdY*e_)zR2;(Ly0L{r?J8vW*@?t6MFq{11bhuK()C*a4y~y{@lP>bD#Bh@Jz(Joc4Y1qq&E*KT1A- z7qj^+EI3qv1&bp6h(L7S>^+VT!h(G1U1ix1Z~*5-4uB5@24T^gem4VDvQG)=B%h|p zdI!O>^+P5DnVG2cK67eob}H2p?dh!bQtHIEuT3uq8Hiqn{E42ts;KO&JnOF)?r=t0 z#9Cax6WY+y`aSa*Yx;tG4Ls9B5M_Yq{AO{*$vRhyhD=KtOultc&eHWM%CapJ&H`(! zIwY|k^2C1jG*G$(f1zf>{rO6o5adZWX|#Nzl+wk?At&-g^nM{^G1ECAJ1~*XNw_+! zGdL`YHZswOSbuqAXra_rGm*E?3h<=hrE{lT9%uxmbK-Q7x0Jjk?74Xgk4HSL0PkN4 zl;9Rb-LQo7q*g^ty4|~3H3}YFU4)mVl zv);*<*ldGrn>L~K=umA~2=``2vrw2|(f%R%8Li1+SVeM#2 ziHIFP>zXIUc`YaPmD+3l{p_O+NpXsu;(JNSLE5V;)VK$UKL}JpON|y|D&p^JXNl&! z_{T&b1OO+4fAg`~G2__$Y%*~c`J|~dA8V~dJr#G%Aili`cc~NaQzUcDVBz68&N~J; zG#p?IeDvtHJc`-37xveMj(bvb>NfNsRI?t>Q~1`|#2x79`fq2t$R=F;Uz73CUxs8i zOT=L8^Zfqbe{+8ivsYUg$isc6@~{rGwhMomB{84o3(2~e)~I!oT~s`WJXMnQvODr< z+J_U$!S&kt>7TOUMe866I{xFPgrM=g3pHIb2HV$?*pd*3vj}<6Vre3=vb9O<wQ}lsg@4oglu0Mpf~!E**RIfT#;aO9cwOb#__SmS)xEwbjsVi zG2pnLCnO~uU(JLi8~nRn{c3o;e0SWQlrkzDl#NIfy?{KO<(}M*Vr4{N>bza zB>8mp`VF9gjlb?vkQO=W`4B!Or2Qert6v63+Brjpz{W z5%Z5tTeOTzIo*N9S9&%r$>X>Sgh|&o4sua8(|feLLs#MPm~jm>p504#PeFc@PA~SL z&zHv$+z>#9$j7Fe_fKC0jQ5D%{i=0K)`DfoYfjCxezjSfDi{daByR&w<`#DW_C0Q5Sx3~GUg{PhS;|xZ<&(;C_z(9Yz zKy1EWszBs*R@2NhM!ak|{Ol#0cBk+o1MWP&Ye;()X`m@r&6GKJ^5RaAVCKr53t}0F zn(i0h8at~Sa)G}VPT(uSRg$qCDspfKgX>?93$uR%t}c+iK6h=Ouz?H~WDZ7enaPCK z@~Z&=qRFO)H*8MZ`yH;-Di34KAU|BKeaat3YqQ-$)GUIvDJ*mlXgLwl(416f*Yi?J zXPoTjs83?)v^q?_so=fL(e64<*J=56Dn|XS2>wIL265E;bIYUEa!)GS*Z{w(ZS=+ShOr0%ob2_>@k%KA0{Mgjc9pTsfN&9f77$#|fv2##&5TDWHV8*gPyK$^aWqXs%wqp-Id{#1b%& z{oP$2srgKm=q(I`(14tB?T4Jt-wxNQ!Kj_waud@+XAMQrgBpEhl_}&DZbLy~@P!vv zo<_2gK?bI#KD8mIt<~GbJjZGuGE}fxLyDU03gL=^ECZt2xcssZIYL*4sqZa~GnP7)aM2os-#N0=?geAbm&wJZAIuT*HSz?qxI za|a;!naimz#u;mNTm;NiViAx;EKfhU1ek}b*tA5X`8^FVi)FmSL2{8S5FBWcaOE(2^fUXOAgE`i1h8Sv4sDYIfhwumxTsx?_eUP-?fQ|77& zDaiVp_p67iXka?xaHmf%A8FZr!KC5zQ0duR?3GbQ!1eduH2U@Dj*g?B?K5$&3*j-L%bLzWpjV#q&lG4l!P*$y+NJqlDxb zLr#rS(Iy0lcYa&8RyP>o%Q#}r6R3)Dg)mJ;5E8A^Qly-?6c|A*MBg+VBE=YBwG#?e zAeqF7IPVZan81JXSN~l&kFVnhDdi!*kE4U|H>YQFnUs(eQ{$Wq7E**6jy1bw+YQ5h zzt5%Ql#I1z+c@XAf{4(|G*wC~M7aXdG$AG&{^ozOF>Jx!FSMI;lna1x%%Na32ZuRd zgE!6}PbbwjA9g!M=&|jdhrO9*3gD;b57GG|ImK8D`RU=Y)tXA-bNcDq*H#G0c_US> z)wl>T8QM-u355k#C4@jA zDEs->UpH@8XRoUdHGg}1@g+rAO-es~`#M`6UDmo4gx}8Bby^>f4-dPeU5((VrpyG_ zN-;t>MEkD$a6El`{RSD|QVEQHd4Io76NHsga-G*z6Mdjwgok^YPS5^|sw& z$(%6|3bql9=9zWh_eb0iC8e=;=sJ+H?%Kcm@z3XF?%VcoI3NIWjPp44UDFReq4bHh z{m}EaJx}AyG|s^mjK2HrZ(o*mUe@1y`dosCDGYu0_2rw1&S7$ByB(qfKs}+WS>K(h zown0rt~Wm|&bx>ZSDIlQ)-5sc-ShLl>y~x-`u>(-9jB2}`W+xm+av;KZ@CapPftpU zX_=>S8u}fl;&gZ*h%W1@8x>-ZiZdnbwvk$nQa$$l(|!+2zRt_@^YgZC2mk^gjA_@j zzx?Y_$-|U*6vKPalfpDx*$vzuZ1O>`<|Xp`F)T z+v_AaBQ(rQkEmump%Mi7hw%(E3c1{-+sEf8ff25C`2R|}k1a`(gbKr^rHk;0NL5*? zyQgP>1q(K8S+L=7I1CG3ojHx@>8h^G%E}O~-Lx5tdXIa*zp9nc_p%ZIRhWEyctZdz zA(Rj+A;acP2w%>x9%U+d<}@}{ygk4|uHUXVvfhiT6wo^}<&Xud1&c8#&MKvAsW3z+ zL5Ar6hF-Syx0i3$#ti8^jD=B+<4^4_Vk96)!9IO^jszje zZV!8I-5;tWG9frWdygx9ng^RaRy+=q+01P0b)J+`F{Ycl`(c`W)Bd*2o1lSW)i#r{ zE5hfL!?Hp~2fMD>5=ne^G5W)H{wy(0A)cvx4K( z^`v*z0;>SXu-SsiXjWM_fQ!`xkkU1JLP^a9B4jvU?zxf}PfA5XY)XoY+qUBwDTIH1 zd>x@Bh;6+SP7@T`ffs zp_F+a^*T-Kx*|$N*Cv8Hsg`-Bm}*LkagtJN zP1Cdzu$$v;DPTBVmg~R)zPq{8s$!HponH+|MDhYkw`(=yzy9)z)b+Zo%QO$yD}jVU zBq&eLiAKGDrx^(mQvnD#;i@_}lC2>2!K{ zc(}W}`}*=yIL!#!91(yNqHLqL!B}%Ty*gu+R*aII6AS_Sa1_eM?5yWhL?3;K%Vq#Z zs%g&CRbYIxKNN@}D(bMe#w`E)KS**0k?*ILaVcaD;h}CDCZ`yZbrN9$0KphjygBQf z+pDJ4`q=F;#u0&enHA&5rtPOO0bpZXwhd6SJ03254-mq!nBZLSoU>%zcaJ&7^tNsk zczdJU2nUNbIvGr)>`XQN;kJRjPa}4F0ZfG*As!@uxsnOW}G5~uG4zF zxw*MH(n?pAzFaRMghRLc`svB0%(O;?UcbJ=TtI>Ix?%T^|4`ReEO9L{Q|dukjM*-i zzkBGjCuv@XZv0YgZ0>6)gWXDa2# z{T-(C^?VA}DMEjG_nuJt>tFxsqSN~}f}CLylnMyLGT*dq$Phz<0hsy$#LOUSq+|e@ zlGc8dl-bqRO+yKjn6d(1qkoy_$=l^J$e92B7Kq5o3(=c{9$Yma^2Rl);`7HTnSzm_`W+N)voiVb>&=Wx(-q7aY+PKjk=!BDa5a@ zFa0*(zPY0mZ6R>Mj)e1=?%q8L#?Un1RZVZ!^Z6Q$x$X9?uC{f77_WB2grwCe&MP6O zby?SK7zPv*a6WTtgSXxr=Q4!de*fF2Pn0p8Nh&2o*J$O&iDqDDn{#>J?s5n)GA%duG$apJ_es-EEw@2c`mqhjxtUN z`94X9rS$y;VkEdg2q`6n5Ov#5+gi6fSW2s9TUFm5MmZNy;2I+198nA)Z0gEw1_RjD z)ikY_X~I$*_J{d=MFrd(Z$7+xk3an9pS!lP&Wzh^oy{pLE}7O3yUquHIiIIt&`RIk z-$8`Vudg@nAFcP}Ji%Om59>6Cln|rlI$6)spo}Ztxb9cM$u4$mLKiu6vUuHomL3mqMj<9B;QUU}|+in{dNjb;>Ge!`# z;~b59Dj^VDFxEm;nEdJS-CpXQ)-TCWMkM1u{`fIipIwSBKHfdvRSI!ta#~Ud5NIWj zZF|4lXF|@G3nJJ$7el}hZSzu9RSepwVygQB8B^aL~A-HauL>pu6et($OrD|(i;^N)7Z6$?mnlXV)i3H*5Y;ta2 zHvz&n08MFWs>?W_>!c|AvP~p`lJdT71n1K{x4U**&9WIBGJ&Y1G|e;N9Ak`fS^A+l z9{S5Q$Alp&F@XZ254EliqQaCAN*Kb(1%(--3?s|{yk7gNYJUFXpD1DDG)rAoZRTq??FOwl-{^{(q) zUQe{Gw;0D|4k2vTASn{Y6=0^6IR>Vb^&V4(1TUQ33T~E_LUgn1%rLMFS}r)kU#_Eb zKKK}2I3AC?rX>*d{dI9sGogiaE?$PQX?J$n!e+OAJT|)&5+U^4`SRQO{0;gO&NxJr zvo|Jf+jzQUpBg5PZRgi%i@}4u

d~1g|Npg&3?oUoOqAC6rcLS4x+Zx~}^=_PlEY zg0IW8=45iZEc5Ivg0MhLg`fphlrut>ZB4LLgu3WoF6XPABO@Nc6_zQ7b@C9FcGteV zzRcV5ayhvaTnyftoBf_sT6eob@XK$X>}DFS9D&%ls%}ovzMjt=<4S8Q`LS+cDbYu> zt?RmW-F{l;r!P;fsu6&}`C*<#T?wryp~2c_*Pg$At*G!!W&` zF7sxZt_!(vsTVVslw%0T!vR9*z0WZcj5(*usrCRHhGnK-FtSGVD7Gi+8K!jvf zF{xaPm{6@0<#gRP1WNE87XV`T{PpYo+s9C1e?HZm|M>o$S(m4$FWCRh&x_q$@@=K} zQdNX$CJHET{`7~T@6Eh$B>|(WcPRu0ktCR4Tw<&k@08Y30gTSqYe5tc;&akMHA)Vb zo=__5YR{{FU0?bufRG>@VqBaZ)`iZipuF4dlvLZgoloa&GeXKGWlXSAnsQ!MP0S?$ z;8MEw6NQ)&*6zC5T1+S>^x^KlhglvDlXFtZwyI#xN(#p4joxvLYaySXo)5cD3;uAt zTgTC7?^8+`ZtH5+H3uK81*KfK**d#F>_ZBIGbwlq-dbY?5sjYgI?j_&vOqA5gY{N$ z;Zx#VF^F5Kt4jMER97$aY`mTACMvCWZNzYiq3?S^C_=ymJB~yCPEacmV&sTwA)mfH zP20+}E|^qI!jSuUGR9WBHs)ftl~U$%o}I-BK}1%&U9NpU^f4uhuy zZyxT9cL0>PcXw}YZ%fJDagQJWRC9hYwoHxF;#P$gfd!H<*1gdp^CI`u=} zN&W6{Bc&Y1@ypj|?*oL;glIutay-_%n6s9OBXpE?F{XsrRtuy@bsQ4HT`Y#=g*(tet4GwAe4CLU@4k&A3_1e zmmE`KoR8Cl04zC2@5gb(m0Fg?ZAMEe7>m}SlxnGr596{RK)m$?fKu|e@d5-{yxW2+ zDIUA7W<2=-0kGrLv^9Xa@6UCu>$c80SGtNJn$>N~8hii*H@p4a?Y+h_Oq&^d4?%+P zzy%BCb)7cn{JBqpbFGYZAq7IHxAw5#Q%nHDyWOs7nl*Tf;Szkt2q5TkL7ZX6R__48 zRI6d07H6&X!#bJhDO&WB-Lhi%I-5=0oG3{wn|)LK@Rbq-6-gq*ew6U+qnF>0+2 zH#f7f5dci-7Oc-PfaH>osN56D2r1rF)lg%@o#_jDGc+tYiow!JPq?YcQ<={ z_ve5046iv*f;y>ox=sN6`ut>LU@>V#VhEGjIAt85<=g3Mme>AT2!8wiy_E7i3`Ovp z5AO~{1nZQPr>7@XfW|m`f7tEb@9(zFJimM$ul<|jQ6QqVh5$t8K0iO}T}SKsGS7oC zcRzeUN-6|S*XuCO>*fkXi?skjKrl(gTWgFNmMvg-9VSlb)9=66v%Qn*?crwY2UV## z_!ql~$NTNNuEuQMwKsc2pmSj{n~)Mf*pEXDA%|FN-89uS&;2}g$HTI&F{RBKPFcxW zFh&TOwsjdN1OU!u>j#|6-F|+Cxb(e};>VwUqzHGr-O%^bx=JAkWtVvzy}k6;ex9$xU~=Yl<#Rd>Jr?}# z&BI@Q`6ZOHulK9>F@?8p9!g5q`md+!8e&&##kgWjP-@m~oTdT_0? z-R%fx{qxi9$PJu8(v^r;fxEG30qH9eUqnzascXfSxJV02^vZT|NMOadq4-mf?#%T4c;p8NGQ>@ zW{faSW5{*g9gg<}!eP9G=$p0;u|Py10tKf32BF)w%1aq%u>b%707*qoM6N<$f3?}=URAb4OWd>0~jIGGXUcy)g zpTbDPkZqEzgNd`R^O)#uOgWM1uIXnJfWab!qloNjd~LvGT~RWAmtwA$ut?L+SokM~bO;rk zaD;%e`GJ6JN4ONcsR@CA3jkmIUd|6dePbLQuLV!mb{+2QYNd-bmcp6>TtB|b1smjo zY!}g&;HF-11UG4d{7H8m^>6h&j(dN1*L>`NHmWP!5^xzTS&CDoec{d8oiSmyh6DE- zMnH`q4Wx2&VRawmSZ@Skv$Vdh#9|6u$#Uz8V+|5{j>b$K*il~A!T8ZqY*Gm+ULz2n zi%(gC5C%(??N!F6+@cu$7q|<{XGAjSxD;ZgYD!g@4J!Ip8IzQ8gX}r+GPEEPBT<$i zK7i)+6-L#~C|5IQm*Z}4t*)9sX0?XGV^{0^N|DsJIR5M4@M}ngZro}da9(>fr4qMJ zaq=hcQ5PuD$mUhfdQWbk%|u29J$Ba6TOp(f?v2y5+jvpaAJd>$)@?1>_oRwh&QKr) zG&0yYzgr)#Vgeh6WLPAJz*~(f(0cG0Q(JF)qrTBi1)xo%{Zj*M#Jl5HrncpK!;C!~ z4#zn$;=23MYGa}BJo2Z(=XbqGN)^JEpF40%n#&hZ3dU@aAcohop3b9=P< zq$%5a`W)+P5T8gc*n{j0Hxv*z0GZ~c9PS)=KWW%?MyQ$VOXmDL46hAf+yh_lQ@Gl^ zeD$@1TK(wN3a}ltBeYUSvhWMuQdF!kvTJ8(X?`6m43tv#Bkww4S^su4lgdoKyVVq8 z^jN%pxm=Y9-(Bv;fv;A}XuVAPM_t>k`2?;O2gz>9?DlC}=$bQsJLg;#iK4qTRo!?q zrdG~b;AOIOH|YrKNr!r zSj4S?$)AD2L=oZmt$J*-0^r|CuF=TKI_~F3rUV$G?)$dm2XhiEwL)}`xI<6P1%=7w ztK1{BBKH&`(PrO%H){){|Gnu;8vkceI6&ZsIEM{d;1P+Z|1)eN-=?ArrNVxj)w98w)1Q2*t zWdsF%e>}7xJ{8^Nss!-h0*t+*x>vMS*DhGV+{+VZbl%{PZQHbOuLUb?R$^~||RD0-{=JjhMT+4cTF7>83!Bp%j{hXVy ziuOSFtU<(&rYanBqnSArF4x@oA`J)xBl@H|G>r=t`?RS<2&_yI^ML2wU3-B{Jsu7j zjx2(OT`exb!WZyBHF?(Z&hOXjA1z~Palm%=ja@GpNyCqYH(9c3B7FSpOpDiwE36Yv646`BF9SmZF&aFJ8K8Q!Px7WWZ%23(Oa zy!M@3Ap=k24`I9OZAjz+pO*3WfwiL$hpcKGE`(0`iMzC_n3(JSLFz7eT5;lB5!M*S zKDe{>$$=%|j!jl2KhWN&xBz9In++M2m~MZXhrZneZSaHTeYTK4cX1$bx8&;?agb(j z=LSL}qtQsM2~h_&l7Zs`+AyrE=+~c#h@|AZC|H#v2Xw-j)*M{-T^wX;F93z@o__=4 ztn|ZPyqk&N%@DDH&nYeG`GnfMl~TlIgIHkVwvIkMV`c-O6vqUERLE6PaO=$hnNr0R zDPiC{UbvCV_ze~wW!~>U*~Zeu&txt;hZ~a!k!s(GQ5z~FAj92;waL|h^QYZe!Oq}5 zA~L;$9@e5HCn@JD-3~$>G_B@OXkd z_7I3suE!@Bx8_w*EWk`JrZfQlikhqdvq@4g)tgf|zW0H*9DA({1geOVQ|N|j*a19^ zvMHC-Z?jxcsI0kES`}h2^*%jjx9v?gV%|x>TH5S~%WoMtsH}xf(omPMWWm`8R6r2$ zETIA>?UV~8*Qk4Y5`iy6(ySzm#bw~%6SuSmg6`IDpk z?-WrZy-dIjs>_`l{x8mbQJ!00Pt9@0fl}Be08cEedYsQNkY-oHi20@d#?Y-if+Z{+&O=#_Z?4R*}i5?FRNZ-V9163 z1ugrWI>)gwELP7j#iW%`n(c95ot&6biB6Wgk6XW2Y4a7GD>q67xB9O5B$_Ca5s zSt;~!F#{de)=yTBhiBkb-F1}Q8m{D$gEhi_@C!{iARA`mu-4J0&_IfeWza_JC!GOe zrw?kJwBFrJ`={zZQiTg36aT98E$qkC-?*E)TPQqA|AlMQbZDx5nI@$#d(PlGp!zqN zZ9>Z@`@8m4D-wpfihq$-vq)0a0=0%ooKv(;X6DCWsYSI-R()*$nAT0Xs~Ew`pJy7k zwYUKRv+249ssVD{Te93>i>hAXl=UOPG7;IBl<1+}@zM-=-ot<~^| zpW;kSKeSs^t zY8$=Jad(uKzbZ|2iM$M?6Bhb|=meFx|4I?hHf|nsv?dtVUYn=IX`gHjP2vnL;xG?- zR@e3p4sOiq81?lljy0LzVc#TMWJhmI#yWVUF*VSSua&qy0KagjHB2Zh5`|O02Q);Cj*CbQIQ7`44q^ z@@|ZLi>7x5_%ZOx>yZe2tfm006k8ow8?HXIt(=eZu+KJRuEF8{R%d#Nzs4;G(89JZ znt5Hj@o+Z$AEfY6T z)Y;Z58D$)0sjz2CbA?!`Ao0x+cyrxyY|{;3ozh}Zo?hzPEr2GFQ#R3|?2kmI$2X|R9bt!tKG zc3vPWk(lD1Ya3!A(binuOjKmfx=~Rm+|!=|(=*|J8U!e9yNT8^9+7txc$0t5qIQ4& zt%*_y3Sk6wi^?o)#=9zkwvYE1SlZ38v*=h2o+o=10XH89r*|h*xz@+2Y?KydK}Ln) zOTCmR45v7##QRAR*3fL$BdsXeu)7+=p6aH2?XEvNIBRAJ&sdJr_3?k<6{<;}lvlH(FCf||ew|CL$68p{C+qx{b+m{0cCpxu|fXJ6_GAoO&cGtogWsDLNcp4U|yiUqzoWdWJS@ByWl zfVEs+4Lu(>< zRkV6Uy};Ro+OwHV$Rv=ps7@`J{3>8pIa@`ht6{@{l@-tItGwWV}s z(2n;uGpK~Mkd?Zb*3@DZA0oA;ac~ zN<=@bz4q)5RD6D&+^M^6mBK6c`%jDw>s;$v;qTOD|5aR61J4r`LU2k|O4Uuni&ZfA zTff|*@|V{vb;0rR)2_QAEm{v3LGNzjH4+gNr)n2C`ehOBk9^sAfSoLol7stwft4BmWZhrQL}~X|KKfe7KKYG z=MUkwSU-|1YE;X-_TlMhme4AJEP>#nmsn5(l3cNz`4ph+)>VhDKP}UnxZxB|Icq(E z?wW+UOQ|Cc0ts0yYz?IGR~44h-8$!)&$VI<)CG61W+%#Je|*|aGy{kmsx}6=re6ML zIQ)=ZG#4A(kb|~R=hFn+g(v?=$?t4o1kHkUdY`KtAFS#=-NzZzv>=j_s1d8GA2qlH z-pAOTb=yxn+(@wu>Xvp71HXH`RDCkuRvltd`v2KxSVb7C}bTKQ}niN6!kY3aS`sy`q_WB6#`>YK~+|?0I7tVrbt&fM=Kd004Iyl zFR-V|D^#>%>`_Mx3kz%tJ46xF+@2zit;5WD~KZ_rwR=C_M4QE7tNhayT|LLq@N8d56NL8k)m(iGy>M$ZK5_v z7JxG&Xk9{NgL^7dnb*MD0pwg`qKht5Q3kcUZT7NVpAb!3#i(xcC!Ta;#=u*Y<|^68 zGv5$Eq7O5cmpf=8b!OS%boSe8wMg>bN$1Hcuh(VRW<1+8id3%~e+78z-FVUP%A>AK`=-)Wt1m!2?rew+JyJR}$T}5KWcOsq=?ko~f{F3<*ts@-Pi*Xme zmI2nc3FwI2@WugABdj^52{{(9mJ}RimQqJv*Fa&B*Gk`bou1k&`1pE>qE`X$urh-ck+E>N zcdT?mJK5T(_8Ty?whTfTExXZI(RV9ZOU7#e|01+EkE+n>zg+7lPk!w+BuEV#Eity* z#RxU+fexXXq1lpec|8z_=L3<&=N@Oq=#+Tgfg3KX^r6xxEL=Y}EBrI%2wJCXSfsA$GpO+r1k?RC)Zc$xGo2Nfev%`N|$9GSA z2K$s#v}Ubv|3kly@YQSmj`9R+JwuHLg0xh6U?493a)x*Jz27YfOfvs;&KkBiqa&iD zZ!fOKsZ6x%Ms3uFH^TK-AtMV~fo`3jcaHXx$g7j}o@vyhxGDVEs~L^Se;Icg=|V`A zcXK{j>&KsFHIcOa!Svn>~Pd-+8mbrdhzKc6p z(834!=hqEO|2@{qV8o6*P@W_#sPw(=zqBy^kc?Mmc$4wBJiLM;l_x9&M*n@e9UiWH zEyX}|!L(WCqB|U4G1HEn+Fn?ceJPZnC;lfZFigeG3&+G6Fnly`ISjvI3x5j24&iG2 zm@_@O>|76~$>hQ|W$(3ga_)ck?Jy6IIuCE@-QgY)-Qp8R4U z!J50Tm7zr_YQ%=puUD&-(9gnTQgd1J`X7%y_TPAOgIa_tm}<}wbg!N2tooz$A0?s~ zzSPmisBuY~7h2d2d&}NXAPgF%En{#F$I7+F$HdfF^o9Fx_>tn;R9}LKMJTf*?6AsdP4IWRlg(ntm+k)oq*S2i zt?D5xTHVYnGf*jXoA56wLzq)8@80tzpxdm}0JCjoprL3k@o<#tY3cMKd+fX({OG5$ zpY5uMj{5w7XVt96NM!p0e^NnN(brS5rTUNme&^(eAY5aNB z$B+`>;~GPe=sbR=h#}Av)VaBr1KNYJYws;OO@}6jy!QzNA@c6F_NZ1!a;Bfr#DR`L zE_$z%^Xo!Hn##^@*a##84DKDTt!`_n|9;GYfO_e_8ccQcABK*Y@ojBrqQ+kki7fJE z`f0ws%8b()=+`FSsMek`#N)ju#v00B<+9j+6$bL8sS_~5JxrD93lFLY53#2v{-iGFv z1n(nt&JSC|Gac1gfOZNs-TKZIjT_m61~=>fvjKw5yrJ1egF=l_4&ly(+ZV0jU$hjO z%3#^ND&>CRf{mAG4FRz&mBVwS<#Fn5g!{9mJ?(WyXU4+y#sw`4DG&&J_r_VMPM`3i z4o4ab*u;*5oR8j&EUuK@q^a_WJhU= zNy(qEpXvj);yc?#2*F}LM#Yz3N0r`L++%0bfI}Nbyx;B4laIJRJNxIm&P?XqT0Z=_ z7b@_2qX zxgh3oNN8yql-(sNnos6q2yRCvM^Z{1=tnw zUgmyKTV-Zy56`>i`oVW_dAY8iC`68%*s$-j>Mz6Lbls4-kz4p=ZejRSVdB47nY^S5 z&auiHqmgM_tNBK`FPm;iBrLC&5*P$C1P}#x*7SzWnZa?1|8f)zVY^)EW-M=R+_kiv zxe}q`su#RpY+7*|BC>N-Ml)r#RPB={T~mV+G4a}_(D+TF_)5IC*!2KsYlx7IM@=Od`b}(mCk>(5F;m^Eta7PZ=zJt&_2@cgBv~%L3MwuQ~&sJ zVv`JclhM3co%$@}W@-X&!i4nRLz5I$CHds|K2SzHk9m-SCa$W4uH&`Q-s|lyO7ca~ zo+t@gq|#M5A`h+nq~WHaTqW-(4!F4WwbwIs=8i1p?|H0^dXimq@^DT}wUjb-d;pU! zQ^+0Iz^Q*A3=@oS{$yTQ{bw@vMC$_3^8U5Uwf(0mV=$%VAy@0q2An!_h9I;Ne>`;> zy-m}vIL>Hi!KDL1-KfkawpBuKduM0*0)`OT=CWL*LY=I4GX?`6H62AA@yj$*lo< z1WZ5kyqdIL_hST}rDj1Z9byJ845#r5G?y0%W?}({8A3)hv)BeuQVjfLWof8H$%mMM z0n})Q>wcylN%s9dji1NYh!)qWA}FIamq6v2j=mbyqu#(eSbIC#1o6tVCsK6b0qVzt zq41kvpFR(+rsn0a1`1Vtg@I7Wvhl3=eXnfD#T))lq){|nw$t_Js9Tp4jgCAkugo|f zNY4n@biErOzgLHEL;7irRMTyB7hNi@!pD|b@7rJ$_+9G+)qd0B-aTM4Hi9>i_DF4v zd}X)gQ|B{%qv0Fp@2Ojk={O8kWOR`00*{)e9bZ57$WDS%{;p?2A` zN9c7}xP$Wb&+F+MVfN^qjgQN-vlO$SnJ~NDQvFsrfv#I6WV|CX$WEVm=<(8IHNp^{ z0HL0Cek2mPHe}8VTcIe>VswP3rt2r&mLo-lPr-;+o~M%j=%^t;67(f@wrwBx+u5IO ze<3*DH9RIS7&&t4$wx*)LPSH?{h9*=w}VCaBQ_SeDl1;U{#ZeQL!ogW5IjsHG?5Hc z`mg+>kSVxlM>@zf^=^a(d?|ik_vGsZ!5&p!#e+@Xy|}ItPiw;zm3MqIw?s;Bd;$K# z<#)Pva6}rj?yC?W%!`K8h)ogQqb0E?0`Q^E-4(N;hE?@`7Y}%!N?-P1T)G?Rd6Nd} z_;@WNo;G_@NYBs=IKDZu_)Z7EkH8i8E;0^}zBkLHsNCH0?s|w2*cXzW5mzOh4*|lK zFcBS&B-ZWu0J{BWl@V&BM`O|b_p6;qQrOgf(F5TE6>Fuv`$E=~F= z-0-NF%4kO7E&ZH5hRAG{}>{(a_3Q@+afKX77d&ZuB zRR-*to!Ou8+OP7z^Zzw9A_7(mUF&_8h!z(OYg&?Dqj9IHvrQIgz+fV+A9ZNV_(}|0 z%^wQPYZo2S9wq2LY_5#3zfFyO`&=z*=KEqbR$Ck_|IWbhpouABVwC zg(u_7u>)dR#4^lKcvzutSt^E8wS3Uz#Ue)IYp>Im z&^ugMQvg|+{A^xxus6D^6OGPbnxI76=RSZPhwQ6)-j^{>*i;yZIa%BADR0exf%905 z$}(}qPi)y{LOZbnc;@fM;~j*MmDPM|$XM8&v=stEq= z#piU?eDk6Q>2U^xN%2OgebpbUuEX}GKl{(eUWW5>^IZT$oz=%qGV7vavRMQzzcEQZk!hWL>s-}4kVl1 z`-j&c)tBb{5QQeWr3xue?mHI#t|Q^k!QG!NyFS8>=)A~5{D<+J-k{h4d6&aO^RL)38Q43lj{k}$@_oJ|LCxoOeM>Da;k_ZgXs=BJdzP z`;XGFde!Sa^OZE^zWHSf5E++<;PTLcw0h0YxKC zUSVsT0%{XV7@h26MG{_2HD;utNoB}#>1KSp!Gk^de>J1$IM-qtx6kw&+_&$c%~rI$iMA@`FU}k-LBL0S8gl z)|Hp$aHlu^nWOE0rzAi>!Q6E~BD~Y3Ub49BF`{C*@UN7&*;UQPA&re-pNjC%M%?J! zrcOLL>xGcN) zuU!eAUxYYf!+v^Sb{szwmdj%p91GwqQ+WJ`qbFnDcvF^#_d@$78XysjYH@k&-X zcq+O!QrL6n+yzhLzG%6_^Ja$#knz+(@iAbKvWQBF3WfvE)2TiF=OyYwV|% zvmjN~=RVIlF$oEBXTpM>YIO^}XSKd3Oxb4lOvV)Au%5U&&y0Acn(>;_PA4_*=$ zbYATlzff8~yO2;iOPaM=v5lxI{r&Z`&BEd;4j!DFF1G&HWP_<;A`ohkIS4By#SDeI zo658PqC{`I&tv{c%Y+u<*`Kh-(2Oi+d$@>5@g>osifs5PgD-UE6 ziLa7TN+?8skG%Br-xudPdHAx+BW5n7Y5EIk360F%mP*htq6M*3c>P}fwVv^owUp^m zDzu(!{;Gb* z42laE>tF6}crQf@d^N6|X82u__^bfOl)_#q8aNE&eIWLg$&l;Ai?{^psx+#A%$G8k zV|{mcSnb`7NwMLxPS*jAXm%T3kbZYdchG1c@XJv4E!KzV?k!36VueTmnD2 zC3XywddP(PvvB?jo~8HWy8@1vi>f|Tymy4S>Jqqx(As=LZmgY}h35gon75uW9qo6R z^Io!)8k}QcA&x;lAIiMh8-WZ9ze-AGpVr@<7Pa`87g8H4Bb$juwRY)H(%M*ffBnn7 zVE_=hPW{Bywa8u=aVgM)Z`o`sxK8a8mG~Gzg|Iy+_U5Oh4Q@|+i`DlXzg&j zWpUd1Yl4D2`{Y2GSDKQmG!#2M^z6XsMStSe2@K6V^v$#6?c(j zs@4zVPx(0)Jv^CNio0)xh-+wuo3jBwoAR7$gHH;Ym2p@ zuX|T7sR4Jy-#@0!Q|`Lw#k z?jQfNd84}L2}K64f7}SsS)6_oKB?~dXEz0yjAi=DMFqs}aWnnuV}T4aRTrLTxo_ZM zp(@yq3f=bp+t02;H`csQdOXtwGTshxwxEnl`HHVwSn7r-7~>mgV~9wWvqww=JjAnA&$^(;&+R zmI(lh9<{e_$P4{CX7X<{G;RRpKU;J@ZtE6d&rB4ezDW6__U4mMY4-Q)<|b0MdA%Hk zj^J0t*U)BnbYFZqG?dQxwnv+@RUY!Lj63`n zJnUWbJN+y3Gsx%nb5bw9PJF(VWXCJDUfZu|jrV0v59gozH$9(wfYnP)v3Bk+YMQjv!<;R zcYL@s*%j$ssi>v)XZzowbot`?&f%j}7K?=6X;-QWt#s$+f|7EifG=BcBgS)K#dgbu zrnR$6-YNa9im_?(-!-pf#L9x$G-S*`Aa!d%4iC_1_4aUdz5F{f&|+`aRQGengQ!2~ zNW+T~3F~2d>ppGEwq{?X=#+apv4<vmVthX>lpN7dUOCC4fK}!aS+_^u zs{0=dYt8~bzq2a&Z-I>LvXr0Mpu0Vcwv7Cn@q6KjLCrxqluOl@bd4941Zr|d%!rC+ zDPMiJWBK3pLX~$dlHPhohmd96&0vWm%iq5aUvB>uivJLMD43zk_;wI2_Fc@RIsi$U zcy;R^g~VS!;4J!dY_}cn=6XD@x$kzIu^Z2@i$1U|J_-G|QGFCQEEaqCXR_q@-;pL5 z{icf+X5`*ew|30~>buVPZR}r5ztD7i=Sd0kX3mxF0l2*T&*;5xbjq`-);jremA>i6 zUC~jXQoLAZ&y282c~63h$_=Ph5%<{h^qKK)h@N&xLf)fkF<$rDEMxhnSmfxa@|x(F z2Ovw@)&H7_4h-5SG^5tpx`z1Szr=MLnSZX5X^dc1BF>>Y*7=g%qQt^XTAEw0>FfZ@ z`O#1#)MfU^cSrbq>U0v89~WKdJ;Gcq8(PY?E%3VnIQ+N&6~DnZ+VCRo6H}vpjT~y` z))jo$zh33y;^Gn7Va#7|$B}Qz`$uizKMz_qtS0^aU)ZUh8jXq|>O&qvuvfRYV?t%q zGr#vBS`v+4Tzshd~|EWpA6fzwGKV=&aBi-OC%;s zm6wxN*9Ju=y*rdr#ox36>dJLy0^1ZiRoc5Jj5cmO!*SALXS@Dp0E^A4%Gu}tvq5Tl z#I?@Utx27 zLAPqoL5XuuG@D=c02JLO2;uy2u{#S|^abCJSo&cRl-C?_5y2e<-dJcO(`*OJ$ID65 z`BD#BE%5=mM#c!o^}YygQQFP;u34Xh`|JLGRplg7K}MFLOKr18vLCS6 z&`e%^sYemmZIHm92_@OSL|1jRw}&;}?}Ng53#}4x|GdhFE${uXW_>1=NMuB+(%K=n z(j`H*W)22pzbtyR`b_2orNl<$?*pnHN3(fJIh^bH3I{#z4_ft1iq6VGb*{S|m)~Dp zk`;l#u5>Mkok$)s+GB6to7=j)QOGCZv;FxS@LTs5m+#lnnL~-`E>rrD7^V2+sATD6 zfqF8g`)^89nSNA%&n@1G#Jc14m;0;BEYWKH7gJ}RqP*qRg%}$|X~EJD(XG57Sx%D# zK!Rv?dE=Q<@d2XSb&1CJQ&ZZd08%SU>8^@ZGIqE}B>w3+ndRB`POZ|#hwL5n>q9*& z4csiUr8!Brmsw-E9Acd&NtaY7orWLAYkz*bJpB_A?tt7&MnBkD?|7G!=dxa3udJ+m z3dApEW1~0z=zP6mxAl|@aGhGtk@D^}rr)A;P?dx4FxO@aZ?t-aNwIY5gCyJi)gx`I zP(7#&e@~K$BA@PdOA`cJmP7ozzu!VCu#Ni5h%0i00ygMpnHGndUK#6yP*2=xo9utt z+;M`4%^-GW#g>|;XH&w*A8YJs%wNzBciyA`ujv12_0tXI5|YgSnD@OFN!>c$o^}E^ z{?d2>Q?!ttExNaNo&!|b)T!4wuHM7=kI4IyC83g?2@QI?OJVrdVhg5vj3iK>O$#(O zM>)EBcfbeBv%kAeUJ}HPdy%?d?!JaQ-2C`862uW)g~?dcZjMd+{0U*Q`R8EjMs zI{v_C`)$byC~p7SmRm>X@$T7UyDWxr%nkx`umOvB0UtMKnQmA3RaeZhF}=Oun5Xx*V{`*P z>t zcFs1dEmt`*;MKf2P?u1egt#Ay!P|alw z63pV*euUOO{~P!?qRpkoD>xNxKKM5aEs$7pJam%u^uOEA#z{^o&jT{n@b@t6JYThW zOp-7&M@D}GrK#CMUj9jUP<{MA!pT<2 z$!I(+o)Ta^H+7S@XKEJo7V-9inw3ee;g_Rp+3P4H3u4lz@rJt9P)EZaDsQR@dV=T* z1gT{4@Uk(f#Qr%ebFa?7YU%xP$odP=tkO#v_4~OzZ#;kW+>lDy6nZj^3%Zl|%SZQ# zxWzfXRt}GmWFDz^0cubFL!-FPUsz^4{=Js1DzTk53;on#8J?hav_!^FdOMQJYf`a> z^ZQel)Z5}aDo*~nSoY-|w9X4IBOX75r@P)AQ}lsQM(pf}XSi6>mHDRTwsglDl!5ky zruJ8%)3pS!{6~62s+VEc8GVVR$CfDXH;mW$1x}J*BuDvY^J1-TD+7n~F90QIcC}48 zJtFJi=ak`RxRTnHh$(!S2y4YO7rKA9>)(a^B0sY+q&XUGXZjSYnvmRPF@K6|n6Ut0 zrsj8qIi|-uurCr?$AcWez?EOFxgm+{Ql;{x@1%(96vC!$wjlshr+X{zz=vE?X0>tL zC8m+5r4idff2$dq8Z@>k+HrM@@NiN$CVy~={O;rz^<?Eu&3-0Jke+sq2K5@y`UjVM&v+LXT|3jbX;S)u2fgrwvaohs!w6G_Qnpew9hv z8%;i+ho2ed6is?BF(r~s!J?rfKB+=rd}oAAn=>h&5_34xQ}5w_L*mU zDCFNA;vA&~c$I&J@mp3B+Du9iWqBX~Sl1Nt+M;sILBkfR2gOV(=2o$Bc7J2U7Tp5c zW!sLZ5MA^9c$_!H|049H>(7eI^Tf`JwqgQdDC_u$%&BU`_CZu6+D^4UsT{2bp*K*VcL7Z@CuQnx1Lx`Z%aqgGmvT z$iL1cq4>kN$N8llrVSz~lSMfTs&G2n4fupCNe*J3 z&9qMH`Zw7onPvR<27iKC=XmP*wYRd%O(bb)CW{15GVpy)x2ecy?5oY|g)c0J8q!pj zceFP=CEKgn-sCV_a6j(uahX&{YrSh%DtZYL0;D7<@H``6{za7ve`uLdcfDwlXrf-u z^22xoclh$;phS#(+xfHulXnvVOvQGsIo{cZ9LX42!}f7A{$_7WCev5R+*d9*wAOfG zZ2i_?%|p95Kr~X0*V7{TYnM^aOOsmljNRw$c75@*f9r&J23_Z9dwZxhG?vNo?b}ER zi$IM6L*s__vDDC};ZU)~q#}XAszXCvS3=@Y^T{9T$*AtJ@$7Lu;e;_sJret;>Go-M zbYb_$1v}X^Y}BPQ#^GR)LiwVt?Ffys*RBYf2XcOqFE3|CU3mTmcOzf@CH9-ea~yXp zZm4;5qj**I-FH241XJ;YUa1FnScUYU>cO0IZ&+9C^ULk^{=Su+?`~MEscoX1(VM|w z$K8F|Tx{9sG_CHAy!oTySdD8Z_xsQmEKqXrBRj)S+PZJvFRFDnhjlw^bI5R85wu2W z#v2qtQ;=%@O=MFPz9i^3P7$Qh!%f6|Sdm%(HFHTrXaT zpP_d&d!`X0y~-#I8V$7(D-%`mz4;Y^pzLN1^_$we0z6fRmdy)4(%)7yXFc7ZP7yZQ z^~Dh~9%Z(J4N674DjAJ7^5Th1xmdt*Pj~#`>@iB;0vtDa76;EU$CW%}0jjoOSDpPP ziE|=8t7M@k7`a4!3A>R^}r`w7HpRv2@2@#@W3t z`eb~;@gBK0e*d3;^Vf9I+Eu9aGmpC%=f+!MP|qIz&mG3P=bs_Mzub+AD;u2+w2I%_ zf8KRCpiC)W&G*PJ3K@XBvw%GnTz>e>$3NpH?{c}`@W}W~YxVQ`DuB7&Dgprb`s2{m zkyJN2SuH72;lhbdVw_f!l8&yxj8R6|9-H69{J`8R#&g?ZbaA#GGB(=f)V1>NaAizw z+h$Nss}Si(JK*=){v{UWHD9hs*Fjs}QanoR2JO=Phxaut;t6}lIYUB{NxD}qFMe#I ztwcHdAFZwC+isVWc$vt@I!jl1b?_VcPo3IGe<}brc9+)Lufb238&7IGqc+wNZnm~w&jPmGt z)D}aE6Q2%vxF*%}Zm2h)2GY^x^8LTw!+8lGMqEqTZsH%0EXDUPQreddE{5OI37`uG zD3jb6zmnL4PYzei6M=()R}CZ-lT(AdbHw6ytBby8pHl?`BSdOD;$kB15Zg&h+v|Ra z`cvZV6;RpAYV7fi+V!nm#gb&t-yZ^gwzYx9B{*zH_Jc(iwC&9NNBjrxXpPwQXY*ea zam5SHFnpuUOlL$AdD!)NULg{$$o~6w^GDfj$;XkIZ+d^nRz{>j^T3NN-LKa^NPu}b zJtXR~p&?}!<<@sHy`WrnyO`nU&i;+tAhcBZO1>&s^9teH%(JSEo1j))^PQwJ?YjTnMp&Za*JXb`a1}`Hq*zW87_!0c>szo_fm?S-(6LE)e?LJ*tQ@m%f~b!}+pVtI4f@&- z$D3%bK0-_U@vk4z^^n4;*oQ=y$=s0c&Ca!aa(MRYi~nZl4I3WqqMO zfEUR89kzp9Ym{h|H2PaH+aAUZg$BT*6$T=$8>S3rb8V2*fCX2p^3C)jR?E% zHsa3&xx`w?K;rj#utUbV_P!{c{64F4yzJf#NxRRk-vI$?&{Z_gT|%rZ`|>? zq6haQj9Zg7aXMo{4{sx`UtgDdAqnV~uwexs)z$&B@29kTn}Dvq7--;aFjxW!Nhld} z<*|l}5QmVUz$OteQ?0UJ{-9dn^$}>WHJsKYZ|!BHXd}VKe7)$A#p6F~e?nRnJjtEj ziqe9w{2B6PCY3GZZ*fs&$m(8O)|?bHiBO(;%&y4<5S5`d>_DbiYbgtYoyDIadYB$0 zBh4MMp7Q1cZtL5?srH}Vf@ghxq4VuYvw!B)loj|knD^s|JqEb3TCe{-T~WYTBNwsW zAIR+z=cKq%l&x=X=8(7cU)Pz_jJF_l$}f}BQ_O51{-+=Sr2DvA6Pl54tdAnLrSt;~ zEK;m15DFhgj1yY;kzCQ~=Q`qdsrta0@YZ?-;0x*SIyAW37J8>O*G^CTG;FciWDxvJ zH<|9&&iUZ^HK2Qv{xA~Z?ox;74b+p=7l+2Wu0xL<%iXLMAuS}F!m?m1VWC}jo5#WN zevHb^^v*Y!uQ{@AS|PXGsQ~zbMnuG4ygz@-Gd3`FO5$;aY6qXq`}<1&X@zz?c%ZMx z!S&?TF};|^F6v-!D2vfxbu_hInq8UScv@$J?x+3lokFoRom%1UoI|Cf!asl=IKCsd zv9c%|v@~`TJYxcW-Y}_X{!^oOMX{eN`o1oM(AM6F+ERws=CBt4PG#^Yh_RXfwQhx5 z-ZwX4vuC(Z`^q0bKV$;KYQcL(x&_k{ZPr@1tGE&oe{W4B1bx4HRSTMN9@J`AFbom# zi?F^f^sCIfj_EPLLOv44SH4cQ;xkOkhEx)?_IBAkK3m^QG`{V-*<_uKL)rKYe>Gy zM~vJ>z0g z5eJ_|@}d}iG)*xDh*GP8*|fyz1kTRKpkY^)!hL+?Yz7Ie4de0~)zY8(z+n4_62i!( z&x^&Z;II%LLLE<1YWOb@TM#nnziwMPMi}1a7sn^k!V&7WBDYWa2b&Mqp1$iBx_C3x zPkkjU{7UVisga#E|5KA-d8^P#F0Ys%0FqBbX~R0)x!#2-vA{~wNo6EBkrr<4b-cg< zq(1!^AX>S2ccUphfFV~{a z9?RwB+WCrme{X%0;d0-05Z&?a&V+Yt#eDDWt-D`V1MUt=sm9mmqjL=avRBQ7s?5e{ z05{UW(us5EaI0eESFUt7~Ac&oVJ*SnS)`o943TxEy_}eu8WCbpSk7>6@ z=Wj-BDbFoLDAZrAT2{ey-kk$NM8Sz=yFStPA65d&b?#yLw8OR)l#joJvp=%3 zc&=FNL7VV`SvnZ_2w6=>DtxO9X=|_JkTL%;_L=z(4#ekq=#zCdUFHnPvsC?;AexJ~ z)64SKkG>lw$1x%IEl3UWiO&Dz&gl6R*p=S45~RTvdQT4pcW{j;kZX(2Sf2OuKOtp0vuZsD* zr+r2^X3qKXrhv;yp}?Apx-M5pCMo(SKg$%l5}ijs3~yauh%Rs33QI3R z_dj^6X57%_-Wz&ZtcN0nX(YG4Hp_EUU#^gs<#4@xo=F2{{I1gv-Y4kmZ+ZAK6|Y5# z3qOg1^2)Cf+f-2hxocHhXUsO@oxb)H#=VO#G=XA!E9E9ihR=nI-gD0-w_eFlzgNEUs^L z4>g8;z7?DzB$LhmAmb(eWFbc5WdFS@eU8%C!75ShtBr5&XlSr!_iEgb#MlnE=F0T{Y_`wSn^`Q#*!%L)Q#F;% z`MS0KT{P{u!PPh2o+}fOEhwH-!_Nilus=(P5-b;@L(EKP#9khRFS3m(X%n{2OhS`G z?NR9Gj}UKK*~2hcOga>*!%X)jw)rL9vO))g({E4dL^Ur2H$7?P3*4C4Ch?9Y`8J?w z0r~Um4Uqe%a!+9gg2b+(PGzO5yL!mC$OW-dJvvr7QJA?!xX9Vb$%M$iOphpaeN^yC zc&_^=v?)7(dDyNLi7+!1i2GPL^h?p!dEE^3P_Zn;8q%;3d@Gauu|v8!ups4*y0p6U z^>A%k;11R)*qM_}gMJFAIP%%S^(Q3AYUXCsbU{@h&6WD!V^hk^E{H6d1BMqPfa414=^S4aV^R2jdt2fg>F#OM)G|2&!Xns_M{nb!%>NAhYkWgs`gj zd$?(p%Rl+KFf-?M!VH9Si0j}UpXzf&eN=DT2M&~6L;9*e@kd%i7-H#?@FP~OE2o^O@UMMFqtN_%!mog|1vl5r2kt((7tQUvXsakuce^LBq{{N?Sx^_| zcavn}1R+eHTVqJB=XLjs?y63vm`TID4b$Zf)yrF#p)s0+`BJ6CLxkd7n1~xMh-U@l z5xN=-Z7NlI0XjJ!JsjX|?nsv2)4m*Io$Vr@ZABBet?%YEJuRc?t%Y`WeNZ!`Iwn%! zB8wPacd$3I4zeQ`GbF+njEIdCCn#ncnHPMV&4B{uZpqU-djn>};c)+mBk z1tq<*Lu`{AOaw^$xtMP!t|cO3kIIxE30D!1+a&c{_GcB6=*@2wbeqXWM@E(vR=7$; zT5rp*J*QodYQ8hI8#8}0^=`_4=UW^$Gar{4{@>T3a;n>nU~#j2IYsYE-X9%J19vM; zO~vW!_?&SoQ^%qwM|`m!@i1)HcfXA%I!j8S$;*CwY9TETLO$LUMBWhmKx`u@zeX^9 z0qZ6|qf4uq-MgE6C9QU~NJzYQnmksBLQ_aaplvSBEW|7A`$n?G>!KpJ9X+df6MTgL zpTu&!zNvWk2YY&Lvm_|^Fv*89)#elB^F7$o?_^=q zf-zftb~-6w7cgc2rj(ykbC2tpR2}EKaMf(%6;qM8P6w&M=RIn2f?nIzF0kIJyedmD z`+DOe*OE!$ulDmJkQfEz$B4h_@_4N}HHynX0>8YFL1Ad<8Dnb922Fgi+AwP?^((T{ z#;|nPdUB^IE#q&3DN6cjcX~)&D4$EvL++lhZ!#3l7TV{czuNpUljQ&uMBn<_S#5}% z?l+mlb;|x48zvr~{Um)Zu1KXZNKa@_{n{vDhzsOyB`86rY_J3H0G{Q}9En!^=B2#U zmyvkVnw1DHRW)kya(jg}p48wS=b?E$2|#<$ePdNPdnlKkq1&lAA-_>0U_Y-!W#{+c zE-CMjv{{xpD8BDUK|<&&h5Z)>l-KCZ7!}|wuk2O)mO4z8-m3#|nvij-_gZ&Pe|&{w zOnoUfE0y7<89!3f$^|hzusjycbPdd_2e<? z^*{KkDppnH;a0}99KD6Vy{1cP#2(*c_yrWpF+!*3X1Q;@XTNPi90`y-qOKOv2efg)si=_;c%*DHYL& zzk3Y_m}o$10C8Y85++tfRqz|ThxykpPDmTd6 zHyy&vG`n)}vl%&8vi?Zk8-+eBVjwAwgxWKj%&*>2y*%BjD;~ldzT_6l%1Y8ft|(Sk zj`vI3H(Y&HLdGemn9{&g<~ZKyXnTq=|6mNs2`Sf_U}P}Y+<|XQJN`AMzkDTk0q9+s zo_caR6k(U(etET}2A)g{*uI$G%}cgOJ!S!Is*o371hix>XnQZ%!{gGkF2PNNedd zYdk`-CL}uQ3c|XFF)K!RnAY7R zlHEqIDV#s5&Cc|1T-V4onhvPYi`Co$=3n~v!+6?f8}HqYOlHA2_OtTEnRSuFJG(B| zSa;*&nP~&H*l9Ja7+8}v=fm|beuoJ^1ydga#d_t)|3u6N_)YtB7J*tYq&TQ6vpeUFbubYm z*nw2)jqaWbF}FbG?A>#HmdjVCaJCP_T|Y0*q`>ak8%;d`@9?E}Bosi-?-kclFW&AnM;Gy_;;E6h{ z=nv4l?6JqtASwRezf=2J2gm$a!E$DwNB>rcm<5rATeO~3-*wm%xNzrg)_De5`8|h| zv{^TX(y5>8xFffJ?x^>=`|EPV+~H8~1q@*I^AL)LNxwtlJyWS;q9b|hagoExMzGvm zeetfyjtoeiU9GDVJ=+csK5wvZ2rz#JqP|{4yEPSC8cXL|@4ms6!B4SI=;-xd44$*G zDLsWj_gU#FzAuU!Eaz=Cgx)Fzf&9t}hx8L{rUZH!S~iZjTtf83`#fAiiksEJM*#p@ z=^npj{GQ4ULEhNB#@2ShBCPkm-=~Qy3FOF_i@ygayQ$SQc=PKl&`?0Pnapc;whanQ zAv~M{X+skbI?K90IYvG&^z)Y&y`uL}G?!T(PoD>tp_}19eY7+A3!1^SS3Plcpl%^g z-NADA6{08=8(`GXg-_cXApI!*tYZIY&zGrmfIFNzfZ)G?rI?NZO{7C8<5Ey7KX|Pk z>x<1k?P=7}5YkFdo{DJ=Z4TR<=Iwl``Sw=)A};^@U(DmHj3Sk-C#nO&SK0hOJm%Gj!wrr9fE(51_EG=;CKIp1cxgOQ`No90^lMwgGkbS z0YXu8`?OgIbG-r%S$(6FZeCn7$M`JukMn~lN4>zy%gCr#Ji3j-hQ`&hwe`$!^6&*=o01C)Z55Wbx9my_i}d z^*dK0$mwQM@{|ovf+hub>XJ^NHGvt`ydu!M9GRslR)x5;W#45hyV`vmGOW}!uj1f; zkHsk@pG&P0V`=aO&+N4H`m4J-l5z5?lTr#2PJirT2zuhUB}Z@sd<|lVGd0BiOb?& zWpR7#4d*V9su?G@@eZ6B%ko#SXN(D?phz=hApyn5-a8)+I8Lq$uNDa>+xK2oF6VwU z2T7(&^4OO&&^{FwCJT11C*y+tdvwrs7JtcS@agU1cO!UyWJxx*nKTB>o_LZD=X8NW zdBA4Tw*cHUN*?>vEtN-7p*3Y-XM;E5Y{f#!3YH%UHtC;yW;x9xp+<*b7-p6k;cTQN zB69~5-8zqRSnvLE%~neJisBV1$Pjy6G+B{pNKE37(lR9oQBzZ9gS{tvl{QUWi{&3* z=f$aS6Q=PV50yCEt#SS)NQuz~nK(-kIgLr=bCXPaL_ZhL9Du&1E%>?8MyUNm7-H>X zN(y}4B^`xvI`QA|Z)IGBuyI5b((Kw*a^Vcp<#)WC1$UBt~D0U^h z+Uq&$vrWl{?ewC}v;hM(z%`GvXS2=UmgRsyAstfh$+r@PRp^O7yC73I5>w-AZVqZg z&lb@b0wvy81@gOBeYFmvGGlWYPU2cKAtbR zW+;n_ore7`iH({9E#LMn&HKiY^s=8_ND~(N-h0F9Cky$WK^Ax9**??M%lwcZQL2_G zug8rBjDPa89R|Z@&zJXVh*cQ}CoT71sj~yTdCm$pB2`LHY~nkx--1+7WWNe2q57!k z*jcKYT<9}WCM)+@h{~NMa&r)HWMl+G3a5F?&ybWlL>)-+xJLUXSU;=yj1bC$cMxI= ztCcpCHehq+%JtXtYibBH(kLt>r&7+IEniqtNeN-&xl15Q3pzW0X)7I}P|XZd4R1Ut ztoAGnDx3=4bt_IZ$Tu&baBIcacH^XIjl{%a<_-;CkDhV4a1TGkRov&)^A}wGfjZtx zW>}`{|4BOE#7=Xi%i$C?R$Xjo+mTx3YfL7NdVk7OMrVrjv(g$!f zo#+KGd6H4DW*>KVs*~))&$PeuyDlgoUoG;{`&TbbZ8HVZlKjZ1N8rM0@fQ)h=2pS& zy>eYKPUX@5lbmAj_xH64Q>pCmy63=WzcI(W4>L&eg$!sw#Im&4*g|SMI_#&$%@!(& z@euAG15BAeg!r5H2pobCA8d zWKODqybs%MW%YJ@7-^kwG@gX0p-TK5FXC|1oM1rP=i=s17 zpkD`$t58<)+5G$fI161Oli-a$XqSFNw)%XHj4K-ts#+Sbjs!?x{HJm||(PoT+(2Y^@ zDB+WwkPKvp=Q|Lb5pn0uySU==amE^Q|}B=?#P^@2Y!2KLL5; z)O+1At|fS%UlEK{-8|y!r=YD2KbdbqO8ZT5XO3BR=q3?Bu*2#}goHq~ma%Ur%!>NGg?7 zRH>H3qkUio{E4YFSRKSFgC~$50Lo{YeE|WWfC62lo$9q?2(9c3i3Z}=GaZ4|qG#6L z!4~RmlA>BW_5T~oKDi>0%nzXt4;oae$(`fDe~Up)_A9o;VM)s=0?C|HWB>i)Pw%N- zF+nN*Iz3I(^zgG4f1f8)1G;7A7MALlLU?lnP?_uC;Ly+Y_5rOrtwO1}vQ)6szqE2B zn=?!qxM&Ik#TObww0J65Le*UJxTFUTja7M;Bf{^Is*~m(_a5n_D)T_Bu4~*p(p9*E zXC=)C{*R4i>=6|p4etZWP@#pUA^>0I=#U$y7;?MS zwQ}zHH@j{OfcoPgWuA`wvXy~Nv+2krDTkvkP9G z&hw)XmyZxNW(qh9F%i3uDu3GDt>GFDPwHVyobx{Q`KK3P!GGIL3S}q`IpnMnT(V`I zk{X{9^N~cP6eJ@f)eCtp{~QP!iC1wVFgDTq0?DUQl7zu9e-zy>rKihpD;kau{`{LW z%q02nv%q-Xz6>nfz|G!I0l9Fy>jIhFQ7pHNURZqA+|(Cbk>Ea4@4 zu-A_tO+i<~MbtF`X!0fjCti)L%KvlLGIGf665}7L%@DBD_A%zZR@R?Br5bHlwL`*JnZ2Q>P3^eqCjDIE#LJLvqTW7GhutV zp|*b2ftQu#HF8Mn?lXkZAvYpwpIxJ6-&Q!T%?@-B*!6DO4Y^UnQSdM?34IpS`8GhO z&L@+qHkIkt!QavOrULdqJ&AyzrsB&i6Exvt<~9qUD%X!N-@DVY`ps#cV>wqt?>{Fw z+0V{4YzQ%a?aFvEu{4A3i*zu_uYTz(^O*S+U23panklWh^4+Vo*-6rTj9Sz`wWXAU z(qVFIF;Cd4CTDDbP7{)N&J}^VbDwxN`*kFuoHk^?J|!SRYM&g2SHH#*##a%2=a?Hz z<5Pi|@j~rnAq0{s7Z{@&OQ6x#-!L9^m<+?Rs>V5`xQp=+rFUWg!u1U(DT^un*eg!f zd4tgX%+Oe<-u~Cv@kRCWg8%mdu&4vG=R_H;SS;If^~CF@O~d(})ppz|MmQaKHpu)B zXE+Zgwtcr$V5@?j8b&28Z7fkN_6#2T_oJ8wxauCwDu0EgBm=$`unlptU;_IY4yDCk!4XjUzy-@%>0tUPnuQwn@95X9e&Nf zN3UyYvZyD5A~0iix^F;r-u!Kdxsx2T`iibae?Zp84THgz4}erY^4}Sw%4Ao?K!c3b z6D_221m~ABim$}$73e*B9Qq$dT*_zMV~C0q+QuN1#}B5kdu|HVM)RQvzxKF)apt5u zM9IQID?x=CENWs9mCj29M33FXqw3LTt{^>eh~S?C&#{g-p}!LX;x83Xv?)AZFm*Dq z^Nv#wC@oElUwmt$W7_BFIf90GlKRdq3q2%KsrmT22B;jOWojrfQWLD^yzV07>++T_ zGgv9Z2>?PEN0#%CLoa=?hocMalWlwnLBU%6N_Mn z(^@B4tA_LVkOfd{Y4eIJuvSrwZ;X`|{za~cFxD+dP4yNoO7gLcj*mM15yj`i&(Gf) z<`W&g1AW$AIrOMKQVzF0^M&T^DgW+^H&S;*W--QPG^7GG`*fhgQYLs*fMKc5)(E!xd!NL&BZA*t-}_ z<;Irds=%1-AeOQK) z5BUh9*q-1+8&W5M8=B8(7Vs%=z+B7p^dA&M(%HP|Wb0nf6K8R3jua1vj8r7sO+EKZ zpW~nEGko?2(%=gwAv$Mg#&P^$Ot8JL5F=oe%J3SVJ@864LULpT93G>MgAq1 z_3&UCfb1YS{%|0vfZayK6J8ct5;%Q_YvUaAvzGu8aBpx*X|KX4zf$~ zBCLNvg~+y-Yf%@0ms#9pn9DykrKNz&IHjRI4%za|u{?46^>4(us5XVEAGZtK%8^`b z^%=##v4m)EPUl1$4#7OmQS7d!vuj(1?_@e*U*E(oqu)9-#W&lK*_8NL%H`Rhl^QMD z&AL0b;kC=-=yw8gBCKU?*x0#?lauDwZ>Mr^7=(h~x$G#1edH;7>z~PNZC6{zP72i=v#MZ{rwvvtsOoX zudSS@6kg@~()P)Bv`rCKxfK<=)6TXQxe&eY?oHc@o!aC_z=nO8T*Spj zs@$zHea$ z`tSZ_!zHTjL`Cmiz4C_VFbBJejp%v=S54-{XXLwB^4fn-Bwc*ad*~1g7N?Sp#t+-o zdp^8FU$8CL#(~2K6k+hxjJRKi^CCgkzs;0nP^X*Dlc^gTkpP$l%lzgrS zFUuLynh@lv&;K10rB#iCvqo`0wXM|dQTjdK*mx*m!Q`)EadcMw+3}XOvm9LEEIYz- zeD=IVHw%$A-|?*hldNy-H#W=0CMTfi#8sX>LV=#J&c$UHx#IC7mlPS?rTgwl;-3Cl=(8 zM>8=&Kuzfxq(!EQzi6RcNDb&b8AyJtHrz!?)tG}C^ouwCLqS?tsrZf&BhxO8ar`i4_73`%^Z>4{m*6gWPx?!Q!*T(tmW_9^c|*A z1fT-|Zng*%S+j(!9>;iA73K8}38j#mov)}R8<>B``)DFJcjIVa@^`AZ)&3C3D+jfi zp-2&R=*Jh@jI2XKT68V`WSf%@UnhXlHNDB))HNP{=b47zrK1-Krf*mubjK>lQ4dRa zES$Bd5^(1U@R6E9PV?#KwN;>rf0SQ0W?l&X@$e zLu-l{v)fZaX%QilWe9E^T5(9G4K`C%=RcZBuyf!Fzcyn&l`V?g+y~m;?2g$?D>VgZ_J$M=*x085TMQG>Y>uqV54%aTq!77sY#9aW*#~T0X}&y&d+-d zf7k)tBjIII#o*cl+7{%^1@d{E>XMMSmeU@pY-TsGv|2pb#FkhuCe!Uds|Vj06kewV z2=pH|ejFHG29^#nnp=H_yk!kiEtu=uQ7F8^S4U8)7CH)Q<(+D+8GHsplZdAhsa|yR z&;9}q>Ti!eO)`WvCTqH}z|@YK=kZJok8TBV!MUhF%H=k+u4;hIJ(g~Oi&RRMa|gDw zZTmcKMBw7_l=^T_K>BUQ=zUZ!_qa5fN#oeheOESlR5Z`Lgylxml>`>8#j;-Llko@W)Z5N^nGZrT{0irfd#47+N_14#UeeoIPH{PfqhwIwCv3J}xY7yhm z(uOH=EOT!*;@q4q_}_6&E?}vpHU3X=MuSk#y7rfENN%e6K0AvV&*uVppW073oe_bH zq$G`R>+33B;|t#2;GnoR-mYE&QQ6Nb&guDsZceR5BdU6JW)--HjnQ~x zt@Zq@1JUv-`H!xTG)F3o8}YLB<(M8_Z3Sujgq_K-kMCXNmD# zPNUF6oS^iNf=u^*eChUz;^MpwKFT&Ptoer5^Ec1>P+^HJ8RqVhCjZ3jHSe}-F~gOr zxmGL(W9_efnyLqX4;p<;0oY+|aGTW>@oJ#zJ@&O3{yjtU3`N1J*@|H1{kcUsFV=Zt z<)|qeO(5sj13F5Zsg_&K_-xjJ<>0%VVdctW<`mHC<_E!)$U<@MIXXFiw2%8CR2AF7 zWX|#hsR^Wgi_X3w%>e-GJ&!D8(G}nc>K*p4G8pG{j@Y>cro0W>4!SP8F3r;q0(#i9 znduHWU3OO@f-=io(vup-AL-v=6Of_n(cuKzQ|fUgTv9wYbqc(P%2VXSO#UGw-so_y z`8>Zg?t(iGDUv6aBTN|~Q?aG0sk7|3DsB$%DQyssZFpJ38&GuFE3cz+Uz%pD1#r1z zj!kVCdY4mB#}GU-9w?m(a#4dHHX2BzsZcFJ`VXOw#x?s54H+IVLv7FFr5-?cuUTmB zSI!qt>_eF}@Ch5aEPw5NnSm~PRg>J~ZN8KWBH68^rpN^d(Q-AtC(o>IW+VXQxMF_q z?yR5J;1;J@)I=k?Uc>&{{D!A;N;(7B!uj86&}**A^B`q9HhFSfSEvR@n7oOL8js7J zXr8Yic8C(UXmS#V(wqRIl`qv(+r&ct{z=86;m)z0wysUgK z=Kp1j$J}IUBbQOP=!}+y&PUbZp(BU6hupswy_hr7G?_jDk)8m%EdOG@*}N?FK-bQ$ zES=h@RZ4&&J^K|nj*S+4*~ed z7h&YA0;&9~t%sv45b0-Jx;L_BKdMZGS$=gH7dH@~ch;`t(y44dseS1D@6Ya2%l5AL z-lF@8N{A$?L|}><+%brst-)>Lin8+G>WTstob=FVp4=b+cpHVrE){vd^C&T6Zz5a; z!15fc*Qyuhs-c=7ff+rj^4Ydw@u5Sz36+IKZc<6-smbiaqr#~18_D1>4W|uuE8setu<~yf% z7xb!z2|+r1iIzn5NmEjH%oFJ>B!135TC~cAR(I9^f15q{mG9J`?>U4}`dp#;Hz4FR)Mk5`YkZv1$2Kz0bsD+LWL5^nmAm{qGh?4IBlDlP`7$ z|KnPrAaxtM;!E?9EFsUgJxhWO$j!TGmfvR2*{VS`8690(Zu4kW{R}b zm)n-1$@ixE#>3|^~Yw4t7rmR;i;eI zqT}Ke?z@E26_C=C{rN{}&l0(uSl$Dpz57CLVH1-EX12-xi}Uu6Cz$Xmi=qfVUnw*b z2Gl#RH*F|Sn-;n>YC7BeK_LZ^uHuKuWEu5-cxd@N<3Ly8CXLD-%|8rg3fGor_IMTR z!(5hcc@ldi@Z0pfE^Xot+L@^Bf0=oEYI8~K-`$~wC|XXnn^E6SWu(d#`hG@hmQx1j z#n**2vZ00>pv>@_K*43{``<6U@1iHO%yU5+2nf=eNO5>`|CcU!1B^&5IST7aB6~U% zL@tK&+YE0g8dh04E0BIfn}@793TIpx?j~CTdGu~v07%laX7f; zT3tbSrqsevJwD?2%lCYId@wE^nB5$vcRC{FSgOIjWAJY!@bV&pi-B(2;#p6r)PEl5 z7Z-l+rYioM`>Jsr4c;9NHwAPH6rm$EzO&<7M}b{*>ryqcc|os#6A#D5Y-z1{`divg z#8YYpXNb5JNu>`emc$1^4;KfGlIbtbPlhFo9@%^a?PcP~=V5Vi^vnBI3hpKDIVLCH zy{2*-*yE$;{4zsru4i*IEY;7+f)T*zfsWrxmBRgnP8iF;BbsC2}^bon!phG|5R2ReN-%oE;UfDX&INei%RejRwU9!k2%=E=Ud6nZ zME^@wJx@y|s|ATH75srdSMWr_RP-HHZmY%aEru%Pe1ogq~|4XgQZiOY$o}2wgy3bzuNtzC`I?SE%>foke6}O9q5RcdT(v$U?NG&)a z`bt89ov*Iv71NYq$S|b1TD+!ceXIFHidZZYX6C+N#tfo$n+v$;&lf9I!O19K(3&aG ztJ)Q_%=uzAdU|mW!?*9Rs-ogBg^Qlo98TC2>zO0j57DxvTpX>rQC3|n2J0CgHdf;C zOStP$v`Qi(`R$(g)0}RFu<`9urXVeuUr4B`Q0pnn!%+bN& z@tD}C1(G(3nM$K1NKf181t@yoBQ8V>fzXf!b7)yu(E(TlYB)7&u~(OdLZoa9tFeUg zVr~aMOm|FLAe@y!Ex;tyN?OZHbL)w~o0pL9Tz6rV_@QO648zB2mwWcUF*|SYTfVU^ z+eN{>twcpI$HPt2lSn2mo9GQrNT08x>@z`PsY^^;)D5)8J+p$+59c()O0UiAE*_Ma)PO`_ELjEOa+ZPR(FZpd;VT??=sb42+p8>(4*s(bDjeI zU5JQ)x*9D3TWlnHj}54@~z>R%fg_Qt;aEJ%q+b z#+CFlrZn5UN^UU$K-pOa(%n<#<`^?rp4Bg4CfW2+luNEapj*8t6OZ$iscFhjoYwYU zzg|$Lz&yCZB&M+35Gm zxjmcE!{>o;k{N(sx|AX#o;So(%%Aq9kB%2+ZHTCyc6AoEIm6W$>nI@Eg$FgS)lfZk zXl=`fa$^f02yVIj%i{8OhBJ|MNPyNkJW~f13ix}v_JRi5Y(HN*lK;ef+{wLHLYpe^ zXklj5)L`VW63fsnY|Q*S(!nniHzpoon2H+s>8%nE3kLQ za=*0Pv3xG0pJnzvuD!G~PDx6i-w%DVpqu>A>n=OEfU?j*v;RtuWQW}_B@|aT)U7mJZTeCs5VjY7uM!y@s?=wg$@& zGkLgQxiCFz`*4!ldJLz13HczE59-;wI5^0D_+e1@&x8e*^*WxfD2qU^{-7Cue^awxj1!6J;tIwBP_um~^m(fC!v$hHW<8 z-f<1y6SxjXSvpL47KSBv-G3yi=(WEY_uf;Z=ohyO)gxvBnCrc#$yz|}ohP)itK2o7 z)Nq?NsNrEQKMi|1HOn#A_?m_)LH-3`x^w?Y-o`X21$l+kmANZyFQAm&iU`M8U3RP2Moy)!D1FJ4>F3 z7^7~#8MgNp`>6JZHpAvB6L)ie*_^DTtK9tzQ0{h_r3e}0$K}bI*C><-Jl=~ffS(EQ zP!2%#q#MqOxOh?8bxaoIsPSwgHJ_{_*j+*j5Z(sv*B^t;td19q$GM04iWu3iG6Dcd zT-JikjlN;=`$1MHw+7(W3J;rkks?rlrn_^WTDo7cK5iyTlm@eBnXBJoJCKTcvOEdFi~b1w?2me`<0)Tt16h&G$pJVzX((qR%>V@cbw%Gz_Bpq68t_B-bS%W@2&|GTu4qqwilyFS;aJ*;H$9X?7qjPHenzr{( zhTOvHwTfNM2>)yN7^wwq6y02HsGp0?kD^8yAZN|@s4vYrA$+gM3XSJr#M;A=7C%l&(_ z?%Oj%DK0k_+W!2B|Cd=ok+GHU_8&dAGPkX66)aCe(own#h}Lzd>_i6)&rnc0Q>`Y+ z21CKD{3lNqDsK*h^X+5E6&TM#>%TEr?s|%@&hq;tj-z}4TGO$LPlkiQ8_-FDAF%=% zDl3{J&N_MV(|{}K?e;}ryW~}Y`Mq#n&Cnh6I&^Y@5}d{?*!b^`EXLKLD3?VW`Z=CN zj_p!45)UlF$Ep;}mfb$b7X9{9)&Z%RjUJS2|z+FyK*p%;NMAr~!6w z&YUq&HnhBC5b2Oi4eL zULIb=-CwhIKFi-S$}%kdub;(4q^+x8zdY#mXR;yMgVyWKX5yA9BHpeNX|%L#TO7%-o_M(Wv87 zhjsWmr%U8}wxvjijz?m&ti0~O@P18)$eXg`lrBlAvH2`4+T)fnWN{zk?-<9PBvo^Gc)E4G z)BXQmfGAsxB$HC9RE@_Hdfp#nsI54}PR$gnRE(0J*9SliWo7h-nPVDei_F17zXu1$ zFOA3Bj|bX(wyXvF5r^Re`1-S*+~Bf{X}{EPd*t35fg?lJoUcZI`<8pLwKi_5ukKVNER5wl;e27HEshOM zHOs-HcOksm{N9pNl-&+k@E%szyX^DBQx>J?C*k{x;djfeRR1`X^{r9W>gc#ev@PWM z4kou(+dr4fh$bSP9{ifcX?`pidUE?;n@Y2bu|WQumzVKW4c}s?I!f;RU02Ei3R06v z@VFc0xUevPXeds1nYCEYkqhn}ijcVGy=K;$>!A0ob;`>ow#{z+|7bebcqaeVJ<`hy`&gU~VhveKG8vZK>$={b_v`h1dZLl?-efOBZjLlbWeI4k_<1yVv29>3_N(y3*ksT)Lq zKuO3Pq}12HIyn~%b>jZ)#2)^7c!tJ?;2rBZm=xVHrro4wjw2nJ>G*S%sTeRazu*2d zcuOS}WcEx>#PptKr{uo(Qc<)6*BwH5QIMq2!$UH}TNP`=gAF{f6#vDYjj35xU)8 znYcq$Wk|nk$o|xm5BG#*I6nwRKnXaf*qd*sY%X*jvbRgzChB?VK)b%e_cH; z!V}ST!h2N;#W_cl%LRW{2PE4K#u>zVAmfsfl44^|2ggD#3PVxiVS}Y_C5%sJ$4!6C zx|kX~#?`B}DrwIPu^6QGwf0lRhtF`uYX@IuQuks5Z@DW}N62RYsk=k*@4c4}9C*TR zh?$Qv*NKql5pI_Cqc^wIAU!M@R4!xn*|@4=&ZpwhzFnc&8ofMdzjId=h+&p#*R5HZhmq5%DZzlww3 z8iWSlqBwAwJ6OJ{p9iM9D{J6x^!&R#)n7Y@O2R+;kU# zx<4Mn6zXaKSHsMpJ_L3&J4en(1u>}VH&nMBs5;X`s$5)Jiem`cBEHT^=U#)dBM+aA zzLDMm0lu(9STm1rQ}mENuUZ$&@-yR(Le^pq-n+uH<%%+-W>lMMM&n}*4~#^JUXMzI$tZv$O^5L);O0>{QOd!03pLJ%l=2)cmx z+x&d`co`_4D>V<90+P->DqMugiP&eJyfNrXKYhYPGq(1W5#xbNeX2_Y5@vDwms3%( zO{ICg!9VtrCBb$ub9Ss>r(lwzbDiUM>ekylD?@5yTp#AYT#Sf?3M9u>vehqNH|GSn zm&D&l+)LfM+6G-sSStM*OJ0*43l#-`<<7}l@E62dQJwfki5CqA$Si%KhnvCcDLmU$ z)P+pZ;#NlbMT&*|D8R<>zg^)R`94yFpP*aDf(w+`D$?`Y$x*?U1Mng408`@bt&Iyw zHEdg3K$BIz-NrqUi@OfdvUtDXe;l&jeia4vr zbhljVI@_-<=!(j;6WQoDG9}g4I{I5fx3&L%jcm7g?rKSxcD_fXj4qO02c^y_%VT5- zHFTfzVkJFYN0`jXFspH=r(p`)V}}x{PL@9aFC6}>lX|awDvXy;1wT2LhkG*`IDCB} z^UJwZy;MHEKLu|e^!j*M(5Lq4{r#bmgI7NK^B?7EDGSRo8^BJoq?atuM+VQo#zq5p z%ys*b)&py|%Mk)!7N{#H>$OgFIW*!o_dPrQx67y@T&ueb;TM&$ey(xMF69dIYL25H zk4{Lgz(-*>LVc%liaY(4bW>APZp073Os%4bX0G?ZE_?gr)TNx`DcI@-D?zJR4ug+FrjRzeGjq10AC7!YZhQo9 z+7H2DS{#sc%vS$$W68CEclWdFpyy538+g1H%;Nt8wGK+IXP&Z1A!1#1Se7Hx<|Ar;5Pvh zKs&f@Yd~<0;Z-S1)W(Hg&Y2I#8gs5tmax0`r?(E+>vRkb1!TNR#o9aK;B^JKF#SHk z3pf(8&b?l%rs(3B#*r2z@#4g%UcGa9Q8(XJ*uN}HEup~f$EmFD{`hh5wiYX#fAI70 z-=$2Y^#8brzsQTgoS+uwskp*c_&K1jTmB!)!N&6O3=EaxTo-ZAy(h%uwD+HZYdP|l zHt|F!xH7))PL^0pGv!~*^86J%(G{&pZ5gUKxYcNx#a<04-!#l~Gs*RWU z^*hlE3>8{TnIT**QDp<-!9Vn6@w#@fr^VDk6)-ny#JeZsz( z+T)b>J2}yff!Xcf>Qw4tWe~~RxsoDg1jc7;brSoR?Lv1(SFxhP8Yp~G#5ARa%JUqA zarqpY**Tq<7)Zvv-e}jV;V8EG)*@W&M<+E0=C86akYXo+9etg2x#q}h2h^&D=?444 zqUM^XR2WpRc2T@V6^|t@#yv6aWg8|xmA?G0jX}JLpJLCZy@$z=l$=WGe(KNv9$mIs{z80|>m!*qISv6`30tcnjKCr+?qrXEQBUe* zfc^oD(u^#G?M;gxv!}~yLd38BAg&ZV_#(w=JQWtWeHkGygwo4XedV0srrc8;Gmr}Y zZ^&D*jC27F%&QNG0X1*keJYZN6+}*f3~R==%l#=mMvgPyDA8G%9)LNf_?4 zrVjAmi;KD3$G!5<@C;D7T2vQU{kcMaYnX;x-`_e&J5qoEFf_{zmWuOfljaA zZang5ao`~8kcTVFp*&9aGcQ>(*C*Iylw1`05*Ew2ce;%=Om-ruQJw1=d(^=$_9y1G zk(YE8jhvvBs%KDEkA6(rc%Yzu1~r}-gz7x9G&{`p>23YPZ$#pT&gD!`$*?nXND$cm zCxGHqcN~6-rEXK~`g7xlGjMNvUx;?~m?kl@S6QZ|t=7RFL8zw~wDN)m#4#^92vN_a zRv$O2Pcw2U@X}p(Qb4Y!O+L;6uj9R>znHYYbG-2NqBP{+&faoVWtRZK5Kh1tJ)q_W zUzlGjk4w0k<8D-+W2`hVJoGyGou{N-2B*7@tnXw%3ktHYSYBK_j~7Op{K&uK_rV!p zn^Dc2iP>5d_F|~Clp&ui9w(uEc|l=>IG}PZxJTIA>WAt4xk2hD6nl9?tFVA{w-+{GvC3~hQzifWli!BRDu}D(wGVxo+?== z@in#U;4dsj+V}+_VS&NS_=)OOb56*VL&qk6(gBD<%VF%z>h+S%EaaIlq% zTVR!QZmtJQOGT^w%bx64S5N!8B99UZ-xzzrEkKRB52l0UyJ)}KhqQ`b(k)aoPp}DcSJywd{!;%K8g*9(8RRP}UYPr=!5J|dCW6c_FoV}_C;i>n*xH>G znVfI?x2cwBp}Spl6qWezN3MVl4UIO(gyzdtJ$|pG+9%M9y%}(eu0L|-;fn<@V?JqX zE7d&F(kLmG&w^tMJp8zGwPfb)Js!Qc>{dW$g|$-Mwu7bbDM4aE`GiRC zN;<%X6%9I^n(Sj7 z*PMU;OFTU32vB&=@{Xe+<&cD+Q493@dB0#nA+i90eutcp2s{2m@yfyKWNjn|YPiAP zug|zPHWsHWw<>kQG*(jLyx_vskGLD|+Al{6MDd(+>bc0hErY{1?r=47;RQRLpwju~ zAlEofk|I+4A#Os^?ftomHv^pg94}bh@Z~ia=V$Z#ThYDGD4ree7_C_{H)gSs*_S5= z$-&xM1pFEJqyy=2-G>I-aw8dd4CgozvL0t4R?;2M9weTHgmdx!ZDySMySwX*$;=>P zup;65(>JMP*T;@++pQOdKDGZ@4lZ4Dl>p%#$4u>?3`3_8Xw%!blacWH?aS6PG1?T{ z<@aS}Z_G4JZ8LcqVeB95n-5DGj(kw5RlXe@7#S#~h<6CeP9Y)$>WW`CNmyR)ZnexL z(F;*_GRb8Ad=#(ovTKGNAgd>M{R%Wom*3Q{o}SJA-0QJTzJPi{3WVVr|L0{JjcN~y_%5Vx)rAh z;hxC*#G4p%G>b)=6%dOdTiGo8%E4HJ0azNf9pn@@Mg$U4VRc$nzJ`AJp{g+298xc5 zKX*o@kIy#M_uaj(GDVV>P#Fb!3-#3B{?^__z!$%+JBGCEiwgKzchR+W zAXW&VrReYy5=gkqQ+JBh6*PbQa~tDSbcMn=aT>BGnJPY`pT0+#H)Xxx*j)4q0@xG^0@{r z*F--+8wO-K$1K^GFXEuGqvwtsdZ2UZWO)g8f+1GVm z*Rz~pZ>o3|apfu8+1u%Zr!9;l()dRB+^W)04-tdkC)}8n^Cym`o&y~LI8_tvaPrl@ z3;yThtQN{DXu;@@;^&=tzy*9hHuALC`x4bko#~+4;I-o7$I^?Wb2AM*>J!2{5pIh2 zN>C@Q#q7!b*s=J{v8kU341y-$3;f!P6YTl5v-gs)uXEaO1o!7PF9dg1O`1MoKTfI@ zmVfYyqJW;AUpm-W`uX0HVO$?%&=tn8>G`YaF|3*saYP7#dcC&1e2!EWm$XDeWEOG6 zSK0bnnnXv_t0|uz5iI2B{b&Mq7Z{~BJM%WB-c1uJL48P7ZgN_jKeaS8)l}&7Vv}**899j^H5os!aa*R zg-2L?(!V6O3q)o$yf>Ka`Zh`qgC^f3oH};*`_R@4g23kJ_mGMKF&SCo$8yLqC?3o? zv1x=&V^8ICRUx~b4~K?o^TIBqV!kc9sB#-RpY(@9QP0P9vN^PILcgQ*JRh0u?)5wX~$gamdNTH-{JoZML=jtZ~8o^|TWymXRYD`8v8f7fZI zi1|c1u}u&5uSz$C#)B9Iio}bULfbq=~~YD2N0(|ER@D6lUKq$&YZrF(*&e}%yDIE z1)8sJg|{ z?bOfK0C$vp?|y4OXw_6|W-eAuS7=$OQyyAc)pEBXV)-K%n3r99xS6EqJcPr@Sjkro z*37V?K+jt!Xowt`17ZEe9!1n0aaSCkYmG@pa_txF5x$bHTUtFv5jpi$jw4&QeMX>alFrtC3@QP!vp z>1n6c86O~zNGz&6Y)>@mV9hWfQcCZ@oy8N$EXnrd6Zem%8=HSH=o`Pwijwe+R%QB2h*A~!JsTB}1$h5% zQl|xJM#BNP-5D&=9Fnv_&N(IMHTq&(NLfW?1?Oa9?${?k@KIXW@V$3ZttOfWyR@c{ zWnQl+V9t#NK~Hez+h~EEl_C0fvU-9qCUqZiwHq(vQhV^J(&@5bBh(_xa?!Xo(I_hmG{ z2_>%^O5&^!*(u&C_nLt`*F;NSahcRD#5Sz5XN6@jSX4Fu*nr{uMSHH*q<_Pkwv2+BruvIb&M!(EMV8MlLNgU3V+BI^wl z?N^rNKy(ak{Ila!G~7wNOV}WoFdB$Y74@Q33XA=x_)`Ca9zAaapmcT?9~ZdPW8O?t#Lfwi6}u|Od~OZgo?H#hFGGZw zFRQ;UxDNGDyJa9aEa`QDQ0Qm^oDWeV4DV*sUDYDMX^6qrK>C)G{w7mrH1X}oo0~sl z$pDRW?rXcVJCfci)5jA(wd$dpA`x=g4qB(0Mj}dHy}4A>Pz1PTu+VsG;^j#TLLo6g zkK*_8-B8yN0lBMn*_khnHK)F+Rd>G|Fsv?ExZfwFsEQQvyqEgILSJ9MfrWk>(+_*ME>;y! zRe03VUKM|zF6E^%4SwS7z}?w8h*FV%kfGZL7PfP#Z_#g8Mhx1`&#UjuQ4_`%NCoR( z3d8UuEy-N(rUhacr0`*!ECl^*E^qe*=MPHYsMLi)C<_7?#4nqIqaH0doc3U!5$Nq= z47H_!P^frGBDM^(M)}Iw>w1SI#P01JlylzO^v;}1RQ)S+e$p#+Uk(@T#6hw z(jcz>jmzmz1mie_!s*bKxvK=mOM7+K@2{&Kn9_iDLU zxLFa>80${n2gknx_~cm$No!qQ-P4kf&?ID7KQ@uD*tp4A?nK`d_+`vbVMIpD6=Mc>Dr& z+WD!mrrh%UZ>QG5Z-AO@y$=)JlCBnofITWIclz7EX(LbN%3FL6JwBvh zdH7@RpQhWLqx|4dzq4M@`@^J!{Rp=|n#FT>3$E8KQCIhuIpg7(MnbD9#-A{|c*wNz z_})Bo&WeerM*cQg__pWdl3qOKLDdUCP0-|ep`4CoQM&?Ah2b%Y{N%qO4w;*AFCOG9 z_@@`sY6D`D*gO43LKjJYc79*94qECOnRzT3PckJXZO?Eve2=*@>Q*MorjY&tM=Sl= z2Rn|j?XFE1dUJDGeq}ic9y8lkR~{+VhJ1AJgnnWB(;4OOg}j??`nkcOge`;n(}t+Z+U9C= ze8apykz@Cg%WxM62X_>k;#SlJYo|RW`{&xnk$x(iC0uU6e2;MGL3k$~lY=!x6u!kp zkA<9c)l$)lA}B-Pb0k7xCL!p$VQ+sMb!JcS5Gm4R{-;@aF2_a~do z=rI+=5eeN%t{xS&AzKs`hO{Fz$jbVMtJaYZvAy%mlOpWsgoL;x8>odGgWccH9;zL~ z1Vs6grNNRcbvGZbkh*R-^DwFutr7Hn@K=@21 zD@oNteByaTt;O3v*+0(zR<-;DCk0l@4BjPg8F#72Y+2eAJ z%YW&W2N~vb?Hp8+x0|)#&LmUAVs~rns+Ilu8*%9r5EmpLR8^$H2kjl$j=eCnx^t() zAjcN@lwbpi4rrj_sV8A`sUKy`2Ryoyk`j_6YD3yw;V8(ppoZ_+hUUGI$ThsNXb?Tk z*c?;KdQ`m&aPE-iSO9aDK>$;9#tdCc@~BB=r4bJWDFT;+zL$7i7dj?ZL51+sV^8Nif{RrjF@RytglMu~y$hqJ? zq2kG?qsywj&@&#{V|HWg+tr0II6bJzz@HH}z>3f{HZ&gJYYzO6=7C!7v!b#?2ck4;X^Yg4|A3W?9G8H=uo$r#cF47hg<)P zaXw9StZiu4I0txQJDRm@Xp93Z{|fFj8FWvJt9+=v*jgQx%xXHZhCE)RPiwxI3b(Jzys96VGS7PHk;ygSEh#8A8^D9pv{ ze=2MTS^mtwT2o-$GT*e5H5I3fzhnkl6hfBfg?hhry$ki(P?;IzF8Ot}e<&e zQehE1j0W<$wbIB`&xQ}${jf>=r>Qu!Z-HE<2*~$&qew@Y^P_EIT6Chy8nJGpp0RalbXYC;9`@!ou__p4SXc z(~~K{Eb89nI8qmd_f{{`z%KPRW0gCgB}Q(snnxU}cJ4!5P&s{=Gl!k!Lco=LHUfmc zws7)$E2raJcFta&D#5)2+cUC;5zp2^xz$m>mdz1o=bIZ)D!h-9Ke;?LnKG|tDUtvj zG7ucj1u`*(sLqh5YFaGnK;JY^K&0f}l{Fu8%CY4&(Cf}x+;)Yl{@G7rs}-?wb4gL( zKfBaFy5p_#F@K#95+J|>3x>KrHJuvO)8B;jxn?3>Y8?9j_GV<6x(E_kA>zx4O7BIk z8R16D?$EmWf}byvu_U?3hiA&kRH?}q*`m+YbE)DMBF#kzB=O;`(HifgYgiH1o1=xP z?-u7odUS3~s`rA$ZkL!<$sq&E1GwR+vn5=%aI=O5-AgI5#i5)>vjL615c_>~W!y5w z$wiNQ?I*q^V{sPD4Up8`kD0SvL>S`&oImSeTRZ?65T`nSlooAqZsq8UZ1fkZ;DBAS zG`lSbmU{XP;O}zKQYa(tYK~}6R~#c{_u>fhM@+?sw(u``_5$sNd%K~hpc zB{8Zle1qM5!7(o%`Q#!lYvTEv!k?Eta0QA+gU;vi!}t{pFyAGB=%#wLhL`o^VwDXa zK=bX-{ zR%&d3btpuGgs_}7k`;y&>`K$9Gs;p>Bc?H*nnJq-KbhpKQij+eGn5B7gM&SnGas@iNi#DxJxX{%=wh)? zZWT__n`0X7DY2v?j{%I!I&K;36wH+F#XQy#Q;!n7C_lcunOSrsSJ^stfu%=mG_U zg9BQn)Nd&nliL&`i;jn$HW|ysTjTE9LfZXBuu?j$b|%gU*B1ME7Ej0R`~!-3G?0 zFe#!oR9@h!UTSY0ASd1y!Kgw@~?@-JAcs`ay+=~h_7`_@vEQt|; zA7_RqUFFe$w4FpR{2UrO2BEMyGp=vKqyFHXQDIVU`y>)#(L2Wc%j!OOc~m;=>*%Dq z6=}Zv@M(A5LTWNy^U>mUgWhw7bdE8@?Yf~zL5qW4VS?M0o^Y}g%Dx^^H?-Z>NMB-q z72;^GsB@ii^!r)AFODVcp6Tw+nd}p)tgJl3dLtNDs=#9__;BJill98q`|>a0<@^cy ze!qCmZfu_(@WTXhuoM$ct(Z15j=yjWXlHp15Om+tqNO5q-di@{+4f@&yQUz%VZKRE z>oy-3TuRsA16M)WyUHvQl0%x)FOsiWX>pgzO>ma@b@fJ2P*5!vPuwX^`n_K^M5E2q zY$|i}#0|}VY_L^`TYJkAb9Fceleb7xN7C&3Q}5kG*!K=MJrqTv8oM{?tXK3H4CUX> za=*kaZ$Y4)MZ9G{D_T?}H^Q?ZRd=VtWyvHDjw*;ZTZds5KVMBa{HtV+8qA)0!deg) ziDg`;o8KPZ{XVUHlI86-6H?JcLN%@~C!R5W>({o#m`^Cpk|Ow%<|t@fpZ@E zKehePFLLGx+GZc${PCdEaU2 zuEU+O93jmRrqX;P$>F5|Kg7buhs}pia`W+o0tgDQM|n z+~eN?{dNSWaK0Hqd+>(S1c#CMzI8Rq7mjnVpb1ztEd`Zdb)hOg7UURK`iyka-+hl$ zAB%tQoxpC=JrZ_5S04PCcTszq-;7f$rmJTDR@i)sI?iHWJf7sVlyq|S%}3;ym2~>5 zEHN=*q1#~7ze46r&^mMI%~Y8@yMKmJ|7E5O8+!Z~Dac@LDBDO0|Bpjf4G3U-ovo^W ze{!5TIoV{;WdMJf7`^*PzE3I7_`HF>dndxj<8Zl||8~}IweG}h-Gh<--0Av58avLr z>+jbnk_2HMVEfGu8Pnb^|1jmTgRi{tjm$5ryKU(Kt!d^Rdiv-Oe1u|7Y52nKcTmoe zs*{({lm{rN%(UV?t=D0DU24q=bt^t#8Tq~4q+JdpVq@NW35|KKfy*NJ@i}byfXm;N zg=VA}Mk6Aw>_nKPSWDd5#3S)74zB)VpZqmW^h~ZQmmI}6NB9!9sc{Csf0IRxd+`n7-PM_HFPsvfVs=9Up9t7IhU%aiewOHMow6kcV};GzB@ zSjTPpX2j^diTh_3zso)~Ja{;q)#*)OB~&zOATJrm17Y&2z3Mrc9H8+&QQV&&54dM& z?g6wU?*j1L5IoT=e<#f^q4w};S8dkrm;85MU$LN`DBa?AxQithUP>t4;XH`5HJ)P> zV#bdm>c4S^)e%CV7{qZIw5@$j@_IMl(@=O47Xrd98$fJ<1IY`jl<&>-&4TP7TSoq8 zv+~W(WRfwW#nINjfrIQQ5#o ziYL=rMu6KmltN}!aQosTYrPdzR{rR$qY?U)p$%~ahrbTZZ+?r!I}ifOiZM)`EW}IZ z>IZ({XbK1-50C-eyQ*^-dihjZ`*I4`CJ{pHb2NHH-#tyx+n``YF1F1dPjnXQ`7bqg zcH=+2U#EH^%8FtvM%g;+r&2gfb!XYsm4A2k^j7UhM1RrMx(g5oztRoXS^N7(3|3u} z8x{+x@j$5QK=i23d0mdQX^OH^aEta9BP1jwcLs{L{i&v<(Hr45M$^zc_??t^CF!kb zDri<5mqj+Tk}s;*I{kd9VcW=@JX5nLlO@$|%^xE4HwK7xGej z>X(FPJe5L<&MviWjSQMkk#UH;?h|t{VN8hX+wZtLJm8C;BltZ>#(nK2z9O{Yq=;$P zzdp-6813VAHoC>i_%)0~mH9byzro$nR6Arb@)GLQV0yZuPaAUnZaJbxN<(_Bg`L9{%S~)L|PW7;1sa8(It({}J9L zXZ(zshu{$r&I_xH7?PK5hB(pVvyL13e+F;s@>eGe)ZKyq@Y*>07MIl;$%KgVOp85u z}0>2x57HR!r;6#q1uz|wWY%#gaBdcvqH%Cqt`ygw;LJU;pWZXq$u?v;k;S+ zVR_X>pNY-y>bD-Fv>>K3+G&C~>HfShrM@BuF?pyRq(rpP>xiM@XbEPb&k4B=b2LVS z$e1hRrE3$Q%~Me0jAt!R1YE8Z->KrA5HW1%i>vhF2BYBQ!LSr;}M(8_45cM-!2zQRrUuNnjK$uRRr+~7K}m&!F5 zhav(C6@WvzZ)cI+nus?Ct}R8)3=OBOm5AeCN+VRq)2)B1piSpSVua+hgXP(~bQIpf z(h(s`UT<@Um--I@>RF=D;1gMKG(Y*Vbo*cL_oMUtkAL-cGq#GGJoZ4#H0ZMo4`KU& zoIA#c=ff*+`8cn|n86DX7dqo-cNzlQNqfZx0}$TgqZ#l6zAv=E>``7u#zHUQm%gias? zM4n~2tIY_ttIkuv$3{;YV=&`!gXHgRU-U%YG8S*lSU_hu_otJ|?FlxP&Tt6cAOBtG z@OLif?e+!w?PR@@4Cu8?T6=!bx=Jc47*EWzmpdiK83ZNMFw8rokN!RmN`?Leq6MLW zb;=yVBUTTQ%(*V=#jLQMJKl-AKwCGj2a>0+ENku=`b)HR*>gsJe>@ME3#r`RE)69U zEC-$aM)G6nN`0Jm7HOV_F(*9Ke(-v~`&*-W7Oa5!ul2;7(tAs&7EQU(F)d8kDI9aWx6 zMAP>8pY+CVYkOZ}_0$viCiZ<}lRggQJ=%$ha=e{Wx6&ce|5>LMk$^I^Qz{KBK$MIw zbkb*hE_o6m(&M0hH6-KB^*f@FNBq!%}+ig?~S-r%TK12a4><7U^FsiH0 zJwq50JkWl+EUa`;3uzTv9&H`5o>7q?b7jTb&kgQ=l1;eYu+U=5jq-qOkQ!KWqjyraRDiSy)z$#0Y%PZ9J#oF z0DSV>Pucuk!^eCYkn`ZjqOBY|-m|=eUt7+y+bvKED&r+RXpx|m#Ox7*;E|zfD_eW| z!7=OUF{Syi>8RxZlVmhHJob3SrHSGl!cW^wzcR1UyWh)MWXxwz4|wx?djQEuu+G@`EEBa?1Rb<7G5qh^||86 zXgzff_^II%xdQD4BggCtwp2upv6G>P39h#oR`T{u%GF*53Mxw-<)H!u0m9DmUuM6& z!^O>9o=@||BoSuFtcLNWzJf5tI%}&$eaSHR)c4^R7T2VAjJ7YN3imsKN4CoC@EF6NMIZWCI~tD}$%r;VMn*lxifPLS^TqeBEaAS@JaJKd zknGf|6^!=0-HTfDLkcM?m@dqPONe>R3_NA9kM!%}(GGCpjNbLg=AEL6?srxEMjR_*q1DFz^5pN}y|xD0ZU=qD zjxN%%t!=7?WNYSB42_0!`>M%PUt++l_R1u7s?@<|(B`YoxCPUp?&#?zdBrq-a|M;P zm2x%R^AJn{lvZ|3*cCjYt48QU@~P68@(rBwiBN(EVQBRH;9?-D1d;Vy-%nra1V@)q z+n?^yb>L`n2LM4k4Rth*hEd&XkX%L|zEe7!4k=rVlxE(^}bd+v{p3V^Yk@&rt>)fy1Rc8$f zzc|5u)DWmbr2T8P>hBp>9T{)BV&z|4OqDWu|aaqTglE~h22_!-g z@5z`f7^TGFB}N+@HoK9t|5?wmC~N|m+wW~@VcY6VN{W^-zwGl`Xf6XA2CS3VTmCVd ztGE26qaMqGhdishx%6{7Fjg}8&DXDAOn{@?@X8bE))IKkW;=1svEDF~<0ITB=*BMD zFS2?LUe#vZV0Nfl-W!fuN<@V(!3T83tHXYE|NB9s_kRjHSl+lPP=}iuG(@Sa{)kUS zrl-68>6#t{AmBrxir50S}wLZPsiu`13y~= z=T)h9isgpfV4py?B3q9m(&j>yuX#7B6wd+h7Y8}q4tmFJEB$Nhv2jnO(qa2DT(lux z@J$Nn{jmq2g}yIE#KH&J#sNL*n#ssa+f2i_`1pTJ`uU^Zv%eySst&ieRrsz$C39;1 z%ET|XtC)K}z3;bs`Nj=?Ld&M8N`R^#WcyaT_~5q|I8IF{w;VH`&WiEN5|MXlEa0bj zl1C6gs;z~v_Vrh8i;G?ahfM4Ll<^?h8MxQ;>|pNa!kO`!<#(Ukf2OyBRcq!E#!~&l z%Fa}>K}AhKnC{t#sH>8f>l#?n#TtI^#8VIwr+I4Ha*73bl)ue~KWtCu|8(NT#RPe| zmc7Hd8_q#qbp=;)ZlT&gop{`CyR{qra~l*Y0R3wVx0+5r+NdBA%YjUY*so2Egn46r zcC)3qUTGB=50ZhZpt`UMyS16@6R*>vf|v?#H6qE$At(7o3qW09YKeX#6)4i~*r1ru-XH5tuCgcWGI$acDLA8{AIS zG61&bPVc9U6;34m?@Hc?jE~mQ$HE65O=Nz-&QlA8XZ^gvL9oxS_zA9XZAFmmnyblz zg^73yA5;Or%_&h@Tfl$+-fO#bH)yZGi?H!E7>u)~w@zJLS}UqA*wY?C{1EuXH1Mnt z{QoR~TDSi3BXu{AeQgc+m`1J9^{6e4YLn=Xv+Mh##~nPVucw!N7XXk)6J4zMg$ZvE zz%TI*v2E@y^^BSGkmD}<^rgdtjo1^=kUlIWL|y_YpbwV3w$i802x0?nKQRPZZazaSWu+yo&2 zH4s`;{)5F$>+4z|l&Z+S&iqCJEG+J6FgO68EHsB#i+OMoWP2#$vckwi9Zy zYF_Cx{Pn1KX2}~!{Ma9>Cu7c8Cg=N(i0*%_q0wr*@|5|!6+=}3#V;1LHU*lxg3-9_c1FO0iW4seram^G{_Y5s|hIYGnm zj2r5v*#FUV?%_q?)s(LUTUmkTi!hhct(nqKw3x z&&Q82IZdIh%rS?>92+_F+xL&(pRTKaT$kSW{kmVz$Mf+q#&P}%c?`HS&w51J+1m?C zc&(c5IgxIJEJ*u2P=iE~QY#%7EX5ou3I-ZfGK{U$5gZ?Hjyuo-Jp)H#fxiCj9PTZ< zl8@W?m#_NzQ1{Y;opXz zZBJT5(*TTUUMQ9;A2xSW-VCGL$@5c=jJpKL4_Mmut(#<8YV2=5<=`av zwa0uXZ$zA^_bL`m@U;}@)}75v0UW&AuN^ykg$)HSKE5_;(xX*?FnbeK=dKiAK^3i% z-Y(qQvXQ@wbhqaI)m$75>Te#qaD_7(F2Pl0D3Yd zlSfmk-=mYqb2ne|cKqa=J5%@7_O*-b!2BP(yy#@(wO6%p8wL-3Z&WZFlne&eh>I}hHx~aNKPO6zz9bqqTnX1YrYR;7^3Kb zm(o%~cGbKU?RZttrv@$3Im{6+aQypo$(l+WK`;&%<~Z}rrUrbw)E*qg~qy$Ge3)@30Q z-2Ii?dgb;gV44@G<| zN^{VDXu zp^T%wqiRYF*aOob45+VCItpkiA^r9J^RJ08^tAP_z20&%p-NeH%_a!$2rVkUj!mrz z*CLb)bL2MsoZl(bJ8-|BKJIlAN6Z9s^kn9jFtv>r0 zedQm&OSH}rZH3nI`>*QlpZ8?-NvB*tmmHU;tYn^%e6&(_)bQF5HJ^es>3Mn+BXx3aVG4Jln?=qZ_`P037G#iNiPfHXH#(i}A(L~nkq7`ek5 zjI>J=Zi_fj3@OweAgV+N;Ik;1t)~%6lmcWm?9y-?K`kXAB|Hilj0lEv&LN6u$pU8% zS|kF&-RZm;;&!}2Y7uoITO0dW(s9pYa{_VKt6lTIYVi^a-1h$N)~@w}j=KWaH3p5( zKAzo~=7`9Jf1B9fKTMCpBP|c~T^IK_#H!lQNM&zzc%9tRZk)}o33A|uMDrT<6Fc$t zpNKyU6PEZgBmhmVG;%-P*3_R;K=4_c{Ic8huD32F%M`SofoX5a*p&Ua+xG6wBy`jCt5HJO z{N;3b3@93{)YE9T#ywS+yv3~TBt)zUe=Ajp*rh-F;U1y6v=vc@#xd9$IB4Y45OrgJ zF)+Dx;Q-+LL=A+Zyg+MA92zst2JOF7rNB_r2lU-@pIvu>`j z=UpBU9&@epl|U&jRO-HaSFaI1c7t~OzrMiK)jJL*#~oZ%9^}*Kg*2Gd$gHMKkuzCz?c&Zd z(W3ZMK_~JGW}_X()OP}dem<^V(Bu#L6?wR9b^`@$A2mVz1kTJ#?r&5KOfqkHo52iK3xK$I`IQpAD<%jm?e}7~3uSVypUfcU+w3zdZJb zF&tTrcfg-N~d^2CgPIiJWWC(%ERwacW_a#E!u#H^iKKc)`%9x`9FSZT?G$X?a zL=cR~`QvFa{*AG`v=rG*5f;?sfEjo^fW1fBoan|=F{jN(@K8vQgBc>b3T~pt*HI^>dv6;F)*}@07 z*Qh~?5+xQ-s7f0#21;p2Rp7@w(AC1x_vB}{8rB!n0_R?7XgRWert z$-FigCx)<}F7%S(I;JBFwg-mRlb_A_`?Wt}RtQ_XMW*@%2|d+3FYQhX zC65N7hDYa_i9#U!viYSLIoLIZJy2s?^1YMcqt-E{)(6OJ8K2SBDuJ#~>jBM2kMi-t zFh)s@G*ombr7~ss+;2hux9OWY;{*Ysjo}EATlOqm%B@%oOhoV>fUS98B>KF;y)g|Z zC11yX$nn9YEqa>NyaYO)-gtuX7$amQokloIx$d4+O@1qc2NurvjwKpM49CW(|xEXfp^3L=|(b~Hdla!6dDb0}7{0YJhP=4LKk&OK z{pX_Sml^k?-SvdT?ZA(TOS=(@n+xl2VYz^<7nM{VHrs#UM{Q{WD-6!MX0c^_P)SpG|%aPl)rL6&@|pC_jeT519XUv#0!7n z|Fq+Xy610sIn>}A(v7pe$ul10khIbWPd^qNIvu*nVqq6!{>04UVhDv8e+GSk-h(2J zxJ%qDGEow~{dhpGCHYSTAJ_Md7O|5KFBP<`4H03O71AKcAVorRvZRLcZ`23TQbVY8 ze94xzBE)ATpdv^Tot*YO6)JU825{=XHyRlM1A?YA$W&v1%C;0yCO$Ex1$nQxXJhjE z^(_=H8|9gRLfC4r99ZE&>l*~X4-wb;EIfP!-<0K0j3{<==ZFX3SSM6)AD3{+>)}ne z+ta9tDX(D{3@^<^pcC}PkjTXWJH&ki^l4jv73^UaBap7?X0LFa|B745Kv;&IzgFm3 zczn(RQ6oE$Xd@GnGoLWa9}-OAkdjWNmS*rqOY}!!1CR?7V?En8y_j)(zL|CB7CnMx z(0!3JF5^5gr5q|Q$LW%m7j6v9%0BJ+*@%J2_Wo?Cvhau*m2v*tPAUeuR@H)BTTW6+ zag>DiWdJwD1OIE_l37cQNsMGm+K5Y*uR z-HcHu;yoHd7;tvx+5~um{DA%Mtojr+r*tyH6lzxa8h;9*s3gpg^8w` zB%zAkv;0YkAfg3=y|P6n5LAauNV0Ph9)9^xKY`u|adLple+<1n4^sG#G4otV^E|&U z7y0MTjDepQmP=-@w2&mruww_PdbL#NX@R~JvOek~^bF&wCj%3Bh8M7%ccmWq<5ccL$uy6`Y(v%O4LhUYctc{OBPID#z-rvh76 zi=h{==Iw<;QW=kral}JY5heZ*H}Y{eomgjvY|NkNo1D=VaWl|ZD?dl7h@iiv&`#c2 zRJ`oGz3MbL7fwo3&%4wA3q==i(DrR~0RVdM)3%@mwhB~gcIoS01O##cpxSt??MW?r zE^X2Viakf`rJz~_Dpx<{_IQ2#j{8odmDz1P`~!5S&#(BX$jTbnz`d9V4uokA5`PWh@c+_>oVxOiJqRa?{7RN7>Y)|9-=hf`=yZMgW*ujsjwqpH@tCaRLL-io! zR|I004vY(Ac+$~IsOw`%m|YT>^(pB zL?-f4L48Pkgoj8)nRuFbbYp*WdVWkS>8rdS-0C=93rna-FAgqakzfe9RvleGPOIml zm5z)+M?o>w3Ua{PyQA_V1ZfQhz!lr-|H7t12*g-yWt`ug%0sqC;ca>|^UGDR1(0#UbpprzWpn$nR_Fy7^9D8A9 zjj*7dmHm$+Z{$|@a4T~`@2Kriak@lmY#nasLti9(S@*e2LPqI@Z#BKHWHITJM;o`E zr;G&i-mQ(knaYlo zPfFs4n#LWoS9TU;JAGV8g3dsRsB{!s23n2BYmlfCoSaV?XFq&foSu`-7&#|UHk>99 zaYOUmEtjgJ4S}P#$0VB$tLc*b?5p$5>->qVUODbkW|-kv>D4vgt4U8KR6CMcZ~Yui z=mZC4T1TWewjVNk!;ujhq>+IFWZo8>YVQAf-y4^|G{d}GcVDS(>o4+L1t!5K32WT3%1BqhG<+ zrxP?;MD`?qc44=b+1Oorv^&?A&fY{9)KgfiZF`6A&$cmkAE{>_8TlpXn+{wtQB=xE zj{MduCxg*_pJ;RIJ=;{;ch~f7jjh}rRN#b|Y_dU{gOcALZ<+%14rmD0&W#6~LC>U) zl%6rZ&GqOms`o}wZOLs@c$CKDC`0Jjs)nT#t!A8x_cJx(I2fOKCD==?1T1*{3)Nwd z^~Ri}8us70_WNX%o&-O!hVQ}V3Tv3P9Ikba{ZrfS#@qSIncsQLXZr^N6MOFOxQMkP z88Zv(F5ocPkPDl0b34li118JL!$7{*ClEBGW0FAfXQuEg8Aj4g4!Lh$EWd;8^`^l_ zCVznfr4Fg~pU{5gWz^@kr#t)XCWx}(Iq`9+ZEp9Ne`z#?pn(LaWn4pMwMPVtari=K zKf7A*wWn`Pi$adiFO}7uFckl>ychW=#Pj-%u%;Nd#T(6p^VK$tzAo={NGX$z<^B^Z zp2`r88()c=`N;2ITkjkF3n^_CI3QG=6pBsydFY`7j z@(u&J`4r8rrQmQN&iC8OXL0VR#ZmT`J4Vbn+<&e8$x)1!iwgN*Y%B14ieMB`xIg5t zu3fSX||n%uGCWo{6SnTR3K z3*2K$pmTUoySrL0-aX6ec)}|Q>(VrZ8ZU*;PYbAvA?7bt5ORU-!I(Nr|6WtXOGv`R z1zfRpmHBvkt`J+07Lzcd^e32c&%Mc7?9i{Q8+E{_sfZK$>WL{x zsmo&8D_g8uSFB}6>FY|okhMJfvMxi67$zg_6|-yj(6JzLe9dUrHj~-Mq}y4(6ohj- z-q@_E&qS_C&GC3}Ub(<0Pw1~jRo%A}oFz=6tz{n+$k3#Lvam}`d1L=IFOIEXeYfA&2>u$Dx9`@$|uor0PTXpJS^Bh6CLXe%F&Wm7d`(_~i!}=lgN9bXg9Lp||8ro~haa zL&;gHu~x^WXxARBh3HI(h_X@7cq{S?_Jz_M11*#F~XDL}GB{%;E;z}A;Pp=VbfB4CBiMX>0Bgt>OA4e2Ord?>5hlkERC+jSw8c4{0d3@1YcOg+a~t zc|lJj4|DO26JC8fle~OYSBUtI@?&5JYF9ySur^boeS6)fK1aEH1j+VD(ksWN7lYJ# z!1l#8|CaX;wZHp8?QzsFS;I>r(ZCUTEDo|iBa;b(8d|!aFU;{$0R&Ux9c-ghgrkMT zn*}JQz318Qh=5hvD^nPCNUG6`?&@#@s78in;7!e6IwP4pH+Y`IJ2e>=!^>L}_kU?< zV6FVV7BR0;LP?w7g6w+-w8^1=pL4&KO9J{K5F{-|t!E8Y>k%B97vNB5%Z!)|L$AKr z8TY!${Ty~0fu^ujCktNc1365z%-SDS-GH-sZ7X?tWqiSHOtx*YRtABAqD|#&T_I)- zd6u6X57*U|f=|3T8KE6;&Q$Dn>`L1DR17lVm2qz>E0u*Aw`JDb#2w^)KlMqfaDO0^ z3!)FS1^9788Z)0H9GCi`j*Q1Ryb%b#@c6_J4j;YZP52i=k#Gsden8mO^GT19!hqN< zSeiZ9%|+c_?rVcGdlwQJzP;8xc^EnQ58cxpck?}Ou8qkl4x~Mg64|Yi9xK>rFS`TR^HwFMwWaM2R0s*?hFR0@1%`9HrH0gW@B!7VE$9uJn#qT1{BBZ>ewOo|5<=4j23yXBv$YXyKPGievRbh z=t#J-H*RUVfNKX`e`hJujz<>VxpJyNeFP~;DAD@Y)bm95lJs#jpS83W16l3B^vj}& z-2GOUWBXakMvh}kK?+Mot+u2u`srp6uH>2b4m6>d>PdhvKSt@5xyXDFuAyb zXScKp!PZbHdDg&`8@~Pb-=cvJr5!9EEk-R_Q||wwnJl(0L%L! z8ZCo|@Bx5Y4In_YFyvlu-5>S5taZgMr;LU9rJStDQAyXHt4%GFrRALV3KyzJ#HH$k zzptFft!qs9a+-b3v^E#xQb9dRJOv~3;DUuAU7EO;0DW#!t}7NpxzcGp>_Il5qN)c5HS8_ZSl8E#IzERG81K7;pV=$uXk z8mokAURNbIxkTYbaR#_!a4u)A*C17!@)FMktr%?6GnR68QsTQ{Mvlv=@V zmGwj;Ea(yfC%cZH05F7dUJ=r@IR&DAfoHC#bGqta9;%)|f5?|7#^PU3mAE7LittE< zN9M>ygL{NiHF8)+=)Z{!d~{&@DD8dZMPLoW8tQ6^PjP-S5Ly+aW~VS$$^;r>hVg_N z>RtyV-w@2)ozSM$V$2t&r>7~k;^3Qj>Gsu1-g_R#e<~Gw8tJNq$g#%fcrb((2!n=e z5(qGAW+u`&#kW-JCh>E}I|#wE3&)A2x&^{MJ4}jJ6aPSbVBdJgD#;*RaOTVXBlHKq z`0qPY%>s~ZdyfHPdggP1PXKbmlPt`;DuFPf+0o0;qkU|1y~W zT3f#-tvdD9p8sw+eKq!6^q;-q(-$=h12iS-r!p(QmrRm*FLfHNnrVDL!v)}?Xp`TX zL1@>Of*!JI7nbS;V7s2}1wo?{_iHAhy?1=_-je@#AI1@eyuh)o0u$Y!*jBxB$<&{Q zJrX(qD+3%GfZ)V(=?lGCJl0DTth|$TIsq0-ma zEpo3GJbYz&Jp_Q&$B7YD4681;@9}(whHh>Al&fidfAULGhu0XjODo2wc%+mWTZ_r( zY6w9$!#w^pmCi($v0SNv-v(OUZy@wahaHq`0QHtLn74vtz(?i2CI2DBriHbcua;5t zIU{M=yfmvtFJg=59OUCEGI&}7eIYH^2Gk4F+IWGKr@6vY2x{>j=3Hp$dNO!k)v+vR zsQn~X(Cvw%=-CVH+ey`^4B|pq=bzB#>l(fJQ~r3QI{r&)oy3J3xAxHep;wnw00zVA z7XA+NhXD^VpU{l~%?7d%Y_t`}ZQlv4tst$qKy9Cw*6->Dq}KF1vs^`SR-^v6aeZ2G zgcpH)|7jZ@pM`UCLkP-eQuTcxWE(T`aUm|P8SHv@hokfusMp^J+JS=Rb;OouO_w4v(+OC<2ovhd|xP2yK6lviC~mTOPr5BWJ{rSAzLf`0(@ zF`4bH{fzqW+rK`|(@}{2mKB+~w4s6pt~C7Ld;0NW284(&i|p!_6;f6$#-9QJutDPa z5FL`N1vLnD72D`e2Cqs=TH2pNKF5#OzDCu65_pr=>Ph9)*jMjV99#^<3WZ0qJfFkZ zJi>o*7=jA0}mKixF|ngvQ_=f)iOTc#;O-|xHtEZzzYFV6tFPk_rEoh{*)JDCFm>P0=QhP z|Keu`nl4-v9C5qfUpc0L&BK3xG8T8>RfowIf+K4^o05}noti14`o3iZir`_`mKvLQ z7qG6LE))WcnvB>Que@C5?G1qUg1xhR#nYN6VSi|}3~i;F%dEYSu=ifwfE5zgN20|f#kvS z&+SZa>PNOXOw7B}ZPSaLs602KqmFGXbi~a>uCkNnJkS~{c;?N7T6<<{j#n7zN(NRC zThVFafA}+qN3iQ2Z3{SK!wV>Pv-hnS+l&Migr1X9LXI5=Y<+EKm+9Lf7P2Riir!9b zJ8lpWHb)fQSW2%-!40|D-6{6RG1Vh9CAhhsSJLNr%xd~}Lv&0jH&ex(5=D-F6FJ0s0&tA(n;_T{I`0biCFEGAR79=ou zPpA4|^S~UdBQ%i~J}N+S#z~3(cKa2S$wz2l%{6s!6sWwFHNE!Xn?NC6t;^?6R^1jY zdJ4SHYz)G@P>5=f2x=mvR@Guq(JHTXP9{6MMU%YHpeGq>TZhl~$DPcFH-eh3M?8Jk zO>gzSvDQVW1u77~*jSGHECrE&{%G8C-$iMh?wC2eAyuHVaQ4p92mPIAt*tfj=ia)C z9BeGdC>-pp{frfdOJwfXYggWT&wt52ukNs1k05peSC!y$8G0u|(~_z2&O7hF@s645 zU$PhDtiC*G(;jPWd7m#0*hAKV>r!l)kKWHCpZ)%N>{Dhg(t#sWDmP`Lb=Uoc?y^mB zh(SPhy@zG;oAv0A-$%`TTnq)YjsN70Z`yY~IQpynZ1S;t^FdG(PHQ11C&_73*vhMqh)7+-D3wmE-+ign#$UKgT)|CVqvTKt zz3>p!-HyQIJ@&m@EQ$xB|L1%{3^|kPL)a0+pjUds5P)0?&#EL*J*=JS17MEqUPqy=Wr|7c9{HwL@%xj-cw+n=^+ z?L{{HoN^ju2WD%vvgJVzRZmy-rxSx_B=4dIOvsj$@k~iy^jWu&^7Z%AM>=BgEI(h^6 z^rztBI^hrFt0}^zqWVStw!jmDPZ}xry79*Bgc^TSo{dcQMNTfc!4z>xSQo4-wAmB_ zg5Xsz=KtzfzeT8UscWK5L(v@vEeYk8KwAzI?#>a7QysI@0a>)=O7ke^9=GmHEI3_f z-0Rk$V;dZqU9K7_%?n^f^j!`y^zA52B`)bN-C z$(cg~O?>}}?_(Uun1kun6nzdNUmx~cvG;|&2mKYO zM!w&x`6c9C!7-O(d4tO;8xg&s1P0QRuEB2*#sHR?T@Znx0M=7(Rk z!kmD#3;RJWcsAkv8S_@yj;9gB0TH`k=l6-|x<5C^)EpdcegaMGQ!PDP@ML|O;XPUU zaI;*<1O!OswP{zkfEY(j%}Yf8JZlD{CQ1`j+r62ox7*oN0PlV8dDjVl6)KZ-#DJ_O!(a&jcpAS#i577b~s zLT}-yxyaqftWNrj)Snd#=q%ip*q*E>*%b5ZjFCqlDoEB`>of+&`~fZoxc1u zEbQ6dU(##1?@o}`Rfn@59)bRue*wiQtOR28d24Ol~ zlBlGUb3Vg2=%My?U2f@8+IMl{7|3lkw|JS}>PB#g|av ze%}4URqwk^E-bwx=xnFh8>B0aR1>TXM)Rpe%PHo<0bsP?NT1H;fs_^lA1hplc>#pN zZ<-^56;51Gs+6?+V)bgHXj~L76TBu}! zn;?=h9B}RYi$KD6n_ky}`pX&XwjAXX5V(&KH|P7II%Ow!3g_>LNf#hn0C2)=8v7KD zAf==Zgz2wM9_&|r%TkMVxr610yMOt+81LcQL$o1>Cc(PuGZRfJKH8hyhY)H5HL|~n zTSvo;$#=LKsQ(K!EoWa0os|EfZUJOBx32~P@-kSVyyuah>vIWe6a%HA+1iC$h1QdS zTv5i*-g{BbCw>WGiTcRdDe%QCUcMWXLBI~y&ThyxEl+NJ&ePsH?Od?)g5fQMJF&v; zLLY>5wtccM{(9W0_4?_%3?N`?-=nrm3n~iJhsUt{D+~9X8<|g|RTQlR|7l7rHOrACcXMRmx4$Du*eNa}2BP%g{bm+b3$6I& zCz1VsqdUp#(Xg@yus2H@?bqVw>+ zcJD0(+DE63$#4k?!Q&~@_ClN}&nVxbJ3dN4S%6P`x&*seMoH|(pB4swCHA=r8M>0@ zL9{{{S(V%ufrmlc-j!8|o*BLe>IUEH%)m%=_pf4|nw*&Tn zZ0RipzTl{)zA9MAGPXh--adZOJfYaXa#^ljh2dCi%VTl>(u4J1=v0ne1kya6Me4Kx z{Q0-17rxIgqNTrCpiE%)2Z~)jQz`)6I;{MSZ5+02t9rVp;6~MQCl-R7U)3!6CqB-v%?v&K=^SY zdscL-^?E@Nh1;(7>r6s7fDq{HNLnq#BGyOsB1=Ri*E z>F2YXbehB$cfCKgm%yj7f@GY3X`r#snC+^$$;8P)Vu0>ty5G4nn9=^W(_uscEJg}C zLtx;g;0InHq8IfcPz3@tmUO)VvPyM`hu|{-##k1?-|rpAJ(bS@T%T*n9R7p-l6tq> zxSpMBQ*i}t> zQTQ;(Swj;gEm}gZ7rny^j8~!<0QXvHn6PK}gb;$VAFsR$uKIQOd!cELT|wK-L`B2k zA(|2pH%92Y7FjruO|30wiwZ^`zXTzXI|zJ=Q_4b#*Ralu=AY>GG zy-CEX@_txO;g9>5H9gOsHb}fLX9VrS!g{HpIo-E;ZhM$coMc>m^yrZ¬utu50?M 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

d~1g|Npg&3?oUoOqAC6rcLS4x+Zx~}^=_PlEY zg0IW8=45iZEc5Ivg0MhLg`fphlrut>ZB4LLgu3WoF6XPABO@Nc6_zQ7b@C9FcGteV zzRcV5ayhvaTnyftoBf_sT6eob@XK$X>}DFS9D&%ls%}ovzMjt=<4S8Q`LS+cDbYu> zt?RmW-F{l;r!P;fsu6&}`C*<#T?wryp~2c_*Pg$At*G!!W&` zF7sxZt_!(vsTVVslw%0T!vR9*z0WZcj5(*usrCRHhGnK-FtSGVD7Gi+8K!jvf zF{xaPm{6@0<#gRP1WNE87XV`T{PpYo+s9C1e?HZm|M>o$S(m4$FWCRh&x_q$@@=K} zQdNX$CJHET{`7~T@6Eh$B>|(WcPRu0ktCR4Tw<&k@08Y30gTSqYe5tc;&akMHA)Vb zo=__5YR{{FU0?bufRG>@VqBaZ)`iZipuF4dlvLZgoloa&GeXKGWlXSAnsQ!MP0S?$ z;8MEw6NQ)&*6zC5T1+S>^x^KlhglvDlXFtZwyI#xN(#p4joxvLYaySXo)5cD3;uAt zTgTC7?^8+`ZtH5+H3uK81*KfK**d#F>_ZBIGbwlq-dbY?5sjYgI?j_&vOqA5gY{N$ z;Zx#VF^F5Kt4jMER97$aY`mTACMvCWZNzYiq3?S^C_=ymJB~yCPEacmV&sTwA)mfH zP20+}E|^qI!jSuUGR9WBHs)ftl~U$%o}I-BK}1%&U9NpU^f4uhuy zZyxT9cL0>PcXw}YZ%fJDagQJWRC9hYwoHxF;#P$gfd!H<*1gdp^CI`u=} zN&W6{Bc&Y1@ypj|?*oL;glIutay-_%n6s9OBXpE?F{XsrRtuy@bsQ4HT`Y#=g*(tet4GwAe4CLU@4k&A3_1e zmmE`KoR8Cl04zC2@5gb(m0Fg?ZAMEe7>m}SlxnGr596{RK)m$?fKu|e@d5-{yxW2+ zDIUA7W<2=-0kGrLv^9Xa@6UCu>$c80SGtNJn$>N~8hii*H@p4a?Y+h_Oq&^d4?%+P zzy%BCb)7cn{JBqpbFGYZAq7IHxAw5#Q%nHDyWOs7nl*Tf;Szkt2q5TkL7ZX6R__48 zRI6d07H6&X!#bJhDO&WB-Lhi%I-5=0oG3{wn|)LK@Rbq-6-gq*ew6U+qnF>0+2 zH#f7f5dci-7Oc-PfaH>osN56D2r1rF)lg%@o#_jDGc+tYiow!JPq?YcQ<={ z_ve5046iv*f;y>ox=sN6`ut>LU@>V#VhEGjIAt85<=g3Mme>AT2!8wiy_E7i3`Ovp z5AO~{1nZQPr>7@XfW|m`f7tEb@9(zFJimM$ul<|jQ6QqVh5$t8K0iO}T}SKsGS7oC zcRzeUN-6|S*XuCO>*fkXi?skjKrl(gTWgFNmMvg-9VSlb)9=66v%Qn*?crwY2UV## z_!ql~$NTNNuEuQMwKsc2pmSj{n~)Mf*pEXDA%|FN-89uS&;2}g$HTI&F{RBKPFcxW zFh&TOwsjdN1OU!u>j#|6-F|+Cxb(e};>VwUqzHGr-O%^bx=JAkWtVvzy}k6;ex9$xU~=Yl<#Rd>Jr?}# z&BI@Q`6ZOHulK9>F@?8p9!g5q`md+!8e&&##kgWjP-@m~oTdT_0? z-R%fx{qxi9$PJu8(v^r;fxEG30qH9eUqnzascXfSxJV02^ +#include + +#include +#include + +#include "libpng_sapi.sapi.h" + +namespace { + +class LibPNGSapiSandbox : public LibPNGSandbox { + public: + void AddFile(const std::string& file) { files_.push_back(file); } + + private: + std::unique_ptr ModifyPolicy( + sandbox2::PolicyBuilder*) override { + auto builder = std::make_unique(); + (*builder) + .AllowRead() + .AllowStaticStartup() + .AllowWrite() + .AllowOpen() + .AllowExit() + .AllowStat() + .AllowMmap() + .AllowSystemMalloc() + .AllowSyscalls({ + __NR_futex, + __NR_close, + __NR_lseek, + __NR_gettid, + __NR_sysinfo, + __NR_munmap, + __NR_recvmsg, + __NR_fcntl, + }); + + for (const auto& file : files_) { + builder->AddFile(file, /*is_ro=*/false); + } + + return builder.get()->BuildOrDie(); + } + + std::vector files_; +}; + +} // namespace + diff --git a/oss-internship-2020/libpng/tests/CMakeLists.txt b/oss-internship-2020/libpng/tests/CMakeLists.txt new file mode 100644 index 0000000..0cb2645 --- /dev/null +++ b/oss-internship-2020/libpng/tests/CMakeLists.txt @@ -0,0 +1,36 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +include(GoogleTest) +enable_testing() + +add_executable(tests + basic_test.cc + extended_test.cc + helper.h + helper.cc + libpng.h +) + +target_link_libraries(tests PRIVATE + gmock + gtest + gtest_main + sandbox2::temp_file + sapi::sapi + libpng_sapi +) + +gtest_discover_tests(tests) + diff --git a/oss-internship-2020/libpng/tests/basic_test.cc b/oss-internship-2020/libpng/tests/basic_test.cc new file mode 100644 index 0000000..cc22561 --- /dev/null +++ b/oss-internship-2020/libpng/tests/basic_test.cc @@ -0,0 +1,91 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "../sandboxed.h" // NOLINT(build/include) +#include "gtest/gtest.h" +#include "helper.h" // NOLINT(build/include) +#include "libpng.h" // NOLINT(build/include) +#include "sandboxed_api/sandbox2/util/fileops.h" +#include "sandboxed_api/sandbox2/util/path.h" +#include "sandboxed_api/sandbox2/util/temp_file.h" +#include "sandboxed_api/util/status_matchers.h" + +namespace { + +using ::sapi::IsOk; +using ::testing::Eq; +using ::testing::IsTrue; + +TEST(SandboxTest, ReadWrite) { + std::string infile = GetTestFilePath("pngtest.png"); + + absl::StatusOr status_or_path = + sandbox2::CreateNamedTempFileAndClose("output.png"); + ASSERT_THAT(status_or_path, IsOk()) << "Could not create temp output file"; + + std::string outfile = sandbox2::file::JoinPath( + sandbox2::file_util::fileops::GetCWD(), status_or_path.value()); + + LibPNGSapiSandbox sandbox; + sandbox.AddFile(infile); + sandbox.AddFile(outfile); + + ASSERT_THAT(sandbox.Init(), IsOk()) << "Couldn't initialize Sandboxed API"; + + LibPNGApi api(&sandbox); + + sapi::v::Struct image; + sapi::v::ConstCStr infile_var(infile.c_str()); + sapi::v::ConstCStr outfile_var(outfile.c_str()); + + image.mutable_data()->version = PNG_IMAGE_VERSION; + + absl::StatusOr status_or_int = api.png_image_begin_read_from_file( + image.PtrBoth(), infile_var.PtrBefore()); + ASSERT_THAT(status_or_int, IsOk()) + << "png_image_begin_read_from_file fatal error"; + ASSERT_THAT(status_or_int.value(), IsTrue()) + << "png_image_begin_read_from_file failed: " + << image.mutable_data()->message; + + image.mutable_data()->format = PNG_FORMAT_RGBA; + ASSERT_THAT(image.mutable_data()->version, Eq(PNG_IMAGE_VERSION)) + << "image version changed"; + + sapi::v::Array buffer_(PNG_IMAGE_SIZE(*image.mutable_data())); + status_or_int = api.png_image_finish_read( + image.PtrBoth(), sapi::v::NullPtr().PtrBoth(), buffer_.PtrBoth(), 0, + sapi::v::NullPtr().PtrBoth()); + ASSERT_THAT(status_or_int, IsOk()) << "png_image_finish_read fatal error"; + ASSERT_THAT(status_or_int.value(), IsTrue()) + << "png_image_finish_read failed: " << image.mutable_data()->message; + ASSERT_THAT(image.mutable_data()->version, Eq(PNG_IMAGE_VERSION)) + << "image version changed"; + ASSERT_THAT(image.mutable_data()->format, Eq(PNG_FORMAT_RGBA)) + << "image format changed"; + + status_or_int = api.png_image_write_to_file( + image.PtrBoth(), outfile_var.PtrBefore(), 0, buffer_.PtrBoth(), 0, + sapi::v::NullPtr().PtrBoth()); + ASSERT_THAT(status_or_int, IsOk()) << "png_image_write_to_file fatal error"; + ASSERT_THAT(status_or_int.value(), IsTrue()) + << "png_image_finish_read failed: " << image.mutable_data()->message; + ASSERT_THAT(image.mutable_data()->version, Eq(PNG_IMAGE_VERSION)) + << "image version changed"; + ASSERT_THAT(image.mutable_data()->format, Eq(PNG_FORMAT_RGBA)) + << "image format changed"; +} + +} // namespace + diff --git a/oss-internship-2020/libpng/tests/extended_test.cc b/oss-internship-2020/libpng/tests/extended_test.cc new file mode 100644 index 0000000..78c04ab --- /dev/null +++ b/oss-internship-2020/libpng/tests/extended_test.cc @@ -0,0 +1,248 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include + +#include "../sandboxed.h" // NOLINT(build/include) +#include "gtest/gtest.h" +#include "helper.h" // NOLINT(build/include) +#include "libpng.h" // NOLINT(build/include) +#include "sandboxed_api/util/status_matchers.h" + +namespace { + +using ::sapi::IsOk; +using ::testing::ContainerEq; +using ::testing::Eq; +using ::testing::Ge; +using ::testing::Gt; +using ::testing::IsTrue; +using ::testing::NotNull; + +struct Data { + Data() {} + + int width; + int height; + uint8_t color_type; + uint8_t bit_depth; + int number_of_passes; + size_t rowbytes; + std::unique_ptr> row_pointers; +}; + +void ReadPng(LibPNGApi& api, LibPNGSapiSandbox& sandbox, + absl::string_view infile, Data& data) { + sapi::v::Fd fd(open(infile.data(), O_RDONLY)); + + ASSERT_THAT(fd.GetValue(), Ge(0)) << "Error opening input file"; + ASSERT_THAT(sandbox.TransferToSandboxee(&fd), IsOk()); + ASSERT_THAT(fd.GetRemoteFd(), Ge(0)) << "Error receiving remote FD"; + + sapi::v::ConstCStr rb_var("rb"); + absl::StatusOr status_or_file = + api.png_fdopen(fd.GetRemoteFd(), rb_var.PtrBefore()); + ASSERT_THAT(status_or_file, IsOk()); + + sapi::v::RemotePtr file(status_or_file.value()); + ASSERT_THAT(file.GetValue(), NotNull()) << "Could not open " << infile; + + sapi::v::Array header(8); + ASSERT_THAT(api.png_fread(header.PtrBoth(), 1, header.GetSize(), &file), + IsOk()); + + absl::StatusOr status_or_int = + api.png_sig_cmp(header.PtrBoth(), 0, header.GetSize()); + ASSERT_THAT(status_or_int, IsOk()); + ASSERT_THAT(status_or_int.value(), Eq(0)) << infile << " is not a PNG file"; + + sapi::v::ConstCStr ver_string_var(PNG_LIBPNG_VER_STRING); + absl::StatusOr status_or_png_structp = + api.png_create_read_struct_wrapper(ver_string_var.PtrBefore(), + sapi::v::NullPtr().PtrBoth()); + + ASSERT_THAT(status_or_png_structp, IsOk()); + sapi::v::RemotePtr struct_ptr(status_or_png_structp.value()); + ASSERT_THAT(struct_ptr.GetValue(), NotNull()) + << "png_create_read_struct_wrapper failed"; + + absl::StatusOr status_or_png_infop = + api.png_create_info_struct(&struct_ptr); + + ASSERT_THAT(status_or_png_infop, IsOk()); + sapi::v::RemotePtr info_ptr(status_or_png_infop.value()); + ASSERT_THAT(info_ptr.GetValue(), NotNull()) + << "png_create_info_struct failed"; + + ASSERT_THAT(api.png_setjmp(&struct_ptr), IsOk()); + ASSERT_THAT(api.png_init_io_wrapper(&struct_ptr, &file), IsOk()); + ASSERT_THAT(api.png_set_sig_bytes(&struct_ptr, header.GetSize()), IsOk()); + ASSERT_THAT(api.png_read_info(&struct_ptr, &info_ptr), IsOk()); + + status_or_int = api.png_get_image_width(&struct_ptr, &info_ptr); + ASSERT_THAT(status_or_int, IsOk()); + data.width = status_or_int.value(); + EXPECT_THAT(data.width, Gt(0)); + + status_or_int = api.png_get_image_height(&struct_ptr, &info_ptr); + ASSERT_THAT(status_or_int, IsOk()); + data.height = status_or_int.value(); + EXPECT_THAT(data.height, Gt(0)); + + absl::StatusOr status_or_uchar = + api.png_get_color_type(&struct_ptr, &info_ptr); + ASSERT_THAT(status_or_uchar, IsOk()); + data.color_type = status_or_uchar.value(); + + status_or_uchar = api.png_get_bit_depth(&struct_ptr, &info_ptr); + ASSERT_THAT(status_or_uchar, IsOk()); + data.bit_depth = status_or_uchar.value(); + + status_or_int = api.png_set_interlace_handling(&struct_ptr); + ASSERT_THAT(status_or_int, IsOk()); + data.number_of_passes = status_or_int.value(); + + ASSERT_THAT(api.png_read_update_info(&struct_ptr, &info_ptr), IsOk()); + ASSERT_THAT(api.png_setjmp(&struct_ptr), IsOk()); + + absl::StatusOr status_or_uint = + api.png_get_rowbytes(&struct_ptr, &info_ptr); + ASSERT_THAT(status_or_uint, IsOk()); + data.rowbytes = status_or_uint.value(); + EXPECT_THAT(data.rowbytes, Ge(data.width)); + + data.row_pointers = + std::make_unique>(data.height * data.rowbytes); + + ASSERT_THAT( + api.png_read_image_wrapper(&struct_ptr, data.row_pointers->PtrAfter(), + data.height, data.rowbytes), + IsOk()); + + ASSERT_THAT(api.png_fclose(&file), IsOk()); +} + +void WritePng(LibPNGApi& api, LibPNGSapiSandbox& sandbox, + absl::string_view outfile, Data& data) { + sapi::v::Fd fd(open(outfile.data(), O_WRONLY)); + + ASSERT_THAT(fd.GetValue(), Ge(0)) << "Error opening output file"; + ASSERT_THAT(sandbox.TransferToSandboxee(&fd), IsOk()); + ASSERT_THAT(fd.GetRemoteFd(), Ge(0)) << "Error receiving remote FD"; + + sapi::v::ConstCStr wb_var("wb"); + absl::StatusOr status_or_file = + api.png_fdopen(fd.GetRemoteFd(), wb_var.PtrBefore()); + ASSERT_THAT(status_or_file, IsOk()); + + sapi::v::RemotePtr file(status_or_file.value()); + ASSERT_THAT(file.GetValue(), NotNull()) << "Could not open " << outfile; + + sapi::v::ConstCStr ver_string_var(PNG_LIBPNG_VER_STRING); + absl::StatusOr status_or_png_structp = + api.png_create_write_struct_wrapper(ver_string_var.PtrBefore(), + sapi::v::NullPtr().PtrBoth()); + ASSERT_THAT(status_or_png_structp, IsOk()); + + sapi::v::RemotePtr struct_ptr(status_or_png_structp.value()); + ASSERT_THAT(struct_ptr.GetValue(), NotNull()) + << "png_create_write_struct_wrapper failed"; + + absl::StatusOr status_or_png_infop = + api.png_create_info_struct(&struct_ptr); + ASSERT_THAT(status_or_png_infop, IsOk()); + + sapi::v::RemotePtr info_ptr(status_or_png_infop.value()); + ASSERT_THAT(info_ptr.GetValue(), NotNull()) + << "png_create_info_struct failed"; + + ASSERT_THAT(api.png_setjmp(&struct_ptr), IsOk()); + ASSERT_THAT(api.png_init_io_wrapper(&struct_ptr, &file), IsOk()); + + ASSERT_THAT(api.png_setjmp(&struct_ptr), IsOk()); + ASSERT_THAT( + api.png_set_IHDR(&struct_ptr, &info_ptr, data.width, data.height, + data.bit_depth, data.color_type, PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE), + IsOk()); + + ASSERT_THAT(api.png_write_info(&struct_ptr, &info_ptr), IsOk()); + + ASSERT_THAT(api.png_setjmp(&struct_ptr), IsOk()); + ASSERT_THAT( + api.png_write_image_wrapper(&struct_ptr, data.row_pointers->PtrBefore(), + data.height, data.rowbytes), + IsOk()); + + auto null = sapi::v::NullPtr(); + ASSERT_THAT(api.png_setjmp(&struct_ptr), IsOk()); + ASSERT_THAT(api.png_write_end(&struct_ptr, &null), IsOk()); + + ASSERT_THAT(api.png_fclose(&file), IsOk()); +} + +TEST(SandboxTest, ReadModifyWrite) { + std::string infile = GetTestFilePath("red_ball.png"); + std::string outfile = GetTestFilePath("test_output.png"); + + LibPNGSapiSandbox sandbox; + ASSERT_THAT(sandbox.Init(), IsOk()); + LibPNGApi api(&sandbox); + + Data data; + ReadPng(api, sandbox, infile, data); + + ASSERT_THAT(data.color_type == PNG_COLOR_TYPE_RGBA || + data.color_type == PNG_COLOR_TYPE_RGB, + IsTrue()) + << infile << " has unexpected color type. Expected RGB or RGBA"; + + size_t channel_count = 3; + if (data.color_type == PNG_COLOR_TYPE_RGBA) { + channel_count = 4; + } + + EXPECT_THAT(channel_count * data.width, Eq(data.rowbytes)); + + // RGB to BGR + for (size_t i = 0; i != data.height; ++i) { + for (size_t j = 0; j != data.width; ++j) { + uint8_t r = (*data.row_pointers)[i * data.rowbytes + j * channel_count]; + uint8_t b = + (*data.row_pointers)[i * data.rowbytes + j * channel_count + 2]; + (*data.row_pointers)[i * data.rowbytes + j * channel_count] = b; + (*data.row_pointers)[i * data.rowbytes + j * channel_count + 2] = r; + } + } + + WritePng(api, sandbox, outfile, data); + + Data result; + ReadPng(api, sandbox, outfile, result); + + EXPECT_THAT(result.height, Eq(data.height)); + EXPECT_THAT(result.width, Eq(data.width)); + EXPECT_THAT(result.color_type, Eq(data.color_type)); + EXPECT_THAT(result.rowbytes, Eq(data.rowbytes)); + EXPECT_THAT(result.bit_depth, Eq(data.bit_depth)); + EXPECT_THAT(result.number_of_passes, Eq(data.number_of_passes)); + EXPECT_THAT(absl::MakeSpan(result.row_pointers->GetData(), + result.row_pointers->GetSize()), + ContainerEq(absl::MakeSpan(data.row_pointers->GetData(), + data.row_pointers->GetSize()))); +} + +} // namespace + diff --git a/oss-internship-2020/libpng/tests/helper.cc b/oss-internship-2020/libpng/tests/helper.cc new file mode 100644 index 0000000..b349c6b --- /dev/null +++ b/oss-internship-2020/libpng/tests/helper.cc @@ -0,0 +1,40 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "helper.h" // NOLINT(build/include) +#include "../sandboxed.h" // NOLINT(build/include) +#include "sandboxed_api/sandbox2/util/fileops.h" +#include "sandboxed_api/sandbox2/util/path.h" + +std::string GetImagesFolder() { + std::string cwd = sandbox2::file_util::fileops::GetCWD(); + auto find = cwd.rfind("/build"); + if (find == std::string::npos) { + LOG(ERROR) << "Something went wrong: CWD don't contain build dir. " + << "Please run tests from build dir, path might be incorrect\n"; + + return sandbox2::file::JoinPath(cwd, "images"); + } + + return sandbox2::file::JoinPath(cwd.substr(0, find), "images"); +} + +std::string GetTestFilePath(const std::string& filename) { + static std::string* images_folder_path = nullptr; + if (!images_folder_path) { + images_folder_path = new std::string(GetImagesFolder()); + } + return sandbox2::file::JoinPath(*images_folder_path, filename); +} + diff --git a/oss-internship-2020/libpng/tests/helper.h b/oss-internship-2020/libpng/tests/helper.h new file mode 100644 index 0000000..9590f61 --- /dev/null +++ b/oss-internship-2020/libpng/tests/helper.h @@ -0,0 +1,18 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include + +std::string GetTestFilePath(const std::string& filename); + diff --git a/oss-internship-2020/libpng/tests/libpng.h b/oss-internship-2020/libpng/tests/libpng.h new file mode 100644 index 0000000..6727eb5 --- /dev/null +++ b/oss-internship-2020/libpng/tests/libpng.h @@ -0,0 +1,92 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Defines from libpng library. The problem is that the build throws the error +// "Duplicate functions" if #include was added. + +#define PNG_FORMAT_FLAG_ALPHA 0x01U +#define PNG_FORMAT_FLAG_COLOR 0x02U +#define PNG_FORMAT_FLAG_LINEAR 0x04U +#define PNG_FORMAT_FLAG_COLORMAP 0x08U + +#ifdef PNG_FORMAT_BGR_SUPPORTED +#define PNG_FORMAT_FLAG_BGR 0x10U +#endif + +#ifdef PNG_FORMAT_AFIRST_SUPPORTED +#define PNG_FORMAT_FLAG_AFIRST 0x20U +#endif + +#define PNG_FORMAT_FLAG_ASSOCIATED_ALPHA 0x40U + +#define PNG_FORMAT_GRAY 0 +#define PNG_FORMAT_GA PNG_FORMAT_FLAG_ALPHA +#define PNG_FORMAT_AG (PNG_FORMAT_GA | PNG_FORMAT_FLAG_AFIRST) +#define PNG_FORMAT_RGB PNG_FORMAT_FLAG_COLOR +#define PNG_FORMAT_BGR (PNG_FORMAT_FLAG_COLOR | PNG_FORMAT_FLAG_BGR) +#define PNG_FORMAT_RGBA (PNG_FORMAT_RGB | PNG_FORMAT_FLAG_ALPHA) +#define PNG_FORMAT_ARGB (PNG_FORMAT_RGBA | PNG_FORMAT_FLAG_AFIRST) +#define PNG_FORMAT_BGRA (PNG_FORMAT_BGR | PNG_FORMAT_FLAG_ALPHA) +#define PNG_FORMAT_ABGR (PNG_FORMAT_BGRA | PNG_FORMAT_FLAG_AFIRST) + +#define PNG_IMAGE_VERSION 1 + +#define PNG_IMAGE_PIXEL_(test, fmt) \ + (((fmt)&PNG_FORMAT_FLAG_COLORMAP) ? 1 : test(fmt)) + +#define PNG_IMAGE_SAMPLE_CHANNELS(fmt) \ + (((fmt) & (PNG_FORMAT_FLAG_COLOR | PNG_FORMAT_FLAG_ALPHA)) + 1) + +#define PNG_IMAGE_PIXEL_CHANNELS(fmt) \ + PNG_IMAGE_PIXEL_(PNG_IMAGE_SAMPLE_CHANNELS, fmt) + +#define PNG_IMAGE_ROW_STRIDE(image) \ + (PNG_IMAGE_PIXEL_CHANNELS((image).format) * (image).width) + +#define PNG_IMAGE_SAMPLE_COMPONENT_SIZE(fmt) \ + ((((fmt)&PNG_FORMAT_FLAG_LINEAR) >> 2) + 1) + +#define PNG_IMAGE_PIXEL_COMPONENT_SIZE(fmt) \ + PNG_IMAGE_PIXEL_(PNG_IMAGE_SAMPLE_COMPONENT_SIZE, fmt) + +#define PNG_IMAGE_BUFFER_SIZE(image, row_stride) \ + (PNG_IMAGE_PIXEL_COMPONENT_SIZE((image).format) * (image).height * \ + (row_stride)) + +#define PNG_IMAGE_SIZE(image) \ + PNG_IMAGE_BUFFER_SIZE(image, PNG_IMAGE_ROW_STRIDE(image)) + +typedef uint8_t *png_bytep; + +#if UINT_MAX == 65535 +typedef unsigned int png_uint_16; +#elif USHRT_MAX == 65535 +typedef unsigned short png_uint_16; +#else +#error "libpng requires an unsigned 16-bit type" +#endif + +#define PNG_LIBPNG_VER_STRING "1.6.38.git" + +#define PNG_COLOR_MASK_COLOR 2 +#define PNG_COLOR_MASK_ALPHA 4 + +#define PNG_COLOR_TYPE_RGB (PNG_COLOR_MASK_COLOR) +#define PNG_COLOR_TYPE_RGB_ALPHA (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_ALPHA) +#define PNG_COLOR_TYPE_RGBA PNG_COLOR_TYPE_RGB_ALPHA + +#define PNG_FILTER_TYPE_BASE 0 +#define PNG_COMPRESSION_TYPE_BASE 0 +#define PNG_INTERLACE_NONE 0 + diff --git a/oss-internship-2020/libpng/wrapper/CMakeLists.txt b/oss-internship-2020/libpng/wrapper/CMakeLists.txt new file mode 100644 index 0000000..aba420a --- /dev/null +++ b/oss-internship-2020/libpng/wrapper/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +add_library(wrapper OBJECT + func.h + func.cc +) + +set_target_properties(wrapper + PROPERTIES LINKER_LANGUAGE C +) + +target_link_libraries(wrapper + sandbox2::temp_file + sapi::sapi + PNG::PNG +) diff --git a/oss-internship-2020/libpng/wrapper/func.cc b/oss-internship-2020/libpng/wrapper/func.cc new file mode 100644 index 0000000..c8630b6 --- /dev/null +++ b/oss-internship-2020/libpng/wrapper/func.cc @@ -0,0 +1,57 @@ +#include "func.h" // NOLINT(build/include) + +#include + +void png_setjmp(png_structrp ptr) { setjmp(png_jmpbuf(ptr)); } + +void* png_fdopen(int fd, const char* mode) { + FILE* f = fdopen(fd, mode); + return static_cast(f); +} + +void png_rewind(void* f) { rewind(static_cast(f)); } + +void png_fread(void* buffer, size_t size, size_t count, void* stream) { + fread(buffer, size, count, static_cast(stream)); +} + +void png_fclose(void* f) { fclose(static_cast(f)); } + +void png_init_io_wrapper(png_structrp png_ptr, void* f) { + png_init_io(png_ptr, static_cast(f)); +} + +png_structp png_create_read_struct_wrapper(png_const_charp user_png_ver, + png_voidp error_ptr) { + return png_create_read_struct(user_png_ver, error_ptr, NULL, NULL); +} + +png_structp png_create_write_struct_wrapper(png_const_charp user_png_ver, + png_voidp error_ptr) { + return png_create_write_struct(user_png_ver, error_ptr, NULL, NULL); +} + +void png_read_image_wrapper(png_structrp png_ptr, png_bytep image, + size_t height, size_t rowbytes) { + png_bytep* ptrs = (png_bytep*)malloc(height * sizeof(png_bytep)); + for (size_t i = 0; i != height; ++i) { + ptrs[i] = image + (i * rowbytes); + } + png_read_image(png_ptr, ptrs); + free(ptrs); +} + +void png_write_image_wrapper(png_structrp png_ptr, png_bytep image, + size_t height, size_t rowbytes) { + png_bytep* ptrs = (png_bytep*)malloc(height * sizeof(png_bytep)); + for (size_t i = 0; i != height; ++i) { + ptrs[i] = image + (i * rowbytes); + } + png_write_image(png_ptr, ptrs); + free(ptrs); +} + +void png_write_end_wrapper(png_structrp png_ptr) { + png_write_end(png_ptr, NULL); +} + diff --git a/oss-internship-2020/libpng/wrapper/func.h b/oss-internship-2020/libpng/wrapper/func.h new file mode 100644 index 0000000..2233f74 --- /dev/null +++ b/oss-internship-2020/libpng/wrapper/func.h @@ -0,0 +1,24 @@ +#ifndef LIBPNG_WRAPPER_FUNC_H +#define LIBPNG_WRAPPER_FUNC_H + +#include "png.h" + +extern "C" { +void* png_fdopen(int fd, const char* mode); +void png_rewind(void* f); +void png_fread(void* buffer, size_t size, size_t count, void* stream); +void png_fclose(void* f); +void png_setjmp(png_structrp ptr); +png_structp png_create_read_struct_wrapper(png_const_charp user_png_ver, + png_voidp error_ptr); +png_structp png_create_write_struct_wrapper(png_const_charp user_png_ver, + png_voidp error_ptr); +void png_init_io_wrapper(png_structrp png_ptr, void* f); +void png_read_image_wrapper(png_structrp png_ptr, png_bytep image, + size_t height, size_t rowbytes); +void png_write_image_wrapper(png_structrp png_ptr, png_bytep image, + size_t height, size_t rowbytes); +void png_write_end_wrapper(png_structrp png_ptr); +} +#endif + From 7b6b2d2fe845040f30735060b3cc1161fb1e55db Mon Sep 17 00:00:00 2001 From: Alexandra Latysheva Date: Fri, 30 Oct 2020 11:17:45 +0000 Subject: [PATCH 02/10] use &sapi::v::NullPtr instead of sapi::v::NullPtr().PthBoth() as NULL inside the sandbox; remove unused wrapper for png_write_end --- .../libpng/examples/example1.cc | 18 ++++++++---------- .../libpng/examples/example2.cc | 12 +++++------- oss-internship-2020/libpng/tests/basic_test.cc | 10 ++++------ .../libpng/tests/extended_test.cc | 10 ++++------ oss-internship-2020/libpng/wrapper/func.cc | 5 ----- oss-internship-2020/libpng/wrapper/func.h | 2 -- 6 files changed, 21 insertions(+), 36 deletions(-) diff --git a/oss-internship-2020/libpng/examples/example1.cc b/oss-internship-2020/libpng/examples/example1.cc index 49b7ff5..d4b0cba 100644 --- a/oss-internship-2020/libpng/examples/example1.cc +++ b/oss-internship-2020/libpng/examples/example1.cc @@ -14,7 +14,7 @@ #include -#include "../sandboxed.h" // NOLINT(build/include) +#include "../sandboxed.h" // NOLINT(build/include) #include "../tests/libpng.h" // NOLINT(build/include) #include "sandboxed_api/vars.h" @@ -51,19 +51,18 @@ absl::Status LibPNGMain(const std::string& infile, const std::string& outfile) { free(buffer); sapi::v::Array buffer_(PNG_IMAGE_SIZE(*image.mutable_data())); - SAPI_ASSIGN_OR_RETURN( - result, api.png_image_finish_read( - image.PtrBoth(), sapi::v::NullPtr().PtrBoth(), - buffer_.PtrBoth(), 0, sapi::v::NullPtr().PtrBoth())); + sapi::v::NullPtr null = sapi::v::NullPtr(); + SAPI_ASSIGN_OR_RETURN(result, + api.png_image_finish_read(image.PtrBoth(), &null, + buffer_.PtrBoth(), 0, &null)); if (!result) { return absl::InternalError( absl::StrCat("finish read error: ", image.mutable_data()->message)); } - SAPI_ASSIGN_OR_RETURN( - result, api.png_image_write_to_file( - image.PtrBoth(), outfile_var.PtrBefore(), 0, - buffer_.PtrBoth(), 0, sapi::v::NullPtr().PtrBoth())); + SAPI_ASSIGN_OR_RETURN(result, api.png_image_write_to_file( + image.PtrBoth(), outfile_var.PtrBefore(), 0, + buffer_.PtrBoth(), 0, &null)); if (!result) { return absl::InternalError( absl::StrCat("write error: ", image.mutable_data()->message)); @@ -87,4 +86,3 @@ int main(int argc, const char** argv) { return EXIT_SUCCESS; } - diff --git a/oss-internship-2020/libpng/examples/example2.cc b/oss-internship-2020/libpng/examples/example2.cc index b791f69..f270ceb 100644 --- a/oss-internship-2020/libpng/examples/example2.cc +++ b/oss-internship-2020/libpng/examples/example2.cc @@ -15,7 +15,7 @@ #include #include -#include "../sandboxed.h" // NOLINT(build/include) +#include "../sandboxed.h" // NOLINT(build/include) #include "../tests/libpng.h" // NOLINT(build/include) struct Data { @@ -65,10 +65,10 @@ absl::Status ReadPng(LibPNGApi& api, LibPNGSapiSandbox& sandbox, absl::StatusOr status_or_png_structp; sapi::v::ConstCStr ver_string_var(PNG_LIBPNG_VER_STRING); + sapi::v::NullPtr null = sapi::v::NullPtr(); SAPI_ASSIGN_OR_RETURN( status_or_png_structp, - api.png_create_read_struct_wrapper(ver_string_var.PtrBefore(), - sapi::v::NullPtr().PtrBoth())); + api.png_create_read_struct_wrapper(ver_string_var.PtrBefore(), &null)); sapi::v::RemotePtr struct_ptr(status_or_png_structp.value()); if (!struct_ptr.GetValue()) { @@ -143,10 +143,10 @@ absl::Status WritePng(LibPNGApi& api, LibPNGSapiSandbox& sandbox, absl::StatusOr status_or_png_structp; sapi::v::ConstCStr ver_string_var(PNG_LIBPNG_VER_STRING); + sapi::v::NullPtr null = sapi::v::NullPtr(); SAPI_ASSIGN_OR_RETURN( status_or_png_structp, - api.png_create_write_struct_wrapper(ver_string_var.PtrBefore(), - sapi::v::NullPtr().PtrBoth())); + api.png_create_write_struct_wrapper(ver_string_var.PtrBefore(), &null)); sapi::v::RemotePtr struct_ptr(status_or_png_structp.value()); if (!struct_ptr.GetValue()) { @@ -176,7 +176,6 @@ absl::Status WritePng(LibPNGApi& api, LibPNGSapiSandbox& sandbox, SAPI_RETURN_IF_ERROR(api.png_write_image_wrapper( &struct_ptr, d.row_pointers->PtrBefore(), d.height, d.rowbytes)); - auto null = sapi::v::NullPtr(); SAPI_RETURN_IF_ERROR(api.png_setjmp(&struct_ptr)); SAPI_RETURN_IF_ERROR(api.png_write_end(&struct_ptr, &null)); @@ -236,4 +235,3 @@ int main(int argc, const char** argv) { return EXIT_SUCCESS; } - diff --git a/oss-internship-2020/libpng/tests/basic_test.cc b/oss-internship-2020/libpng/tests/basic_test.cc index cc22561..24ebf3c 100644 --- a/oss-internship-2020/libpng/tests/basic_test.cc +++ b/oss-internship-2020/libpng/tests/basic_test.cc @@ -64,9 +64,9 @@ TEST(SandboxTest, ReadWrite) { << "image version changed"; sapi::v::Array buffer_(PNG_IMAGE_SIZE(*image.mutable_data())); - status_or_int = api.png_image_finish_read( - image.PtrBoth(), sapi::v::NullPtr().PtrBoth(), buffer_.PtrBoth(), 0, - sapi::v::NullPtr().PtrBoth()); + sapi::v::NullPtr null = sapi::v::NullPtr(); + status_or_int = api.png_image_finish_read(image.PtrBoth(), &null, + buffer_.PtrBoth(), 0, &null); ASSERT_THAT(status_or_int, IsOk()) << "png_image_finish_read fatal error"; ASSERT_THAT(status_or_int.value(), IsTrue()) << "png_image_finish_read failed: " << image.mutable_data()->message; @@ -76,8 +76,7 @@ TEST(SandboxTest, ReadWrite) { << "image format changed"; status_or_int = api.png_image_write_to_file( - image.PtrBoth(), outfile_var.PtrBefore(), 0, buffer_.PtrBoth(), 0, - sapi::v::NullPtr().PtrBoth()); + image.PtrBoth(), outfile_var.PtrBefore(), 0, buffer_.PtrBoth(), 0, &null); ASSERT_THAT(status_or_int, IsOk()) << "png_image_write_to_file fatal error"; ASSERT_THAT(status_or_int.value(), IsTrue()) << "png_image_finish_read failed: " << image.mutable_data()->message; @@ -88,4 +87,3 @@ TEST(SandboxTest, ReadWrite) { } } // namespace - diff --git a/oss-internship-2020/libpng/tests/extended_test.cc b/oss-internship-2020/libpng/tests/extended_test.cc index 78c04ab..fee0942 100644 --- a/oss-internship-2020/libpng/tests/extended_test.cc +++ b/oss-internship-2020/libpng/tests/extended_test.cc @@ -69,9 +69,9 @@ void ReadPng(LibPNGApi& api, LibPNGSapiSandbox& sandbox, ASSERT_THAT(status_or_int.value(), Eq(0)) << infile << " is not a PNG file"; sapi::v::ConstCStr ver_string_var(PNG_LIBPNG_VER_STRING); + sapi::v::NullPtr null = sapi::v::NullPtr(); absl::StatusOr status_or_png_structp = - api.png_create_read_struct_wrapper(ver_string_var.PtrBefore(), - sapi::v::NullPtr().PtrBoth()); + api.png_create_read_struct_wrapper(ver_string_var.PtrBefore(), &null); ASSERT_THAT(status_or_png_structp, IsOk()); sapi::v::RemotePtr struct_ptr(status_or_png_structp.value()); @@ -151,9 +151,9 @@ void WritePng(LibPNGApi& api, LibPNGSapiSandbox& sandbox, ASSERT_THAT(file.GetValue(), NotNull()) << "Could not open " << outfile; sapi::v::ConstCStr ver_string_var(PNG_LIBPNG_VER_STRING); + sapi::v::NullPtr null = sapi::v::NullPtr(); absl::StatusOr status_or_png_structp = - api.png_create_write_struct_wrapper(ver_string_var.PtrBefore(), - sapi::v::NullPtr().PtrBoth()); + api.png_create_write_struct_wrapper(ver_string_var.PtrBefore(), &null); ASSERT_THAT(status_or_png_structp, IsOk()); sapi::v::RemotePtr struct_ptr(status_or_png_structp.value()); @@ -186,7 +186,6 @@ void WritePng(LibPNGApi& api, LibPNGSapiSandbox& sandbox, data.height, data.rowbytes), IsOk()); - auto null = sapi::v::NullPtr(); ASSERT_THAT(api.png_setjmp(&struct_ptr), IsOk()); ASSERT_THAT(api.png_write_end(&struct_ptr, &null), IsOk()); @@ -245,4 +244,3 @@ TEST(SandboxTest, ReadModifyWrite) { } } // namespace - diff --git a/oss-internship-2020/libpng/wrapper/func.cc b/oss-internship-2020/libpng/wrapper/func.cc index c8630b6..cd4d1bf 100644 --- a/oss-internship-2020/libpng/wrapper/func.cc +++ b/oss-internship-2020/libpng/wrapper/func.cc @@ -50,8 +50,3 @@ void png_write_image_wrapper(png_structrp png_ptr, png_bytep image, png_write_image(png_ptr, ptrs); free(ptrs); } - -void png_write_end_wrapper(png_structrp png_ptr) { - png_write_end(png_ptr, NULL); -} - diff --git a/oss-internship-2020/libpng/wrapper/func.h b/oss-internship-2020/libpng/wrapper/func.h index 2233f74..1f8dc91 100644 --- a/oss-internship-2020/libpng/wrapper/func.h +++ b/oss-internship-2020/libpng/wrapper/func.h @@ -18,7 +18,5 @@ void png_read_image_wrapper(png_structrp png_ptr, png_bytep image, size_t height, size_t rowbytes); void png_write_image_wrapper(png_structrp png_ptr, png_bytep image, size_t height, size_t rowbytes); -void png_write_end_wrapper(png_structrp png_ptr); } #endif - From 94abb95771b5e912f8cb965e40f5877f29a5e2fe Mon Sep 17 00:00:00 2001 From: Alexandra Latysheva Date: Fri, 30 Oct 2020 12:46:13 +0000 Subject: [PATCH 03/10] order targets in CMakeLists alphabetically --- oss-internship-2020/libpng/tests/CMakeLists.txt | 2 +- oss-internship-2020/libpng/wrapper/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/oss-internship-2020/libpng/tests/CMakeLists.txt b/oss-internship-2020/libpng/tests/CMakeLists.txt index 0cb2645..8feaad7 100644 --- a/oss-internship-2020/libpng/tests/CMakeLists.txt +++ b/oss-internship-2020/libpng/tests/CMakeLists.txt @@ -27,9 +27,9 @@ target_link_libraries(tests PRIVATE gmock gtest gtest_main + libpng_sapi sandbox2::temp_file sapi::sapi - libpng_sapi ) gtest_discover_tests(tests) diff --git a/oss-internship-2020/libpng/wrapper/CMakeLists.txt b/oss-internship-2020/libpng/wrapper/CMakeLists.txt index aba420a..2be50a0 100644 --- a/oss-internship-2020/libpng/wrapper/CMakeLists.txt +++ b/oss-internship-2020/libpng/wrapper/CMakeLists.txt @@ -22,7 +22,7 @@ set_target_properties(wrapper ) target_link_libraries(wrapper + PNG::PNG sandbox2::temp_file sapi::sapi - PNG::PNG ) From 36c816c6939a147cafb2c3c2af34bb7068669cad Mon Sep 17 00:00:00 2001 From: Alexandra Latysheva Date: Fri, 30 Oct 2020 13:00:05 +0000 Subject: [PATCH 04/10] add small documentation to readme --- oss-internship-2020/libpng/README.md | 36 +++++++++++++++++++++++ oss-internship-2020/libpng/tests/libpng.h | 2 +- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/oss-internship-2020/libpng/README.md b/oss-internship-2020/libpng/README.md index e69de29..dcf5749 100644 --- a/oss-internship-2020/libpng/README.md +++ b/oss-internship-2020/libpng/README.md @@ -0,0 +1,36 @@ +# sandboxed LibPNG +Copyright 2020 Google LLC. + +## Start use +You should make sure the libtiff submodule is cloned. + +`git clone --recursive https://github.com/google/sandboxed-api` + +## Usage + +#### Build: +``` +mkdir -p build && cd build && \ + cmake .. -DSAPI_ROOT=/path/to/sapi_root +make -j8 +``` + +#### Example: +You should add `-DLIBPNG_SAPI_ENABLE_EXAMPLES=ON` to use the example.\ +run PNG to PNG: `./examples/pngtopng /absolute/path/to/input/image.png /absolute/path/to/output/image.png`\ +run RGB to BGR: `./examples/rgbtobgr /absolute/path/to/input/image.png /absolute/path/to/output/image.png` + +Input and output examples can be found in images directory. + +PNG to PNG: \ +input: `/abs/path/to/project/images/pngtest.png`\ +output:` /abs/path/to/project/images/pngtopng_pngtest.png` + +RGB to BGR: \ +input: `/abs/path/to/project/images/red_ball.png`\ +output:` /abs/path/to/project/images/rgbtobgr_red_ball.png` + + +#### Tests: +You should add `-DLIBPNG_SAPI_ENABLE_TESTS=ON` to use tests.\ +run: `./tests/tests` diff --git a/oss-internship-2020/libpng/tests/libpng.h b/oss-internship-2020/libpng/tests/libpng.h index 6727eb5..c167d44 100644 --- a/oss-internship-2020/libpng/tests/libpng.h +++ b/oss-internship-2020/libpng/tests/libpng.h @@ -13,7 +13,7 @@ // limitations under the License. // Defines from libpng library. The problem is that the build throws the error -// "Duplicate functions" if #include was added. +// "Duplicate functions" if #include is added. #define PNG_FORMAT_FLAG_ALPHA 0x01U #define PNG_FORMAT_FLAG_COLOR 0x02U From 3a83fe68c9ed360c1a6259ab70cb067d9f698be8 Mon Sep 17 00:00:00 2001 From: Latysheva Alexandra <35174583+alexelex@users.noreply.github.com> Date: Fri, 30 Oct 2020 19:05:37 +0600 Subject: [PATCH 05/10] rewrite readme and correct mistakes in it --- oss-internship-2020/libpng/README.md | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/oss-internship-2020/libpng/README.md b/oss-internship-2020/libpng/README.md index dcf5749..c649592 100644 --- a/oss-internship-2020/libpng/README.md +++ b/oss-internship-2020/libpng/README.md @@ -17,20 +17,28 @@ make -j8 #### Example: You should add `-DLIBPNG_SAPI_ENABLE_EXAMPLES=ON` to use the example.\ -run PNG to PNG: `./examples/pngtopng /absolute/path/to/input/image.png /absolute/path/to/output/image.png`\ -run RGB to BGR: `./examples/rgbtobgr /absolute/path/to/input/image.png /absolute/path/to/output/image.png` +run PNG to PNG: +``` +./examples/pngtopng /absolute/path/to/input/image.png /absolute/path/to/output/image.png +``` +run RGB to BGR: +``` +./examples/rgbtobgr /absolute/path/to/input/image.png /absolute/path/to/output/image.png +``` -Input and output examples can be found in images directory. +Examples of input and output can be found in `images`. PNG to PNG: \ -input: `/abs/path/to/project/images/pngtest.png`\ -output:` /abs/path/to/project/images/pngtopng_pngtest.png` +input: `images/pngtest.png`\ +output:` images/pngtopng_pngtest.png` RGB to BGR: \ -input: `/abs/path/to/project/images/red_ball.png`\ -output:` /abs/path/to/project/images/rgbtobgr_red_ball.png` +input: `images/red_ball.png`\ +output: `images/rgbtobgr_red_ball.png` #### Tests: -You should add `-DLIBPNG_SAPI_ENABLE_TESTS=ON` to use tests.\ -run: `./tests/tests` +You should add `-DLIBPNG_SAPI_ENABLE_TESTS=ON` to use tests and run: +``` +./tests/tests +``` From 9068b28d280636a2b9b65936c21462383a4376a3 Mon Sep 17 00:00:00 2001 From: Alexandra Latysheva Date: Fri, 30 Oct 2020 13:27:25 +0000 Subject: [PATCH 06/10] remove default constructors; reword some errors; skip check is there is enough free space --- oss-internship-2020/libpng/examples/example1.cc | 13 +++---------- oss-internship-2020/libpng/examples/example2.cc | 2 -- oss-internship-2020/libpng/sandboxed.h | 1 - oss-internship-2020/libpng/tests/basic_test.cc | 14 ++++++++------ oss-internship-2020/libpng/tests/extended_test.cc | 2 -- 5 files changed, 11 insertions(+), 21 deletions(-) diff --git a/oss-internship-2020/libpng/examples/example1.cc b/oss-internship-2020/libpng/examples/example1.cc index d4b0cba..ac90298 100644 --- a/oss-internship-2020/libpng/examples/example1.cc +++ b/oss-internship-2020/libpng/examples/example1.cc @@ -42,19 +42,12 @@ absl::Status LibPNGMain(const std::string& infile, const std::string& outfile) { image.mutable_data()->format = PNG_FORMAT_RGBA; - auto buffer = malloc(PNG_IMAGE_SIZE(*image.mutable_data())); - if (!buffer) { - SAPI_RETURN_IF_ERROR(api.png_image_free(image.PtrBoth())); - return absl::OkStatus(); - } - - free(buffer); - sapi::v::Array buffer_(PNG_IMAGE_SIZE(*image.mutable_data())); + sapi::v::Array buffer(PNG_IMAGE_SIZE(*image.mutable_data())); sapi::v::NullPtr null = sapi::v::NullPtr(); SAPI_ASSIGN_OR_RETURN(result, api.png_image_finish_read(image.PtrBoth(), &null, - buffer_.PtrBoth(), 0, &null)); + buffer.PtrBoth(), 0, &null)); if (!result) { return absl::InternalError( absl::StrCat("finish read error: ", image.mutable_data()->message)); @@ -62,7 +55,7 @@ absl::Status LibPNGMain(const std::string& infile, const std::string& outfile) { SAPI_ASSIGN_OR_RETURN(result, api.png_image_write_to_file( image.PtrBoth(), outfile_var.PtrBefore(), 0, - buffer_.PtrBoth(), 0, &null)); + buffer.PtrBoth(), 0, &null)); if (!result) { return absl::InternalError( absl::StrCat("write error: ", image.mutable_data()->message)); diff --git a/oss-internship-2020/libpng/examples/example2.cc b/oss-internship-2020/libpng/examples/example2.cc index f270ceb..783cb01 100644 --- a/oss-internship-2020/libpng/examples/example2.cc +++ b/oss-internship-2020/libpng/examples/example2.cc @@ -19,8 +19,6 @@ #include "../tests/libpng.h" // NOLINT(build/include) struct Data { - Data() {} - int width; int height; uint8_t color_type; diff --git a/oss-internship-2020/libpng/sandboxed.h b/oss-internship-2020/libpng/sandboxed.h index 12e8585..385c1cb 100644 --- a/oss-internship-2020/libpng/sandboxed.h +++ b/oss-internship-2020/libpng/sandboxed.h @@ -61,4 +61,3 @@ class LibPNGSapiSandbox : public LibPNGSandbox { }; } // namespace - diff --git a/oss-internship-2020/libpng/tests/basic_test.cc b/oss-internship-2020/libpng/tests/basic_test.cc index 24ebf3c..4c4f97d 100644 --- a/oss-internship-2020/libpng/tests/basic_test.cc +++ b/oss-internship-2020/libpng/tests/basic_test.cc @@ -54,7 +54,7 @@ TEST(SandboxTest, ReadWrite) { absl::StatusOr status_or_int = api.png_image_begin_read_from_file( image.PtrBoth(), infile_var.PtrBefore()); ASSERT_THAT(status_or_int, IsOk()) - << "png_image_begin_read_from_file fatal error"; + << "fatal error when invoking png_image_begin_read_from_file"; ASSERT_THAT(status_or_int.value(), IsTrue()) << "png_image_begin_read_from_file failed: " << image.mutable_data()->message; @@ -63,11 +63,12 @@ TEST(SandboxTest, ReadWrite) { ASSERT_THAT(image.mutable_data()->version, Eq(PNG_IMAGE_VERSION)) << "image version changed"; - sapi::v::Array buffer_(PNG_IMAGE_SIZE(*image.mutable_data())); + sapi::v::Array buffer(PNG_IMAGE_SIZE(*image.mutable_data())); sapi::v::NullPtr null = sapi::v::NullPtr(); status_or_int = api.png_image_finish_read(image.PtrBoth(), &null, - buffer_.PtrBoth(), 0, &null); - ASSERT_THAT(status_or_int, IsOk()) << "png_image_finish_read fatal error"; + buffer.PtrBoth(), 0, &null); + ASSERT_THAT(status_or_int, IsOk()) + << "fatal error when invoking png_image_finish_read"; ASSERT_THAT(status_or_int.value(), IsTrue()) << "png_image_finish_read failed: " << image.mutable_data()->message; ASSERT_THAT(image.mutable_data()->version, Eq(PNG_IMAGE_VERSION)) @@ -76,8 +77,9 @@ TEST(SandboxTest, ReadWrite) { << "image format changed"; status_or_int = api.png_image_write_to_file( - image.PtrBoth(), outfile_var.PtrBefore(), 0, buffer_.PtrBoth(), 0, &null); - ASSERT_THAT(status_or_int, IsOk()) << "png_image_write_to_file fatal error"; + image.PtrBoth(), outfile_var.PtrBefore(), 0, buffer.PtrBoth(), 0, &null); + ASSERT_THAT(status_or_int, IsOk()) + << "fatal error when invoking png_image_write_to_file"; ASSERT_THAT(status_or_int.value(), IsTrue()) << "png_image_finish_read failed: " << image.mutable_data()->message; ASSERT_THAT(image.mutable_data()->version, Eq(PNG_IMAGE_VERSION)) diff --git a/oss-internship-2020/libpng/tests/extended_test.cc b/oss-internship-2020/libpng/tests/extended_test.cc index fee0942..5b20c54 100644 --- a/oss-internship-2020/libpng/tests/extended_test.cc +++ b/oss-internship-2020/libpng/tests/extended_test.cc @@ -32,8 +32,6 @@ using ::testing::IsTrue; using ::testing::NotNull; struct Data { - Data() {} - int width; int height; uint8_t color_type; From 56615d5d57c954b773ab10f9c359a2fc46d1f4f4 Mon Sep 17 00:00:00 2001 From: Alexandra Latysheva Date: Fri, 30 Oct 2020 13:41:55 +0000 Subject: [PATCH 07/10] use absl::StarusOr as a return value instead on pointer to constructed value; rename variable --- .../libpng/examples/example2.cc | 63 ++++++++++--------- 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/oss-internship-2020/libpng/examples/example2.cc b/oss-internship-2020/libpng/examples/example2.cc index 783cb01..eaede6d 100644 --- a/oss-internship-2020/libpng/examples/example2.cc +++ b/oss-internship-2020/libpng/examples/example2.cc @@ -28,8 +28,8 @@ struct Data { std::unique_ptr> row_pointers; }; -absl::Status ReadPng(LibPNGApi& api, LibPNGSapiSandbox& sandbox, - absl::string_view infile, Data& d) { +absl::StatusOr ReadPng(LibPNGApi& api, LibPNGSapiSandbox& sandbox, + absl::string_view infile) { sapi::v::Fd fd(open(infile.data(), O_RDONLY)); if (fd.GetValue() < 0) { @@ -87,38 +87,39 @@ absl::Status ReadPng(LibPNGApi& api, LibPNGSapiSandbox& sandbox, SAPI_RETURN_IF_ERROR(api.png_set_sig_bytes(&struct_ptr, header.GetSize())); SAPI_RETURN_IF_ERROR(api.png_read_info(&struct_ptr, &info_ptr)); - SAPI_ASSIGN_OR_RETURN(d.width, + Data data; + SAPI_ASSIGN_OR_RETURN(data.width, api.png_get_image_width(&struct_ptr, &info_ptr)); - SAPI_ASSIGN_OR_RETURN(d.height, + SAPI_ASSIGN_OR_RETURN(data.height, api.png_get_image_height(&struct_ptr, &info_ptr)); - SAPI_ASSIGN_OR_RETURN(d.color_type, + SAPI_ASSIGN_OR_RETURN(data.color_type, api.png_get_color_type(&struct_ptr, &info_ptr)); - SAPI_ASSIGN_OR_RETURN(d.bit_depth, + SAPI_ASSIGN_OR_RETURN(data.bit_depth, api.png_get_bit_depth(&struct_ptr, &info_ptr)); - SAPI_ASSIGN_OR_RETURN(d.number_of_passes, + SAPI_ASSIGN_OR_RETURN(data.number_of_passes, api.png_set_interlace_handling(&struct_ptr)); SAPI_RETURN_IF_ERROR(api.png_read_update_info(&struct_ptr, &info_ptr)); SAPI_RETURN_IF_ERROR(api.png_setjmp(&struct_ptr)); - SAPI_ASSIGN_OR_RETURN(d.rowbytes, + SAPI_ASSIGN_OR_RETURN(data.rowbytes, api.png_get_rowbytes(&struct_ptr, &info_ptr)); - d.row_pointers = - std::make_unique>(d.height * d.rowbytes); + data.row_pointers = + std::make_unique>(data.height * data.rowbytes); SAPI_RETURN_IF_ERROR(api.png_read_image_wrapper( - &struct_ptr, d.row_pointers->PtrAfter(), d.height, d.rowbytes)); + &struct_ptr, data.row_pointers->PtrAfter(), data.height, data.rowbytes)); SAPI_RETURN_IF_ERROR(api.png_fclose(&file)); - return absl::OkStatus(); + return data; } absl::Status WritePng(LibPNGApi& api, LibPNGSapiSandbox& sandbox, - absl::string_view outfile, Data& d) { + absl::string_view outfile, Data& data) { sapi::v::Fd fd(open(outfile.data(), O_WRONLY)); if (fd.GetValue() < 0) { return absl::InternalError("Error opening output file"); @@ -164,15 +165,16 @@ absl::Status WritePng(LibPNGApi& api, LibPNGSapiSandbox& sandbox, SAPI_RETURN_IF_ERROR(api.png_init_io_wrapper(&struct_ptr, &file)); SAPI_RETURN_IF_ERROR(api.png_setjmp(&struct_ptr)); - SAPI_RETURN_IF_ERROR(api.png_set_IHDR( - &struct_ptr, &info_ptr, d.width, d.height, d.bit_depth, d.color_type, - PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE)); + SAPI_RETURN_IF_ERROR( + api.png_set_IHDR(&struct_ptr, &info_ptr, data.width, data.height, + data.bit_depth, data.color_type, PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE)); SAPI_RETURN_IF_ERROR(api.png_write_info(&struct_ptr, &info_ptr)); SAPI_RETURN_IF_ERROR(api.png_setjmp(&struct_ptr)); SAPI_RETURN_IF_ERROR(api.png_write_image_wrapper( - &struct_ptr, d.row_pointers->PtrBefore(), d.height, d.rowbytes)); + &struct_ptr, data.row_pointers->PtrBefore(), data.height, data.rowbytes)); SAPI_RETURN_IF_ERROR(api.png_setjmp(&struct_ptr)); SAPI_RETURN_IF_ERROR(api.png_write_end(&struct_ptr, &null)); @@ -189,32 +191,33 @@ absl::Status LibPNGMain(const std::string& infile, const std::string& outfile) { SAPI_RETURN_IF_ERROR(sandbox.Init()); LibPNGApi api(&sandbox); - Data d; - SAPI_RETURN_IF_ERROR(ReadPng(api, sandbox, infile, d)); + SAPI_ASSIGN_OR_RETURN(Data data, ReadPng(api, sandbox, infile)); - if (d.color_type != PNG_COLOR_TYPE_RGBA && - d.color_type != PNG_COLOR_TYPE_RGB) { + if (data.color_type != PNG_COLOR_TYPE_RGBA && + data.color_type != PNG_COLOR_TYPE_RGB) { return absl::InternalError(absl::StrCat( infile, " has unexpected color type. Expected RGB or RGBA")); } size_t channel_count = 3; - if (d.color_type == PNG_COLOR_TYPE_RGBA) { + if (data.color_type == PNG_COLOR_TYPE_RGBA) { channel_count = 4; } // RGB to BGR - for (size_t i = 0; i != d.height; ++i) { - for (size_t j = 0; j != d.width; ++j) { - uint8_t r = (*d.row_pointers)[i * d.rowbytes + j * channel_count]; - uint8_t g = (*d.row_pointers)[i * d.rowbytes + j * channel_count + 1]; - uint8_t b = (*d.row_pointers)[i * d.rowbytes + j * channel_count + 2]; - (*d.row_pointers)[i * d.rowbytes + j * channel_count] = b; - (*d.row_pointers)[i * d.rowbytes + j * channel_count + 2] = r; + for (size_t i = 0; i != data.height; ++i) { + for (size_t j = 0; j != data.width; ++j) { + uint8_t r = (*data.row_pointers)[i * data.rowbytes + j * channel_count]; + uint8_t g = + (*data.row_pointers)[i * data.rowbytes + j * channel_count + 1]; + uint8_t b = + (*data.row_pointers)[i * data.rowbytes + j * channel_count + 2]; + (*data.row_pointers)[i * data.rowbytes + j * channel_count] = b; + (*data.row_pointers)[i * data.rowbytes + j * channel_count + 2] = r; } } - SAPI_RETURN_IF_ERROR(WritePng(api, sandbox, outfile, d)); + SAPI_RETURN_IF_ERROR(WritePng(api, sandbox, outfile, data)); return absl::OkStatus(); } From 64d04a80e5a507bcf5fb3f657d61b5951e476406 Mon Sep 17 00:00:00 2001 From: Alexandra Latysheva Date: Fri, 30 Oct 2020 14:02:34 +0000 Subject: [PATCH 08/10] use api->sandbox() instead of send sandbox as an argument --- .../libpng/examples/example2.cc | 15 +++++++-------- .../libpng/tests/extended_test.cc | 18 +++++++++--------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/oss-internship-2020/libpng/examples/example2.cc b/oss-internship-2020/libpng/examples/example2.cc index eaede6d..dabde57 100644 --- a/oss-internship-2020/libpng/examples/example2.cc +++ b/oss-internship-2020/libpng/examples/example2.cc @@ -28,15 +28,15 @@ struct Data { std::unique_ptr> row_pointers; }; -absl::StatusOr ReadPng(LibPNGApi& api, LibPNGSapiSandbox& sandbox, - absl::string_view infile) { +absl::StatusOr ReadPng(LibPNGApi& api, absl::string_view infile) { sapi::v::Fd fd(open(infile.data(), O_RDONLY)); if (fd.GetValue() < 0) { return absl::InternalError("Error opening input file"); } - SAPI_RETURN_IF_ERROR(sandbox.TransferToSandboxee(&fd)); + SAPI_RETURN_IF_ERROR((&api)->sandbox()->TransferToSandboxee(&fd)); + if (fd.GetRemoteFd() < 0) { return absl::InternalError("Error receiving remote FD"); } @@ -118,14 +118,13 @@ absl::StatusOr ReadPng(LibPNGApi& api, LibPNGSapiSandbox& sandbox, return data; } -absl::Status WritePng(LibPNGApi& api, LibPNGSapiSandbox& sandbox, - absl::string_view outfile, Data& data) { +absl::Status WritePng(LibPNGApi& api, absl::string_view outfile, Data& data) { sapi::v::Fd fd(open(outfile.data(), O_WRONLY)); if (fd.GetValue() < 0) { return absl::InternalError("Error opening output file"); } - SAPI_RETURN_IF_ERROR(sandbox.TransferToSandboxee(&fd)); + SAPI_RETURN_IF_ERROR((&api)->sandbox()->TransferToSandboxee(&fd)); if (fd.GetRemoteFd() < 0) { return absl::InternalError("Error receiving remote FD"); } @@ -191,7 +190,7 @@ absl::Status LibPNGMain(const std::string& infile, const std::string& outfile) { SAPI_RETURN_IF_ERROR(sandbox.Init()); LibPNGApi api(&sandbox); - SAPI_ASSIGN_OR_RETURN(Data data, ReadPng(api, sandbox, infile)); + SAPI_ASSIGN_OR_RETURN(Data data, ReadPng(api, infile)); if (data.color_type != PNG_COLOR_TYPE_RGBA && data.color_type != PNG_COLOR_TYPE_RGB) { @@ -217,7 +216,7 @@ absl::Status LibPNGMain(const std::string& infile, const std::string& outfile) { } } - SAPI_RETURN_IF_ERROR(WritePng(api, sandbox, outfile, data)); + SAPI_RETURN_IF_ERROR(WritePng(api, outfile, data)); return absl::OkStatus(); } diff --git a/oss-internship-2020/libpng/tests/extended_test.cc b/oss-internship-2020/libpng/tests/extended_test.cc index 5b20c54..deda14e 100644 --- a/oss-internship-2020/libpng/tests/extended_test.cc +++ b/oss-internship-2020/libpng/tests/extended_test.cc @@ -41,12 +41,12 @@ struct Data { std::unique_ptr> row_pointers; }; -void ReadPng(LibPNGApi& api, LibPNGSapiSandbox& sandbox, - absl::string_view infile, Data& data) { +void ReadPng(LibPNGApi& api, absl::string_view infile, Data& data) { sapi::v::Fd fd(open(infile.data(), O_RDONLY)); ASSERT_THAT(fd.GetValue(), Ge(0)) << "Error opening input file"; - ASSERT_THAT(sandbox.TransferToSandboxee(&fd), IsOk()); + ASSERT_THAT((&api)->sandbox()->TransferToSandboxee(&fd), IsOk()); + ASSERT_THAT(fd.GetRemoteFd(), Ge(0)) << "Error receiving remote FD"; sapi::v::ConstCStr rb_var("rb"); @@ -132,12 +132,12 @@ void ReadPng(LibPNGApi& api, LibPNGSapiSandbox& sandbox, ASSERT_THAT(api.png_fclose(&file), IsOk()); } -void WritePng(LibPNGApi& api, LibPNGSapiSandbox& sandbox, - absl::string_view outfile, Data& data) { +void WritePng(LibPNGApi& api, absl::string_view outfile, Data& data) { sapi::v::Fd fd(open(outfile.data(), O_WRONLY)); ASSERT_THAT(fd.GetValue(), Ge(0)) << "Error opening output file"; - ASSERT_THAT(sandbox.TransferToSandboxee(&fd), IsOk()); + ASSERT_THAT((&api)->sandbox()->TransferToSandboxee(&fd), IsOk()); + ASSERT_THAT(fd.GetRemoteFd(), Ge(0)) << "Error receiving remote FD"; sapi::v::ConstCStr wb_var("wb"); @@ -199,7 +199,7 @@ TEST(SandboxTest, ReadModifyWrite) { LibPNGApi api(&sandbox); Data data; - ReadPng(api, sandbox, infile, data); + ReadPng(api, infile, data); ASSERT_THAT(data.color_type == PNG_COLOR_TYPE_RGBA || data.color_type == PNG_COLOR_TYPE_RGB, @@ -224,10 +224,10 @@ TEST(SandboxTest, ReadModifyWrite) { } } - WritePng(api, sandbox, outfile, data); + WritePng(api, outfile, data); Data result; - ReadPng(api, sandbox, outfile, result); + ReadPng(api, outfile, result); EXPECT_THAT(result.height, Eq(data.height)); EXPECT_THAT(result.width, Eq(data.width)); From 4bd158a68ff91b2e4593370c587bad1983d0a518 Mon Sep 17 00:00:00 2001 From: Alexandra Latysheva Date: Fri, 30 Oct 2020 14:52:53 +0000 Subject: [PATCH 09/10] use ctest for testing and set testing environment for using test data --- oss-internship-2020/libpng/README.md | 5 ++-- .../libpng/tests/CMakeLists.txt | 3 +-- .../libpng/tests/basic_test.cc | 2 +- .../libpng/tests/extended_test.cc | 4 ++-- oss-internship-2020/libpng/tests/helper.cc | 24 ++++--------------- oss-internship-2020/libpng/tests/helper.h | 5 ++-- 6 files changed, 13 insertions(+), 30 deletions(-) diff --git a/oss-internship-2020/libpng/README.md b/oss-internship-2020/libpng/README.md index c649592..f71b776 100644 --- a/oss-internship-2020/libpng/README.md +++ b/oss-internship-2020/libpng/README.md @@ -38,7 +38,8 @@ output: `images/rgbtobgr_red_ball.png` #### Tests: -You should add `-DLIBPNG_SAPI_ENABLE_TESTS=ON` to use tests and run: +You should add `-DLIBPNG_SAPI_ENABLE_TESTS=ON` to use tests and do: ``` -./tests/tests +cd tests +ctest . ``` diff --git a/oss-internship-2020/libpng/tests/CMakeLists.txt b/oss-internship-2020/libpng/tests/CMakeLists.txt index 8feaad7..ea4af40 100644 --- a/oss-internship-2020/libpng/tests/CMakeLists.txt +++ b/oss-internship-2020/libpng/tests/CMakeLists.txt @@ -32,5 +32,4 @@ target_link_libraries(tests PRIVATE sapi::sapi ) -gtest_discover_tests(tests) - +gtest_discover_tests(tests PROPERTIES ENVIRONMENT "TEST_SRCDIR=${PROJECT_SOURCE_DIR}") diff --git a/oss-internship-2020/libpng/tests/basic_test.cc b/oss-internship-2020/libpng/tests/basic_test.cc index 4c4f97d..6b6b6d2 100644 --- a/oss-internship-2020/libpng/tests/basic_test.cc +++ b/oss-internship-2020/libpng/tests/basic_test.cc @@ -28,7 +28,7 @@ using ::testing::Eq; using ::testing::IsTrue; TEST(SandboxTest, ReadWrite) { - std::string infile = GetTestFilePath("pngtest.png"); + std::string infile = GetFilePath("pngtest.png"); absl::StatusOr status_or_path = sandbox2::CreateNamedTempFileAndClose("output.png"); diff --git a/oss-internship-2020/libpng/tests/extended_test.cc b/oss-internship-2020/libpng/tests/extended_test.cc index deda14e..a2e67e3 100644 --- a/oss-internship-2020/libpng/tests/extended_test.cc +++ b/oss-internship-2020/libpng/tests/extended_test.cc @@ -191,8 +191,8 @@ void WritePng(LibPNGApi& api, absl::string_view outfile, Data& data) { } TEST(SandboxTest, ReadModifyWrite) { - std::string infile = GetTestFilePath("red_ball.png"); - std::string outfile = GetTestFilePath("test_output.png"); + std::string infile = GetFilePath("red_ball.png"); + std::string outfile = GetFilePath("test_output.png"); LibPNGSapiSandbox sandbox; ASSERT_THAT(sandbox.Init(), IsOk()); diff --git a/oss-internship-2020/libpng/tests/helper.cc b/oss-internship-2020/libpng/tests/helper.cc index b349c6b..84ab30c 100644 --- a/oss-internship-2020/libpng/tests/helper.cc +++ b/oss-internship-2020/libpng/tests/helper.cc @@ -13,28 +13,12 @@ // limitations under the License. #include "helper.h" // NOLINT(build/include) + #include "../sandboxed.h" // NOLINT(build/include) -#include "sandboxed_api/sandbox2/util/fileops.h" #include "sandboxed_api/sandbox2/util/path.h" -std::string GetImagesFolder() { - std::string cwd = sandbox2::file_util::fileops::GetCWD(); - auto find = cwd.rfind("/build"); - if (find == std::string::npos) { - LOG(ERROR) << "Something went wrong: CWD don't contain build dir. " - << "Please run tests from build dir, path might be incorrect\n"; +std::string GetSourcePath() { return getenv("TEST_SRCDIR"); } - return sandbox2::file::JoinPath(cwd, "images"); - } - - return sandbox2::file::JoinPath(cwd.substr(0, find), "images"); +std::string GetFilePath(absl::string_view filename) { + return sandbox2::file::JoinPath(GetSourcePath(), "images", filename); } - -std::string GetTestFilePath(const std::string& filename) { - static std::string* images_folder_path = nullptr; - if (!images_folder_path) { - images_folder_path = new std::string(GetImagesFolder()); - } - return sandbox2::file::JoinPath(*images_folder_path, filename); -} - diff --git a/oss-internship-2020/libpng/tests/helper.h b/oss-internship-2020/libpng/tests/helper.h index 9590f61..7a2a97c 100644 --- a/oss-internship-2020/libpng/tests/helper.h +++ b/oss-internship-2020/libpng/tests/helper.h @@ -12,7 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include - -std::string GetTestFilePath(const std::string& filename); +#include "absl/strings/str_join.h" +std::string GetFilePath(absl::string_view filename); From a5b5cd9a02dd814915ba361e697373cae76d5952 Mon Sep 17 00:00:00 2001 From: Alexandra Latysheva Date: Fri, 30 Oct 2020 15:47:36 +0000 Subject: [PATCH 10/10] add forgotten license to wrapper --- oss-internship-2020/libpng/wrapper/func.cc | 14 +++++++++++++- oss-internship-2020/libpng/wrapper/func.h | 14 ++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/oss-internship-2020/libpng/wrapper/func.cc b/oss-internship-2020/libpng/wrapper/func.cc index cd4d1bf..559ed11 100644 --- a/oss-internship-2020/libpng/wrapper/func.cc +++ b/oss-internship-2020/libpng/wrapper/func.cc @@ -1,4 +1,16 @@ -#include "func.h" // NOLINT(build/include) +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. #include diff --git a/oss-internship-2020/libpng/wrapper/func.h b/oss-internship-2020/libpng/wrapper/func.h index 1f8dc91..44dc583 100644 --- a/oss-internship-2020/libpng/wrapper/func.h +++ b/oss-internship-2020/libpng/wrapper/func.h @@ -1,3 +1,17 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + #ifndef LIBPNG_WRAPPER_FUNC_H #define LIBPNG_WRAPPER_FUNC_H