pax_global_header00006660000000000000000000000064147573061450014526gustar00rootroot0000000000000052 comment=99ef83f4b413c4a526ddc706eceda24701f773c3 libimage-png-libpng-perl-0.59/000077500000000000000000000000001475730614500162275ustar00rootroot00000000000000libimage-png-libpng-perl-0.59/CONTRIBUTING000066400000000000000000000014101475730614500200550ustar00rootroot00000000000000Thank you for your interest in contributing. If you would like to contribute to Image::PNG::Libpng, the first thing to do is to either email me or add an issue at the github. Because I started off making this to be distributed by CPAN, the github repository doesn't contain all of the scripts used to build the module, so forking there will probably end up annoying you. Although the module does most of the big parts of libpng, there is a lot of detailed work on this module remaining to be done, such as the handling of unknown chunks. Please be warned that the underlying library, "libpng", has a lot of "quirks" in its implementation and documentation, so an inevitable part of contributing to this module will be your having to root through the libpng C source code. libimage-png-libpng-perl-0.59/Changes000066400000000000000000000146051475730614500175300ustar00rootroot000000000000000.59 2025-02-24 - eXif, hIST tests switched off for libpng version 1.6.47 or above 0.58 2024-01-27 - Remove documentation for any2gray8 (does not exist) - Support for zlib-ng different compression behaviour - Maintainer email set to non-CPAN address 0.57 2021-04-27 - Remove export of "shift" causing bugs in dependent modules - Remove any2gray (is now in Image::PNG::Data) - Remove undocumented "get_row_pointers" method 0.56 2020-12-23 - Fix for memory bug within split_alpha 0.55 2020-12-21 - Add README to distribution - Bugs in transform fixed -- Always call png_read_update_info before reading image data - New "any2gray8" converts any kind of PNG file to an 8-bit gray one - Document read_update_info - Add support for (g|s)et_chunk_malloc_max 0.54 2020-12-19 - Implement the histogram part of set_quantize - set_hIST error handling changed to check values and warn within Perl - Automatically test against old versions of libpng before release 0.53 2020-12-16 - Support png_(g|s)et_(cHRM_XYZ|chunk_cache_max) - Support png_set_(background|rgb_to_gray|quantize); add examples - Add create_(reader|writer), color_type_channels convenience functions - Support partial read functions png_(read|write)_(end|image|info) - Support transform functions png_set_(.*) where possible - init_io made safer - Set palette chunk bugs fixed - split_alpha internals simplified, doc changed 0.52 2020-12-13 - Bug fixes for iTXt, sCAL chunk tests - Documentation tidied up 0.50 2020-12-12 - "set_text" issues errors for bad text chunks - Unify testing of libpng version - Better tests of setting and getting of tIME chunk - Round-trip tests for previously-untested pCAL, oFFs, hIST chunks - get_pCAL now works (was faulty) - Doc corrections for get_cHRM, oFFs, pHYs chunks - libpng_supports expanded to cover all macros in libpng 1.6.37 - DIAGNOSTICS section removed from documentation - Functions, chunk names, etc. in alphabetical order in doc - Doc "PNG Timestamps" to "tIME", "Palette" to "PLTE" - get_sBIT no longer writes zeros to empty fields - Unimplemented but documented "get_color_type" function implemented - set_PLTE_pointer method removed - Add read_struct function 0.49 2020-12-10 - Allow user to set compression level - Add set_compression_* and set_text_compression_* - Support the "lang" and "lang_key" fields of text chunks - Remove undocumented "language_tag" and "translated_key" for text chunks - Documentation work - Skip all iTXt tests for versions of libpng up to 1.6.3 0.48 2020-11-22 - Makefile.PL and printf fixes - Add ppport.h to distribution 0.47 2020-09-17 - Added "split_alpha" 0.46 2018-09-15 - Change set_rows to copy the data - Bug fix for Strawberry Perl builds - Documentation 0.45 2018-01-04 - Provisional support for png_set_compression_level removed - Documentation of two undocumented functions and a bug - Documentation of pnginspect 0.44 2017-06-28 - Revert back to old method of detecting libpng, discard Devel::CheckLib 0.43 2016-02-27 - Documents png_compare function - Documents pnginspect script 0.42 2016-02-18 - Adds "png_compare", a function to compare image data in two PNGs - Removes reference to mailing list from metadata - Fixes documentation internal links 0.41 2015-09-26 * Remove broken image, download, and mailing list links from documentation. * Simplify documentation (excessive headings). 0.40 2015-09-26 * Fixes bug related to use of memory after freeing. 0.39 2014-10-17 * Fixes bugs related to 64 bit systems (ARC) 0.38 2014-08-17 * Compilation guards for various kinds of libpng. * More tests for libpng support in libpng_supports. 0.37 2014-04-27 * Fixup for too-modern test (used s///r flag) * "get_IHDR" no longer returns "compression_method" and "filter_method" (always 0) * Some documentation cleanup. 0.36 2014-04-26 * Implements get_sBIT, set_sBIT (previously incorrectly implemented) * Implements get_tRNS, set_tRNS (previously unimplemented) * Distribution now includes testing over all valid members of "PngSuite" for copy-correctness of "copy_png". 0.35 2014-04-26 * Fix bug caused by premature freeing of memory due to changes in version 0.34. "copy_png" should be OK again. 0.34 2014-04-11 * Plug memory leak 0.33 2014-02-21 * New functions "set_row_pointers" and "set_image_data" for access to low-level PNG structures. 0.32 2014-02-14 * Changes to a C file to compile successfully on SunOS/Solaris * Remove DESTROY accidentally included in EXPORTS_OK (causes serious problems) 0.31 2014-02-11 * Changes to XS access routines "get_internals", "copy_row_pointers". * This supports "Image::PNG::Cairo" version 0.06 but not earlier versions. 0.30 2014-02-11 * Support sCAL chunk. * use warnings, use strict in main module. * "libpng_supports" added pCAL and sCAL to testable options. * "set_text" now has a default compression of PNG_TEXT_COMPRESSION_NONE, so the field "compression" doesn't have to be specified for every text chunk. * New function "copy_png" for copying chunks from a read PNG to a write PNG. * Support sPLT chunk (experimental). * Fix bug where some PNG constants (PNG_FILLER_AFTER etc.) were lost. 0.29 2014-02-11 * As 0.30 except bug fixes were not fully applied. 0.28 2014-01-23 * Memory handling changed for the benefit of Image::PNG::Cairo. 0.27 2014-01-21 * Change "supports" to "libpng_supports" and add "tEXt", "zTXt" options. * Try to detect broken libpngs and skip text tests for them. 0.26 2014-01-21 * Skip text tests for people without libpng text support. 0.25 2014-01-21 * Use the "official libpng" test PNG files for testing (previous files had bugs in them, leading to obscure test failures.) 0.24 2014-01-21 * Fix errors in gAMA.t causing test failures * Open internals for the sake of Image::PNG::Cairo. 0.23 2014-01-20 * "read_from_scalar" now has a return value & doesn't require create_read_struct to be called. * Documentation clarified. 0.22 2014-01-19 * Change Image::PNG::Libpng::Const back to Image::PNG::Const. * Minor fixes in documentation, etc. 0.21 2014-01-18 * Split from Image::PNG 0.20 2013-03-12 * Use Devel::CheckLib to check for png library. * Fix up for bug on Windows multithreaded. 0.19 2013-02-16 0.18 2013-02-15 0.17 2013-02-14 0.16 2012-04-18 0.15 2012-04-14 0.14 2012-04-14 0.13 2012-04-14 0.12 2012-04-14 0.11 2012-03-28 0.10 2012-03-26 0.09 2012-03-18 0.08 2011-06-02 0.07 2011-05-31 0.06 2011-05-24 0.05 2011-05-23 0.04 2011-05-23 0.03 2011-04-26 0.02 2011-04-21 0.01 2011-04-21 libimage-png-libpng-perl-0.59/Libpng.xs000066400000000000000000000646131475730614500200300ustar00rootroot00000000000000#line 2 "Libpng.xs.tmpl" #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "ppport.h" /* There is some kind of collision between a file included by "perl.h" and "png.h" for very old versions of libpng, like the one used on Ubuntu Linux. */ #define PNG_SKIP_SETJMP_CHECK #include #include #include #include #include "my-xs.h" #include "perl-libpng.c" #include "const-c.inc" MODULE = Image::PNG::Libpng PACKAGE = Image::PNG::Libpng PREFIX = perl_png_ PROTOTYPES: ENABLE INCLUDE: const-xs.inc # Constructors and destructors Image::PNG::Libpng perl_png_create_read_struct () CODE: RETVAL = perl_png_create_read_struct (); OUTPUT: RETVAL Image::PNG::Libpng perl_png_create_write_struct () CODE: RETVAL = perl_png_create_write_struct (); OUTPUT: RETVAL # XS destructor, this does the work. void perl_png_DESTROY (Png) Image::PNG::Libpng Png CODE: if (Png) { perl_png_destroy (Png); } # No-ops supplied since they used to be in use in old versions of the module. void perl_png_destroy_read_struct (Png) Image::PNG::Libpng Png CODE: perl_png_destroy_read_struct (Png); void perl_png_destroy_write_struct (Png) Image::PNG::Libpng Png CODE: perl_png_destroy_write_struct (Png); # libpng-style input/output functions void perl_png_write_image(Png, rows) Image::PNG::Libpng Png; AV * rows CODE: check_init_io (Png); perl_png_write_image (Png, rows); void perl_png_write_info(Png) Image::PNG::Libpng Png; CODE: check_init_io (Png); png_write_info (Png->png, Png->info); void perl_png_write_end(Png) Image::PNG::Libpng Png; CODE: check_init_io (Png); png_write_end (Png->png, Png->info); SV * perl_png_read_image(Png) Image::PNG::Libpng Png; CODE: check_init_io (Png); RETVAL = perl_png_read_image (Png); OUTPUT: RETVAL void perl_png_read_end(Png) Image::PNG::Libpng Png; CODE: check_init_io (Png); png_read_end (Png->png, Png->info); void perl_png_write_png (Png, transforms = PNG_TRANSFORM_IDENTITY) Image::PNG::Libpng Png int transforms CODE: perl_png_write_png (Png, transforms); void perl_png_init_io (Png, fpsv) Image::PNG::Libpng Png SV * fpsv CODE: perl_png_init_io_x (Png, fpsv); void perl_png_read_info (Png) Image::PNG::Libpng Png CODE: check_init_io (Png); png_read_info (Png->png, Png->info); void perl_png_read_update_info (Png) Image::PNG::Libpng Png CODE: check_init_io (Png); png_read_update_info (Png->png, Png->info); void perl_png_read_png (Png, transforms = PNG_TRANSFORM_IDENTITY) Image::PNG::Libpng Png int transforms CODE: check_init_io (Png); perl_png_read_png (Png, transforms); SV * perl_png_get_text (Png) Image::PNG::Libpng Png CODE: RETVAL = perl_png_get_text (Png); OUTPUT: RETVAL void perl_png_set_text (Png, text) Image::PNG::Libpng Png AV * text CODE: perl_png_set_text (Png, text); int perl_png_sig_cmp (sig, start = 0, num_to_check = 8) SV * sig int start int num_to_check CODE: RETVAL = perl_png_sig_cmp (sig, start, num_to_check); OUTPUT: RETVAL void perl_png_scalar_as_input (Png, scalar, transforms = 0) Image::PNG::Libpng Png SV * scalar int transforms CODE: perl_png_scalar_as_input (Png, scalar, transforms); Image::PNG::Libpng perl_png_read_from_scalar (scalar, transforms = 0) SV * scalar int transforms CODE: RETVAL = perl_png_read_from_scalar (scalar, transforms); OUTPUT: RETVAL const char * perl_png_get_libpng_ver () CODE: RETVAL = png_get_libpng_ver (UNUSED_ZERO_ARG); OUTPUT: RETVAL int perl_png_access_version_number () CODE: RETVAL = png_access_version_number (); OUTPUT: RETVAL SV * perl_png_get_rows (Png) Image::PNG::Libpng Png CODE: RETVAL = perl_png_get_rows (Png); OUTPUT: RETVAL int perl_png_get_rowbytes (Png) Image::PNG::Libpng Png CODE: RETVAL = png_get_rowbytes (Png->png, Png->info); OUTPUT: RETVAL SV * perl_png_get_valid (Png) Image::PNG::Libpng Png CODE: RETVAL = perl_png_get_valid (Png); OUTPUT: RETVAL void perl_png_set_tRNS_pointer (Png, tRNS_pointer, num_tRNS_pointer) Image::PNG::Libpng Png void * tRNS_pointer int num_tRNS_pointer CODE: perl_png_set_tRNS_pointer (Png, tRNS_pointer, num_tRNS_pointer); void perl_png_set_rows (Png, rows) Image::PNG::Libpng Png AV * rows CODE: perl_png_set_rows (Png, rows); SV * perl_png_write_to_scalar (Png, transforms = 0) Image::PNG::Libpng Png int transforms; CODE: RETVAL = perl_png_write_to_scalar (Png, transforms); OUTPUT: RETVAL void perl_png_set_filter (Png, filters) Image::PNG::Libpng Png int filters; CODE: png_set_filter (Png->png, UNUSED_ZERO_ARG, filters); void perl_png_set_unknown_chunks (Png, unknown_chunks) Image::PNG::Libpng Png AV * unknown_chunks CODE: perl_png_set_unknown_chunks (Png, unknown_chunks); SV * perl_png_get_unknown_chunks (Png) Image::PNG::Libpng Png CODE: RETVAL = perl_png_get_unknown_chunks (Png); OUTPUT: RETVAL void perl_png_set_keep_unknown_chunks (Png, keep, chunk_list = 0) Image::PNG::Libpng Png int keep SV * chunk_list CODE: perl_png_set_keep_unknown_chunks (Png, keep, chunk_list); int perl_png_get_chunk_malloc_max (Png) Image::PNG::Libpng Png; CODE: #ifdef PNG_CHUNK_MALLOC_MAX_SUPPORTED RETVAL = png_get_chunk_malloc_max (Png->png); #else UNSUPPORTED(CHUNK_MALLOC_MAX); RETVAL = 0; #endif /* chunk_malloc_max supported */ OUTPUT: RETVAL void perl_png_set_chunk_malloc_max (Png, max) Image::PNG::Libpng Png; int max; CODE: #ifdef PNG_CHUNK_MALLOC_MAX_SUPPORTED png_set_chunk_malloc_max (Png->png, max); #else UNSUPPORTED(CHUNK_MALLOC_MAX); #endif /* chunk_malloc_max supported */ # Chunk code which is not automatically generated. int perl_png_get_sRGB (Png) Image::PNG::Libpng Png CODE: RETVAL = perl_png_get_sRGB (Png); OUTPUT: RETVAL void perl_png_set_sRGB (Png, sRGB) Image::PNG::Libpng Png int sRGB CODE: perl_png_set_sRGB (Png, sRGB); SV * perl_png_get_tRNS_palette (Png) Image::PNG::Libpng Png CODE: RETVAL = perl_png_get_tRNS_palette (Png); OUTPUT: RETVAL # Transform routines. These generally doesn't take any arguments but # usually do require conditional wrappers to compile on older # versions of libpng. void perl_png_set_add_alpha(Png, filler, filler_loc) Image::PNG::Libpng Png; unsigned int filler; int filler_loc; CODE: if (Png->type == perl_png_read_obj) { #if defined(PNG_READ_FILLER_SUPPORTED) png_set_add_alpha (Png->png, filler, filler_loc); #else UNSUPPORTED(READ_FILLER); #endif /* read/write filler */ } else { #if defined(PNG_WRITE_FILLER_SUPPORTED) png_set_add_alpha (Png->png, filler, filler_loc); #else UNSUPPORTED(WRITE_FILLER); #endif /* read/write filler */ } void perl_png_set_alpha_mode (Png, mode, screen_gamma) Image::PNG::Libpng Png; int mode; double screen_gamma; CODE: #ifdef PNG_READ_ALPHA_MODE_SUPPORTED png_set_alpha_mode (Png->png, mode, screen_gamma); #else UNSUPPORTED(READ_ALPHA_MODE); #endif /* def PNG_READ_ALPHA_MODE */ void perl_png_set_bgr(Png) Image::PNG::Libpng Png; CODE: if (Png->type == perl_png_read_obj) { #if defined(PNG_READ_BGR_SUPPORTED) png_set_bgr (Png->png); #else UNSUPPORTED (READ_BGR); #endif /* READ_BGR */ } else { #if defined(PNG_WRITE_BGR_SUPPORTED) png_set_bgr (Png->png); #else UNSUPPORTED (WRITE_BGR); #endif /* WRITE_BGR */ } void perl_png_set_expand (Png) Image::PNG::Libpng Png CODE: #ifdef PNG_READ_EXPAND_SUPPORTED png_set_expand (Png->png); #else UNSUPPORTED (READ_EXPAND); #endif /* READ_EXPAND */ void perl_png_set_expand_16 (Png) Image::PNG::Libpng Png CODE: #ifdef PNG_READ_EXPAND_16_SUPPORTED png_set_expand_16 (Png->png); #else UNSUPPORTED (READ_EXPAND_16); #endif /* READ_EXPAND_16 */ void perl_png_set_filler (Png, filler, flags) Image::PNG::Libpng Png int filler int flags CODE: if (Png->type == perl_png_read_obj) { #if defined(PNG_READ_FILLER_SUPPORTED) png_set_filler (Png->png, filler, flags); #else UNSUPPORTED (READ_FILLER); #endif /* read/write filler */ } else { #if defined(PNG_WRITE_FILLER_SUPPORTED) png_set_filler (Png->png, filler, flags); #else UNSUPPORTED (WRITE_FILLER); #endif /* read/write filler */ } void perl_png_set_gray_to_rgb (Png) Image::PNG::Libpng Png CODE: #ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED png_set_gray_to_rgb (Png->png); #else UNSUPPORTED (READ_GRAY_TO_RGB); #endif /* READ_GRAY_TO_RGB */ void perl_png_set_expand_gray_1_2_4_to_8(Png) Image::PNG::Libpng Png; CODE: #ifdef PNG_READ_EXPAND_SUPPORTED png_set_expand_gray_1_2_4_to_8 (Png->png); #else UNSUPPORTED (READ_EXPAND); #endif /* read_expand */ void perl_png_set_invert_alpha(Png) Image::PNG::Libpng Png; CODE: #ifdef PNG_READ_INVERT_ALPHA_SUPPORTED png_set_invert_alpha (Png->png); #else UNSUPPORTED (READ_INVERT_ALPHA); #endif /* READ_INVERT_ALPHA */ void perl_png_set_invert_mono(Png) Image::PNG::Libpng Png; CODE: #ifdef PNG_READ_INVERT_SUPPORTED png_set_invert_mono (Png->png); #else UNSUPPORTED (READ_INVERT); #endif /* READ_INVERT */ void perl_png_set_packing (Png) Image::PNG::Libpng Png CODE: if (Png->type == perl_png_read_obj) { #if defined(PNG_READ_PACK_SUPPORTED) png_set_packing (Png->png); #else UNSUPPORTED (READ_PACK); #endif /* READ_PACK */ } else { #if defined(PNG_WRITE_PACK_SUPPORTED) png_set_packing (Png->png); #else UNSUPPORTED (WRITE_PACK); #endif /* WRITE_PACK */ } void perl_png_set_packswap(Png) Image::PNG::Libpng Png; CODE: if (Png->type == perl_png_read_obj) { #if defined(PNG_READ_PACKSWAP_SUPPORTED) png_set_packing (Png->png); #else UNSUPPORTED (READ_PACKSWAP); #endif /* READ_PACKSWAP */ } else { #if defined(PNG_WRITE_PACKSWAP_SUPPORTED) png_set_packswap (Png->png); #else UNSUPPORTED (WRITE_PACKSWAP); #endif /* WRITE_PACKSWAP */ } void perl_png_set_palette_to_rgb(Png) Image::PNG::Libpng Png; CODE: #ifdef PNG_READ_EXPAND_SUPPORTED png_set_palette_to_rgb (Png->png); #else UNSUPPORTED (READ_EXPAND); #endif /* READ_EXPAND */ void perl_png_set_scale_16(Png) Image::PNG::Libpng Png; CODE: #ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED png_set_scale_16 (Png->png); #else UNSUPPORTED (READ_SCALE_16_TO_8); #endif /* READ_SCALE_16_TO_8 */ void perl_png_set_tRNS_to_alpha(Png) Image::PNG::Libpng Png; CODE: #ifdef PNG_READ_EXPAND_SUPPORTED png_set_tRNS_to_alpha(Png->png); #else UNSUPPORTED (READ_EXPAND); #endif /* read_expand */ void perl_png_set_strip_16 (Png) Image::PNG::Libpng Png CODE: #ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED png_set_strip_16 (Png->png); #else UNSUPPORTED (READ_STRIP_16_TO_8); #endif /* READ_STRIP_16_TO_8 */ void perl_png_set_strip_alpha (Png) Image::PNG::Libpng Png CODE: #ifdef PNG_READ_STRIP_ALPHA_SUPPORTED png_set_strip_alpha (Png->png); #else UNSUPPORTED (READ_STRIP_ALPHA); #endif /* READ_STRIP_ALPHA */ void perl_png_set_swap(Png) Image::PNG::Libpng Png; CODE: if (Png->type == perl_png_read_obj) { #if defined(PNG_READ_SWAP_SUPPORTED) png_set_swap (Png->png); #else UNSUPPORTED (WRITE_SWAP); #endif } else { #if defined(PNG_WRITE_SWAP_SUPPORTED) png_set_swap (Png->png); #else UNSUPPORTED (READ_SWAP); #endif } void perl_png_set_swap_alpha(Png) Image::PNG::Libpng Png; CODE: #ifdef PNG_READ_SWAP_ALPHA_SUPPORTED png_set_swap_alpha (Png->png); #else UNSUPPORTED (READ_SWAP_ALPHA); #endif /* READ_SWAP_ALPHA */ void perl_png_set_transforms (Png, transforms) Image::PNG::Libpng Png; int transforms; CODE: perl_png_set_transforms (Png, transforms); OUTPUT: int perl_png_get_palette_max(Png) Image::PNG::Libpng Png; CODE: RETVAL = -1; #ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED # ifdef PNG_GET_PALETTE_MAX_SUPPORTED RETVAL = png_get_palette_max (Png->png, Png->info); # else UNSUPPORTED (GET_PALETTE_MAX); # endif #else UNSUPPORTED (CHECK_FOR_INVALID_INDEX); #endif OUTPUT: RETVAL # Functions which retrieve individual values from the header. int perl_png_get_image_width (Png) Image::PNG::Libpng Png; CODE: RETVAL = perl_png_get_image_width (Png); OUTPUT: RETVAL int perl_png_get_image_height (Png) Image::PNG::Libpng Png; CODE: RETVAL = perl_png_get_image_height (Png); OUTPUT: RETVAL int perl_png_get_channels (Png) Image::PNG::Libpng Png; CODE: RETVAL = perl_png_get_channels (Png); OUTPUT: RETVAL int perl_png_get_bit_depth (Png) Image::PNG::Libpng Png; CODE: RETVAL = png_get_bit_depth (Png->png, Png->info); OUTPUT: RETVAL int perl_png_get_interlace_type (Png) Image::PNG::Libpng Png; CODE: RETVAL = png_get_interlace_type (Png->png, Png->info); OUTPUT: RETVAL int perl_png_get_color_type (Png) Image::PNG::Libpng Png; CODE: RETVAL = png_get_color_type (Png->png, Png->info); OUTPUT: RETVAL # http://www.cpantesters.org/cpan/report/fc1cade6-3f17-11eb-9d08-9e4a1f24ea8f #ifdef PNG_SET_USER_LIMITS_SUPPORTED void perl_png_set_user_limits (Png, w, h) Image::PNG::Libpng Png; unsigned w; unsigned h; CODE: perl_png_set_user_limits (Png, w, h); SV * perl_png_get_user_width_max (Png) Image::PNG::Libpng Png; CODE: RETVAL = perl_png_get_user_width_max (Png); OUTPUT: RETVAL SV * perl_png_get_user_height_max (Png) Image::PNG::Libpng Png; CODE: RETVAL = perl_png_get_user_height_max (Png); OUTPUT: RETVAL void perl_png_set_chunk_cache_max(Png, max) Image::PNG::Libpng Png; int max; CODE: #ifdef PNG_CHUNK_CACHE_MAX_SUPPORTED png_set_chunk_cache_max(Png->png, max); #else UNSUPPORTED (CHUNK_CACHE_MAX); #endif /* CHUNK_CACHE_MAX */ int perl_png_get_chunk_cache_max(Png) Image::PNG::Libpng Png; CODE: #ifdef PNG_CHUNK_CACHE_MAX_SUPPORTED RETVAL = png_get_chunk_cache_max(Png->png); #else RETVAL = -1; UNSUPPORTED (CHUNK_CACHE_MAX); #endif /* CHUNK_CACHE_MAX */ OUTPUT: RETVAL #endif /* SET_USER_LIMITS */ void perl_png_set_image_data (Png, image_data, own = & PL_sv_undef) Image::PNG::Libpng Png; void * image_data; SV * own; CODE: if (Png->type != perl_png_write_obj) { croak ("Cannot set image data in read PNG"); } Png->image_data = image_data; Png->memory_gets++; void perl_png_set_row_pointers (Png, row_pointers) Image::PNG::Libpng Png; SV * row_pointers; CODE: if (Png->type != perl_png_write_obj) { croak ("Cannot set row pointe rs in read PNG"); } Png->row_pointers = INT2PTR (png_bytepp, SvIV (row_pointers)); png_set_rows (Png->png, Png->info, Png->row_pointers); Png->memory_gets++; # These functions predate the macro and were valid in libpng 1.2, yet # the macro is invalid except for libpng 1.6.17, so conditional # compilation doesn't seem to offer any benefit, hence the following # is commented out. # #ifdef PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED void perl_png_set_compression_level (Png, level) Image::PNG::Libpng Png; int level CODE: if (level != Z_DEFAULT_COMPRESSION) { if (level < Z_NO_COMPRESSION || level > Z_BEST_COMPRESSION) { croak ("Compression level must be %d for default or " "between %d and %d", Z_DEFAULT_COMPRESSION, Z_NO_COMPRESSION, Z_BEST_COMPRESSION); } } png_set_compression_level (Png->png, level); void perl_png_set_compression_buffer_size (Png, size) Image::PNG::Libpng Png; size_t size; CODE: png_set_compression_buffer_size (Png->png, size); SV * perl_png_get_compression_buffer_size (Png) Image::PNG::Libpng Png; PREINIT: size_t size; CODE: size = png_get_compression_buffer_size (Png->png); RETVAL = newSViv (size); OUTPUT: RETVAL void perl_png_set_compression_mem_level (Png, mem_level); Image::PNG::Libpng Png; int mem_level; CODE: png_set_compression_mem_level (Png->png, mem_level); void perl_png_set_compression_strategy (Png, strategy); Image::PNG::Libpng Png; int strategy; CODE: png_set_compression_strategy (Png->png, strategy); void perl_png_set_compression_window_bits (Png, window_bits); Image::PNG::Libpng Png; int window_bits; CODE: png_set_compression_window_bits (Png->png, window_bits); # #endif /* WRITE_CUSTOMIZE_COMPRESSION */ # This macro is not documented in CHANGES in libpng. #ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED void perl_png_set_text_compression_level (Png, level); Image::PNG::Libpng Png; int level; CODE: png_set_text_compression_level (Png->png, level); void perl_png_set_text_compression_mem_level (Png, mem_level); Image::PNG::Libpng Png; int mem_level; CODE: png_set_compression_mem_level (Png->png, mem_level); void perl_png_set_text_compression_strategy (Png, strategy); Image::PNG::Libpng Png; int strategy; CODE: png_set_compression_strategy (Png->png, strategy); void perl_png_set_text_compression_window_bits (Png, window_bits); Image::PNG::Libpng Png; int window_bits; CODE: png_set_compression_window_bits (Png->png, window_bits); #endif /* WRITE_CUSTOMIZE_ZTXT_COMPRESSION */ #if 0 void perl_png_set_compression_method (Png, method); Image::PNG::Libpng Png; int method; CODE: png_set_compression_method (Png->png, method); #endif /* 0 */ #if 0 void perl_png_set_crc_action (Png, crit_action, ancil_action); Image::PNG::Libpng Png; int crit_action; int ancil_action; CODE: png_set_crc_action (Png->png, crit_action, ancil_action); #endif /* 0 */ void perl_png_set_gamma (Png, gamma, override_gamma) Image::PNG::Libpng Png; double gamma; double override_gamma; CODE: #ifdef PNG_READ_GAMMA_SUPPORTED png_set_gamma (Png->png, gamma, override_gamma); #else UNSUPPORTED (READ_GAMMA); #endif /* READ_GAMMA */ void perl_png_permit_mng_features(Png, mask) Image::PNG::Libpng Png; int mask; CODE: #ifdef PNG_MNG_FEATURES_SUPPORTED png_permit_mng_features(Png->png, mask); #else UNSUPPORTED (MNG_FEATURES); #endif /* MNG_FEATURES */ # Transform functions which require arguments. void perl_png_set_quantize(Png, palette, max_screen_colors, histogram, full_quantize_sv) Image::PNG::Libpng Png; AV * palette; int max_screen_colors; AV * histogram; SV * full_quantize_sv; PREINIT: int full_quantize; CODE: full_quantize = SvTRUE (full_quantize_sv); perl_png_set_quantize(Png, palette, max_screen_colors, histogram, full_quantize); # These macros are for rgb_to_gray #ifndef PNG_RGB_TO_GRAY_DEFAULT #define PNG_RGB_TO_GRAY_DEFAULT (-1) #endif /* PNG_RGB_TO_GRAY_DEFAULT */ #ifndef PNG_ERROR_ACTION_NONE #define PNG_ERROR_ACTION_NONE 1 #endif /* ndef PNG_ERROR_ACTION_NONE */ void perl_png_set_rgb_to_gray (Png, error_action = PNG_ERROR_ACTION_NONE, red = PNG_RGB_TO_GRAY_DEFAULT, green = PNG_RGB_TO_GRAY_DEFAULT) Image::PNG::Libpng Png; int error_action; double red; double green; CODE: #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED perl_png_set_rgb_to_gray (Png, error_action, red, green); #else UNSUPPORTED ("READ_RGB_TO_GRAY"); #endif /* READ_RGB_TO_GRAY */ #undef DEFAULT_WEIGHT int perl_png_get_rgb_to_gray_status (Png) Image::PNG::Libpng Png; CODE: #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED RETVAL = (int) png_get_rgb_to_gray_status (Png->png); #else UNSUPPORTED ("READ_RGB_TO_GRAY"); RETVAL = 0; #endif /* READ_RGB_TO_GRAY */ OUTPUT: RETVAL void perl_png_set_background(Png, perl_color, gamma_code, need_expand, background_gamma = 1) Image::PNG::Libpng Png; HV * perl_color; int gamma_code; SV * need_expand; double background_gamma; CODE: #ifdef PNG_READ_BACKGROUND_SUPPORTED perl_png_set_back (Png, perl_color, gamma_code, SvTRUE(need_expand), background_gamma); #else UNSUPPORTED (READ_BACKGROUND); #endif /* READ_BACKGROUND */ # These functions are not part of libpng and do not need preprocessor # conditional wrappers. int perl_png_color_type_channels (color_type) int color_type CODE: RETVAL = perl_png_color_type_channels (color_type); OUTPUT: RETVAL const char * perl_png_color_type_name (color_type) int color_type CODE: RETVAL = perl_png_color_type_name (color_type); OUTPUT: RETVAL void perl_png_copy_row_pointers (Png, row_pointers) Image::PNG::Libpng Png; SV * row_pointers; CODE: perl_png_copy_row_pointers (Png, row_pointers); void perl_png_get_internals (Png) Image::PNG::Libpng Png PREINIT: png_structp png; png_infop info; SV * png_sv; SV * info_sv; PPCODE: png = Png->png; info = Png->info; png_sv = newSViv (PTR2IV (png)); info_sv = newSViv (PTR2IV (info)); XPUSHs(sv_2mortal(png_sv)); XPUSHs(sv_2mortal(info_sv)); int perl_png_libpng_supports (what) const char * what CODE: RETVAL = perl_png_libpng_supports (what); OUTPUT: RETVAL int perl_png_read_struct (Png) Image::PNG::Libpng Png; CODE: RETVAL = (Png->type == perl_png_read_obj); OUTPUT: RETVAL void perl_png_set_verbosity (Png, verbosity = 0) Image::PNG::Libpng Png int verbosity; CODE: perl_png_set_verbosity (Png, verbosity); SV * perl_png_split_alpha (Png) Image::PNG::Libpng Png; CODE: RETVAL = perl_png_split_alpha (Png); OUTPUT: RETVAL const char * perl_png_text_compression_name (text_compression) int text_compression CODE: RETVAL = perl_png_text_compression_name (text_compression); OUTPUT: RETVAL SV * perl_png_get_pixel (png, x, y) Image::PNG::Libpng png; int x; int y; PREINIT: CODE: RETVAL = perl_png_get_pixel (png, x, y); OUTPUT: RETVAL # The following automatically generates the get and set functions for # the chunks. SV * perl_png_get_bKGD (Png) Image::PNG::Libpng Png CODE: RETVAL = perl_png_get_bKGD (Png); OUTPUT: RETVAL void perl_png_set_bKGD (Png, bKGD) Image::PNG::Libpng Png HV * bKGD CODE: perl_png_set_bKGD (Png, bKGD); SV * perl_png_get_cHRM (Png) Image::PNG::Libpng Png CODE: #ifdef PNG_cHRM_SUPPORTED RETVAL = perl_png_get_cHRM (Png); #else /* PNG_cHRM_SUPPORTED */ RETVAL = & PL_sv_undef; UNSUPPORTED (cHRM); #endif /* PNG_cHRM_SUPPORTED */ OUTPUT: RETVAL void perl_png_set_cHRM (Png, cHRM) Image::PNG::Libpng Png HV * cHRM CODE: #ifdef PNG_cHRM_SUPPORTED perl_png_set_cHRM (Png, cHRM); #else /* PNG_cHRM_SUPPORTED */ UNSUPPORTED (cHRM); #endif /* PNG_cHRM_SUPPORTED */ SV * perl_png_get_cHRM_XYZ (Png) Image::PNG::Libpng Png CODE: #ifdef PNG_cHRM_XYZ_SUPPORTED RETVAL = perl_png_get_cHRM_XYZ (Png); #else /* PNG_cHRM_XYZ_SUPPORTED */ RETVAL = & PL_sv_undef; UNSUPPORTED (cHRM_XYZ); #endif /* PNG_cHRM_XYZ_SUPPORTED */ OUTPUT: RETVAL void perl_png_set_cHRM_XYZ (Png, cHRM_XYZ) Image::PNG::Libpng Png HV * cHRM_XYZ CODE: #ifdef PNG_cHRM_XYZ_SUPPORTED perl_png_set_cHRM_XYZ (Png, cHRM_XYZ); #else /* PNG_cHRM_XYZ_SUPPORTED */ UNSUPPORTED (cHRM_XYZ); #endif /* PNG_cHRM_XYZ_SUPPORTED */ SV * perl_png_get_eXIf (Png) Image::PNG::Libpng Png CODE: RETVAL = perl_png_get_eXIf (Png); OUTPUT: RETVAL void perl_png_set_eXIf (Png, eXIf) Image::PNG::Libpng Png SV * eXIf CODE: perl_png_set_eXIf (Png, eXIf); SV * perl_png_get_gAMA (Png) Image::PNG::Libpng Png CODE: RETVAL = perl_png_get_gAMA (Png); OUTPUT: RETVAL void perl_png_set_gAMA (Png, gAMA) Image::PNG::Libpng Png double gAMA CODE: perl_png_set_gAMA (Png, gAMA); SV * perl_png_get_hIST (Png) Image::PNG::Libpng Png CODE: RETVAL = perl_png_get_hIST (Png); OUTPUT: RETVAL void perl_png_set_hIST (Png, hIST) Image::PNG::Libpng Png AV * hIST CODE: perl_png_set_hIST (Png, hIST); SV * perl_png_get_iCCP (Png) Image::PNG::Libpng Png CODE: RETVAL = perl_png_get_iCCP (Png); OUTPUT: RETVAL void perl_png_set_iCCP (Png, iCCP) Image::PNG::Libpng Png HV * iCCP CODE: perl_png_set_iCCP (Png, iCCP); SV * perl_png_get_IHDR (Png) Image::PNG::Libpng Png CODE: RETVAL = perl_png_get_IHDR (Png); OUTPUT: RETVAL void perl_png_set_IHDR (Png, IHDR) Image::PNG::Libpng Png HV * IHDR CODE: perl_png_set_IHDR (Png, IHDR); SV * perl_png_get_oFFs (Png) Image::PNG::Libpng Png CODE: RETVAL = perl_png_get_oFFs (Png); OUTPUT: RETVAL void perl_png_set_oFFs (Png, oFFs) Image::PNG::Libpng Png HV * oFFs CODE: perl_png_set_oFFs (Png, oFFs); SV * perl_png_get_pCAL (Png) Image::PNG::Libpng Png CODE: RETVAL = perl_png_get_pCAL (Png); OUTPUT: RETVAL void perl_png_set_pCAL (Png, pCAL) Image::PNG::Libpng Png HV * pCAL CODE: perl_png_set_pCAL (Png, pCAL); SV * perl_png_get_pHYs (Png) Image::PNG::Libpng Png CODE: RETVAL = perl_png_get_pHYs (Png); OUTPUT: RETVAL void perl_png_set_pHYs (Png, pHYs) Image::PNG::Libpng Png HV * pHYs CODE: perl_png_set_pHYs (Png, pHYs); SV * perl_png_get_PLTE (Png) Image::PNG::Libpng Png CODE: RETVAL = perl_png_get_PLTE (Png); OUTPUT: RETVAL void perl_png_set_PLTE (Png, PLTE) Image::PNG::Libpng Png AV * PLTE CODE: perl_png_set_PLTE (Png, PLTE); SV * perl_png_get_sBIT (Png) Image::PNG::Libpng Png CODE: RETVAL = perl_png_get_sBIT (Png); OUTPUT: RETVAL void perl_png_set_sBIT (Png, sBIT) Image::PNG::Libpng Png HV * sBIT CODE: perl_png_set_sBIT (Png, sBIT); SV * perl_png_get_sCAL (Png) Image::PNG::Libpng Png CODE: RETVAL = perl_png_get_sCAL (Png); OUTPUT: RETVAL void perl_png_set_sCAL (Png, sCAL) Image::PNG::Libpng Png HV * sCAL CODE: perl_png_set_sCAL (Png, sCAL); SV * perl_png_get_sPLT (Png) Image::PNG::Libpng Png CODE: RETVAL = perl_png_get_sPLT (Png); OUTPUT: RETVAL void perl_png_set_sPLT (Png, sPLT) Image::PNG::Libpng Png AV * sPLT CODE: perl_png_set_sPLT (Png, sPLT); SV * perl_png_get_tIME (Png) Image::PNG::Libpng Png CODE: RETVAL = perl_png_get_tIME (Png); OUTPUT: RETVAL void perl_png_set_tIME (Png, tIME = 0) Image::PNG::Libpng Png SV * tIME CODE: perl_png_set_tIME (Png, tIME); SV * perl_png_get_tRNS (Png) Image::PNG::Libpng Png CODE: RETVAL = perl_png_get_tRNS (Png); OUTPUT: RETVAL void perl_png_set_tRNS (Png, tRNS) Image::PNG::Libpng Png SV * tRNS CODE: perl_png_set_tRNS (Png, tRNS); libimage-png-libpng-perl-0.59/MANIFEST000066400000000000000000000133131475730614500173610ustar00rootroot00000000000000Changes const-c.inc const-xs.inc CONTRIBUTING examples/color-type-name.pl examples/copy-png.pl examples/get-www-png-out.txt examples/get-www-png.pl examples/grayface.png examples/libpng-write.pl examples/life-gray.png examples/life.png examples/luv.png examples/mono.png examples/picked-wave.png examples/png-cgi.pl examples/q.pl examples/random-wave.png examples/rgb-to-gray.pl examples/set-background.pl examples/set-background.png examples/set-text.pl examples/set-unknown-chunk.pl examples/supports.pl examples/synopsis-easy.pl examples/synopsis.pl examples/wave.png examples/xkcd-out.txt examples/xkcd.pl get-pixel.pl inc/CheckForLibPng.pm lib/Image/PNG/Const.pm lib/Image/PNG/Libpng.pm lib/Image/PNG/Libpng.pod Libpng.xs Makefile.PL MANIFEST This list of files MANIFEST.SKIP my-xs.h nicemake.pl perl-libpng.c ppport.h README script/pnginspect t/bKGD.t t/bogus.t t/chrm-xyz.t t/cHRM.t t/chunk-cache-max.t t/chunk-malloc-max.t t/comp-buff.t t/compress-level.t t/Const.t t/copy-all-png.t t/daft.t t/exif.t t/functions.t t/gAMA.t t/gecko-1200-gray8.png t/get-internals.t t/get-palette-max.t t/get-text.t t/header.t t/hIST.t t/io-read.t t/io.t t/IPNGLT.pm t/Libpng.t t/libpng/basi0g01.png t/libpng/basi0g02.png t/libpng/basi0g04.png t/libpng/basi0g08.png t/libpng/basi0g16.png t/libpng/basi2c08.png t/libpng/basi2c16.png t/libpng/basi3p01.png t/libpng/basi3p02.png t/libpng/basi3p04.png t/libpng/basi3p08.png t/libpng/basi4a08.png t/libpng/basi4a16.png t/libpng/basi6a08.png t/libpng/basi6a16.png t/libpng/basn0g01.png t/libpng/basn0g02.png t/libpng/basn0g04.png t/libpng/basn0g08.png t/libpng/basn0g16.png t/libpng/basn2c08.png t/libpng/basn2c16.png t/libpng/basn3p01.png t/libpng/basn3p02.png t/libpng/basn3p04.png t/libpng/basn3p08.png t/libpng/basn4a08.png t/libpng/basn4a16.png t/libpng/basn6a08.png t/libpng/basn6a16.png t/libpng/bgai4a08.png t/libpng/bgai4a16.png t/libpng/bgan6a08.png t/libpng/bgan6a16.png t/libpng/bgbn4a08.png t/libpng/bggn4a16.png t/libpng/bgwn6a08.png t/libpng/bgyn6a16.png t/libpng/ccwn2c08.png t/libpng/ccwn3p08.png t/libpng/cdfn2c08.png t/libpng/cdhn2c08.png t/libpng/cdsn2c08.png t/libpng/cdun2c08.png t/libpng/ch1n3p04.png t/libpng/ch2n3p08.png t/libpng/cm0n0g04.png t/libpng/cm7n0g04.png t/libpng/cm9n0g04.png t/libpng/cs3n2c16.png t/libpng/cs3n3p08.png t/libpng/cs5n2c08.png t/libpng/cs5n3p08.png t/libpng/cs8n2c08.png t/libpng/cs8n3p08.png t/libpng/ct0n0g04.png t/libpng/ct1n0g04.png t/libpng/cten0g04.png t/libpng/ctfn0g04.png t/libpng/ctgn0g04.png t/libpng/cthn0g04.png t/libpng/ctjn0g04.png t/libpng/ctzn0g04.png t/libpng/f00n0g08.png t/libpng/f00n2c08.png t/libpng/f01n0g08.png t/libpng/f01n2c08.png t/libpng/f02n0g08.png t/libpng/f02n2c08.png t/libpng/f03n0g08.png t/libpng/f03n2c08.png t/libpng/f04n0g08.png t/libpng/f04n2c08.png t/libpng/f99n0g04.png t/libpng/g03n0g16.png t/libpng/g03n2c08.png t/libpng/g03n3p04.png t/libpng/g04n0g16.png t/libpng/g04n2c08.png t/libpng/g04n3p04.png t/libpng/g05n0g16.png t/libpng/g05n2c08.png t/libpng/g05n3p04.png t/libpng/g07n0g16.png t/libpng/g07n2c08.png t/libpng/g07n3p04.png t/libpng/g10n0g16.png t/libpng/g10n2c08.png t/libpng/g10n3p04.png t/libpng/g25n0g16.png t/libpng/g25n2c08.png t/libpng/g25n3p04.png t/libpng/oi1n0g16.png t/libpng/oi1n2c16.png t/libpng/oi2n0g16.png t/libpng/oi2n2c16.png t/libpng/oi4n0g16.png t/libpng/oi4n2c16.png t/libpng/oi9n0g16.png t/libpng/oi9n2c16.png t/libpng/PngSuite.LICENSE t/libpng/PngSuite.png t/libpng/PngSuite.README t/libpng/pp0n2c16.png t/libpng/pp0n6a08.png t/libpng/ps1n0g08.png t/libpng/ps1n2c16.png t/libpng/ps2n0g08.png t/libpng/ps2n2c16.png t/libpng/s01i3p01.png t/libpng/s01n3p01.png t/libpng/s02i3p01.png t/libpng/s02n3p01.png t/libpng/s03i3p01.png t/libpng/s03n3p01.png t/libpng/s04i3p01.png t/libpng/s04n3p01.png t/libpng/s05i3p02.png t/libpng/s05n3p02.png t/libpng/s06i3p02.png t/libpng/s06n3p02.png t/libpng/s07i3p02.png t/libpng/s07n3p02.png t/libpng/s08i3p02.png t/libpng/s08n3p02.png t/libpng/s09i3p02.png t/libpng/s09n3p02.png t/libpng/s32i3p04.png t/libpng/s32n3p04.png t/libpng/s33i3p04.png t/libpng/s33n3p04.png t/libpng/s34i3p04.png t/libpng/s34n3p04.png t/libpng/s35i3p04.png t/libpng/s35n3p04.png t/libpng/s36i3p04.png t/libpng/s36n3p04.png t/libpng/s37i3p04.png t/libpng/s37n3p04.png t/libpng/s38i3p04.png t/libpng/s38n3p04.png t/libpng/s39i3p04.png t/libpng/s39n3p04.png t/libpng/s40i3p04.png t/libpng/s40n3p04.png t/libpng/tbbn0g04.png t/libpng/tbbn2c16.png t/libpng/tbbn3p08.png t/libpng/tbgn2c16.png t/libpng/tbgn3p08.png t/libpng/tbrn2c08.png t/libpng/tbwn0g16.png t/libpng/tbwn3p08.png t/libpng/tbyn3p08.png t/libpng/tm3n3p02.png t/libpng/tp0n0g08.png t/libpng/tp0n2c08.png t/libpng/tp0n3p08.png t/libpng/tp1n3p08.png t/libpng/xc1n0g08.png t/libpng/xc9n2c08.png t/libpng/xcrn0g04.png t/libpng/xcsn0g01.png t/libpng/xd0n2c08.png t/libpng/xd3n2c08.png t/libpng/xd9n2c08.png t/libpng/xdtn0g01.png t/libpng/xhdn0g08.png t/libpng/xlfn0g04.png t/libpng/xs1n0g01.png t/libpng/xs2n0g01.png t/libpng/xs4n0g01.png t/libpng/xs7n0g01.png t/libpng/z00n2c08.png t/libpng/z03n2c08.png t/libpng/z06n2c08.png t/libpng/z09n2c08.png t/make-tEXT.pl t/oFFs.t t/pCAL.t t/pHYs.t t/PLTE.t t/qrpng.png t/read-from-scalar.t t/saru-fs8.png t/sBIT.t t/sCAL.t t/set-itxt.t t/set-text.t t/split-alpha.t t/split-alpha/basi4a08-alpha.bin t/split-alpha/basi4a08-data.bin t/split-alpha/basn4a08-alpha.bin t/split-alpha/basn4a08-data.bin t/split-alpha/basn4a16-alpha.bin t/split-alpha/basn4a16-data.bin t/split-alpha/basn6a08-alpha.bin t/split-alpha/basn6a08-data.bin t/split-alpha/basn6a16-alpha.bin t/split-alpha/basn6a16-data.bin t/sPLT.t t/supports.t t/tantei-san.png t/test.png t/tIME.t t/transformations.t t/tRNS.t t/user-limits.t typemap META.yml Module YAML meta-data (added by MakeMaker) META.json Module JSON meta-data (added by MakeMaker) libimage-png-libpng-perl-0.59/MANIFEST.SKIP000066400000000000000000000006641475730614500201330ustar00rootroot00000000000000dists/.* libpng-tests/.* ^oneoff/.* .cleanok .git ^xt/.* .*\.o$ blib/.* build/.* ^Libpng\.c$ ^Makefile$ .*\.bak$ ^build\.pl$ ^.*\.bs$ tmpl/.* Image-PNG-[\d\.]+ Image-PNG-[\d\.]+\.tar\.gz MYMETA\..* makeitfile$ doc/.* ^pm_to_blib$ ^memory-test\.pl$ ^unt/.*$ # Scripts for building from libpng source code ^util/.*$ # Examples not ready for cpan ^nocpan/.*$ # CPAN doesn't need this, it's in the repo if anyone does. ^examples/Makefile$ libimage-png-libpng-perl-0.59/META.json000066400000000000000000000026411475730614500176530ustar00rootroot00000000000000{ "abstract" : "Perl interface to libpng", "author" : [ "Ben Bullock " ], "dynamic_config" : 1, "generated_by" : "ExtUtils::MakeMaker version 7.70, CPAN::Meta::Converter version 2.150010", "license" : [ "perl_5" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : 2 }, "name" : "Image-PNG-Libpng", "no_index" : { "directory" : [ "t", "inc", "tmpl", "build", "inc" ], "file" : [ "t/IPNGLT.pm" ] }, "prereqs" : { "build" : { "requires" : { "ExtUtils::MakeMaker" : "0" } }, "configure" : { "requires" : { "ExtUtils::MakeMaker" : "0" } }, "runtime" : { "requires" : { "perl" : "5.008001" } } }, "release_status" : "stable", "resources" : { "bugtracker" : { "web" : "https://github.com/benkasminbullock/image-png-libpng/issues" }, "repository" : { "url" : "https://github.com/benkasminbullock/image-png-libpng" } }, "version" : "0.59", "x_contributors" : [ "Aaron Crane ", "Greg Kennedy ", "Petr Pisar", "Phil Perry " ], "x_serialization_backend" : "JSON::PP version 4.16" } libimage-png-libpng-perl-0.59/META.yml000066400000000000000000000016221475730614500175010ustar00rootroot00000000000000--- abstract: 'Perl interface to libpng' author: - 'Ben Bullock ' build_requires: ExtUtils::MakeMaker: '0' configure_requires: ExtUtils::MakeMaker: '0' dynamic_config: 1 generated_by: 'ExtUtils::MakeMaker version 7.70, CPAN::Meta::Converter version 2.150010' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: '1.4' name: Image-PNG-Libpng no_index: directory: - t - inc - tmpl - build - inc file: - t/IPNGLT.pm requires: perl: '5.008001' resources: bugtracker: https://github.com/benkasminbullock/image-png-libpng/issues repository: https://github.com/benkasminbullock/image-png-libpng version: '0.59' x_contributors: - 'Aaron Crane ' - 'Greg Kennedy ' - 'Petr Pisar' - 'Phil Perry ' x_serialization_backend: 'CPAN::Meta::YAML version 0.018' libimage-png-libpng-perl-0.59/Makefile.PL000066400000000000000000000037071475730614500202100ustar00rootroot00000000000000use strict; use warnings; use ExtUtils::MakeMaker; use ExtUtils::Constant; use Getopt::Long; use Config qw/%Config/; my $ok = GetOptions ( check => \my $check, optimize => \my $optimize, "prefix=s" => \my $prefix, ); use 5.008001; use lib 'inc'; use CheckForLibPng; my $vars = check_for_libpng (verbose => $check, prefix => $prefix,); if (! $vars) { print STDERR "Libpng may not be present on this system.\n"; exit; } my %wm = ( NAME => 'Image::PNG::Libpng', VERSION => '0.59', ABSTRACT => 'Perl interface to libpng', OBJECT => 'Libpng.o', LIBS => '-lpng', AUTHOR => 'Ben Bullock ', LICENSE => 'perl', META_MERGE => { resources => { "bugtracker" => "https://github.com/benkasminbullock/image-png-libpng/issues", "repository" => "https://github.com/benkasminbullock/image-png-libpng", }, no_index => { directory => ['tmpl', 'build', 'inc'], file => ['t/IPNGLT.pm'], }, x_contributors => [ # Alphabetical order 'Aaron Crane ', 'Greg Kennedy ', 'Petr Pisar', 'Phil Perry ', ], }, MIN_PERL_VERSION => '5.008001', EXE_FILES => ['script/pnginspect',], ); if ($optimize) { warn "Optimizing is on"; $wm{OPTIMIZE} = ' -g -Wall -O '; } if ($vars) { if ($vars->{inc}) { $wm{INC} = "$vars->{inc}"; } if ($vars->{libs}) { $wm{LIBS} = "$vars->{libs}"; # This overrides loading the library from /usr/local/lib by # putting the directory we want to use first. $wm{LDDLFLAGS} = "$vars->{libs} $Config{lddlflags}"; } } WriteMakefile (%wm); my @names; ExtUtils::Constant::WriteConstants( NAME => 'Image::PNG::Libpng', NAMES => \@names, DEFAULT_TYPE => 'IV', C_FILE => 'const-c.inc', XS_FILE => 'const-xs.inc', ); # Local variables: # mode: perl # End: libimage-png-libpng-perl-0.59/README000066400000000000000000000067261475730614500171220ustar00rootroot00000000000000 ___ ____ _ _ ____ |_ _|_ __ ___ __ _ __ _ ___ _ _ | _ \| \ | |/ ___| _ _ | || '_ ` _ \ / _` |/ _` |/ _ \ (_|_) | |_) | \| | | _ (_|_) | || | | | | | (_| | (_| | __/ _ _ | __/| |\ | |_| | _ _ |___|_| |_| |_|\__,_|\__, |\___| (_|_) |_| |_| \_|\____| (_|_) |___/ _ _ _ | | (_) |__ _ __ _ __ __ _ | | | | '_ \| '_ \| '_ \ / _` | | |___| | |_) | |_) | | | | (_| | |_____|_|_.__/| .__/|_| |_|\__, | |_| |___/ This is the README for Image::PNG::Libpng version 0.59. Image::PNG::Libpng is a "module" for the Perl computer programming language, a library of computer code to install on a computer. This document contains four sections: 1. About - what the module does 2. Documentation - how to learn more about the module 3. Installation - how to install this module on a computer 4. Help - what to do if you get stuck ----------------------------------------------------------------------------- 1. ABOUT Image::PNG::Libpng - Perl interface to libpng Image::PNG::Libpng is a Perl library for accessing the contents of PNG (Portable Network Graphics) images. Image::PNG::Libpng enables Perl to use the "libpng" library to read and write files in PNG format. Image::PNG::Libpng does not contain the libpng library. The libpng library must be installed on your computer prior to installing Image::PNG::Libpng. Image::PNG::Libpng consists of Perl subroutines which mirror the C functions in libpng, plus helper subroutines to make it easier to read and write PNG data in Perl. For those familiar with libpng, the section "Differences from libpng" explains the differences with libpng. ----------------------------------------------------------------------------- 2. DOCUMENTATION You can read the documentation for the module online at the following website: * http://metacpan.org/release/Image-PNG-Libpng (This link goes to the latest version of the module.) After installing the module, you can read the documentation on your computer using perldoc Image::PNG::Libpng ----------------------------------------------------------------------------- 3. INSTALLATION This module requires Perl version 5.8.1 or later. To install the module from CPAN, use cpan Image::PNG::Libpng If you have the App::cpanminus installer, you may prefer cpanm Image::PNG::Libpng To install the module from the source file, Image-PNG-Libpng-0.59.tar.gz, follow this sequence of commands: tar xfz Image-PNG-Libpng-0.59.tar.gz cd Image-PNG-Libpng-0.59 perl Makefile.PL make make install If you want to test the module before installing it, use "make test" after "make" and before "make install". ----------------------------------------------------------------------------- 4. HELP To get help with the module, you can email the author, Ben Bullock, at . If you think there is a problem in the module, you can report a bug at , or if you want to alter the source code of Image::PNG::Libpng, try the public repository on github at . ----------------------------------------------------------------------------- This README was written on Mon Feb 24 15:02:10 2025. ----------------------------------------------------------------------------- libimage-png-libpng-perl-0.59/const-c.inc000066400000000000000000000033231475730614500202710ustar00rootroot00000000000000#define PERL_constant_NOTFOUND 1 #define PERL_constant_NOTDEF 2 #define PERL_constant_ISIV 3 #define PERL_constant_ISNO 4 #define PERL_constant_ISNV 5 #define PERL_constant_ISPV 6 #define PERL_constant_ISPVN 7 #define PERL_constant_ISSV 8 #define PERL_constant_ISUNDEF 9 #define PERL_constant_ISUV 10 #define PERL_constant_ISYES 11 #ifndef NVTYPE typedef double NV; /* 5.6 and later define NVTYPE, and typedef NV to it. */ #endif #ifndef aTHX_ #define aTHX_ /* 5.6 or later define this for threading support. */ #endif #ifndef pTHX_ #define pTHX_ /* 5.6 or later define this for threading support. */ #endif static int constant (pTHX_ const char *name, STRLEN len) { /* Initially switch on the length of the name. */ /* When generated this function returned values for the list of names given in this section of perl code. Rather than manually editing these functions to add or remove constants, which would result in this comment and section of code becoming inaccurate, we recommend that you edit this section of code, and use it to regenerate a new set of constant functions which you then use to replace the originals. Regenerate these constant functions by feeding this entire source file to perl -x #!/usr/home/ben/software/install/bin/perl -w use ExtUtils::Constant qw (constant_types C_constant XS_constant); my $types = {map {($_, 1)} qw()}; my @names = (qw()); print constant_types(), "\n"; # macro defs foreach (C_constant ("Image::PNG::Libpng", 'constant', 'IV', $types, undef, 3, @names) ) { print $_, "\n"; # C constant subs } print "\n#### XS Section:\n"; print XS_constant ("Image::PNG::Libpng", $types); __END__ */ switch (len) { } return PERL_constant_NOTFOUND; } libimage-png-libpng-perl-0.59/const-xs.inc000066400000000000000000000051531475730614500205040ustar00rootroot00000000000000void constant(sv) PREINIT: #ifdef dXSTARG dXSTARG; /* Faster if we have it. */ #else dTARGET; #endif STRLEN len; int type; /* IV iv; Uncomment this if you need to return IVs */ /* NV nv; Uncomment this if you need to return NVs */ /* const char *pv; Uncomment this if you need to return PVs */ INPUT: SV * sv; const char * s = SvPV(sv, len); PPCODE: type = constant(aTHX_ s, len); /* Return 1 or 2 items. First is error message, or undef if no error. Second, if present, is found value */ switch (type) { case PERL_constant_NOTFOUND: sv = sv_2mortal(newSVpvf("%s is not a valid Image::PNG::Libpng macro", s)); PUSHs(sv); break; case PERL_constant_NOTDEF: sv = sv_2mortal(newSVpvf( "Your vendor has not defined Image::PNG::Libpng macro %s, used", s)); PUSHs(sv); break; /* Uncomment this if you need to return IVs case PERL_constant_ISIV: EXTEND(SP, 2); PUSHs(&PL_sv_undef); PUSHi(iv); break; */ /* Uncomment this if you need to return NOs case PERL_constant_ISNO: EXTEND(SP, 2); PUSHs(&PL_sv_undef); PUSHs(&PL_sv_no); break; */ /* Uncomment this if you need to return NVs case PERL_constant_ISNV: EXTEND(SP, 2); PUSHs(&PL_sv_undef); PUSHn(nv); break; */ /* Uncomment this if you need to return PVs case PERL_constant_ISPV: EXTEND(SP, 2); PUSHs(&PL_sv_undef); PUSHp(pv, strlen(pv)); break; */ /* Uncomment this if you need to return PVNs case PERL_constant_ISPVN: EXTEND(SP, 2); PUSHs(&PL_sv_undef); PUSHp(pv, iv); break; */ /* Uncomment this if you need to return SVs case PERL_constant_ISSV: EXTEND(SP, 2); PUSHs(&PL_sv_undef); PUSHs(sv); break; */ /* Uncomment this if you need to return UNDEFs case PERL_constant_ISUNDEF: break; */ /* Uncomment this if you need to return UVs case PERL_constant_ISUV: EXTEND(SP, 2); PUSHs(&PL_sv_undef); PUSHu((UV)iv); break; */ /* Uncomment this if you need to return YESs case PERL_constant_ISYES: EXTEND(SP, 2); PUSHs(&PL_sv_undef); PUSHs(&PL_sv_yes); break; */ default: sv = sv_2mortal(newSVpvf( "Unexpected return type %d while processing Image::PNG::Libpng macro %s, used", type, s)); PUSHs(sv); } libimage-png-libpng-perl-0.59/examples/000077500000000000000000000000001475730614500200455ustar00rootroot00000000000000libimage-png-libpng-perl-0.59/examples/color-type-name.pl000066400000000000000000000003611475730614500234150ustar00rootroot00000000000000#!/home/ben/software/install/bin/perl use warnings; use strict; use Image::PNG::Libpng ':all'; my $png = read_png_file ('tantei-san.png'); my $name = color_type_name ($png->get_IHDR->{color_type}); print "Your PNG has colour type $name.\n"; libimage-png-libpng-perl-0.59/examples/copy-png.pl000066400000000000000000000005331475730614500221370ustar00rootroot00000000000000#!/home/ben/software/install/bin/perl use warnings; use strict; use utf8; use FindBin '$Bin'; use Image::PNG::Libpng qw(read_png_file write_png_file) ; my $pngin = read_png_file ("$Bin/../t/tantei-san.png"); my $pngout = $pngin->copy_png (); $pngout->set_text ([{key => 'Name', text => 'Shunsaku Kudo'}]); # $pngout->write_png_file ('copy.png'); libimage-png-libpng-perl-0.59/examples/get-www-png-out.txt000066400000000000000000000001261475730614500235750ustar00rootroot00000000000000{ "bit_depth":4, "color_type":3, "height":31, "interlace_method":0, "width":88 } libimage-png-libpng-perl-0.59/examples/get-www-png.pl000077500000000000000000000007441475730614500225750ustar00rootroot00000000000000#!/home/ben/software/install/bin/perl use warnings; use strict; use Image::PNG::Libpng 'read_from_scalar'; use LWP::Simple; use JSON::Create; my $image_data = get 'http://libpng.org/pub/png/img_png/libpng-88x31.png'; # Now $image_data contains the PNG file my $png = read_from_scalar ($image_data); # Now $png contains the PNG information from the image. # Get the header. my $header = $png->get_IHDR (); my $jc = JSON::Create->new (indent => 1, sort => 1); print $jc->run ($header); libimage-png-libpng-perl-0.59/examples/grayface.png000066400000000000000000000331411475730614500223360ustar00rootroot00000000000000PNG  IHDR,,tFgAMA asRGB cHRMz&u0`:pQ< pHYsod IDATx}}|T /8$&!lC`ҭZ(KۭZneֺuW"m4C-?$Y`!!,#3Xy83sf$s<9sr?2R w gh;Ӟ0Rv׃3깍oBc}~TQɧ,aƷ:O& -|ܶ~|l/[_H6sopotK6قibIN`IQ&z0%l\H$g-h[u% qy?"fXSӟzl$O4Qo,GQkUX6*oAN3LPuI#UxjN^uvG뽦929e֕jĊJ~SE7N0/' |"Iy x% O` -h=~ZBVSXD))ThlD2ƉOmǐ""o{vda nS+rLK'nZov-$)m2oebĪJ3!`'@渂XnZ&J,ٶ*ԕ42Ob%솳;;y!Vi$ }+o٤lĚBLgP?',CmS5. ևuaQL_)tBלK+ %.odie\8О u=en'܀c:SZ =<&}\J#q+ÈE-n92)M*Ay+K zXRާ/a[SȦ}s w<U ==ZI`+m:ws4@6Z ÐY!wl\F9 fy0K)~E]5 pV@kg@u,14m\ 섛VĚBLg@ !LƊ;)*짷^ni$Hs]nw֟1 ƛF~f[̤vnEJ_hqafD#+ӺEZt.Y(zk 0ɦ+iZYdsЫUֱQԭVN ˁY+@]L{Z-u5YL8h0|ʠI0W,me[E5zj@$,2LeX,+;vr6Rd7y03&%Z$ьX`.rJhd4ɋtCVD)-pc8y9 g3]iK+X3 EONg"I>qH']٣ξyhZH,[VCVbח @QLZ7}+YcRBG eV}2*(DPjKfoQг;j@,nM,&*S ~$)S w\nK?ojHsq]7?/(QD3ۘk׹Xb ri%[ȰR`UJR=蛛oK޻pwo[?ZgZ=ۯ.pK++"uOZb1Us MbbK0n^HICjQM$jtHڃtԛ+Ǔa#zC+'_|3dFΡ13E%^WYn/62RM%֠԰8-qzpZ}LDZqt.rz'kB?Qq94A@T0]XRT$IĜcmk]K F( 3)A+W.\]nwD]U\h=5vtȅa37'W>QJPvl"ԠxɊ/ѿ%eVV09sc д;Q؈ۉjbVA5׵pհK.UJLVwd$k陶ئ(#Lf":;!H>zs|%KQI4@6'~%--t%Klk@v-*2x $ B!D ]V5;Gg/+1gmmۚ,B~Eb .z"uȎɨ9<9ظ._%鎨R渂G3:brSj?(lW8R42rfP)6Z/61͚8i%2.ETXpFW) qO8+) zH\b1LVS~+A'䷘wIG` %uLp{2h)%pESHXF6 $4+2.w:B5yvH Ǩ>isa!'4( CPl6ƅ'} ޤ7"uՓ(A)fKQ&q?~0i "+LmcH'$F䌣 k4Yӂa"!b%1't== JvmL(p&j$&V~9z ӫ'OMS(JVR<'nNjnȋwS&S|4TZ+ Rޥ[erMirP#e#/tADĒ V9$B,Af#BFwV y¿Dl=Ȝ=\R4LE%*&WP{.fG=|={!2JqiV9't,qcQNMZ`QA"؝[.6/ Κ, ZN{ѓ-u^CD}{r4sAq(> )wF=$ {qrK bN-ncѦ3Bb*m;n?xÙ"ٕ D~ĒWe YcTϜzhT(6 Ah_NP5gn{ TӑyPg1L -Kgt=9>vw IXZx;W\\@h@\t̗$ d 47|OK dhM*Gwkoy11\,C)i 3&_,w7QWKr&<_1R 9j Ys~n}%Mf\ ɗvuj:1k(RA!=.Uz ͲafwaÌhjs==j \ 尯R} KnCMb?Dn| RM&:B6Z-c5Joj0wż3JYoabEނyĊ)b Jy-ZSxoa -p焆l3?M6V[ KرMZb)0<6f]y73 &?i=y05aϯί^`@fcoEނsBEwB˲!#*͒?NlɊ~v V0aNSD ]RroAƗDKlɑئ"g'Y Mpbm?V,:yok[Vbi-!$UYYIubZPU-߉m븥 e@岲om vPlQ@&b7F&"ۑZ)mU\o޴6 r}ĬI3*$|.ҞBvbړƮd{=Vd0 D]l6CjرI׆-MdVNJ9m"V8N矟e.`LI`ک}ЕX>ڷ= "Y? G#3['.}!M"9;1]븊#F/>~1ԠE^m0L,ztn1\0 7l'{F` ęEyŹ7]&'-b&VI,E2| +j鄴N4arYFܗŰ4N.%nn/F'i Ta|xKe[dYo3wi,8K_^T} в{Uu+IG+AI9"/?{;&0[',.y;C;-^䤇(,.npotTP [!cWPR9K32q^kD^gڡ7|x%]aO@dɫSېEh`+Ja]? V2Zj0L"Z.˷dS#J,m8t_ˇĤ-Ls$ғXfjҮ>o Pze6vb+*Y1 1e^0LPRмl}6w}S1-NHGڡ]I <:KZ UYOq 9XUk6u|=pX(1{!6hK\DcE%,ꡧbhYr!Q9O~-[AM+đ0xx VW?;rl;s@wT9n#*gHB6w=];ic) (K,\]X O$G?ڲ;OX[qOO!? ! y_Su'G|bOT w3G-] yޓzRЕXܧTJkkИɠ5pNv/@`~&@˻VutrC N+6se/^rq›2'{JowFx .Ͼwm^%mp5Oc>R&zp`K;y=~Y5|px ¤ _heX{n'[Nܾ'R:,=:Gضsi8evJ5kcv]^yY'&|hQߴ 0}O, .UύihEY IA˫Yi@h= 볠q_OX^1acn%?{ʗFP"9i;ܹ)wK > ;L ˠmt439gD 8"_#2zU2PTc%qfmi%֖lia) #3&)H"Cjqlfk D|;*8ݰGABOV e- DS2t]1#- bfȫ.,[JȌ6#^iXPtᠪ|#t\Fcc(*b"',[4* #3.>n*qw-&`f2ypδag[bOX K02È4 L͊zDp0>ҹ %ˢQ#Ffbr{m"n)(43bk>|yJyo\pfZ )h ePjgb+[G_׮NhjЀԻw #OHTa\|{gk%k c Nᷞp>pkt7y>\!y'*Ci9H5 Sn&֨mU<.QhEwL-53\G?_ޱ \W,WL[+*OEg(.zP_Z!|+盿+`I3 >.54@aDv. %WjRZiw8;& 6ܴA]0/ DZe]Fr;}_tEi5 bDuѯb;x$a x€^R߱;v۷׶hH%U-v}WAhvol0\ǒȩlN!LacټR}B$^!k&IKyENp`D6,>ױZ{(1-k:=%U;~Nۙ8 w-_ع~Rg;{уj;gRcNAΩb}JD0܄9т~Gy>hO`h2r*>g/S'A6D>~)?b $v;Qƣ-`n~*Ҧ$|ay.߹xb{M2D640Q=S;jqJ~wC`+(b&!o[Kvx[Eb A:`R`enC^ۊT%+7?Vvmvmƫ1En+E`^BemS bߔs)NOsupc2ފOׇNWFĉ״ ++OM2r#7XnFza&wFq{Wp)f5 #0A+ lfS Zj;ULs)ьt{rʹhzd}2rnH\Jd^w\a#6'emgCBš&l68ǹ4pԉ&xytygIHXF{8u٫j/2i!]i´l$6P6 vnU۹i<4ìEh| Ȉ>4a kx 08=}b¼X뤅Ԫ$wK'6ȯ0t+;Y. wt‘d8ռ ,'P$DC W:vOLZܪ4?M4A zIDATbàΆU5 I0g8Or`yU\/rQkn 1vbAE gj闥"uלO&q[V 6 O[3pmuܝٵPDȽx&zt|Y@2~+NNexWd. !F٘O)l>wժq~b+_l 4';Q(gA-LjHΘg5G됡5[*0&l}Ǚ#>6[^N,I"1b,4f#:iV<\lҊަ<4& |&Y6DiyȸvQ{ 'Kv 0f Ē+3`e[p?>FE:{4˿] ; *ߢh:?N*T5n8c5wg2zuy+YZ@ b @Oz{ 2[Dv|8 ﰎq\d&RsGXXq׿p1l6Z4|O5ݙx˗ր@/`9bŒezعn(Z@ .(?].Ȭ%6Oo%E8b=:dn_Sѻ+/CO1Q 7B1dj.wH°(k'\Nj(_8͎Tl1|+G?*I FTWvVAoF+I+*#Z_,#֕n8) [VfT{50"efHNp`U[*>.ƦnMZYIbI8k˯WwOR8f" Ƈ?0he#XנךkCЖZѩ"Gދ?J`mFK c=Zenf RB1j=!^Vo>~{F<z9+f@GW30a-bgl4l' FU L<la[3ޏ6v`Kذ?SC1be/^rl/4XHY XtY=}@qM}ܱ S }/ǧ/{'4Q "}FV !|Uw|qq o}@j‣/,H,"V?<)XM^9?GZhk#8o $sCah??Tp(wJNaxܟ]ֵX ÂbSZ\+iuoAi(=My z6b Ud+SwZlgm9׮\U<ǘۘ6on3SRI,l4jIa_\TSӺ ;iZ C vذ(hBd#@d3h-^hj|P|1Xa~'?9`o l]pg=>zfwF|S gN )lʘt'}C|aөÕ 2a7, -}ǿhzkR^iS6lY gKN)ېbm*X̦,;^ 뛘>C͒oobެ:1ޔ # 8m p'^5#B_gWI1iKKC HYEʝbH{5쥅ۈhMS}a#nWnC03'Z!u)~^ndpcUcT:=yG8ѵ!Tv>NwMBRXC.%UӔ2F$h%ߵ65Aa0K`EbE|tmIQ{u:ѩnt욦rht4CpF,Q(ڏv -@@:O#kOXzو*dl$x8lphN{83Q"E{#2d0Yzq<99WjfjC!V022+$8ΊMb'U |Рuo|2$!JK}R~JM VsHns1QLJ{ѹk]ؠ0χ:G?#QKΕ9A zV KXTJox$G-{S*!@KDuRb+ʐ^%9iA%#a5L-P-Vit GPJci-g1% &TZ_| 9CV*FDYV)'>FiFiFiFic Y iv DiJ]:3y{# {ٝQϊQJqlxS7X h Dϙsλ7 'NoF ©1u50'1b5;#? $nPD+7-}*; M w.4+f s"#y=szmdy~B ibf=x:D,9c;pz `VjؔYibn#ﳱZd@;*zX UMջFGZƈ$I爢\ib xkn9x6N/=Ϋ,EXQ7bYֺDGZש׳ҳԁnFޟtH絉<[*;կƥTX6*N Ƿ2ާ`Xj^nz2=T&OIUbUa nW!sXciWRk^I!|d3ZJPEbJ wwb"UG@+ ;@ve<4BQ!G&XuyN˗"Ċ5 An ubPEdHvOJIJV%z Ub\GH:P%OYa[t\ҙˬw9!)SG:61ԈeCgr@`$ZR0 leUYR~1TeC2fv^?\P@,\+ MጺK歎UhTrl%*ݔ?A:BJh?7~j}HSX'Y0L͇9 j4$ ۷^HU;V|9zI dι5kޜg|&DԕX͗4e7);UKF X[U#R=0g)X̍ ؝nvj @Pь9U +U'_6SJ2n0: EL~8Yt/g٫um:w.5aXJk+SE7Cpκ`Ydg<bQ[NIRk^;CVκOi_Wm?CNOsL`pnFJ:^Dhqs64zA K0|F׀*ESwc56xmTC0&fp!vX?H]b@$PȀY5"+3L0nֹOm{)?l+̞}M]HcJVV@ ` RC@Y ]s!-FojYղDE19EARX"+>Xp9<ٌ;?I-jU-cfR.l*d KS,AI'3aRO"&\Ed5t )'!#-{t?*#"zI?I",u%@Wmޘ a 3 @nYBb)-B641OvߚF~H(ۜUOeOUbUKlf%o9 f"h*aH,힭Nw185 CFP&u;qD%WEITQ%]ICj'B ~G[Joym C 7\HwɝsG=WbZYݮz d"*vo@]+*0?rF 0]U )ܸYLe`s?"o^,R >lq;z۬MH^Z$F[ۯ)ă9RĪap{U6(-yDr^2(}j*ME*H,Vݏ-uF_ Jug#çRXXeD)@Aé"(xcx']9>e$gT 2z!Bg^#'dS-.N' lr阼G?w1\G/mg~=/ふ%b7IK- a_eBnţHjVRQ "f/9O=nG͞x#pׇ*n釅SZ Ĭ>On EFN)UHC#yoӽ< u3<+rBkhv/+=L1 #(@ +}iW!3%UA~?cXǻP I, X2^e375ɥ/IENDB`libimage-png-libpng-perl-0.59/examples/libpng-write.pl000066400000000000000000000033401475730614500230050ustar00rootroot00000000000000#!/home/ben/software/install/bin/perl use warnings; use strict; use utf8; use FindBin '$Bin'; use Image::PNG::Libpng ':all'; use Image::PNG::Const ':all'; my $outfile = "$Bin/mono.png"; my ($height, $width, $rows) = pixelate (__FILE__, 5); my $png = create_write_struct (); open my $out, ">:raw", $outfile or die $!; $png->init_io ($out); $png->set_IHDR ({height => $height, width => $width, bit_depth => 1, color_type => PNG_COLOR_TYPE_GRAY}); $png->set_text ([{key => 'silly', text => 'finely-tuned breakfast cereal',}]); $png->set_tIME ({year => 1999}); $png->write_info (); $png->set_invert_mono (); # PNG puts the leftmost pixel in the high-order part of the byte. $png->set_packswap (); $png->write_image ($rows); $png->write_end (); close $out or die $!; exit; sub pixelate { my ($file, $box) = @_; open my $in, "<", $file or die "Can't open '$file': $!"; my $width = 0; my @lines; while (<$in>) { chomp; s/\t/ /g; push @lines, $_; if (length ($_) > $width) { $width = length ($_); } } close $in or die $!; $width *= $box; my $height = scalar (@lines) * $box; my $zero = pack "C", 0; my $bwidth = int(($width+7)/8); my @rows = ($zero x $bwidth) x $height; for my $r (0..$height-1) { my $y = int ($r/$box); my $line = $lines[$y]; for my $x (0..length ($line) - 1) { if (substr ($line, $x, 1) ne ' ') { for my $c (0..$box - 1) { my $offset = $x*$box + $c; my $byte = int ($offset / 8); my $bit = $offset % 8; my $octet = ord (substr ($rows[$r], $byte, 1)); substr ($rows[$r], $byte, 1) = chr ($octet | 1<<$bit); } } } } return ($height, $width, \@rows); } libimage-png-libpng-perl-0.59/examples/life-gray.png000066400000000000000000001335541475730614500224450ustar00rootroot00000000000000PNG  IHDR!# IDATxy`LW_sc"H$4)ZPRZK邢hRkm-Zk]b .L|~ܙdQ<۟ɹ|9{9;Jag 5'9Sj]!'\?*ej[qig)jxWs`Y˿g@dQԉRj9x.s!= s\ȟoB{<?% ns=ҳ5 Q(%vLmEkjj]CM8(t,+2dY5xS7:9eegV7\6yG/sϹySV!rOMe垊yg-mHRb<+V)@hJ {Vbh1FOis^W0JNŷIgu4xqlV )v dn]NM'{8=U%@Q'i#ZH[ U5CzY+^0P z{kMw-z氍ٯI-CJ-[k8rcKJ(bd^`?""2nd};,v9E.蚵&S'%V0vSrE$6CDr]P)""yձ')du{A@Zr`V/{LY?\ 򵥐i?-k)Oȷab*gkm KLi8kpWD 1~KtN+mka"|wD- ,%I̛5YDd,ʮ""}L*MϺ7H =Z D+w*=sȺZP7^ַO›yo2emREDb챻(b@Ck#!;[DoVS{-$Fz,g&GDu+Vd{k*@H#n-U#+@]gp"Fg55戈t1w̓5ۺiծ9f1wb-Y,"aLNTing@DtMU=Y@S.~AS愈mGSa+䩇*݋O\vn;U啃&RMSrS{AL"2h)NGiZ/r}ީӋ\ntȕffcW0SDHǼ[!BikY傈̦15c4C6IdX eȒ.DDƒҚ:} D$T#[ QԬ@sDd&r5E*5Hf% u,i[Q b/)WeY:!8}TL\Dd(Wq3/,<ڿVzaA0?s6ɦ*XYWDd1]"+0%>oX69&y P6>^}65QIdI%u?Up>#>17$֕'`l;/d.Ziaؘr?sͱThF$L^y.2FۓXT rE_zkLg^@2n:]&oJYΟ7y17K_KȤQg(~i ?r/6,Wŏ=V%S _.fv}Mm*;h&ʢ<Ѿ{.p6qZ6RJ*Hhx:_o,W(g08ʖ!wiW[}? 1A,̌c Zg׃JZ~+qz=6Ǫy4D#@W6]D]Hk8R"lجgyi]re&3 p}rZs>i<Skހ}ɉx>|s^nqnϴǪ][ .FGx\{jֈhNJdg7vb2@f{;jy^]3cHb u GiȽUþz>IKMͱpWNtan|Ռ~aܬ7N?J<ɧ)/p/qASĿ@G|mn{te({H: .4-v=0>xr#OhkHTI`>^ 8C z3V`S-SMYlVXݟGuΙS `VIhi )[I_W̢Z3plc{(ys9]]vH99tg̋+$)_Q- =K0jJeJ8aXFŕ!/C+/}7*:>1MoͲRM[ܲytW_^U}p"މU\[ 3T"le.ym6u<8Owǜq뛧0E=Cn@:9*M,Jz|Br:wNjU`Īz\.S; UW7GXyUM>h]Yk~1KO7wcU90CUq(wr?I^ 0 -rp{οdzOvq쾱<ѫT֏)HA;O>'^*o~26 \!_VM9㊎CHVNdu,ePqw0uO%9qZ.A^ zks%omV5vܙBffk}]܃ u%s4oŰ5i=U- qnݚ<ϭ!rf^dfľ\zwN… gVӶ+h<6<B\(lGl\LXy!ɝm-f#ZEʖGzRƟ pjV֑\sHk Gm+oB/9Xy7坭wEd,<jg^.9&}jWבrdѿ63jͤ,ѭ~EOC\Ivq2cBe4umggNAz%4MV_}Q Us9w|T p ;+m<98pv_rHYb=m5eUX 6Bbyuw }Dua8s,&lmypsoߜhrn٠(xK$gVQm!>y.!@6&7~0َ6i-?OdlP{*n&sCǻk_I 5RT|=~g˻Qo,#K3Z=/yb01 ,Uj9g[g !!*8ANa ޵GvQC{uS| , ez"ʤf5SyH2 5u jg%'gфFGQ(Kw^ka7:)u鳭d]{u #h]bAӼ :6իƽLj1?bXܷr n%;lWv!S6ojUa. :g]|.dp#dN\?B`sIĔYGpB:ȩf9KPJ(5Gan/,FT0Өioo{m ;g=uw{ 62[b֩33zݯG1U!SPi$y9k"H=6gS[h Wi F^yz{ }'r~G)YWzeVȋxt+w\.XdR~6P|, lCy^ h]2?R>6->5{,QeJ^xe&m0s5ܚv["#>Q.Il3"9&"ҬQ%]DsdI> SZ՗)jS͑)"J-G\-HV͠F7/抌c6/Ai'srl1u >$V>̔uՄb5\cdtEd0a|YT vVvY1;4ɒ=9maFʞKˊHq=4ҿzƪ,>2M+谻=Ir'vD4Ah|"s|Q{Inh)rZ7̧,[,S,QO.-1J\KܺQi*J4n' K+"TGHС["rPsk""Ǫ K{T)7 % J@Pz- NꠌD0Iz.U3\pL ":+WD$+QU׋46b(&"߯9fT(̞40Ȗdysධ$_ݥЉs\ZS['I/fX8|J;?V"opU"bE៴UdNlg"~ID*3Uc$ yo˾}5nXJ M"bXڴ4V21WADHȄ!M?=ZgHDdYDc=NGE$⋻j=%^\5Ud!?1| wR-㖆n#g%ʘ,9ФȻ%<~1y{{{a~1 SevH؃߼V.rK6Ol^etAtãqzfD/E_ɭJrO%)ƒЅΙ cr%fd'e;TrJ%`h}cGʾY<aN)'=*Y~B;f D'g'մht"N(ObY2ng$i't ԯ;V>x= s\ȟoB{3NdBC3zYa ]j~:տ[ײK}`өB(+-{kQiFr2; K"M~;=5-Υ{i I)>oZ. @WsYʴ ۷3{6<98p~,@薁fP5>D6-7v Jo;wba9=[%9,Izzn.MxRUu`SMߕ*4gڐ|ғPϡT'cx3lU"3c9vsΚ.'Ls,$s<tiG更\UuaSgI֋S9?jߖ74@^lsr}nc/hHL*yPʭxO&CVϪ7o |Pq^'Rdo"""+5hDv:HǥMn*T/b)D$wc"y"2uWm R`?MDD+ ݲV*Z+IfD侦oDTK(AΖ(6R:]!""gY,0"" "+8)uv6 ١߈p Ί~'vL 9)"2D1HlS "c~8ݦ=1&!sO$w"#\)U?`o [OXǸ\&H&Sd]m_e&BD/nWLC4+lh ZPZ"2JDW<]#(Z`^/5t".QNi N5e)I7{9i *^UמI<"" Yۻ*z܀~xf4e9iP+C,_-Mٻ9xZۋ5ڟD7gTWٖDOynsA6B$Y&C&D"g(ED M$aՇ }jbc49ಈlVb}[7!9hSݽ\#,Q@]KDYmIa7Ȓ@uH;0<`T ^zAQ?l9/"r0 XqdWxƳ5tϠvܮ&J>~ط ?_g'W1ѯqND$A<–Mqڟ% FD]#JَYZW-h0s~X*2vu=%_kzmJoNC#Ka1f]idYl<0)|OϟDN)`%\OiޘCD8\,{İ7+ X%~ID=]tɪzD%/FZ5-VvlTdZ-/D$^3ֶ)ÉOGPg14p͝F5E2H!FDƒe[!p'o3<]DK&9&aD_E,"a\Slܗ4WqGDs͝R "]FGD  ywO|Ozc ն5TZY")앥j"νmEWGDr֝lͶ֋D򥓻n;#QDdQ!dlEEk,[9-""&/#FDR3tΐ(5EV\fDM<Y@XD .1SCnD:-J{VTeg hd]|!O gv~5.V6WSk@[_xOյw~OV +J;DzoMŬ1f Tosqy+J'lyE]ƯL{>Mi8,> 0Z}0R3V+g78ZC19 ng+{͈K֙]f!CjϘW74]"nao+@ H dъ_Wz?4<餶1y7놤#@F:o>3hqhx]Ŵ7m6mXG5,ql IDATLW((i&;4 ?7M%.]銚Hƽ `@hT;`;.1̥Lӥ66T:!=kh?QXN&/ѷqy0z}5v/`ϵ!̄2,nB'm}LiLO,,udڍ8KR NO2X7o7+2+=Ƥ6Fzy[evk;c+xZwkSU ^]s[bƉ܊9s(gt'헷Ze#x|sٙ{A%9IFpgi~TX;R؝:xFPpq}pۮ,:z=kuJZ l'W2OVpX :`)Q5Rn m.ّ.g “ QHw đ v"x XUdh߅;${oͣrsiBbChUd|HBvnA\S;koQ#7~$P~\8\rݝgkYԼrJYgZ.ø}fXcZe<%tO4о"QX̏]@ `?x omإzsG%pt-tQ|NFޤ׊V.xf{:k!k ΀5fD+WѼɣ3f3ܬfx)e2E.Фy7a--uC3kfrȫ芇&TP^yλԄDmf‰7Fp$/+A־&I|e+YLY ,i*g욘+ ÖU)q# Y偐ɩxTtE[%=7 Lp}\J- J)-iފ9iXWi]br#NM޽j|0y Sb2򫽛iu?gqfe$9vd [ h'=c*ǝ4*s*iѽqyj;khKzِ `\h_;˲aV[|w+@Er¯<&^` =ӄN<:iݽ50ơKu(MM߱hő # Kբ\|g/Es'1DKȁlU~\: <_nb&>Ƶ zbWs>w#J[Jmϵ _oͲ\.{K]QD?+*wi^d)d]hg iY4]t~0~VmB1 iZ\GQ7*m0L}vՋ]veXLưG lf4Ua&Q.͓Ҍ⑾/s '{_DD5>jh+?H {<yqNE$QKr)폊$?Ւ?P'DDX Zr f1D_DS$!g roV]I"r~DŽ|+"W*]l}#>{FU|b;ܖ;,&H6(Bq+(OGa "E1?#~ɚJ\iED:$zt-$ER/r(%fǣx sB4wfZd46({W%L ;6lKra!t®?~wOƅV ~(c(,fJ^NJ<YG_do_ dQZ -11F|]"Agv/޺myemֵ6ppz Sڭi\V/%^}-n[#(xvJm'7WCR6=^_Ds ^N~uLЧ- Sk%ZLH345[2d޼񪫏3 4t sE)%i]T(k@HNG}2}H"8US(awE`Q+cem5ޙ+rd79,"=yHmԃwTfE嚀լ0:jugƋȑ:иPc~YAu&٥嬈$Zw6F=䑎9T_Y/iRwɷuyI3"8%\& J27,hK"+rkd"TWmֳF[0t)"2ppYDy+"FmCQOGZ%#iZoʟ2E mx4&M &GLCDr="EV1gʹ}:k3"*e6fB^_9/E1uHQjVd&ܟ8)"2""r9"bh90Ku\IcS]HD]!\d6cDdhx^{ruFW(R #_6V/h5Jݙ|vLlS2E! y٢iczcx+BI(f2I'd")E9|!"_q=mEQCSDX2uJܚ`5ɷrjg4I:?GDVB5 Nv;=A(<$X>W1ke`4,%Z 8f@3lmgڠYݑD7ᮈl%B2;sdT,ƕXqEDd"ҩRdo vD1v*""AWYSX'""yilAZiY/j+ Y9.:DL mMJZș61mIsm#s >G$.Pk[Q(MKCFif4PmlYaҩӪ+ r_LBfIT_~ ݼ%B*M-26HĤV}juu d.W=C:{ov ^Td˪E+z3d^9y_;077*&7-4_FʙJǜ-nz1X>Ps޻J;8o@;.8:߲dIO'ݪxmԾ۷udo}UTiHf$㗬6l~!2g)k=PF 1vl NnBtIp(m90: wmK?"W,k:涛) 7×NZt)ZG1i"deq~y!9n?,Wm[]-455HXB=u}mg+G)ef\9eLl]kPbE0P[qTkѰ\*0ϱSPMv6!Cj]͋xy{&*YM'ʊ Ke؁E.Pǝ͌!xg?Wt)e*Mʥ?8BTe+`"?g|fw%*5ު?k>se5N͞\G )> ѡUG ]l2?jN``>lSfW2+5wNv'N:%J'_\F-3~c;O3T>[qd~o6YBHqz3&)e `"_]_U ) jJ /b}`\ѱpʲf]^8> >gScsWrpJ5)Nۍ2/g bmK3ɽ]D uYe2,Yv?~X pU}'n ހs_Dxq>UnϹZ٥`t;w԰Þ5dL&b5 = W|HwF;?ZUlW6M6L( C9czT>G/kJaspN! U7\dsS7tnY(7r\9Wd#_V?9:"5f8M6L@3,ƭt=bSïz^]Tkvgyq֠JFkp]E\rBxVl6[Tq:iؙl^T 2Y[xb碣w?yӯo&,k/\wTi?Yqȃ OђOhl] f[d2 sY?Zc3ڔgn %^- s=Xغמp(C`+ˌvaѰXz-ʳbEN(5 0yǟt񓐅6MD:J绦71 'M.`RHK0OP|/`M׵ZE[iH5]l o*K\RMw2pT*@_^yAvM+ϯQ{>r!aC2'OvB>6QǒJ!vkc=;U2\S`SDIqvQI$Z(w%|~`;~5m*w 2UQL4rlvQ?LSdtn!HJ+r <2N$ 0>`6TQe ?w|u^M\|Ac-4|p7hGũ'6Vڧ6R v~oiP.ˈV'W㋭%M  .(A~L]OVqqE]sǁfT=QDϹ~<hz9=}_}#3GR&ٌ%dv7nk|N񧍷=̨f Dfg4')rcy(OII|1>N&o%]Ga [?$(SA4zagFˎ˖fk)CdTeHY}7&)U.H-dڇQ%rg'՝32 "Pv2619oW!cvi8W]ck} Òvp ,5M oYhBu 5-̓}G Gzܣw'M|Oջ}*w+sDܦ6@TlU̢ ֩=p"q7S$f<]~] B>($^^Azƚi`F~AU!)ΟECu)Ѿ,HP*s/g @y/哃gfJ<Hp9\Sv8? Zo9N*OgwUNa^SsZm4cAF%hU.hWc*XV$m򕱝1VT^"" IDAT7бKzt= +E۫"lb jDDDhݒj L\"2@SFLHLW1lݷ8‰tE$ns*?ی:nu(/9CMYDHH.ۤȪB\z&G;POD 6GDR `"d!ʧsJ,"[d9#OŠsbp񦉛&FM#t9o;O(Yql >,"+2^DFYL(8(댃}SD|q#5au3x'~"^ DDXfW$Ιq43{vTԱV#b6^DgPwdKgަ\IlY6LYgVRHu"wHeӣo>w%ՙ "wSDD"B%ֽZk~c)(?2EE?⁈D jW]%jOD)_~" ,%hC;  H1'$RhBQnGK T9n) f䏬B^`t1slyO^{jz{NNhE$|$vCdI٤MJՆ)kн~M>"7sfNBپa}Dd3ZD\4jٵO )K"z}5 lhjۧVD&"";V:'!S"[}EsHjWNc^UO{43˿3Zr̭B!)ZAsyEh^kxf FV!/>{L0[Os9 F/J^xE/"A/YKD65@;yI6KI=RnYw Kuc<\bc<_E[:Yyuſodп ?_!Aw|rތλ<7ǿ̛̚RZ7"d|uvaH|xA`oS=XMl]ډTc c$a೔rMj>:ZdCN;&>6ZhQwo݇?00>QN6eS|?G@Nt %u`xАQ/@e]JpNHz+J̊'_HoEU@G+B%Wk\YdAq r6!'Rip '6/H!`'?q|*Np2F}e}+x?6vw3;`M<aM trI+"r̐8R=FDd !7nI߰KDS9s!FUa9:RG6\DD4xxz%QP Gwu@D䩺̠#D}lV] c-yJDi`{Q""'"^j%i2(Hud6Mi򣈈Nu͙w㞇q& yD !_6d9fDh`?HMO\v"c1hoH8YuÒwτ(Aܴsyum$""I"&Vu_fB>̴!W2$4@Uk)Tn smUz͞ZL+v=wPj~9/2EI?Zc:t,"q?x>>f_ㅪF\J8UO=Z]8 epcH~B~2 ņh"ϥh6JQ3)"2irV5^D ?[m\:TDC|R* "6JRe4s[,ۛ<+"PMV% U+4ƣ,dDd#~aNmI9aϬew;ә(jHnJ;8$" XC|Ed!cC:Yh*Y]kE$[P?^iXVV5&鄍#)iR,M1J.ąCfRWwU-դxJG$>阐cMi7.'[4xu¨beS a97rO]?)Xv8.j|җ+6oX1 j%v d.XݸYN d@IRfęXrE%2$$;.*ЇРMR ֿ4{?XI̟òy-ҔlʐLk`ԋKvuJGo+VW)gu)G&Zlpd y9M3j2V5N'~sq|׳qqٳEVpz9߯کOa\\7f#[le󬔯Ǯ`{ (akm^W耠g bՇi3g/'':|>cPm%ٸ4fUgƓ6*%IP[GN7(G*Xp_Tͣ_67߀ ael_r{y{B Rw @*%p>3k6{`kIDsx۹y+gr/Na_ZӱJ5^KR@*#5,Rd BiqPk[!?Aܥ3:tq.ZgJH?/oN`TyW[.V,\qS nX$?sN(.<2w~}Dj('/Psduo7n.6_3X{}Hmk[N5oEW=|w:^kRgJȍIx/erWu-SVe".eAڮC?b06Q>2 8F4nWqB&6~blï@oo6&KOu=ܚt* it2#zSt!zN-Uoh.w!ב?i@.eK*KR:}g [[jl=07o{2{20 W7=j[SKHƉ1;seW.>fp>|\?JRā5Ogl ćZ⪟+@UҝW;;Q8H9/eWg)ƙB Q.HP}&m5,c9WKǪ.PNe ߰e4|w2*1;{]$<˟+S6o=.UꧡBP|n^ZDIj0r6!׫˒B~R]s9| ;6Ȉ4ϛm-[yo~K8ruhvȲX=^**Ѽ*ҕ թ}>g EՑd.wfh z*pa`^,Ň`eœ{M'`"uZ"\95~UkmZKwm93-]$;}{?K4/PI D&ѓFj/߁ _25y guƦ[S=xG`I{6/ӛ0ږ>`]ٚVXkp.L@T_y.eZ=zbȗOoX0R$V/"]^'&Hg@ݠCyEɞ)g*b5FD$5m_iLXG݈jys67*Ynb; ^ڨz7S Q."^O+jf`F'DX3AJ#EBԇL09gծE@mqrp̛֓ham_S@NeTKg=c)C9bϳ.ѥpl.K E!=ߗ#`xxctl䊈kڍ31#L2אszѸڭU'Eos3Zd>bSDdkfԢӼ\LJFV+n6%Yatg"Vf/5ܒ}ZX?m6" 'rD^LKð-kӰ7ݷjԣ#D$*Nc""Z36ʼn)lzC3SDMg-XSDD_JC \gm!='bu1 uҧ/]̬y t ;樑va_}^ Ys]1 7n]:8YH(2C5SzV]3?/%3(Γ.r6)@DckHEDGT+ yl8)g*C&&$"jzWx=en$-jSW'@F5@qcݛMDŽ5eI+[O>X樽Q]3{- U'Ĭ,X`,L~79l>f_=_ P4GjAG1Ç*1IUD/I`%|:t#}X! ba ݯ;wbeVhx/f_w7$Tmbmw݅:zXgej*?B3+Q!OI/؅y>}ѧ4)nGZժoG{$ ٬W-NgQۊ2#]_=NBZwydAB:;gx 4]<_`^52~479p&7@%YaDqO .ML!"b @{2gUtgM]K4aoM @17˻ RW[Ժ`idI ߷hٜB=gB/R4RTfZ:>7^Y4g n>e#4}W(N6V'ףG:اLWTZ:pulXi KOoԵP XW1_UQC|iJ"Q*\)[[ý4hZlQ s"g7RGԽnWTiI737 L󋯧~iQmoZ'"Mׁ ֯UY8H S%gh.(QTͺb6y`@m#M>s57xX xLE++[C(=gb>$wQ5G)'g7R&O*pnM]_`\D$Dd\+yGv*&o.v#+OjDt]qPӽߨEd VfԋuJ,DG"һl,_}r-'4-|+y<2hHx7FuoI?vVCG[Z}V5޾Utè*>3OtVĽGM-D2!"ؽ9RcͯOg8 Y/!zc?Vn "Q]DBV'j'Tf%YOSt!׭]a #0\/rCզqklY#e*mf0I",VD.UL#jo ->69;K*f)dѱ("۲%a:Q$o{ߺE (YFT7."DDVp2Nu36"r &gL"F[3d"䢄!"^?A3 jdun9V"\Rd=GDa""ZY;CDv0"&U$;'_Qߝ[C נǚӋZ,0-gI4,U3 ?I篘ġ#),CwͅLț IDATj4T̜ZCll9nc w ~nߎ!pׯsjh#u||dv:]D o\mwH!gZ`%NϮD*Xm?uG.XsTr.%jE2sCV$-\ ϴZ+ԥ&)6@i֛6H׻6 b/NHѡ|dYQg(JuI9фq}$Dve=t?Mj9R K/9v)MJDrdtO3HGtp:MAY{rt6he9H1/*)E<9%A k?J査[b6k, z6?g''g )ic\pEǼFmL;o Oz5>qj :u24cbTUV};ߙ4Şx[op@i=K),FJ{n&Tp*V}E)Y GI1- 2͗- KCJ<@@o5<5Y;GcR7vG} o_%~ʦ |7S*>mOꉳCas&-r#x8ukl$Y6"6Xz{F-M J}9q=[gߌ~- Ub ILIB7Bq5\T?qn"\*~#qڧ$ k™G!LeFI Yx銬'nϊg&P&hԳcO?B%1ܺF_c܇ukGGc VWC]=܌o.Wz*FɃ- };5j5t1&=`͋;MU$=bA#DgKDҔ/ڳԯ`[2"XCҥU$Sn^GvvϺqs;[ E12=4u؄VT1?5z$#xNԀ :rOfnIZm_8 {uZ*)}TJ@t狆4&2EuJD(j.Mٵj?GF+}XqjsnκEu~^&TghS5ɉcб RASxٲ$|_N"PsM;m;7s5 mu.5( eMbhH{ !wIv" s rx@*SF[s%i~Csg_Gg5w!(?y:CoxY1xΎ$%PTHݠc~-B6nWlhz:dX6_Cr\hPg+G± tp]PCVj{ =b+vgr":22lXs,ʧjy*SX*#woR>ީd h;}}")GVv)?]k2Ѫ0'#w;:Ւ4Jߌ\ں;@Jr:6)/g*5!K􊐈5 ؜uN5TY (}1:8m%fAOsf;MO)5EYڣIŐFJ6ܧJuѽ4s8Յ1M DDzj-Q",^Yuѓ2r Y'O 9]߾[DbOXx6+ȳmO{Q- =[w㽏v/2ce5CiKҏ4N ok(v$l"+ [n|9)2 t[d1"rQm;`z6Y7iVDDƩP/Gh)*Un ""WY/"W921]D$5ٰED.`,tnrG$^"":D$q40Mk$ Q}(&9gMQNGETvmf[͔pfxqU09ND|*r޹</""EDQp[]V BNѤ[ "N>{Q2]Z|DD¥8H<*CILQ^B~Hߙ|EDk`-G2Cݜsk_AKv>yCDI% ;ɖ b||_IZ]o] $JD$vᰯiE$dl%F [нGϓ=99"MޓrK<T_a_:ܑd_5B`Bu,SzˬoMTe(T6+^⪿y$g=d/rx: { {_D܅\Y_ ߖgH5I?zٰ6u'q=/A\.f 9z%a Z\+h|OORnQ17R7eHh=у-ޚz:J.is~Ͷzhasiװv%@{Kb)e$ZWúi~2iq]W}b+@z[/nd>9 C{vL ׾~$;K\fhu逨+QvEmlDRy'Xj-pC:v&煝(c`kvtj{eE G ƓlS(5=z j5Z!~2t/p0˅g_d}>77R7NޫzBLaBR'br+E`!Gq 8֧"]Fh;eKɈVt2ޜe5%:v,GZQ bj_K)-K^E%d*B^ͳ*&ׅ +_H'f,R6mG1{JO1s3vriqs0tvݚ wn^Ь{X}iR_n~g)_MzexVωy y-rZQgO glu%IQXr̐C{K 8 U%1Vݕ(WzlNcW~.W!d|<U+bK P7R:f}<g$3s7vOf/NV$xs+ʅKS5d5A'?fAVCaNTHi~J:hy¾Bv&yp,ʫ?$*KO8W!-+~jZ kۓ(?VT['/(ivرr )hgflFݞg*ֱʿ:~[KP 4ɫT_s2ưJV,St}=mh3T~KnKP~no1TwT֯';(2D_)O䵒W uQ)dH'SI;U\Hx U'fǷ&XNE8:sZ]]-ȁ  Z{+\aQA.jmHC qKǗ7,>q4"`NȒ:Z6!7(n,+X*(٥kfKVg}U_lrc'T3gXs_ZiyE cKv "QK{ۢyI*J0«Mחd V|棓N,Iw;nRʞVDbP4aMe!ЯlaEsvr,Md`Lc\>! ?_Ѥ~ez~qPw1Q+F-| N/ү8Q+YfyC҅tN`KK3MuƃbM>}`UkW*4`me>Q\<@B]bb9VG Jn-2ĩaEZ\a׃^3Sxn*eU.jdѺvu{޾-]B]bǏnE` =5JzaokFsAG *LCܰ7-> ?`|>ͤf5n/;Ml0nj‹Bfn]l6<-ɿ"i㞐ÂLQ> 7%Ǣ@a/nC*|tx& '<-ʬwKU qaR=f‘^;onRU_i2X]u#k[)f=t]'ZAfK2+d, 5!E=Zf %O:.ξ(J¥JL\@̓ Hyzb{p7j:]ulQ.c; 8H@p~sx쒄whHJS;Ӥ̈́:a 0|e&N墣\h5  _~ 񜒮>T Q UIǠ6УGbZemes~_1/Yq܂/1f@x\-ȍ>`s骏'OW<.9_"tEtKUs4XS{鲼 Ə}s'1muޟĢarp\!s{P\EAt߾Sa% g 72YFԧ{'[KS>h(s|3z)djgW#?^I-; 16okY>?4ܭ@W ߠ/ < -}3J46Fk3_V}::d @!YsBq#L^IX@zme\k5pJ2+qOx`VcZ+ڕz>Fb4۶Ui^قJߵ l5/n KLWYu6yE2p#cz*$z4[ 63ԍd_.blho#k6ͳB1_Gɦ,_Ս F[XUfmX]\vuA&1Wk՗]Q)~'/wT:|LrClm9i~xeҵ65ҕexlѽNY bl-8Jju)}>&O*y"% _]p- _V\7ټj`j5Z7e*TȿRg +%I}K&/'L=KYw`I!ה̿NFyG/#_#͝sBn>QqO om|-b#ߣcR_gHޠ5Br+yZA/^⊚b/U{* B 'cQVS_gYIf!n^-.qem~kxY o! :,HfmTSu|m ?c:[ [Y~9Ǽ_'*jS}+5-ۄ>-QVF U%1]r &;<~-hx qjWJǓUr H|)\;oqFQ@W?;"=<8K#;\ty|ֺ/aݑ[ĵ j^@e~|r] 1A{w!њZm ?&'ߊB!?!W+#M1TU2v[ϳU32/Q(3*;@@k2ړ Cw8n8Q w>,}07|R)tj|~9q.ӬK:$.ye5N[nSFmxzf+k U ?I6<- ?f-ߤvĽލFS}tʝÓ F\Ʌef]@ R- :|OH#ZJ8_|$Zfi̘t++qo"r&{$' |%Wpr~Y*<:a9r!6hѴPs#7d`0M?^D Oc&77I'o["">E(ػoEd&AxBLÛm }em AD]IJ$7qN.E-KpwZ{p1'|4l[|8CWj9ںuwF &W4xivv&>tu' 4`=N)(TjxS ;S>w=8YQrA :~z"8oGi<>jKkJ$8C (]sKX4"`ۄgqfQPRh dCɤ&/ay{CqG< [/s8EԶeAcEk8%`cI>xh ^w]Љh׷/lhأKnx` 3Ϯyl\f O4;JAJW_ޥJlF[׃~}7 IDATxO\l4);oI2.CjK71-n0_VPe*@% uSM3׹(WR!+`5hj77&RPW*hmj8QāVk[kZGkZw]ԅ{{ϺUQA%9?n7977)ocrrϹ'<.cѺ)eXV1}(9מs<9 STC&R OlR$ A&r_eko5 .2/U~MO@Dx3rz(lg]R 㠜Qd7|-[Yf3j})(HV makj|ԈW&]wGFGLډ,PFs=RśUmwjaM"MP1Ѳ-4TPH0e>g|lmrl6ߐ [  BCt=YRO1m\2gslF{^׸&f\% \Pc*(d 0cXax`8^[\Bkm \V0lwxoWPߣia45 uo=S }^də:بB= Ja_wg-HSC$e>gH {8cۥ)~ hcsrI!1@*{+܏jlϕgWS|]8h dIfgJ{崙fxP@\]9[|;ޓzwWEUvίa~CU"Z>lbnΞ @&"{!6H@}0t]OA)?;ZW}+tRjmvu + S^O3er@<{ vUh?Hp+#;Pn=}Gi|89"L r?fn>s!W0UE1O^Jམy< 425}P"Q)a>HЯvTzYקM?,⍨_ .՘f6|tA^➟bF8 2Oy삼qon4M飤 pD!O< P4Y]àEW: \Z/޶n۟&[r;!Y!wu)yGB-MN 9SBz(2ic{k5&+Mw?L!z5[&wqB|}CX_Ur%X!];2y{BVV'tc.0r .k9K N/GؘmҕS!%BElB!?rY|^/٨)GcnUOݲ4esWr|(tAE~T'tBN"][7x^K)Z, R}3@)8RQAf6"89_M{x|/+Kz?*F|m.I4`FG%묚3Yiz!wudE:^xZl2R%?\[`;Q$YJ?j5l4!Z9z'X≉!yG_(tc՗A˨ar{KvY$7ש!G}=ۤ\l>-Џ<5l/+ 3{^Ez:L쾮&q4Fm JSĈ?ún<}LcHQ C̖t d勍6/i m$3ftDV?݌Ft~JJYRM'X?.A&:0rʶSKjk7 wn$XX6&goi{^ٳRtd/A%yӅlQɴتҷ r(JK}{/u>Wl=o<zڼ96)0<~naٺvr翅:̙*W[+HEԤĔw/[ e68%ZK瞙pyVz5 \/CqBDҺung^Ͳtzn~qfHbCdDE'z ]b: "wFq^͐Ke ^wk:e|FPgeF-9:d=ٵYP Bi =^wX FzJ: .&Q4@8=H<) j^a[r *hf!/Zj1<ͳ],1`KEwU=;F 5v 4[@bv2ⓓ?E3x~=j~wvx|w\݅7W"VR*4q\#<9F^i>)gc~&#9qjz9,_C< ׃YS4QX<`p\?K- B~?ww uꓖl) R?O0 ^WJ=@uO7Dc|fS$h\[uM Sju'og9 /OܰdG1J8RY'bh(UAˉf'>l0!#dX$Z؄0x;3VCLFy-Fϒ-%Eme:6>"sr[d BX& 8s\,,B~ Syj? s"oV'L>IozY_xk/?f?yلE;iE&uƆA7/M.)D`M;$k Ν~Cq&oh[2]U=}; a[k5ztYavWF?S7'r@i3 B9Uyw~;kfqz#jRی$eIKIE)ݴ :)jQ)vY +?]^j(ekn$4SQ5u?ڣӵ.d=憿xQt@? hR]7%[p@o&Fy!d(6vw9;l[!̴Iz!-}j \˧ n֜?؄<˭n@u_=!d}U+ zmWB-ρ!߂\}5v[1q ׏6 |Mwj_G 2qPpw ORV>INQ5To*Tnhd:v1&kR5Ej:oӨ (nX(s/S"ؾi\ta>p\כur/"#.֍wտY/(Fе'G` :1_T # !<ƟmKbb?'@O>3)RּbrƯkB5+xk{3sx-訓Aw+{jo6s ! )J[=D8YY] =m;z9!xbBW *xX N΂%y@~|+^sIѢݪ/Fh_2 9)MBHm~]>\&? D#gɟX!{^\k=B~y@iIȽC!F0x|BD yYM8gݺI9m6eܱМr>"eUnn<Z򐐢M~ pFa\[€U Y&?LѦZ=:+IppYB &l,| 9mdE(:6rvٓ[Ǜ-*x<W!U;!n@ݑ5ξՎ/<|{iE=қ06&'`UEyVFʙܰN9䯜{\1g^žٛup3|]޵8%NfԼJK}(2;(M"t+7|?y{ gK?C +Y'Zɾ6O !Eud='N fp׉%˰Oȭ\<"\|10|nºɾldPy>Z&˰DK%k_$ 'Ы+|Z%Egzpkzd>%]ֻ|B;Bwfd ҡpdzfev3çi\¡o<^pj0s1[|y B>O96CC}^,z4kF P Uj-uMqDܘjWh|Dž3*cs&EK$. >o_\1ǫ'EQQwjƇ,|_ `;.i| &aZe22|8}@%ZkjASX5) ,j\jnJɳ钃%m:)?fK͖8-9O:>ᄅ%!X  $<1wnz Lf϶-z+p3:/3rdUt?~.ܭ:w`Q"ԺiN]@a=*bA[L.hs6YTꊦVӭO͏5Mu뇪 \uaRDTWNBicA!t4{BjI4L>puZQNT2_-i;#e,P ojr )iDjʼӾ6u, ZԅN|Ts3PQqn_e>ϙg Dj@'7Ǧ]Mz'g&mƜz|M~zߨN{gM^pF7 #=ރIpZ7ˡ YnQՉW54 G7z/Fc~zdZ3_MB@Z0״:l5tJ8}zՕŀJ_A38IWq"iԕyTa18ovv/ NfnqmtAńj8Պũ+ 1<\0Wgꣿa7!>tBK#M:*H{jawAiդnYg_F{)c' oErʪxr齯r !xWWpLߤIsCUC;uk&腼X޾B; %eIB~3n`ce @#! GB]¸_gRVpf3BEQ""| 0`}$fg^r8M%OY?`sy=6 0^/ !tB^]+:M NEi`hVfR"e!?@si&>_ip}' yXMAh8&aӲgק [KqN8\4B^*szRV: M[I!n|a]srP;2C/)\Gad :9̙XIM*䭆/,wŒW p2 km3ymj4OHp.BKnMzjי `'H.Mc^gyTZ㢱h%wqBN&@*L%AB!TJ&.k=fT={S~?~*'uOzkà}r2eTk!!Gn  L7Y3 U hcl))ů R7vQIZj!&,m0\ǫ2&!5R1K<EA\{hě@ik>[ZD) ǣ0f]@nH`C)䷧ = mh ʄBr{4r]Hm(BoR8Zp`Yp8Uf!?<$&e],E tܰVKMNRu>f-\pumw1@ 4uMMhw? T.8!ny>v}}W[:Q~!5ސ᱕YAjp-[fyŗ+ZBCjZ-[9@Ew[PQ] J^+6Q1<}"E~EBͽߛ&:Pm/SWf?X+xj\xtۋep2ǰ<6y~0bRR[AV'^@87 8~2hLd1fxB`ƠAJNHl':,^BIK '33=Rp'wl41:o K`Nmob$8`M9tm'F玽xYv^{i)Jnv=&N hldnar##ݣreNj!X0Xd8%{~F54 :s画6W~ SpJEdłY3GVrߠ׼%}%C0շd蕚Tlb/*xIqyV)OԹvKy%!GE aҨ(s>SqrZyŌ"XVG76v k.0 [Jwa}iUe(M$xj n'\fw5|yLt%F4,pSrqwsh.[}g&QnV1ӭ·0emC^y3ҡi"=V4ĉ>&]gyD6,Cpmf*nt y56T)$6z4/WWpo|INAΙ:f!phPQWCiڨQ]DY2tc?mKJK*pRr*7W٘^lD+>|7됻6By B :ݚIDAT6VP0?490[Eh[*.`en"BïMA>YػZ6ܼQn地ީQ!* @lb7YWL T%ц[or@y%4n."N6wB?D^{|))aQ1uِTBZjEC\ skqN,$H.,]ϾM^;y;#s8!Xreƙj;ZZ 1kYU :/o ;JZ'Ʈ5P Uф\P|{^ujg(^|C]xʁR4䀧U%,gr@+tsg/Hsӑ}߹зn@.єEk}.-ta4b3,;k_Ɠ$sWJH":x Ǻl.Up Zݡn6^lBQͽI-oE ~6˕Q8RU2(: {fD鼨HIagx.x@,LBNȃ hPéL3˾2ze<(i:mv|@T|-)ֿQ Zn貾vӅI/\ p7Rµ#쳔ppТz,(4U,fYb\8W/o +E(9{:@Gțl4Y*4*T̝nUH<F/]٨oQ@/ ]>eEw- b1kS!+(6x_#ۮ 7-Cǀ=1%C |m8w:wJNz BN~ aвt8<5bNݷ(UNʰ^>O}4^o)He|*T_Bb#0[=}*@ M 2a4rcc@ܴ}-UlTѴi5LjyPL_jAQh[ÂFMڲArF"B;W 0Cq,.IvnI<6\oӼ{~m1!znl,jo,nlE-(@EM54z2vM]d,tZWFv寐p4L~ r(\Ǭۗ%]4qʨ;]oJD7'r,.4%34yZ 3ك8 s-fE51nY3EVOQD_=[a-FbIwV?t<{$n4Ҡ=TJ mq)K# o{x^ic kq%uhBl< &e]L(t35mo,Y:σ9vLC& 6o6ƼN3=`.ngRA/9oQn"&*v7oIh]lW`&"~ _ݺe5wvC>3\JQ\Y36! ō)KWk0+97f0rfk_ОZ{8iQ zu4٨:s ΞN횻kAŠSu0rx;ͫsεu~k&n45sd7>lErl]r sPkBhúN21!4=DqP ܖԬV# q~ \Jo `[rs\Xitԝ7-\qynH[q61yw YNkJ;3W؇EThw?5n=ˠ򓚝1R:Z+s˧OB8‰Fp_y,dѬB ri?WY{ZzȺ*bzeioj{Ҥ^،~fAY̙~=0/EZ7?+4OqC=ԝs٭ {sv9q|C#;'>Q9޶x_S9kIg+V[3vy)ϼYUB]eY P wWK r "֧L4f'!/(ץtzpL!^I6zD;5!q!ST//_MCwQ.Fhm^G{B4Ziz֒@Y0t:VP٦H7k桾*ݾ+G0v\0_bݬ[|}64P⯘D``K%$XhHg=hkum4-]*;lE&="Bfo(眣ršW|c޲a^V%b:xNXg7cĐ'tٟ2mBD#xoqgR*@mdzF[=1wN""ib얔.jo m\Swpx( I Ma:Ae͊o8A.gqۦ1@Fe`e1#GTզfpq`dZ.B}͔0*c v!)nk𻦆,KNs>Nc3}aܚ3M\ xk-KCj:0 yXM,y/j4\mX/7Ҽ 2#) okJIό\*\?OP 2 y q d&8Y CU5>>>Q2)gEip}K! mOxse:Ȓ;k!Pz%g k+lVrejj^'Td9~נ;w;jKSoT`JKxwfnK#m@'Dp+g˾d<}'퍝iIɑK~aZYWP )fIP{&dwym! h뛷Jsq(%{F"R+yKVp}fC`O7}şթKu_R({>/R hWD(JV%N`/CK_GYƋbYl#k)x&Pn({yKd10 yђU޵ѦcȆk%W>ֆ2?q9~ٳ漎5 -adnf֙?:{TCgۍK5yTm`X!b )Ï(}hZX>EYo̱U4V`*Z zf r+ۡgϊˤ{?R]*JV~7iL;t~/z@ u* %_U5$ [~B. EȋW}߁λ&Wh6"fsteSwDGgPܗo盳Bv6J_|+CH+͟'hCd3iqz]:F4?=C4Z7J -KDwuhW 3".PͲSo<^*n V"[ + Jr蚻9 *=WGDgɩmNO4]g|ECqW?ysX#{uBTNO!/^YM)U kMG1xq^ﳖˆRs}G>4{)3ևdO{۬"X4Ag4o)+ٌN-5zߣ"gsb_Y*ȝ2/ϴSV.|VkڣT/A^3$4 Ţ|xxv~CS}/8[餵7Ò4\۶Lt|n%;\Z͸6 ^˚yi -{A}Wl4tbN1c=DNrT/}KOau;! ݌jyzS;]8Kd8EՖ!vyZ |pXֳ"jWݪ x6wOI|-0 k';`@cv?s7hziwQ[wpfYvtwuE>fo,:3Pse[l)Q]G.v 4Kf7O+x }*J~~@qY >xϰ)ZmhݍZ< v#2u/ IZ4htskpUXkC|sdk a[cO\@ ¤FoӥCŚz2h-QNIt,8SrLDۂK4ڜ0c&H<"VWet/jR M@'hNCn ^"w=oɒVȯ4sIXj^> #hy"y>^(BC1R.BPkT,FT/=cʹӦx[4᮶CfZ!߈Ĩx~ƍayXnbb *io#G6 B ~Wӯ4jqSY2/n*3ZX`m,?y`lfhȬzd*sKzneb<)4VY0=o \~AkV 6-|Qu~ΠՋ,V;Q]c_T_ y xYi ~7{ĿB^>Vwap 7n)$y+zn0Nh]_!/KO\4xB䷶KKKۛI $8qw}Ǐ}󖖖`ԨQk$?FFFyyy+C 1C2dE 1C 1GCLVC 1C4dE 1C 1GCLVC 1C4dE 1C 1GCLVC 1C4dPQQp/]]]&>+1 _v4ML&s޼y;w3gom^8p8L&Jٳ#FXXXhkk ^__v)Addd)** [QQe{{uցF°555/_~U{{{\\رc&aÆ?5-ϟsss}C{{;q\YYy㸗kkky<^YY!b_*:cƌs·#qΝ0 }}[~w}=&%%=|۷#G733#~eRRRyU.~777 hB\SSSEE|;w>|8zhwwwOOϑ#GfKKK<777&&&$$dȐ!'33AUUU##A~6`0444ȟ  inn AAAt:=$$d{b̙Y,ֆ 'O,S~~)Sx<^rrrSSSKKKOO 222jjj-n׮] z򥬬Op8--- cСZZZq' n555|>B(((G`2)))666#F~&yTUU͛!C̘1CXz{{o8N_UUOAjhhWAnܸW%Abbb\rmO;v&loo?~|S걱Oy) D;99 gxxxPPЙ3g>}r\xAaX^^^YY  % 8ă^)8kjj/l6rWS(؈aǏ|k( ...---pIVVSYf޼yEEExzzsڵk{D[[q]\\O> Wzzz۷o_{{{wލ H`` Ǐ彽RA\cԒ{? 5k젡c8Lȑ#0xeA޼y1uT"p8m߾]`PQ Aɓ'"emmb +++UUUUmmm!wNNNpUjjt <22ɓpÇdAq8///$OII|EE_O166x~ԗ䯫Cd\f_zuڵ7nlܸ1 ԩS[l>ʕ+NNN CLLL`rܺ:⧚͛7KJJχߟ fff}mۼCo dggVSSCRߣGD>``OsM}ƌiiipB]]݌3xqq1 >ŋ>|1WWWEUUUkjjV^M0..X vvv|i666[YYyF}}}rrrBBŋ99o<3330odζmѣGЅdj󵵵 㸣# -㸚کS:::gΜ)q qpۀiXXXXRR(||~EEӧOErߊٳ/_bx꺺:B`޼y KJJu! HuuǏ1 0aӧOy<!TK^^“'OtzGG㺻׬Y!Iu1`nnΝ C }yA\]]>}ѣO>ѳcǎ8r.p@+ϛ7A>\rEQп9rF'Otzyy 8qݻwrl6OV( <{]$a_; 9(wwasE__?..Kuvv"rL Z[[EcXt:bƌafhh(p'Ձ"##o߾}ݍ7g(gdd"F5=zhNN={{{8Nٿ?χˉV2119vXpp˗i~'YIMMfxT*ںR| %ք #e˖ϣ( |͛7yxxDEE]qFArss&>^[[ ޽{555lBA?""''z'N%|#gҥMqݾޤEQ///;;;* O>egg_zUMMmĉɦMgKKKar8mmm==ObtR̙3-[F~bvv6aNNN3gΔ޾}{||w着 Q533ʂwttmr455!/p|޼y-ZԩS> E@AA͍ǠȊE_.--URR0g 7n@~|}}Q^uiӦM󓒒󜔔TVVp~nMM!}bmmmݲƍE ^S fTTT%La̐mA55xRRғ'OZ[[!:ZYYBlڴŋ\|ɒ%}ϳgς`9y$0hCh|`K.q\OOoĉMV$+===BWTT"PQQM6G Aݻw߼y|]]nGnnn<ڵkUSS#w^Ah0]]]#!& /// rrr9~8x544LLL @gϞl~ǎ{ƃY!䶶0ȅK%?Oq[[[]]] z2@_eee555 p*adlݺuҥΡ`%/ }? Fرc?ohhi&{{{MMH!V ˋr[np87nܨ F455CCCq2zh ++CΙ3'33eŊ88qq$$_0 \\.dr\$ N>8 CwwwDDɼ nr}7yIIIX@KK ***#G$pz Ԁ֑Ay~GGGttѣ`TBBB___^^[JJO?DӃ9ή]LLL\\\ȷj֬Y@#16"ZZZZ NBJJJ -pʈ#Dj(eeI&J+t7a.;v,)\nrra8 Ou@CCÃ~g&Y__?g "̮GJX0c]]]|w/1b˗/۪UOiӦ͛7߿'NLJJ"/+@_bŻwF0,̃Tx[eeeEEE(nff6vHb ,q:toZr%311QQQRWWߺuȹz!M>,((HNN񣱱1jmmZz5B8q7xyyڵ Uzzzeaذa֭khhx֧O8# ͛7ظ^zuŊu7nܡC"{n--[w[XXH~>of̘>z˗ AWr8} 鶶6R999>OsjjYgg͛7 %0X,^ʕ+&M~/_@^SSd2Ǎbaa %%d``aK,њ"moRTXinn...˻ѣG[ZZYqر}' +...555D@tbss3X\tlr#84{eee##3gwQPP(:bĈٳg={fB^^~0͂aXhhC/_y Çmkk{ZSSә3gm۶qӧO3Lpӂ3~&OrJIѣG777HKKKNNNRR2::zܸq.]ڰaÎ;.]DVt:]ZZGFF‘Z*L˗]]]?Cdʕ%%%>|֊;v?^AA!##833˗/7o0^zӧ/^|0XXhkk~nII aJJJ*** PPPHHHrttQRTT$---`m۶nǎAAAn*--ksssaaaXXXZZZFFƟUb?mEQouuu0l>ғ'Ofr摑Æ KII𨫫ڷo8;;T* _ϏxlӉFCŋNNN{uuu0 (> ]?C ?O0!>>vl q7n8x!C,,,TWݛSRRlْghh8n7n\WWWSSA#'''aFDP 1CϟA駟wڵxb}iG<j .$7P"55˗ ի322`r222W^-,,jnn|۷Jˀ&`ԨQ`׮]``ɁsZFFfȐ!jܹ;wRPP߿jjKLL jkk_|YJJܹsOTRRxt^~-))IG;tPyyg;1jkk;;;MMM`0&Lߟi^^x@ t[[D!2y;w'{8//oܸq?|Ӕ)S֬Y7e1cƎzjEWOTjuu5$ϥP(]]] COOoΝ0D,,,""",,, *--}ҥ3fdff oRM`ڵSNpBVV1b_~!/X ???$$dw l0rƌSYY)a 5Wc2JJJ@=9@㸝ݍ7vDB9zQ㧬LYY`mnn֯_0jԨ:GGG&_GIxˡ=jhhxѰC Y?###'Nw)++%>L4wwl |{- tٙĘ B*Š h-//poncc۫ ~z{{{ccѣ<{* L555JJJ_~3ZYY8NMLLVX1gccc;Ϗ?(уpŚ4iƍO<:rH^w2B NNNG+WZEA&455Ȁr׮] o߾q>tZ( e@EE~V) 4 0lҤI'Om3$%%)ŋ?~8fW OhB&9{)S<}֚r `;v,??\.7##cÆ /_~zHHȾ}@KJJ;0nB37s̱ V:Np8dQ\^^mddWp8g ފ K hhh33t:3 ))ٳg?|/̝;711&D~y@ &Q!XmhhXv-uuu>.OOׯ{{{ \X疈v$JFF"lrƍ0~x*|T1bDKK@4mfMMM~~~0b///lIgٷnݚ:uP* '=z]RR˗/oll 7ooM>4*l6xH^ Y[[[NN޽{0l?3H $:t(ު*H;wvuumhh\[[rԿ~]]\GQtݺuAAA[Ag$ H D6@1vqq… Ν;WmiigRH9WR_#P ?*k˗//++;w%%%v t n"W (JGGGyy9o7G_a-P$/_6mZUUUbbXbŎ;~ᇈ5k9rd\ptss311=Q :u`yKKK_Z[:;;~jiim@[qooo[[[ % P(?8_butt(^UUW<T6hiii``!ߵk׶n:j(\CBB߿/ *33ϟoggA7oޘwuuATǨQ@OBKHH@Z Btttxyye׮]rrr"ShfHq`ݺu<uݺuyyy DUWWϚ5KSSs޽IIIvqq8q"~Wv+**9rqAR Wb!0*DL&GGG>>>@߿gmm=gΜϟ?oڴ 2| EрFeeluuϟ?2P'X #;;;...888>>|p#jkkɱ؃șOqwwֆT ɝA^"_ennnjj kAN?WUU(DII 1 INN{H:DN,;e-,,W:ay}}۷eeeusYYY?>(EΜ9sasrry 'æm۶]zրu"1`8HB#|ԩ"ϧh"6:88hkk|X(mjjee˖A AAA`O888ք Bp'SАHcbbIk޿FCCʊFAӾ^cTvww/ZzFFFׄR9||x5p <}ҥʃa0yVjkkwmfffiipB3cccJ; ٳgaaaW6mBvkjjB^͛...ill#ٚD4ǩT*1 .On"}ݻoVpaU3fWVV633r;vPTT3>zhaa!tOaaagϞ%="##12~g>)4#|2X r4 rijjvww(;4g̘a*l ׾`0||| IL 0LKK6ldmmmll jյDgȫ+[YY!#ÇYnݺ5sL$a;Gl)(( ӃikkZXXZZZVWWc,--I g͛ޫV0UA8~n; *)p޽@G 9  Hgwq<::< 87rrrǎ'jz  Fppe6lp]c:::ڵ"qא㹩 [nYXX-[ú q ''wߓv@WWׅ xzz:u<3㉉0LkjjܹvM6㑑BCC(_WW㣯>pǏ7lM TD8j*{{{ӖtbԔ4㥥EEE]x1;;k˗*DP\]]!/Çi4p3g?@dN (r555KKK777U{̴p 1HDD̙3ZP'HmJ 8.0JCݻ7==lܸq̙֭ w^QQQGGioouׯ_WxaEE!^6iii{{{gggOOOOWrN̝;w-QQQ}e @ǿ`Չ@ME6]DD̠4H oN83fPUUJJNN9?t9s@*Z6}Ӥ1rssh4wܾ}CxK~v~ƍt:FZZZdz{{rϟ?O>755:u 겱QTT$*2̲S wtt_XD۶mِ`h4555þSdO|qDn&ooo;w.\ׯh]]] .9r޽{:L:588Xdm]***.\Xzuzz:ބ::: E6l!oܸb H;d2ۅd2AC[>?lذ#F,Sŋ'''FFFt\.WBB,l|;(2ԤFѪ^xakkWuԩ9s@)6ݻ"&a؄ Ra 0BIHH ~v777Cg߾}+%%WͿϟ?755UTTyzzBUTTx.]?N`[]]{p+?C')aij`QT"]Ozz^*iΝ6liiiȔ 'aLJJ\:</ EQ---GGGEG޶mf@Rkcc#gE+Aκ OKKR|>ԩ)((HII(J d9}cpfffX0E!S˗!CTpp0J% ...jjjqqq|>?//rX~>$t0LZZJ@8attts *ZSSSPPO !T;B>}G```AA@*$}!'/cee o޼!frrUcc#8v… mmm̴ *%%Ed{}}}H~pLMM) $ pCCC;;۷O ܸq#a```ٳp>04((h(BsZEEE̓tq @?;wnܹ$ЀĦ/^hHKK#'|\pA˗/744ܾ}RB744@sA;v?ݻwayyy? 𐕕}e˄7܊EEE(KFDD@yhȵAYظq#۶m@)))}uL wӧOs GDDH݉>>>™%%%S8 G0 #'88q)Kh"lIIao޼X~@))6666:::ԘAAAz q~kk@VRejj 3?~ NVV*QܸqC=O>M> ii+W{=1 #O_jYM8~D# YQUUkaa 𴴴?666޻wbqܘwwwrY@www;~ *-d;޸q#q$-- EQ333\XX322"1!)$? D&=nMoLp޽ dz$ݝBSTIII677l}P\\܋/ !0@EEE  r{yy)**޾}DC0 Yټy3JYWWW|r(===1 xP[}jP(5kִa&_u@fΜiddzɓ'}U-())?A좢۷(eaaaffuVb@]Սvq8yӧ:tEQSSSsSN]xٳg=z$bb!zz:$}/))0 2 ===!׾2P@'Nͺ ȑ#iiiRRR}e쟬̛7OWWPK ;/<<\NMMML&3""BOOO SٲeKmm-d,Rm>>>111o~<Ν;UR.\HKK={SəA._*XYe***TTT:::֬YE=kd겲VMo"CIK@a?{ nYxM1 ۰a ]hիWΟ?o>gggruNr %d=G bbbaX```nn'NljjjooR:** YAk9r$,,,..t'wᒵk:::BobqEWX_^^`0D&044STTTdddHHHff&Zp!wgggb8ǯ^J455E[IMM{7QYY9..k(Hԗz2P( tww[YY}x:&&& i0r@dffB5YYիW?z(++Ġ d2!qcc#T x Ot!UUUYYYPKl6F̙3Q(JJJivN> X,---BC5OSRRRWWg0uuu(z{{ݽ{ j X"֘Ѭ(%_^OO]a HVBBB` pN*++ ZZZ~^BBd2a5P8;;( EѠ-p'DOɟM|>?44@c: ^^6dŀ㸕l[[[fffww73g!p+9F|—/_,(˗hLϖ-[Ptvv||gEEEP0Cro 2'+˗/'.]s͛—@ Ʉhr*jggGHꌌ (f988 r qT1HN)>>>&//oggE<PψAV>|PVVVYY &S/LV`0ttt耢WIIIPҥK@e<t;wfMMM)JQQ1fsNDA?~ VR`HJJ.^qKKK$u޼y%f@q%r=YX'NR ŋW IDAT/^$n,`…ºd(0Hݻv2J]|yIIɓ'O|JJJ" R&Xk@g!}9u yF2ZhQ^^q"|]AAV6 p5zh(L3wܭ[*))A@tfff~~͛7===ϝ;'%%驧J%66... 2d߇:`y@cccHH/ù{. rrr`~566.^ l.iӦ˗[XXS4,,&%%\/~ӧOrrrP-$:N n'eFOR=<< af7BUUoݺb@5JHHu~*%%kYedd`ܧ'R!hӧO999ɠo߾a= .xjIIIpPݸqc{{{~~)S@X:T`-͓&Npa&Mq@܄b]pacǎ%JeA8d677FDD8::cT\wܸq \.@QQJe _rE}} Ι3g͚5G9yΝ;$W5jԅ  n:ccc (O?,_*@ jkk!'u~~>t9.aT*۷555a:M0ASSsرMk{zz޽b @.\`ll@t7 ?~&MY(C@@a$={6;;̙3T*ѣG5K.[,$$ǏD]n2s 99-[(**BGOtFQחbζ:u˗/pљIII111;rPɓ{ݼywƎ;gΜYfnݺ֦׭[gdd  *..Bӓ?~={ھ}/\mii cx…_l!7D(x ]oݺ @(Fc0۷oWWW}oZZZee%"%Dc| 33bBULҗ/_F=^|I\[\\<|]]%K )Tw@`22!C\M6k,ŀ覦q ˗/=zD  %^^^$se0ZtttLMMΝ )sG Lp\F>}w}GRa9FUTT7:;;((U7oX,-ڟ:u BᆱdX ΠCKKKsss@944"BEEEvv;=<}믿CDDի^zhy3 #EQQQLf(x<&W ް/cFdgddB{'Tqnݺ;w466.\|̬W^=qӧ`Ȑ!QQQ֭Î;,,,`i^`; #("ȀG\DB\r$=#//@Pbccɬy<<< /["e۶m֭?Ȯ/^oΝk׮0,66^HCYYYIII7w Ip9Ijdd]NN΁0 ۷1k׮B`u+Wtuu=yҥK'NWmaK`RRR0g#""̙jժ?{?HHHƆ!#>|xqq@۷o8~ poz bfffmmmfͺvZss3D755uuu r{yꕴ4544:'dn{{;t3`<+vl]?JJJtpVSScffV`Oʒٳזϟ8q~ f͚`pS744(**¼џJ[[[C`&OLQTT$-- ShgPd L"h4%%%:>gΜvqLl "4΀03fС>|HHH[%RVV.((hll2e8 !111|5Xvvƍ߾} ϟp\bŊ1cdee[ZZ]_~h:++ d2 Ν۸q+W y<17a@lǏwrrJHH`~ǏɄ… N% Vi ;R@_ϟ?s8EIKK;vaܹ "D'ߺ`aR}}=X^駟"##\ pxؐ[ ٴiӳgpRp&4 F;pI?&j镑\pTQQQEEÇ 8SXX\=|>@fggƒCtA꺻ə3g7{l ȡׯ__`WKKKKII)5 HJJ J)6a`O^xq_~% I_̻q]iiib;88a$x':l222]]]%%%K.3}thW^͞=y f!7o~xҥwޅ:tO>88rH&)CN"ڪ&|&L)VW<߿ORuttȤa%za l!濩)>z… MLLfϞ-%%ERAy;wNMM-<<¼ݻ ***8&Lo*--h"8!C@bRE M ڨT* ɓ'h4۷oQmjj"-,,BCCeee>|XPPp:N9sٳ ^XEE'sGG]hhhQQ!r4P0o޼IJJ 𐖖?L>XXXXZZ~by{{rCCCVUYYوϟ9s()*%%Ç/_R(ʰ\}}}X @`܋t*6Çvppƌ  tww߻w}Ξ= K`Saǧ8( 0( A  Ă",Q"a(b` p 0CaZ>kPɛ?\r[N{}~6?ѣhPzz@ C$cccKL{ONNu bv Sq\xٙRO6lxⅳ3惽ЧOs疖VTTaǎ`g˗O8QNNHʆj*!޾} e {*&&VWWioVIIRqeAŴ%&޳wW^,G yReee~PX__Oo~~~>>>UUU}7<?~O? //wu ::֭Hhkkݾ}ܹs@os3g"Bf$D"qkjjjժ;88 bqɑ999'O׿u&{ٚT;!//g2z`@B/y$''{xxq8?~xŊ"*%Ixx  O a*++LfKKOaa޽{,Y9gjN]zu޽ZZZ4.cǮ[nG4iwss3 #S<==_#GԌ=M fD@999}}}.iԷxG***0w޽{㕗{xGH ͍^z _~+))&!!ުOG||< ضmʕ+gΜidd#FUUd=bz}@~BwwwyyyS磣݈#lUi0LsG k?G:I\.]@`+Yf`|e˖!իW勊.\Hx^GGg߾}>>>HDgΜa0pC׆f=4q x bllE\@]]]@@ٰapG@ gggO}= ϟGGG]JEX]]ݥK'O"_~gѢEΝ%̬ӧOoٲ~ ={yFz#!!a...zzzl6{СhC !ނO>dN<ɓ'˖-k`0^Zb[ZZbngeeM:{HSRRB9rŋ!"ZA޶QjժI&ikks=z >~…))).]bX"Яuuu-uV77qcʕ'|_F?yyy9994f!ze˖cǎye@tPH$g5j?~pΝsnܼ}vJ:sرӦM=z4 3g&''O2eƍG.[BBmmm~~~>_R\媫 s_MDr555曾}r8i)*k^r?3SLY`۷_|l2D<ݹsiСͭdS&ǏhMoaaw^>%Hjjj UGG˱ƍ^t{^ڷo_KK˭[n޼Y__Y־pBNNrvvvzzׯ޿ n|{{c=zhhhxuUUU]]߿i477c-YŋN(r|Zrtt<~1unddTYYI5mmmWZw 6oͅ J$nI #99YGG'''oǎT X.p8o߾xZZZrrrw܁-UQQp7o`'sέ !P5&gG.\bh~2XZZ8qb-YD7o }⅂֗k׮=v옫kHHȃf͚eddv?74`L?\|9&&B"~onn!SjZ=8,@n}}}EEEPVV ݰaáCLLL?32q#`O|{QRRRVV...ё1c2$l eee @7X[[X(0?%{<55fp8:2d͚5b<)))~.MUQgggee˗/cc޽rkjjʼnv#IHHD>>>ܜdb߿$Y {իW!TUU H$*++RN60I#v/8qq7n#4Q{055U888@ f˗/c<ѣ"wZ|9 ކ|gu46L0>!XNNJ̝;DEECleee}}}1L*P(=z4Ç|>>JY1'lllC RNSSӶmۤ{IJS10܈z1`z~z$,,Ln\---/Ǥ, <7n#%X)--eXוvjΝΞNLMMIй{nccc&""jyfĈsuww8uԵkbbb$IJJJ@@M#j-:::== acc^KaSSSccc[[ہ֬Y&Mu!mܹs^s{VPP0g1믿<|_'JKKKpp粗b6_iӦW^FBe󨾾 PCC}I\TCؾ};ʺqƽ{+I+WX>Oڤ7X,V]]]zz:XR'}ĉ!!!CߋD䯥雚iX),,|>%%%yyy2 ݻwoUʗBacS IDATnn.n://ȿNb~]ZYYʮ0:0e! QWG2PxOѶ b_u+L+0;ggg0.wH"ΤNϣ_~2%IIiFFF)))-K':щNtXD':щNtht+D':щNtNcD':щNI:@CCD"p8moD"RR</++իW<*))͘1挌ÇKJvBeee {:hmme}@gu+`׮].\cM kkk߾}[UU% {r̙`ccaaaE&AD(''XQ,yP/iii_~]yyyuuƍre655>}:""o߾3gܼy3@ҭ[75]F_wccgq< E"r߽{7w/^,\p׮]*jϟ5@tPnnn2feeeffRk DQQQNNJB0..ݻw"Ç7n V.Й3gR=yڵk666F}[>|ح[)Ss8vDiii?¸GeggSocnn~J* %%%n=x`޽/^?sssFekkbmmmDz*wppHbf;V;6%˗/߼y:eiiI#;mXXXjj*˵VzٱcǤI֭[G}bss3Jwڕ?z755l++bfff~~~fffNN;r M'''K׈rD'OWVVgر(H$Æ \jժUW\_DR%du;(}vɓ'[l֭?laa7[mmm-1vxx4gA$}jkmm鎤ׯ3L]]]++OYe/]bZԪǓ.ӥA-[겲Cx)2׃F<.\@~JJJC INN^m6PQQ1} 6[XXNV{P'ŅzX,И1cL9-;wD UVۗ}֭iӦ5!!!'Lo⸟ uPo;tP'''iMiӦkRU5xvvv퍬/Y3f X,6} jhhhR+..NyPSS>}q>y̙ .иΜ9d2_zh"|֨QҥK}||-P(q{ƍyyy,իb0dx˄D"9z(Xȑ#Eܹ=S靄B!F)ʒtR3M>N gee5rH-[333y<^ii)ǃ߶mPuu20ECCC<<<[nޒwqq vZtt4jrRosN 7CN[[*?eǍ7m4KKK*3xDJJJnn.Ų?ݍ7X,$GAAaͻt钷7 swwD 3gnvNhK.KMMeX JKKC04 GD6 `IGNa53a@ӓf~52SA^ Af͚ekkOBǴi h߾}p̞>}zΨ/A 9\vQXfff)))rrreMMM:::걱\.wԨQ E>,?|PIIt ƊEDDP(7o.9mq4 ӧO3w.X!@K.q8ѣGƦ$'''~@rrLޭŔLLLO:uU ş RSb77?}lƌb㕔8޿O>eeeNNN.AݢXP)88`ݻ쬠p޽*>?a„+WQrrD"RWW.!Bq8Lq #FX,,3TUUn>pV&۶m uRRRoheesNBr}9sf߾}/ӣ*y E RSSP(0aɌFJRKSSL&uCexzzbD"ٱcxm{ eIOFŸ<xG^ vww'rvv622x/{n\\ݻi B3m4C90qDeeeHK.8|rjj*a2,x׮]6l033[fͳg/^L5Qaϱٳg ĠpLNN^t)B{333gXX477 G'#rrrv'b+++e8`O/jjjP(B}L2ӦM'A#j%%%\.U0FQFb}!*;z{{kii\/|}}ϟ?bqSNEDD`&455*++S%I^^&* cٙf h8R__8p PLj)  b\̛7@E"V***555p2^[ZZJ$*uuq8V#4;vɵ $33;v $ƍ ѣG;x/4Vn޼Kdq Ow#彨zUp`={mhmm=h -7o^rrrnnnEEEVVf]lr.f͒' ,J݋=#FXlYss3j[likk=z4> +VtΠ@t{  g]dhhh+p8#acc.;q۷o drZZZ)U%// PCCs=zfƍ/^ B,sΥfff B]]]>?qD.ߚݼv5j'+&&&X }4g%???))֭[EEE/VTTP[[;h ]]] YMIP{d`ԝ>}:մ4n d *++SUU%;{EymH|?NNN(Ek"XlmmbkkK{.$9hРofdd0`OJ% Vf|ѣerb 0455i{.Ǐg0'r---afILL ۳gOpp0q9::=|bO7V6mDfW@EE0*d+d$`?!, ;nǏ'׏3Ʀ ,]P < &Q@9k,r31^ebGǞ2JgtP M ٢|K5׾X *###&&o߾dQ `lذQUZ|gkROOh#+ި *S1bҤINNNΝ۰ag\cff&WHxb//#GaaaXXw +!2((H,#N UIΝ;c= KKKݻ斓SVVfggX3K.u֡޽Q  hll{ըQN8bM\\\XXXJJJkkk FϞ=Q"=9{lr[4D"Y`]dd$ϡ|Tbb{|||hѬ&MN ĥ |211$w\rss`0obb0|b={チڻw͛7'$$@6uXj*:}6eJJJ03fܻwŋW\׏*..ӧϪU.]?ظ/]テBYZZjhhDGG^Am۶M60w}̙Ծѣ۳gO &NkǏ/Hjkk\.̛͛7A؞G<Eii)puqssjĉ׮]NS~GHzѭ[9rѣGp}#`,\PEE|cvvvNNY얕CMMmV%Qk-AAA---&M:zȑ#K"hll?~|EEsqq!m `0OfzMM ѣbA%D5ڄ|ڄH'bW\gϞXcǎxիWSA-,,ꊊx<^7nll֭xxx .]:{l,>x?H$?G,b޽Sdbb6Ə֓~޽{6"%_oH${Y={^zao4//|2͞2e 駟!hf̘(cb޼yb`C766Ջ%׮]knn'&&޽{9F$ZZZxi.pk`oobN<9xް@'} }}}G͛7nj#$W;04/]k. ⤤c|yyy80Y,VnL wh.@n:鰻W^ڵ +**M.5]v1bebe0K:u >7n8cǎXB]]/Z˗/39s|?_R$, xX0+V~P\\;uŋgddnBƆ` !66~ǀC˧ 8*Ea)"4*##cɱӹqɄիpf̘p`M~T1ܽ{w>\QQի}jjjdgg)S[`ӦM;w>p޽󟈈b4 F8׭[fUTTh+Ls p%K\RMM-<<\zz~]'O|._ڵkIϘ1?#3oH HO‘٭[7`$$EEEl6yRn!!! 9p&'@[Y^qwOx̙T x v͛7`hkeeGk׮2eʕ+WGmyyәL&#3MII)++}}bb"ްa͛I`- hjjFGGZ/^TVVjٳgׯ_ؠ , HJ<+}3gΊ+mll`O`Ӈ bifI_Bgٿܹs%aÆQՆLD"G{^z|~TTT Wjhhhjjv3{ѭ[7%% 6̞=#DK;VMMMKK+??޽~m=Z[[7l0i$f 1ʭ[u5--d&$$Sd۶mZSQ.///..>rȲel6Ksss߾}333?~`OZi IDATutte˖hh:u*ފ6ma7;w`8x!C1gϞϟ_~=_h#FHII $~8ӧ(m?~ .**JMMMIEll,l)gq7I&8eeeZmhiiR7RbM# #99?]F.ܵk-XYL&3uQ ƊZYY1^a˗O6m˖-֭? 8y$}uuu깬L$1` bϞ=LMM.Z{Dj/Z)XI5*++qUUՓ'OLyy֮'"[xb^^.z=z||_p8 q$h ((ӧ^bW=zիWW\9y>A6~.|~QQT9͛7?5kș}C.]LMMcbblmm===3pN?={DǓH$7nܰѣ?Gi)%%%HԿ++cǎ'1v?0YB:555bX&&&cѣG922rXOb R1Baa!lq={:tӦM!!!?nhhhϱrݻ'ƍc=}V^y.]B!- 9Rlyw< oSWW% /^9s6bCGJ^|Dr}zϞ=߿߁ם ̲JHGk׮+V577'^l6 ===...<<ҠzV1M{4&UUUB):UWWIt޽{ysؘOBRy<ɓkkk}}}SOx5ievQMMfq5Ԛoʜ-o޼INNnnnI\]UU|r8}⨼FIII*B|" ?J(7o޸Ц[RRL BEpQ^pAWWm޽/_~ajj*ud"##Fv\\:***\\\޼yҌ?~ .Pydl67 jEz%hѢ#F̙3ȑ#7nx)94Fŗ+H &uVǏ,XPVVfbbB2VVVR5 B֐i`f|}}Q~+^?=z4ȑ#/vuuIDDLE5'sM8wwwWWWB u$ 4ϗ& BB644- */lnn:uڄ ֬YoVUU{\ѣ ]v]zυ4Q&1r ;v8{lv߉?m|]dB$&&YF%@RGށKD{UVXbϞ=F򫄄Ot {.44j^M/P( n:rH#|ҥ4H>ߞM6͘1 Xf>{ogA,csHҀ„Jc]P4Qr>;sss" oeJuuA:' ]p ##P#2LZNtD'T4yD':щNtXD':щNtwitD':щ4:N|dffJuuuqqq/^x4 HT__^ az5f( :yÇ2 w۷o(+++//ϯpssCV@ OKK{MAAAϞ=---e'''9PPP4Yo9'''---###//`TCBBAɓ_PPP^^ԧO#FYTSUUf'ofWWW/ 555bprss>|`ݻݹsݻyyyQo^reנKtyD"yqff&zD^^V Hэz^"%%%W\~QQ#.\AFkR!H@=KV$mܸ666gΜRjhhH$àHdbbzOL xtIIIDDDVVVccG}$IQQ&c.]n``Q󴴴Ȫ*wwO)) |'VaD&Mjor^,{_nyV-[bŊN7<+O>3gm֭O&ZZZܿMhGUUUAAa̘12~zEEt%'/_lhhf'N :@NN`ڴiwuumC rԩzCCCeˋfy# ,N=K,GEEZԔVQHIIz%(_y<ޑ#GX0foos΅ڵkԟ(g:t(0B$ܹs*++I3b}}}иwZgpp0NGGgΜ9d ^j… Tbp%M6bX666DBӧAAA...SN544i,Jbt`qqqDDĜ9slAs6Dq555{{{''' e˖ᭊ/_joooii@(`ZZZںٳ njjZVV^bsϝ;7`eQ򗐐@fz8)J)؉jc$ mJevppwttTRR~W111򋓓B̵GbȟVUU]dڵkoxʕZ5p`777sP+s FXXXnn.ppp KNNxeee999(1ѷo_GG_xٳ.--E _(4j1Lp?ի|)m۶iffF(~ #FPPPUSSs#ˍKvѣG^^^L&L$eݺu<OېAXEA,e^l6[GGg(%T&y2V>|U։Xp8A']5qDrdѦ4#CP4NiX,gŋmmm2* L&Հ@;iW)C֡2i<&9pdJ&4/~2U$:)#!!!p:nJzz:(EZ"i<{ Π&]CCŢWc,Z}VVVYY*$^&nܸqP0jjjqA ˗+**q׮]`=}GP'>>GpV(8p֬Yްau(N r ͆H[r%[6ll6Ύ]bgFòeX,VVVV]])orI----PUU%sc ¯~NQ]]-4A#Go߾ ߿?ꙟ>}_~ z@hYi8lwww?wʕ+!z & 6 |jjʌVWWNjQíz{v{ L/yyyasAjjjա]X,ϟ?->~xuuuJJJu 1{lr֖`$%%P$MJŀڪ?>fjD (ZZZkΟ?O*Q={ÿ_cԩӦMFkc`2ZVVV|ڵk&L={,bB-%%%H$ϟ0a€hJJJ8?3f3gzzzFGGkjjAqq1Y`k+E466uuuvZlti?#>>kjj._o{PHUo3$=t萯1é"|ZA\B tssf1c.]Ae˖R\LģG^~'Obί\T߿bŊϟ+((())w=99YMM-!!!:::66:,, I%vqqyرc]\\8/^xb̚5 lرc7r##ZeeTHaKKKҲ}v)..m 477H{!'++K]]w<{xxwBBBL&F׮]u3$5PfX uƊ7|$_nkktF"ĉo߾}ueÆ C}{쉏q H[[=n8804i"/_~1"Kzv^-Zr WVVΘ1ie}N0СC+Vс^|]ee%)h"$GQBhx1Xz52dDDDKKGr*֬YS\\|Ν];==}޽VVVׯ_DaXYYI ?00*u IDAT :::VVVvvv#x-S:l̙#GTTT|}222b|~}}}yy']vm۶C577zWA &TVVUTT|rʕ {)** *`\|yҥfff6lXzz: ߾}{JJJs߿L'bq?@OOOWWԩSÆ c555 {nll7gϞңGGΚ5ã{߿///ק=ܹsI&555=zԩSL&3((HSSᔖ:4666002^z=;E (-@(N:P3gЬHlJhE-ڮKHbs)J]UHVʪ$tEjsD~7f3{<~8&jy9sy_^+==e555ǏOL 6o￯]ˠoqP0 vvv&*'ǧٹӧ[nEE,ăH=== g^N9ײe$%% -2͛QFihh@8r##a>zddz{M4 6T--y橪w# aQ\\,&&&++?X,eee11/^O <޽{ccc=<<ݻѣ!XBgcp(Q suue0uuuXi?IWWWWYY933eˑp/ ڳgOIIɌ3Pw![M4 Q gaaGpRֲQ<{A , uKa3644?{ }}}۰b/x⠞A1 |lRUqaXZZ.ZHJJjԨQ+cAA1?̙*ϟ6mWWW`` o߾&aiӦ۷o]VDDpǎ{? Urr2roߎ^z1cdff= =}H9sΝ;q8܆ ޽;hׇ|cIۃ.ؕehh-@|YXXľ}۝lll@666{.AקNNN***O<@Ν;i͚5ԅH1ee?x ɂBR55߯\<ܹ+NVV4*|utt`ϟOOOF7U"##---!o uqAMnx<388877o 1؛711ٳgGGG0LV ?#:>|GuFq8AAA'On RݻOIII 7 /^̜9Rq8܄ BBB6oo匨e'%%W\\^(""2i$tY 漶d=yAs ?FDD`ѣGl6j^N1nݺ8q"00'h4JLP:::뭬H$RaaaBBBFF~mSSZhh(}aA0As\ Z=UVV6''СC>>>C0QZXXtM6b֣AǗhjjbXJJIAA gj˝@z#%%%)))'Nؾ}9@Z!~%<(CCò}9sĤn޽ %߼yK.:thӦM %{? <@AAy?~,pEoe28|{`4$$DGGgʔ)0*t 8{044 S999l6[SSDCl&Pl۶ 2_immݴi"0qa0>M8f|9H!I///4 v-[p\[[[hKFQ,X hr䮮.ccc<lmmlٲrJnfm@@fWM]޾};J h驥ىF,pܕ+WΞ=~۷D"VݴRFFLMMy۷o>|`:uԣG8|ǐ+W@ ˅i'MbŊA|&SSS=A#JUPP AYOPP$BIKK;ϯ@Ghlllkkkll,//onn.c---`Z7D"QAA!11;z!d lH_FiCM'ݻwpܜ?B IIIbQQQ~~~+W1cNPPd>}P%Xp'C.4PܹwYSSɓCXYYpAyT%K WDDiX媪*AA;OKKCG&d(LѩDb[[[---_^R.]ׯ_s\4?A0;;;a  hϞ=C'N>ǏwttĎhd2߾} 'J`###p\ )r jjjW#ϳ^0~Al99sF̟?_VVvO_| @Xg?tww'H=-a2$..gmmmM[[[Š֭[[DuTEA^}}} 2( + dnA5k׉9urVVVaׯ_;99yzz^r ػ[[[kkk`i[=q-=,AAKHH\z]T*@@J.^b baa99r}ɓ'a0zzz ,pttGǂ?'deeh۷o{zzٳʕ+:Czz;>yú:~NP@5u&+W zjbbɓ'Q1t? E?=Fh]v-::ѣG===)l+AOnnnnaaG&я:xÄL&p677?߆h"xi&X'M$:)\ll,jnDeqz8ի@AMMMBpܹx<@ 7n +xzz"mmmMMM'$$kPQQ@ CB v"w^0@"2k-]]]A"D# 3i$4Beq,`_Bsp83!J>oѢEp|5 333 GPSSbggg///2#/]ޯcǎ V$1<<(F111]]]>|(((۷222bbbfffa(%%%Гrrr'N q8l;;;T}CL&cYAI$'Iboo?: mmmڬYfPRQQ$AXJ,`x+geiiO琑 @_/_h4X5|PpoHRvwwR\t mgp xzSS@~S6m tnAggP _T0\cAѰcf}rOb2!!!6{ҥKO~YY',gܿ.=#>>mˋB V͆a Ά 3m֭JJJT*Օt.]:x˗X`@QQsKe˖z8_ҥK eժUc|IGA֭/^_'EooK֭[giity',,B 2m4//7oA} bN<?*?6hya䆯xPkVbdaaa/SRRlmm#""p8\tt4˅o ºHRXqq1By<˖-rhi'N7mPL^y]4+uł*恡P΀999???˟>}c]jH_yLa+… @u $oI|З/_^tH$R(V+ +V;c 6eZw"1"ʠ@mAKKKiig---| |g}y['6<`4bbb/^LNNpqqjjj*{R{zz֯_]QQwYPkjj,Yz֭OO7nVaa}bօ!Ǝ `)_8,, 38BAP444iii55a\-9mۖm9Y?F2uq,$v|rɒ%}zܹ'++Ǐ,֭[:::yyy999H8o޼+Wxyy}!Bb$NPY@^^^__?,,KTp={6 """'Nlhh,J}}]v8pƌ+?Nkjjkii쾰566DHrJ@@zzz׃M_4]xyE4SpFss^, y333aECC'[8qD2f>*VVVs׷200ljj~h >?iii/vww;vl{{;DҢP(---zzz7n`k׮Edĉ'N011 + _gΜ9ӧO?w\qqqYYYLL PR[[H$L"===^޷oٳ!@ 9r$;;Yzϝ;!2фp!B(FRXp8Z˿*x|SSb2_߹s%K.\~zϟߺu+44kڒX;Ν;!Mޕdgg LeX@'%c_/LDN;=`ldHz 9_с ޯJR%$$K'''[[[9~xP!1"=􌶶vmm-~ J(6!>#)tvv~D6cǮ^{x!m6?HZ!CaӸu! ⿃joc_!BЀͱ⿌ZBυPX%g͛7X . Emm0^/g c 7nR(l}dڴi楤~'hr]V^^neeşePQQqΝw)))Y?? ?EEE͛pB6핕'N 6m'N K#Hd2Q᣼\CC#88xpQ[[p+++ !Š(޿-j=Lp86joo/))!_/_d @ii)N1cz^TTtܸqU",QFu̇:N$?׷p-ٳg˗/jll7o^~~Ο?S',, +|ŋ6x<]BB"11O~~~P444 E:W^^nii ճ%%%.\xҥ>[iie>| khhPSS|xw>|c``alYYYl NNJJ'OlhhC5߷655YYYHqa뫭ooookk dcǎϝ;BQ477wvv7.==KA^v]^^~޼y'OD… 7nܐuqqqss!!!t:۷o~hkkkggwAٹ~EEEܡj& SSS]]]mmm 0wO6)\PP6V|-D{ [jUVV۷oy9s 0@⧢bnnE"455ۛ6mpnnnl6;77qwSWW'- }T*H$"booȑԆ۷oCEnX^~~9eeË/J wttlhhpAl]v6קC"RRRnݺ}vZ_nʕ#xÖZ({ƍ8nt:{<::.rpp={,(@__ߛ7o߼yֆ io߾A_Çuࡂǹ\ J]t*,zzz>|@kiic :uJOOoǏEb)))H$T%300HMMd7~{R8[{l J755H$b׮]۽{-[\nNN|=`8+))166Jrrrnnnf߿=mllm wrIII$x<ڵk<۲=%Khkk˲gϞŶlŋq8 yyy""BOOOFFf<`j^cA` <׵G(=uTuu5 ^uI<d2x4 w!gVVVZ4 fߑ#Glׯáȝ;wwV'+2%r`@IᲳy:w <"p3fl߾vCmw޽cD"YZZ(;;;))iŁ`miiofffeffv=`l~~~ii7ox3 F߀2}tvᬬ|g655Axahhptܹmnkk SKKKX,yaEGGg#r+- 6i6CEEE>wwwmmm;P2&c2FFFpnٲ%<>@)SAg4P/ 8 ˹PDFF$##rJG*:m46 /@XX0 ` XwP|{am$ع"`-,,/LNN +(vލb *0UUU`6(++"HZ+w&CxCW®n:ccc,,,\Bs||'c Pݘف5ܹsO<9qdr^^.bbbo޼9zh```NNO?Ae+Ycǎdqcпa6BáJJ~)ddd&ܼyD"=z_RRիO<ƍ2 )))qqqSRRJHHcƌ޻w+F˛2eիeeeEEE̙B &NyX ;;@#CGÇTjggg}srׯGO\@ 9.zppccc#""|wަM\RZZ ϰc3jB޼+W`h4S^ lľ7b%))(yIᠸVVVf˧NJRQ ##CEEV+VL6 tAf͚ʴ4{{{~ASS8Q׃)&?~lmm]j/2k,iiy=zާk*cȈbpuy{{ ӦM[|y󴴴 EȬ&a:e@ݰajnnnF$JOO{eggļ{x<>,,`y{{={ %7Ã?8loop႕Xg`Fz;wxKLL|Uhh([Ϛ5DCT*g&HJJn޼ƍF={6!655߿={6y򣽽TVVb5@"P o&&&uuu`? [ff&ӫWnܸueH[[Nڵk͚5tuuuVG矖`l9?hnss3Ooo/VX\ x/K3L>~8ɴY Çc6::fxV>?|;qI Bلյ?5k,Yf3%.. ~sC$L<1((  6a2~ &MB- gϺcǎB >|=b!lɲh||pK]v…QTVV~2(`Ι3GOOOWWX,&x˗͝;wٲeK,ijjţ&K___[[[ZZz4`B1+,,w^JJ {(ʛ7o8Ζ-[lllM6n8 ?0=T?[cƌ+npرǏh4---ȐVVViiiIII˖-gl\.| affV^^~̙9s@v8ê;$I]]ã/ޡ@XxbAAŠƉ~ǟL&R69`i/++Is(v7RTGGG0]p m`!`xzz~ZKKkʕ=,YhѢK?ӧׯ?qĺuu0gh.ARRreeeO;w)--Ս+**"첲>~acc%K$%%ihh|K/`2LXOrC7m]%ʚ0 3T㫪vp|||zzvv---@EׁԹs¾V---T]`ԍ7NEE֭[ H7ttt|RX]__/ P^Y!&&F^^VckVt4a0 ˗/l65 [ɟ" h$%lX)1cyô$\ 2a:p(l~sxKK ,G_A344n.\aV7Ϝ9?J"7AEnܸ11ӧo۶Dz|1c̙3'''ԴbƌwRDD$..nҥγgώDeeeUTTPҥK,`fRXΰ9q'OFdz{{Ԥ<<>֭;s挚3HqFpppbb l2o޼( tǝǭHOO߰3gSNӜ@7O ᑜ q`}YtttBBBrr2 ˘ gl >*~cR .&%B ?nX?By"WWW ,kSN]jPbQ,]]]T*5..۷ׯ_>ܿ?啑H@lǏGn $v@LF+++ͭŋ 6*EEE۷ب l˅f>eddejj PǃD"EFF*qB~PII @xnn.( LMX:K abO~E$wV/FcccII Vu}6|, gt677/Z(***33˗޽}MYYOr8t@b/_ AAAw ܽ{]<==hJ@(@[?k3`---%%u_MM`V#*mkkKMM544>}k```|||ZZ`]f9r$++ ***h4к:222<<<)) 5uܺuJ.X 22[vdlGL6M||UPsͅg +/_}kkk7 y{+{Fnٲ%55cnڴiٲeCՙ?<<=== )|AIVdeey |mǏC !)yabX _UXcJJV|{aá¾L@(Fn} _ &?3EJ1uX1cܼyS@Z$-8 333y S@2 Kt8I(# qq7n޿#)3L& ?ߊXA+x^{$BcN:Bȷo*uB0FXXQVV2% !qHKKUR&JX!`$@ɚqeffFEE;B;dee𛡽=%%ɓ'SLqvvgٳ/_VWW777s8QF-Y{0Y,VGmiiioo߿ ZY濶Bo)J!> #lYEa B@̙3h!oܸqDP(:>U8z{{+++sssҮ]ZYYIWSS_!رcPgݺuNNNwpBRRӧeG҂5gdd,[w܁>֭[zukkԩS]]]}bbb6o -?|0{={@JHH3g@?~\\Jd)))ėYA r Ź5UyV)(>*Jpp=xyyuuu]vdP˫@ UVV\}}}Ν۵kנ۶m} A6 | o߾ ,PAJH4 &k;>}tDzi8<+t:}(*a!l6J=}?ge@'Np/ !Pb/8NCCCssskkk{{;ZikkO2Z[[C,222RSSģҥKQ ?G5@ |Vy葡p'OFÇP_mmmcǎ뿆`X,ooEIJJgر>|W| drUUb&Lx# ;;?J@_j㵷;::]߿;,,l֭/<%ݕXuJHHt͛=J$g͚kq8̘1nnnۻ}Fӎ3FNN !PSp1ؿ>|"?Ӽy󬬬 xbxJULիW\nvv6 d2/_乭'㢣gxǏc3yyys΅֭[Ǐ۷o3Yfedd|!@X^ꦦ:::jjjҢL&${Et5jhh' `׎ڷoĉMf``yAMAڵxƌ}~ZTRp.\PRR:|0DDD_.)?TUU/#/eggme[;FSVV ٿ?KJJ}ݠ5k())Ҷmfmmn``li&LIJJRVVaaaZZZGBBɓ'[[[h4ڽ{̙/\py__sΝ8qBMMmϞ=III l,rkeffpccϣ)Sjkkϟx̝;WKK+ ڵk_=g͚u/wCI _L]]]X,VDD;wyQccƍo*dnܸ02g;t萫… UUUMLL|||:1c{8 _zU$ߞq駟 5( .lnn7o^^^gddDDDlHņ[n3g?rݣ455###-,,`  ۻp8ڪ/^r~稨~K:;;#Ǝkjjٳ'N_^LLᄇ_ tzUU8UH + sݹsH\\= t588QQQWXXXUU5~ h6n8W]]:PTVVN2ٳg7n9 ???t`x܅AAAeeecƌpK.MLLG=zر @ hii s moo ԃK .^njj:P'((h޼y ;vׯKJJ ***H$RLL HgϞ-((8{,m9NDD oHHH@@?/ie ǐH$cccMMMΛ⦦&VTUUA +j:n!X3`Xꥥk׮MMMlqqq:.###&&&++ kѣG Fqq1̙3QQQ!!! oߞ|ؽ{ŋo޼pΝ;Zjjjf̘o߾Yf544|Fݵ}y î =Ӑûe(LX~}ww_RR|2555x}}(Jbb={޾}}Hu떹9 (CB$&&VcccX݋a)(({ PUAmmmǏ:6ٳgãsrr:::MLLl3f<$;ݻ)P( sw ">ymƎ;GQQQNN[nMKK?߿ HEqȑѣGCܵk"""{o_3ӌtƄ1NHD"ZNlA Qz! 'Q--$H))Hiޮ|f*fZ1ͼu5z.-fͺqz5~q3'',FLeeq:::&L`uGBB“'OѯW\quuO˷nQ۷oߺuCvޞ={,bEHHUe `bcc:3k}GG "u53fHAwdcV|X ;w޽{ǖ5~N Ƣ?>xB,[lҤI=*(((..ȠRVbۃBhӧO IHHj/biXx|}}=B155e2ǣeeek׮ݶmٳg|555a:4_TLL3vѰqpqq111?~(--K_|*..~auuӝ;wrss!ĉO<9t萆ddT7.] {8(sqqIOOonn^`AEElji4 ۴iSHHWUUǏ$e0 #,, 5X,VRRH$=pimmmuuudgg#bbb~Pd2( D7C, 4xVa̘1(?~$HAAAD ViC#Jgeed ^cgiѢkޖ-[TTTP#L bDEE&O|zΝO>6773/Ddҥ{Yp!$4رCQQ^ASOW^e؃8 7ٳ$bY 跀",,|ѣGAJ̚5`}@ؿ[gg'nٲeCVDA񇑑Qee,j/F?/ |~^C&cmm~ (((=zIl~;]޼y w UUUś4HB @t̘1SLBVܳ6BቱiyyyYvX~~S{{ӧ ۷Pݱ?y={!\E LLLBBB&N`0DZZZNz9"MPVZEP***<<qDhd($$4=~Z^^s0ɓ'K^YYY]]4 8w\w߀EDDWWW;88޹sGTTed2`~rttx^^^LL 쩭]l٘1cRRR$~Ჲ y( E{݉=zBiii ituu!޽{ϟ:u4NOHHKMMNsҥ8ɓ]lVc%::_>##ؘd԰jFl߾4''g̙qqqw촵-,,LKKSUUURR***5kփ~ׇ*))?-oVVV6 `Νrϟ?˗/` )yUUU&mOOObqǏKJJٴiSo;uH L&> ww> ^k2Lh'''*d2tuu{9s;vO"""L&SUUUCC^%HCpAҥKL&ׯRRR/.((. FHH ߿D1ݻw{yF߅N ;::rkt^H___FFGXttt455dvbbbݭ8x"l CVV`{ _' )111ݽs۶mT*N?,""bnnNTUUcbb A?mCSÀt`2Ϟ=kiia2RILLa{C!RXXk.AW^577Sxp&@*555mb' j$hC IIIoI6s'NBnx3g_~ =N555M<& wwwii3g@ \|Adʕ?3;p-[qFCCC[[[SS߼yA .\z]{{{ )s-++z^2ṡdE慅sgg+V:tԩSo߾E"?=4I>}4J~իKnӫE[[[nܸc__?CRR@Ϗ@ Nn[[3g466ܹ Aa5j:~8vvvbX"džP` Jի I4t:m%1~ݔ,{:;;[XX'$$Cyyy={| 51c8fł2jԨVX,-- eeehNIjj*ill|]SS+ ĉϟ_VV6f̘ &,Z('''00011~'OR6l(++۲e;MBB`!ahBǟ9sF\\|޼y XZZfffp… 6Q! **GѺ̳cD"btUSEEwpڴi %!!__5F;s持0V-[y>Z" |Uhh(${mm- hƴÇ_t|ԨQ  +++,XP`.sV:::XƍWPPܜ"..rJ-hk'&&2 III2,!!1viӦ+NDԞ>}FĢ^z믿6448qi)P? HM; -Cɦs###ԣ ,,cǎ:$LMMTӧO7l?1WZZj 9,)))!!ڌ [[ۆիWZXD177dx)+W^={6!+ }y2a͉bk?ܿ~򃑁0Vƍe˖X, ٿ wt=ztss3ٵkWVV+Xx dCJFFFGGGMMMnnǏ?a„v:lff6^@wwphڬ… 믺:r9!khhæɓ'D"رc~~~ZpaKKKEE3gNEESAAܹsٜK,溗5++ áTC<xʕمcƌd2999Y5 7 USS#--z؛!rm s̙s\xonn>uԭ["ތ` $ٳgG-.. }7oߺzbVZv0uXYYفybbbp8ŋ52@4P׈X;b_|8qЙ3g ŋ & zV__@^!2j(pޠ1 ",, 7n\mm-k^AyԨQ+VyfGGׯ_={F̱c\]]׮]u={$544p'?UUU g.wܙ?^A1ᆐeRR! ***x<~fffFFFd2:P޾}$666+WY%Bf[nuuu}葖ֆ lllJKKlݠ][[[RR̙s5,;cƌ-[Ǔ_F:ޝ*..eؒӧOx<Z NZz5LL+222ClxX ~駆%!--ֶhѢvH] j !!|[[ qEjiiA3fX+Alʕ+Ν+--;vlSSg2SMMMXX:D0%]]Gݻw؎1=//ެX@}ׯ/_>/o޼)//PܹsTjxxlffw]?pVʳgRԜ.+ O?q=z߿ ͫٳt:}| ,}a0ww;`1@@ӧO TTTnݺUUUU]]͖I l/|F3d466;wmѢEbbbcƌ5jlzX>}eˬo߾ I4 9{PPPHH۷o9*fjj㓒^x!$$FK8^js%1֭[̟?C a͚5C,u4#eddX_@|$77:::vؑqԍO?mݺ5''GHHh]* #''gΜ9seU*9p1uٳg =b0l?%MMͦ7o~ǧɓ'w2eʉ'8ӌ ///4* J\͍dA`KPM^˗ÇϞ=+SLqss;|vv|} ++D" l:5/^HGGݻT*J޻DFFouرۋ+VgUUUfff;x gV)z3ҔN8j{{{33aaa33={|?ܴiScc%FFF4̌sYx1c( HYPS8Mmmm{{{/^HP?`gQFٳ'''g(UGBb͚5&&&VVV3g ܸq#/]T]]9l]]F,P(+w1$`S\\>>W\ٹsҥK߯4o>>l.C sA&cǎ.C(&unjnn~Nwϑ{FÇZZZCsoee%..~!hll`:744dm2'?=zټy+h7õA<\DGG D+V7n\LL ߻'~+nnn4amm=O'&&rPȑ#/^EAH (-- W`̘1 nddt.##)8YA cx(feeO2e +|Ο%C^sΝ;JJJzzz0~íF\~vX9133[pΝ;gwChwΝ3f,_<44f999mmmŘ)S߿?wL͛o޼yĉ  .|6VH$͛7;2 U&O~ȕa1́'5PNN}#000,,lڵ"$| PBL4i`w`0 Hk׮};a_2e}z͙9`! IDAT>}bCL<1f̘9Ə=:vؕ+WfΜlٲׯwttGCCC@@x%KGteFffUTUU_N&) P2eJvv̥[ZZZ}ࠢ6%'zyymڴ5FXX:<<ʕ+ eڵVRVV SӋFZ0%%k׮TWWǛxzzedd?yV+ iӦ?tuu5]z$uuufoذ! ŋh1sppHKK梢/_1Ȑ;T&# |%!!aҥ-!!k׮O>u7A ... &&_]] %ξ<_xudd6H\poIIӧOCڈ߿߶m@7n:UUUX,Å3 ~ |4V@OAB+TTT@Jkk낂:O m. SSSty5e0ǏxG?禦ϟ?fj|6&& n9,kbbc!Yh]Ι N_x1/'a0iii̓ARRСC111"""ܻwbcD }laa!83{kTWW իx<^IIlo0ˆ!---~vf|oٲPVV@ BBBg϶(//ojj3Qoݺk.yyy8e ww^nh0m۶a)eeeK..toI[[[rr ?Ç܄oՕ.]b'OsFhnn'VBBgk0LΕH cbbˏ0UVAqQQ/B :dll܇\EEEkk}ݾ}˗/pB\ԩShHMM-<|+--\v Y`0D"%''jFw*((X,,..nkkkCBBTTT׳[J[[D|Ou϶=z!Dx3+4ԩS?!ٙ>j +++ضiiiɍ +L&388A޼ٳgk׮aM&CCCcbbnܸPKiiIGGGQPPb|X~=uDDD|||QnooWSSfcBlUq'%%۳G\\\]]]^^<%@EEbnMAnoJKKI$&{ ҂:Y Vp8p^|9::z߾}ׯ733cKUVV{S`G` ߍ&ibbB$^Fnn.[L&Hlٳ}||lmma%`0o޼ѹ!rQF@#..+jXb222RRR3)>>௿y***`rvvjbb"%%;FP.]1+L&sڵ;vO qw@__ʕ+hkk+..tҚ5k`ҿA&EEE_zI655p1ŋxyyqk@n!8JQQ1yd1W;I$9: gPE<A|||z3gp8y8]q NNNVVV` "FIKKsfQRRRXXnA@+eee EJJ&x⬬,[[[o.--͹аޚ.]d>| HTTN@̂c|eѢEİϟxbᑘ`0jkk/_8Ȩ+Կ{n?a`wqq# ŋ~@S[QQq /^D~]O:;;/_l`` ++ۃ#A&b "޼Zsʲ],Xnk݃i"`eedxdp^⦐ Ț5k;젃Jgg89900AJ ~ "&VUUQ(YYYGGGB ޾}'AjUU.RRR>|8z( 7o uuu^@|7Vt޽{{ifHKK{zzh R[X… eD^^^]]r{ ptttKLLLbx:::~ O$K`0 R"..ݵb999\<5k k. v9c|222Pljj 9%"..`())mٲłg cgg|l'%%A<~2V *j*2[[ی CCC.]ӧ̐sss(eMM @XdI;Aύ?t999===k;wLnkk׮]] 6TUU]]]*++?|Ðy0OOOKKK(`?|/W?p͛7~w1VL =祾zH$jjjE  kiiy&ghhOPd`JIIuvvrH$FcݻlKKK:tvK` 8puᬭ7oldd+`+)) tH|qOf[*h +wE h;b11{n۶թ  * HmfVl۶ pXgX`ؿT4 6K.|Y^^^PP>!&&6D{_"8J}}b? kkk @RRv%%%999۷L[… \?6X-aaa,~,;{KiN<1E:t˳|y'\VVwFA6V,Yt'ammmT*D"8;;#r><;{uhܽ{8/G੆Z-qر7on޼)PWȆ`]+L&311nu3'`/_\x pa0m۶IIIs%{}$MvĘjkgcΎ@ ߿])p8\Ͻ U[[ ~z,('ZZZ<:Y0xw7~hA>`(Ν;cbb>|}F} WܻwOp02Vjjj+id)))=1=ztwuu ƚ5k!YbEpp붿nݺ+t㳲@+ c۶mXXXpWOlhii988ٙ { cnn~ϟ?hǏC29|Ex;J[[@A߅H$]699ӧO9o<;rPI xt 'z+`0h\@3gΤx>((WXjD곏d.Xؘ{x /cں߽Noiia{\ikkÎ cjjs8J^^ 1իWaݠh=c.^8+|EYYyΝ &P .ٳlrhFV uvvnhh(pd///"775VDDP?}Ag摑@.|/4V};V\ 6:ujٲemmm}*555<555Piϣ [n6XKKXt A#fiiiKK JݿUƍ HCCùs+**X-[-[vm[[۹sBCC pyyǎx=\mmmPPЮ]}Ehh(Xr7o ܜUksʮqZZ3g͛ҢdׯLLL&M#%%_P[fK۷oQ{Vip=R ,8pjw ThEnn.Ow ~ g=}+FvD"qӦM/^LMMyf75aA|C=z4 }>nd;g,|ogرWEHHh7JKK+**>|O?QTyy)S}l֬Y}'N/Km:ֳtqq?+++{{{HJJA>JYY7$9*++{xx[n;w A+VX[[kjjFDD̙3^wUSSs7n@”_~ ۼy3\@7T>0G& QZYYٹs~%??5T\\,&&lٲ~ `)))T?&1Ᏹ¶R^[#pEEJrr2@`k:mt:S~緵O8xҤI/_Wt֭:ltN/^n:6KL&~Դu޽޽;p@DDN`0@;99ڦ& #,,<~.Us8y-HIII,{]WWW_hڏw> s% 0tQQQ^=_~b0AÇy?y%@TTTЪK8 VHW^>o޼Y˗/:/l.]yf/Ƌ/._ub׷h@ F+" lon ϚAVLMMy)ͣu~M[UU.*pЧXAvv6!ɷ~822r„ R?gݐ_˗PeggwΝ{{%;;;44l.hG!!!0ѣUTTչU ~6BYp!Dh(P4A:;;QSqǎ-o ZYYqk2P'8E W$T²o(**ruE%):a V^|78l nݺPUUUhɆ$WUUE͟?>_===./{ cffƭ>^B\۷osk7op8}}[t =z[æ#׷C$Z<\t A]vqe# HL"R__ϭ1555Tj? qCBzz:B3Ɗ `ddĪbRSSU$i{=p.kAۓ222bcc܈KKK߾})//'_ZZl;;;VZv[DU;nssBTT%޽#\Id0ŻC~+w^n `Xe~*99?8 :4VX}k?ɧOXu9·\y9B9r4V8Y[7n۳GHHɉ~xѢE ܴiS~uֱ%B{Y IDATCаD#rڵJ+AAA6 X,vÆ \ A//u5;4V Y.mmmcq}VNNU@ceӦM\Z ZWvUU@xq#XΌb񜊑2Y vzf޼yl&YQQbzzz=@ shh(!J~~>f͛jreslGGUUU$IXX㰅Jmm-zX+cz{{CE?ǁNNN}RWUU)++c0~΄`ЧW:uH$644HII人PYYbo޼4Vz0'6nȋL`0/_4 466<$5V $'##jjjtvvvKHHp1# ŋ$ILL¶6!+ק7H᧱kPXXaR,kjj:O˗g߿/**b.f,X!R?p?FСCܚȏvv8ƍܚ0c; g~㍌""" ֢eY;w'V!#|. Nꕧ۷o9%yΞ=!kKe'77@ H>tvvZYY T OcϏO1Hss&%WG h/'b #**ZUUkkk%%%۹:CvvZo7ৱ6BSԾUh4$#""xpxxx ޙf5ٳY#CC>A2۷ ' wt:͛[- =CRΞ=''''%%]|ҥKqqq/_W322?^SSӳW*!!aƍ`m۶PNjiUTTpbAaƲV{Q(([ N~p(++ˋ/~4B |3V޾} @la؃ƺʸb%%%ӇL&{xxdddH{{{iiidd$DI$ҩSxh"ibbRRRzaǡX[[+~\\9ӧSNAxdd 0c7>"%%5{lccc;;7{xx9r$ 'O ۵kҥKYz%%%}||~1;%CzyP+eeeps:W@1G]#)N͒ZRJ[t(*EIG %o?k}n֮Ze݄n$%ݨnTnBHRnؒ={}1ߙiLwsN~Ug:̹׋ [z?J{{?W~,>}roe*P\xQ__4yjgΜhw""" /2pYW2 6{Bذ'55 jpȖSSDKKˁ㪪oBjjj\.ɓ'F*V= '$$***\r3g|{-[ڵ6 d2W^rʜk׮ݽ{رc\.baddTXXؿRC#G wٳGB$w@۷o߿d27njB ?رc߯k' Ξ:u :ߴiSnnի>/122ח377OKK# `_EHgㅄ888Hw||<'O!vzTVVYYY[ZZ <֯_b Xtn ܿHz4G%H,BÏHRY>{`,Z(,,>>>QBjjj =RUUxUUUӧOQ#$P麌aoNJJJOO222]]]rHKKK]]]SSYfQxg[^^s55w^-#444[[[#""VXQSSO\ro:Fddd뗗755ݹsg 7 ?7n\GGǒ%K0 *///?… z": æON8EйGuVWWWccgB FȈ`;ht qѣGGDD8pd^^$ RŋEEEy=&##FHMMx"WPqq1 @=((h}V)-PBCd2O.''7~x*@MtWsܟ ĵ``E[[ʕ+A+AbQQ8KÝy)͞7oaӦM=zhw: ޼y#p>r`^| ?Ă׭[Gm\.9X,֣GY5tLVkkkۚu ?:Y,}yy9=)TQQ dW^% >ӵk677gee 4͆OӜ rA9G744@ huNBCCutt`QXKK4kBdСCjjj5554LV -4\4C{cc#4sqKKK`L&ŋu@^`tZ vrtt;w.JJJݣOxW~~ڵkaرӧO/,,/a풕[n]lMMMGG[nJG=e]]]rG>40 %Zל ^<OQQqɒ%ϟ*0555zHK 0N,/>|_[[[UTTlll233Y%44e˖P>444x .Y˗71A %''V޿8?|!flvhh 8뫪my%66qWWWj ̤44"e=T` RQQq)S4663f֬Y---4I^zuԩ+W?`TTTɡWy;;;mmmSTT|Ν;za1 蕬DGG3LWWWL&ի4%A`;@;ccc!$/oq@-/^d2` k䊆EVB7()GVV믿&e&LhiiF***ڼy3C2a&z /^DFF̜9& /_E @WBTPAEL2b[`ϟիW8S-666h&Hoꆆ:QUTTtuui&///&&f˖- kDŽ]ii)hPȹsddd<==!ϟkii)-4JVx<H@։p;;;###E͙3b;#zJll,hߵCdzyya/33f/^~9rdPPХKPMaٮzh9 1o|fҤI֤`D. ؿy{{[􎷲joo興ppp +hrx3r#ǣ4YE߈x@@@II^'; HXa۷䯆'Oq,ښ_·S-\DZRSSLӧi"(ѣG1 !#R$:::$$D؜\9s899۷Ob ***3fW1~0===CCä$i64>Yyayy%KC5ΎbH=F 怄m2t #$<8 lz (,,պ-&&fdƆ`3Ç"ϝ;GE\!'''%%E^^ˋ N<`0,LP`lݺR;.۷o|hѢ'vb޽Rݻw ᮦ/_8.[YdyS(NVx<޹sLMMrO0|6-ѯRE 8l$ѣGmmm‡W$zzz,DEEB |! W__߶|JW`JYLѝ;wZMI a͛7WX!rs'q|۶mR+ץ2 RwFWWWRFF}Zdɓ's@`Ahi~a @SSӨQD^5n4L%,g͚%… VUU=}TA644$'' Ϳ^c?+@sŊm^_ӤyfƍݻWx!5N>-FH]]]lmmw6@xs : 6˻ǚw@q T04L0aQQQ<Oq&''% ''OVQQq\x_ɯG@]DR#>> #R@VM2~xKKKc $mӦM'GyAlٲ:88PS^^i&v~v!q|ǎRXWlGz$e#(NVRSSԌӧO l]5ˍtww^%xO>$000++ ݻwiii"-FZv5CCC->֭[jwdǎ111ʧOF΅ܻwH`+onn kۭ lA簩)==O렾)341IsÇT,%ijjz1dT"!זr`#몪*[tiAA) ϯBCwQ +&&&:㕕"7ڵ"yddO?x\\NI o;wJV}v)W233qyyC+Ia!!T&+-0 myyGɓcbb;w\X`;322*))iiiiZ7 Z`ѣGpEԦ##wΝf;i$KK˳g%jniieSSSxHȿ{`*9rRҘBPEnngRD8 Byy_+Kzzzw_cH|#l+`0,Y QR 99YKKKx^);;#GtgZd2/]$}ADzz1=z|׮]ŕ)SI'hoo?|Cm{rhx˗//_|dŞ< "E~¬&Lյsί`"(!66qwww1TTf0;vhii9p'O,X 5wegg񐩡Pp;˗gϞ!ܣ ҩXTWW_~]⇞sUU,`*պVIDAT\{`ٳgwqss{aa޾}jkk ʤںsN5+W8?3 i | /&k.hYIaa3^z|~d&&&@"ׯCCC}||-BQUUD ʄ`gg_O0@߉( D>}:YGHeJaaa{{iiiq|͚5yyy͉#F+ԁFQQ/!F~ _ZZP `eeV:9E>;|Pؿ?nI!g={dGGGxxĉh+EGG = +BBB2{[[[I ضm۔)Snܸ1U47yheeRg4p8k׮?t믿  IIIjjj&M~:cٛ7o&H@Yj2W!‶xX)*));vL4_  jhh8qRZ[[Eޗ477B/ ذaCqq1j]RR2лr۽feel???+kZZZꠀN81..Ha]\\ݻ׏C൵MMMO>N!e lll>oI;*!qM'cȁA~RSS%ѣGTY:(KVE-߼ybQhhMͦP8%%eƌPO>qFݻwb̙3ŋʂY?ɤI صzK oOLLq j%!222??̘1Ǐ fĈ4sLOOׯQxӦMZZZ/^‐& ,8u$s::: C EVGGʊg Bd,))~/r8DWWWPbq|ݺu%%%Osrr:uꔙt_qℵ \`6lPTTT)d`STp9rϟ?Յvؖ-[(k" cjjjii &233oڴ"jkkĉ,--Ѐd666J3Ya2nწC/_ dShw cllo`0+++i͛إKX,rիW) mJJ=ލߧvOy<^dd61#d2ѣG^BիW˫9sLe(a`` // 1Dž3tіY`WR]]]PP[̧JSRRB +򊏏€pSd4d)Occc ); TUUKKK H ?vy \???ggg===ICCz++lDfѣʤz:99hgh #5'vz k z lם$ԩS] +tii<}u'c```llLLݻwl%˗/OKKp@IIɓ۾}{||{ddd@bѢEeee6l8ydHHHjj0w9 4ѻjii1bJV %+ ,KeˊAq޽d2E.T0Ϫ v>}aiwNaB|U8hhhٳG[[ Ǐcw^ &O mmmhgvUUUׯ_rׯ_ZѣqI'͠.JGGGll%KFs`ٳgwԩS!$ݻ83pqqxq&##CGG;xkkkEEE~hDW\\cǎ6mMvv6O0LccJKKK.+Q^^ smƨ%Ys˅Ɣ000 /NNN$¡̙#//ޘ+++Sё#Bd%55(ү744Ο?Ϝ7o^vv6|#zʍ7`O eriiivvvU'[hQgg'3_jjj222~ O׍u֬Y&&&eeeOa҇ WΙ3CFFf˖- e+MMhss uuiӦ < |{mOV\ٳg>z}-Zgah%YYY"5qrrf3]yyygg~Uـh£ ~-aCf$ܹs]]]>|_H3!xuuuEJ>B}zaPRR8q℔k`# ׯK%!E~~>Ai U.iݻa،3>L---CCC4ޏp'N`|rW1b… eee/^4$ЦfoopOɩHg[nݤIo߾ ڪd2ʆ POV G-Qnnnl6R#%%R[cƌqvv>:Oˏ{GGM, \.7,,Uð#GJm9##%y+ُ;f׆e˖a~<4>t萞޲ex<ٳgׯ__QEI& Т0Yv׮]CPtttPeP<|ãGmaa+r ȹ7<|]ޚ0>|$TUU1!ƻw@^f233knn bx䉎ΦMRRR߿r"'LN&}wuuu'ԬAR+}d;{K,)))Z`cbb%ckk+̝;WVVV:YYYd$0L??ddjwnܸ޾hѢ`q_~=aϟ3gnܸ"SYY9,ɓ'?sV100xhz/Pnccӝ͊@_j[wޕח[PP%$$%%ՒbVXہ>7nPPPx|SS]-X@+c1=ؒ%%s璖iZUU  Y Vnѿ|紕3/^ A 5ʪUq PTT\paLL@pܬ,kk뾼oyyyEEE5HMM VVVqdoQ#T/a4ԩSϝ;7܏0ΰ())J_&Y WۻwoTTTE%ͭ//booO#"aXb_C9sIv ǻʊe `֭ر͛7qqgtZZZhˠ/߲XcǎELMMO>YbxOsw,K|-9}tHHz7 aKKKy󣮮~޽^?"(v]8jժ^u"Ó\cK$E$Ɍ֭[ :|JIPPGI 1 o{9FGGxb iyZ_Byty)N-IW_! P\qㄑ2ebMF_pgoiܵM}?9j§,SL%[bu@$5FR&\VA U|e|q|p[-3ʵ6PH[t"˗NR\΂ `amY݉ ,/"O_79^lh;Nmϳ֖%*ؔ1\@Owھ>nqm!ʼâݺZ p-0.)T$CGER oZ?f*raz=n!p%e$CMf1Ih:*}O}%b7]NF נ<,7p7Iνe. c\Pjgn∇db֜:jb ,X[Tt7Ej"8ÕpM$W-*mT##/W,cU7pmb]XR>/+q3 ,+YbYZ>s)۸lbǶ`Y?O{\II :jl욃ѷ=@*B[8+0{Ug{Nhz˿Ҿ!GG/q :B ]Q:O52b~oH!Ӵ'~Kl",E>I!P VX E*ׯ4U :!Pq5 VŰ ]!&[F$C4Tֳ0PGd=56 -6>VA,`_D6,e(Bg`w ͘0!x"VP\>jj|1\=O= yu哟"zPĵ.UB%NYS3nI gm);݅O 7wԗ!Ա53^lRfn:4%G+?$xm`_AĊFկa `&)*CMH VVCfA*w FۻJnP2-T x@+ v5mL H݀%g I)c>% ӿ~Ѱ㟆]&’(Q6]EG AtgK%) -Tن0(]B*&@"V-TC;r̦t't1,gA PBUXeK`ax'U]Ts~"/!!P`Qc.OKxޒrC)ϟrXY'Xln l8ׅDBDpßLVV ԂY(iRv\5/[rx-B(-OL 5ODi?!G''ިPO_݄_5Ir@YX$n^UHfݒt,q=L.T uS:ꣲntdU۪38VZٟaz}e',qCr^+|B^hAj.X#Qx4!snﮓ_`] @{\5فڽOԴX߬XBņ t Ko; {rqIDNN8x[<辿]hPJ@g7{Uݾgf{+!Hr!#ھ^Wb]ZfX 7 Y v;F+G)1K43ZMOT+ε #C74W1n !B55oYPRYzƏ&#uiwwULJIv~][=ieaF}~*%4Kʉ[EɨK.c<ϧ{SHfEFaHq` Tܵ#_*x0l`Qml] MWoA91)2U@{u 4v\]BB5F=sAj lAc*7Xݿ3Dmk;jU&A0ݬC(oY[]# 3$QށȈ*}i f _uCW&HZ$7w: N ߳ftZTBhB+pdX($VpüPR}SF 6uz5` Ǯ;Į c2tI/(E5WjRkaS#:oL :tUڶx،L4N*M(TWmngEi=Fɢ&%{{5Х22 Ta^w|@!3fII,G]]m9ԓӡixR+w-x30I;@6-^\+7^Xqhԩ-TFFJ!#ݩ@ [[EE=bODŃT'kR; Ee63/^oҵԥGsh=ả۴/+ Sd"Xa/P|.M%%Kd:YTQw & @]Ӛ)(:x&x_Z\Hy}%|TH#IT6A# R5O6,Rrh|z]?`ħ1,y¸ySwik>Yi?m} 5 ցrzXWsCfŘ/Afިc%/l /YTI=9 5o~ wx2s 9H!2x}K ` $񧚖i1Dx.#7 X\Kݝ'_3`J}#I@c2/w¨e9Krɫ+@Hg}̊(A ^؈HB%v>a"N?s>:$Q)6S!A2+Y.M";9@L<+A+XHQP`Rf9|ӷqW|"XL݅2;*l}I5Lf.z}ڮFa15 p[DLi`;B'SIUOFk@O/@|>r KiX328G:oK]#=!Q<5}tq,x4;) p2&kQXUZ"*m"xF x Q v|TŁx~Y8VPoIyZ)>DoDF-Y=Nb#`2ZTJ$ے  '>#+K5i6uj}?P8SK{bRmY[SCݧuUu+ ;02vP }~]7]wZb!Xs%/} K*Ƨn׼ H@W YT%2?L4 , 2!B7"8K^ڏzmM"X<8e5ҡT |2_a,  ' A'z|D .L)At)ހԆ,!"DM&9%Nm[ꮗ#!xɜx).k9%Nmz"bX’%,wGW,".1$JFñ^vZ/l2Hwf '9<xࡪsCW*ՉM'OnYh4 3N^Xi G%=SNk0v96U۪ڷ3H7 ;oMooQ.[3|ZL%Tڅ\k7s ^pSؖ GZ ]g/V=z{a">s]ggퟞvvQ%I1Q)ŸKaӅ%3K"iGKk0WvBfSM)\: p6Ce:k ĭJ D#!6wf"X xREx}MN7[D_( VOZf|ǂѿÌf-t3!9+Opw˯p,'1h " 0vR8g948f͇۴?]TS[5_:ʢbf9{ litLc!wpU{Uޠ QLZ鉕%DȮ@1@uhp cp Uw|~;`t]B`mQA*VO |t] `%~lw 9\C+kx]Ld5eJK,SԐgu'qЀZTZ2>T;?N-IxSsg9X:B >ݽz(/0YYn> Ɣ(#c"^:EB8Z#Igy奋r2doW>;{o?6;Y6>Ar9\f,_#>aw`HoJ+ugU0\0OD1b%fA6<&0*H4ǫT4^nܗ!';xHxX1j%9!-W4qw+ W^98Xΐ4kG a|C'tn &9B!JxkdI`MWL^ [/%8eXd7SG~寅O}Sw*{jb&/.q NmYD;`Ʉq0 w_`LWyʧc֓ 4$.Kt:+D\fnOnLO/-Q)t{ctM3#p%!A (Ko-Mv@G(yޝ8}办mˈT,K+9zL!3*M4mh9ʟ^gk~ 5~juߢ_=O9$[I%&y9߂f\--CD^ʮkź'ru۷"[qݩ?q% Y46*ca85Y !H$Qx6>t>]]ŐA2yTR&L h7i߄cC_wqȽ  BT,^$y)Hr.qի7^vٝ2@ ǫ?O{dc⮙;)w9z47 }ǚfRKP2ߣr\B.J(˓sq@{'M^f 'Pt/.R^G ʙEe*u]yt?}w,X֮%8>X٥Tfv,/ P[be"ZV8ŹX]zǾaeOyї]SXSf k6 lyi̕$kj"g(ŨY4)dr}ҾF.O.+:PXCMoYX_jS%V˒Xŏ;UIkR$ [.$!.|Κ/Uwpx I14.n2)9?~|kӮ^Skȍ(EZYҢnnǦ(uUW}Us ;n+(Vo=ŢCV>5?FВ{e5$;>Mo\<S{{!V@,s/ܻwXY > e~-ZSۋf]AZ,ֈ:,q+p.wg"%Sbǖ΂vߓc7Rb5 M(V!~ڇn}qUlvhjHhCtA>?k2c%&Exȟ+q܌یU]0/k‰O9EQb@tGx䉎_"K}Y[DT k9+XYbFu .=4:j90='-]C[myl>2BS$dh'˪|۵o4.-Bq$Q'>dc޼)FKgjD{dN-*{,C*Vo*V RxнeEkЂBi;wZ_p kֽ;۾؏C?QGA WS]MؠsaXA-4=fSd첧)aT:Ww0@Qߦ́$B1천TRձ XhfɫӳYx)tRJX S2eO8 d"Y2{ zn,il`ܺ>yC͆ioV9M? WkRZ>+o֕FZnI tVLoɹy0qli)-Ozd幎AWC`h,1Y袓]լUܜ"d(G9(uhp c"$Kbiò*;"Jߝ>*c!b~%bc bZ FtrP$hO…C Bx>ΦW=3__ty<0վ{9\L:_wbpokkₙ V$6F$xf}]̛1&9~*X32,*&Zu۱b򓧖^}9VgÕ%uSSP3 `LnᲬ]òxwy_WW \P1.H$o<wm8ss2 m?BcԪ(k1'",gؓbɑ/_|EUͲ*""g9no<7(kkKÖ&2] hWUar:ꦛ+=-l]9ήlEF׷2i C!ԂnnJ/f'x@&<} |d'|yIyjAZƋ,.:+1J<-dU?:XOdI:qv% fE ZG 9aDdVٳ=>򯧳h[,p 7ŲH{i$SINxb wq;*nԛ PA:~n=]eGAp'f'ƃ3Y[6%pڍ5?t[}2R3w=/6шEL^mE(2?ߨ̜잾oqׁ4U$SWt*ZYldp_!!X0m{Vs%Ł)OW<~˻k!NmGR$_],dNDFwfjhΛ$1iÇmHmDŧ%9UE 2.![ u-h>‡)%VHKD4i۱*qԛՓxcb;.ܵP\-AWAo-v&A qB Ưv,d-Ł.(IG 8?2KKHZXJ]d$Y\4'[Ej.vɺ]Zů&xZ.-H5 Ц#[B'\7EikPTI`t,hܹ=[ñ ,MRγ;3ulsiUh,VszCqJŏrL6[j%hTnH&OJr,>v#+HΑF9uc!%XO!!z"$hess${5w}_3wz˚)?R qP=`e1p)6mي\A]kԩ-r )82g9~vve3BNB =!mg"gRߚZZziњѥWnLeue&vLێ`|xܵVxgbX^{D+bU%qit{@]AH*^`5?Hb^CUHi-Rv5΄`LVxW  1bikRVT )@ >R/ ,С{< Tົ< ] 3!)XLw.crs]cCAu]!Rit )QGx˧n5|Wvm4ǭzL].jsur4HWt`N`gܺ\4e崍bٓBZ7wtRΥaF{5q2 MbАj Zwl &k4SBa'Xj'h:q׆1%0(j}}#{PZʺ\t$V*s5n w,0e$`k;v*vEW!Ё .>߄`C %Ŭr5!7wxqggkn|Wԟ{||x) iv] *v5Q)s>l|$s&c&5#s84^V2e Sl~?i6vȈSVn&]׮۶b^0;-ϞQ_iU@@W- Ů e~ږU^K\-D^ږӚ]a%X}YZ᩵CZbGQ8z[XqAӥ/[Y \z`QԨ~jҼ Ǔb^k>aGJmq(2z|7ig!EH-MK+]J 2xB*K*./_F7; E'0QFj,_,XIfCM%*UAu+Ȗ]t@dx*a w ӻq5W$h8˹rF20JAqV 0:Zh T0kT[:XRL_wI(EX t nwx? JTZ:bWgZ/ćX3dɞf@M Y'b4יD˺*)MC rkh9.]ߜҗyR/to݀G"͍ɴ)G>x.-JbPah+pxYgC Jq3'+/}vm>0X Ǝ5bDm)e5!TjsԶ֕5pzۄu kUR9@xȂB6B ȳ[>hmu hp cXw `Q|Q;Fgetڻ쭩F 7ō훷qia\nJ>EBe1E#s[S%s1g+@\u}C/q!X\֕ru )kj9*7V"H3Ͳ%=Cgg͗뀳1WKu@ EpNm*SSKhĒdsŋ|ZS`pI+wJ܇YY:c+Y kʒg-r1%VT`ܔrzḯ9,Sn%T\Upр8 YkCG_ު*ulFQ[{$h. ;l+MM2k pN?P٠ r1diھ|Y,I8Lz!ɤ+uu`oRUlYU5*g+JJ1]]g!2{H 1y$m]3OI2{Fqbڿ-FC2Jiww^23 7#Xǒe7Jt`6 mnjM#LհUuII݉l዗aɍh4XY|)SN51Y([V޲`qܧؙrsifHJD#(/v*^C3Q-y#.'JtX6 KGlMbDWC>"43XU%i;w7~)vp"hˬoHp`qif+ DC M fbVlbu:?\ ˓VO/>ʥDP"T|CTxȂu,ga'ZC=$ AສڍLk7fآj Vɭ$3sz:[fR<7^ {# O*, F*hRj] raL!iN,t 3lt@Ny ߢq.*UŢXA*uUfv %O_N\?A,,<䒥|ynܗ/Ԃ@<ܻ&XUp1m*MsK_!" HCYZ..ly8,_$WXkf%aŊեU콝X"X;V.`JYI,LF tj]z@Z[+߃&$2YͿ~JJRiBa{{'6O1"_}gh؇u{ȟ!@lⱋ/zN C"C=:'\!!hSHfE,O(QfI&LOj`hh LL01878%Ď%a XC߯6dLf)yk 4ExjF I6P7AGyf92x .& d\EiiK~a%bM ێ5u0 % s5İxBc4EԶ =6lA5&*: ?599lU{݅OxZJ}[v<7mjj=+i l ) r>n H'KR jj`!cS 4kX ;>| |ְy Z] # Zߴ_] ;D櫫i )4%bjA?\*FMV,Ji +&`]oh%]+YBlKs~8\NQ50S:L[CAP ,v+ssgfAjkzwQgL|}ى/nbYsnP!U>Ywӆ7ILZJ|CNl?'?Gztujr.i@mW_ ]|\̤7Jxw'sK쁩ߜN~Q=mh֐/'[y_<%QCf_c+(-WnO7{ GOCF|1[H  DȡnS^8 Gp@{VtS  %KV#OʖFMz]! @ @ @ @ A"PD 4D%e0:!y(ܦ<M6V~Y'"XzI2D;Ѧ!˂jTQ#N5âĊ؄* RcJ?vWhW/h"|3uhU}IR2ˮ[/ kvn3жVWy/H墲<U[ E r#VL:z{џeWr(4@ > gz 1 / [J܀^]Zǫ^[ko31M?=ud}:Pp K~goYXD| b|1*{n-uD}-:~>=֓nCh|-e2jo={hOn]zcYD| sQaZtdHә[%kW1.5z|@}L!F\ E&M+3!(*E`)mu>J֮? :!Ȏ,`vwlj.!Hg֠$; Z`׍P(U(D5y" C`A"w5x ~9Bam\+.!E GCϡ;} c`]TF.ϗ9RO|| Db+ΖmD^+F 0:x)uB "XauP! $g7` QQYRЦ =CCF࠱ w 9cC+Lʒ;-MZ$"B I@ "X! 5 ^.AuTY E5Ehе*\`Y͸ ],ti¹R/{ZtWt޷ fwҺP:Jg.a wmN4O*Y?/"yUcN *ebUw$*hA9dy} o]5ZeRm @::k4[w}f>0"B6^=B ZfZj>?[aAI& ҢD>cBYx(H(.nZk[;? + 'xu֏+&?[c/VDES^JBb*ڐ.,cgN55z )犩`o ?w},ɗ1|Ԥ_ߘ̜/{6-G4%&gg%kOZbIOIwᗙDXQ\>8[Nn=lBh ,ɗ0X>xwt:C@7ً-f@36aFC%@4"puEQz ǗnyqEsA5gi Eӹr, Μ^g.[O-+ ]wxZKM-)zC-S._¢[VӬx۲ AJS2Q>qt{_{לbRq~Rp{>=6ϭE.7lI<2`: #'96~HMəXUبP\$e\5œ㮙(>6Cx3r4WRKs aZRLm߉qc'G'sswBr?-Vwc|vD":ed1Z JNE9mwg)%3G(rKҳ&~/5;7oNmZG[XT\oŋJ(ex~OͷȷGpy5%g[.+޴lӯR5qsIai=?x >E wރ\B<$n izoJݤσ_ѭ |z=D| Wji}֟Kero[UR";%hY?Z.+ ۯK.~N.+@ f /8F=JN/!0nXuXT?}fY ;,DORpz(Keܱd?Z O 꺻d;>H:~Cλu@! RX҃O9uh,b.w)JLr?,*{, A'beN$.Qt՝ +b{w02ŴhP͝R3)j[HYC\B/VI6R9݁,R0wm%ƞbv{$h|[ ߌO9Pu|߷}pi 30#W4crio2ņx#Zv r7iO^1<Ċٚ P@M+j+x22:^w_GGz h@rS3Xs CC$/=sR^ȉp\tPm뮠>:a Cit+2|~)07܀ًBg2S\  VQKmEQ[xo)a, Ԅˮ/|USvnp .ۋѾ}kDO! ~ =]¸(hj?*Mř`qG_5HO ;3NK $ӝ#&WoRLLRh+068W$~ldU}?thD^ 7z=*0S6 X($J Ʀͩ-Ywck=g"+ efJߊ k߷PR{`3΃cbUyO,o'ABrᤄG(3 NX[`Mʖְ1 ;hҰt+igX?@Fr/~'f_!s4Q}IENDB`libimage-png-libpng-perl-0.59/examples/picked-wave.png000066400000000000000000001173371475730614500227660ustar00rootroot00000000000000PNG  IHDRgAMA asRGB cHRMz&u0`:pQ<xPLTEڸ☓Уۢ<\4l'Da<_:Yп̼.Mk)Bcqj pHYs&? IDATx}ْ:@02%A??s w9ِQ)ضkMGϵ^Վ?>x_srԏy~|ǞV}z3x=o}t|zPOxQ~byomzp຅B0zL~޽~>{W!Dd~\q]2]+8Enj t_6ϯB@~]> yjYW^]BqJЂY}2">8dFNT$,W{iNy0U^& B^'  ;jϰ, މB/ /?~dy33!Ug@aq}}}{y<JCW^L2a^a˘)B{?.kA&Q3 u)E>gSy*+2r:s5FyF,f%gafCvVY~O: KfU3jͯQDBk1 gw8'#OWq^3SgVOʗ;OtfN̯ljJԗJ.bpEgv/^FK, tOUXPĤ~t ]E2?O~ :IM߉JwgEqzKh۽&&`f8O/T/!XjY><+f1'a׷)7k䗙-D}c xBUy~2X^Lб^,гP= ]w]ψ;*X)OVQz lD'7/;Oߢ'3OsbAB*gF(, I7( ^xٷ;GR6R[ )At x3 ^t 7I8N$jSp2.Qm@T|k!i1~YcYlAzz¹u\i1 N=aa|y} MKZȺ@/ԋx=4-zDu/CLTa~<>o }d,S#zr"|Y``9 Y>Z,{t'k2+ᙾ\?:g^d<I!n[}εa\?_Ne~MN/SvEUw)x͖=35Ed9/t'Ůg2JE">G4*3JF&Qbϗ~UӀSįG_hv2ꇼ )W:!zdx$R)0bV_I.B p Vph7wv<ryK%8NJ :$^|LZOz)C4Ѩs\iى Y|ݶg 'ѿ""[쨎B!|AB²O99L?E\:\:.T&3+N9?G$S5GL딆6La|9Y9χKivobW%ek ]ubOl1`YOY8{aD񕚻V퇩CfSwr&O:RnĂ@@BVGe|_ HI4ۄݟgC4ds Mǡ'v}f,}ʟf?w3Gk fc{_v(!bq/U). y#- e2={ GL})0 };ͩR߈_ DVeأ?`|'΃BTmCx8$+1lnf#ʯZZR֦pv6R ӷ ϩ +:!d3)]#%Bَ?{?Ns /sK^g{i0h f@cJPx:<٦EK9r^9O<"+zS76[8W~>> )%5aeBjTp,"㙋}/+ݗ>KNjf{ Դ  SOPAQo xhfZk3! )'׻ ;]UocK($_D'т3-X/glr3_u \2EuY\@vcbUk PGv&h,rNǤId$bhK*j9<>!ܨ\K'o754\F3v6(b&0lKUBz}*$}B^ b0gf,(<0µ29:zl g}\+\/sT wU8QRtaͯypg%+ڸhL_Wigk麲-Yd&46'6тBg(ʣrlmahIkj^OPշwbBlEpU-ӓOw]s:/X:Qq_#ě7@{1:\2@U(Jl:" R7&X~^)SW[//dbs_b"tO}Asc&dVrvg4gUhK*=Ì[98ZDFbF_x|J8n];Sʈ+@tZS1TiByṀѫ/v/; ,?_✉u6Z/hshԤjOp=q0 RH _Wwj}[;T&XPx6%DɊo>z_.\iy=4Ejhd-AJƴ~|,-j[I&dY`y9ksL<r{H~- #{(g=N<諅8|ј7tIiJRo>4((~%NsrWN|"KpJlv[`^?R B' 'cYVlg[jٳ&YbÓ~եj32-!P(b:%xX-ߜ&!פ )Qb8nD^<ăSt<4ԁ(?%X f˩o\,EF`c 9J!U 4~;u$|DMU `oKq2C wb)ҮN';S5f$wGL]qʉ 7̖"2| ""8n.-tb ݎ|t%YbEP|"B"[Bl( *bA]Ćf-foEՠ;X~Ȏ3)/ẘO0{-NzQ] ⹴>4Qш2R->d3M)Q4D5ðfN,@9K`t =}C>=]>У#Y뎴=s;S몓ФlSڠ C8DϏ rfA}Xak⒍yh)"Ќ<ƿ0 x|-H~V_Bb%wcF'7>GɺG..ҜȪZp9gE8>ʫF7֣͔vL|#)"%MmC'{тR)tY vح%WJ;g9R`D~ 晄ӖOY3 ΖIsvTM!ZR̰W&1\tn6Zk1[?GO εc5j߆'B"hg`6"LOu  V #b݁@E |KncJ' S )RU6Ҹuj6Uv?8Xu>0 o @!|~Tj[2)ZP[0=]aA-%'ɇ CL9W |A'f +;&FLQHpq9cIBp;7>5I eq:myY}x@gZAuXEeʩ֚I|koԠzh"X@=B`9XpfBSŔ״D'CW^>*'r!)E2mξWxo( JjOObjrF ĝuk#ӦiB pt|fyOaWum8&$3U2 sl~p0(@|{`$sQI ̅VpQW³x)\g)8uu-oG=̥j-Zbm!!+T`zS@(2Yț$:/f6y}cE2q BH9]*x]Bl+OaPMNQ]CfPufp!NoXp3>?G$*N,DhHOZ@X8+yfz `YV2~}0F@Ojd~ b6fRʾB!eAk+EM30pkI@IMejJ5\&;~P%zjVGzS->iľ n=2#a$sDQБPa~\594% }+GHm]iR#1P6dF,a'<_4"= Uީ4x5P>Q!Iwt]Z\rY~{O,XN,阀F>@!{^¸{U6KN1rC݀{/x_&ҠiPPk׈;]Yo}zשDa#D]|ʗ K h\ 0j<μϧz^?$V>/QUzw^[--)} >&M~! $p Pnm]0N9xx~wb~WR6ىk%ݦ !m{SfX5Sf, f?,X%AlxSdΨrB~Ca-#P?T᰿~~(} @zQ;!T_wA%'XASE!{`ifŝ̮9,M#ə,B}v}Xs| 7T' 8,lͰ i(R(fvSP Bt0G B"*Ĭ" tM *iꌐiHlz/6Vܙ`'1hu3wQLvAO/M~_B܅> sõVZ!0>c*c<#7}a}hYҎo^ZeCf5in~&00yBjG&.䅒/TJtY\?`2Y$*3OSНBeR(ovHB2pdG:ʙ ߧ1d5ClLm£Fʃɬ뉖l B# *Bdq|@uLSH,ީq~i*JR`Aӎ`')i=賃"` 5W_qWw &O0*/;Pt35aoS7+p="qL䐄be2ٹΩZNk~ޱQ }}8U"@Fy`Q!ڞ,C'tJpU YYpuǣS,AT8 xf$1$G+g Y0=0[3V)W5- 1Sj Ɖ^2fZ$'D'O?MĦɡ tÖaMb: U8me `8(0Ď3 ,眂4=t6wRB/zpV{W񈬃"tTSYp)nzvIUwqfal u"ٷ3q?ƩX/ ᶷjwc)3J|O m,\]\_)Dsi#O?-4rEkW5HDUyCOOe#j#HW៊}4rk:ӆ#8иL`֢O7 >HtT#GqD8$}eio# qY:&TdF(K(`3p IDATv ~ãr(*!}&W뺐/{0^9#bHS* 1||sVvIXom2j@ftv~_2ǁb[K knz^UGq)@SY#)hep.>$f$JhƯK-pHZs+bd%=;6ѺduBC?dNZU([td bu"ڈj+|X ~k.RrΣZFP#0Y~& هv wNclI5Dd *A,dPw[XYEi≼5EEᎁL1̡]qH 8S'#(/,%@0 Ba_lqG!y3p 9jINb^eWP0]ϰ;xdE*QHF.UJnv.їte]хl !e1%tm̂/S|q,:8@,u}'ZX݂dֲp +1aYuځ{lr!T|W0g/y}d3L`F!&}!Tx?&4l-%3VL jZx3+@]Q*N!_\( g!8pxllvFIإ^ͩ1-IցS& 0LfE MEFj Fwcʍ\ާHcn1#M6t%q ;p ;tu?mi[y%'CҲtGԶ6X'̈2BV{`vRSsd:)z9&$ gyUg~?Iө̂\K/M,h*B?72Ch1T1gLJO,p@R-IP@;j-0'0)8f󣼢z6uIVˢ6Ef$"4=قȿ,'frH~bÏf8kܶ='bC`? [O]M/, GqKtfJedb K\U9.(hetS%?[>ǙQ-)wq]f4CKߊ8!538DKB Ûfw9%VW`~H7P{n.Y{ Q,EEj@!4EhAxlX}8eHcB- =$Gad߁g9mh{s2eFU8UeAdSD92FkoTa|dtgއ/_H !6þWC"g'e,!V? N EW$kmFuGGp@hNy9NP8[,s]ME֏Ήypj79r` Q\م,Cʈ,LFßr.R !c\$T_v/x3&h0!|w ߱) =znDx=ًXJs uExuN߬➮%,[%;U`ixߏ?$2qvn8|S;ZK\tyb?Gn]$-E,?_$IrR9d43Upr"(_?>ùYxz_eӣl-s9ApT*]uc֣TY210m|orS&/Srl'[+:CĊ;DRmz@D<\)(0>oydBj4_H]H15ڭbs}V7tIz;rxٓW6eF9`R'ɦD8Í=&kb ʎN V\VFB%hiHf9apE-(HBntGFDzXc X6㽅_Dup'd>5!RZߠ%F)T)qd* X!tuky.c؂g_f^ъN,8 saqC;'tB@*Zh5o&c}:52h.HEH"2a }~ƀ[y?J)D6dLCBXM:j}Oj'eV^%Vn/"&0nӬOI7OkM|Dj0Og`+6\6y38^Yl;M|J ̐32T@? f6Jt$YSl1Wq}g4Q`Aq -/tRy]KH{.X~ȂW8#¾4AKePD'M3^hٸI?z+'}ZIhmDu,Z4:V5>I.(\4w;%?# 3!%=q%FTB3g$BmlS2J CZjnSpH@KAJMI[׮ =@}O!,at1q?R)Q =i"udQA>F$j'≅C,,䧆E:iH6x$!>ex8ͱ4yY37 fP.퍗v?q48[lO4;Y8:΁^ ) sHʗd$>a/ 䅊 Ҷjn7Vt>`C`}bOyI&p@fxH%UڬϹV+7GfC+Vɉ ]l H&29^!Lc#@&ЎUn ӶCk4*ۭւFO'M鸵)^IAI2ȽE wHV>/%caOӔ$֑>2c1/6DҀ>G;ru4("h"ύpNf73I<}6Vg>yl6W$:y*Xa,jX<=7=,&ߧ7LLxȭ8@@:S\&g$OJ/qGCRڣN"!!#DhZ8IQQ c\@@'+ՑVD͙6l'7 /RbX[Si44>lSoɹ׉?L8G<njXO~k0P$S<5rjPZ]?dY9Nf_+a( 38-6qE "d pqH١&g3jb y :,.Jc#Y@՞H3 Bܳi&YǀK[$glsk?t7;fNtwN,gj7[nl=@, #qj$-N$c@ZP{#}n,J;p"i J Z@JyL["z*rPO&ˢ3 u[5K.>@x :_>j"5l1P5I@'_?gŕ~JZ Žt#k>Z,n4B25T:k<)a;7dZ=7lpKw=A}*YZ`j!e2}`'vs7ɒIGa7EbRt mvѐ OwiP-{3LuŚ]tX ^!jGΑH9BspYLG-H)Y2yRFvJ[OX몹Pp2cn"B]ÂE#$;d3vCnt`#d!EQo8e6CnaAS\Xߘr( '@ "6mB}Cq̞i^Z,j7/PB2a8U麆\ 4a|mć6NݒJہ븽,q4DE׭ +[@ҁ {`fH(|=vq2TsN8u01IaF~!!;+,-%2R&1*JL, !ِjbxow ĂdRY|K}=|&dt|u3D$ qN6\\I_J~ؕ2QST56y#Fnt= EKUXl1B5UVƺ)+DbhbhA3"\3uP|Rr{C477_,Փ#]d̃i~䀝~9P:;m\H ( CS+ 0}fd ;=/ϠҿӞ?{ iadR8 7^ّ*kj2V#^`4yJol)9N[qsJ);?J,"s{ t$:@0=bkN0lH/tp' Ҡ ^C,ErC4X?鸎(f։)t=`j*&5łN Z$qێFhtA_-6ПZ8d=K1`̓Q\K9V<};'k%C znZ_b&CE˒o'ցFs"OBNLҴFU>^KMĕQM5 d-/NU<_js{TOǸm[>\S!0n 7lfF&w;v#$ۄPod$;↠Z *X xHy {XHjQz(^'&AA@-Wq.+1uZWXZ[]ik<[>X5 C?q#Kĵ`A'ЮÏd2{W䥒D"T1a~;SSR@NvkwߦnJ=(D4!0˨$m,qgWI8[f"wF7w)h? /e%TM~pV]gY%UmjSxS }O]5p :z"F%l$aD?9{,h=6;c,T9ӎm#ׄe!f&E++Y%݅rWFCњAF1 q'U:\lZ2l˚?!x/ٙ55Ă&QO)ƚ ! /EoMTqbȳG&KK)eXl!lݒ op d͟MѿOAH1wZu;D_h08 x.@@'n2QReS)x ; ^Hb?Ϣt+ƒm E6&l[#yY6iBd*ZXL$a ""FXW&i*F#mR$ib0jY,rHOҥ,N)sBdS2SgѮO5q$~[iiUH%1bT/|=9W>}i,ayp^tw-Ekۘ֯~dAqK~G :Qru |#A(HK4HUFЋFT4$"5 BzV%~fRBrHuDӋ;/ճEqWOJ\yh&Xה^$)MK{d]Q\Qcu`wqadu ;LI_' Q\R␲'(&kBo =ׁlΆ6VMۑDG~*@-V?gEUh+Yc;B!48jcJ(,r61Mۧy - oe߮%] NVCУsegđf> 8\Wkp#zзL^)̥Rg2kBl:3NomC&`w_ .wGI#8Ha,UeU \\I`/eIBEpރr6 [zᇶ-|׭KaV3RX}-DI&n*w5)blccX MHQL\V؇LBO{"iQWͭ%D%q*S_&ПXIq oa"y1 'x~"nchG \9h} ae~gDÛ>#u!ۆ6/ ~ߕ 0k,pj\,ųdod)@;+L*̭4YP$T .&\^N)$جSC[~}]Kq@ltsGRP;ez@NֆQy0i0 %%` HDN ##ⱶ,UПux]C', T,=‚vRU=ɓRk1B;,K'g PU n՛ղFE3v2ڊN^&SSݝlI0a+ց| īj}ixCs8`7R?9P[n3yP\aC9_J; :y*ȌY,w8`~:e$% BTz+$r'[V.HYQ.VSy!Ỉ{S>&E tJ!w4`?2$$ۘnFxL~Gڇ0[˓F0"9RL!L}lǻ[X80x(I󀹗dֱ[VX it>k6։yR% ?ў䷜b<ь}! ,G/%#24$V$^dk2ߙӕ\-A~iۀHfvE;[%ao))r-g )-+M+jXp8\ڬS?E qMpXC~PZ |Y ;0;7茄[*jԸ_KQq@&oSiBI(fw]YEqdҪ3W>ZK@Y"A;ijGH@oVCYlsD(lPvRB@ Ok62sdbրe dץZx5AR^R yo߀0h'l\]R,Q(h^pj@8@Q %e>/ޣJT\RS2Yysz!EXzh:] y x4\+Lp}Ht! #ym~nu=cAcyiE9`h-=#;u̯p%W[eFl[] +T>-.f?9 -WMuNGDacs}DO Pj"b=vn] Oom-+dZQL c z2^ӆޣ`-׾*3g61A~yzhgLC 0iW+L u?nJJ&NzlYJTFT;mUNeWU`Jgh#!j^$&ޑe1tM).y#FP_kbMmĝ!Eb bL.*J!>^CzF0834U`'D[2j)ZװdMN:wx2Z#{z Hg\L'gv*vtM=osF@CvIrLIW_D@-iv}oaKR{j׵z'6Nv"O5](|ޒKQ1--uGp&`JTFzk9iN鄔sZ%(1"I:sZZRGJSCdl*^[ę&'K5+lS0- ,:j0NBhA$݈3r(}\Ax'#"\ӆ }J@,i\dž>9 [ ּfnU[;i"ZHg``NH\y3K,kٙ DF()+)9wZTD`t"FfEmJLZE5djQmJb$AH[?(vR3ز.~K s:DRFB'B JmLy#^H뛐Kiʊ?YFm2fz0bi= F Mlnm4Zd*[)qp,4ͳoǻ'7ܼ3/dM#s@;륰`iXЬE'7yugOdR$eJD 9Sdq]c9Y=2WTX'e'mz-_Sm?;V`}Ӷʲ2[c ߋ//>N `1&;cǼʄ+1j(ejX=0eXK-> 8Q[,¥XRˊYpòc bm$qOH"#%D_|Oaw_ڳG, e&Ҫi\xg^ۺKOƾa ds/On2Sᓢ="ǜ a?+Ω[b C]r,:Sg05"Vd.h'/,X8z) .SMٱ5F4",mHH$$'uEH~Q&yB@HQ0^[@, ?CƂb;(`M8g4 T]E*7j2[*P %ZPwnh)6 Ys` +OE*r~΋f#~`qMb G =PҸ@>(.L=$ڻt UَAYkazo72]ql+0 2Hqްuo#pEW qf%e-AXazBZV+KإiudQ_ě֎%- s7J$نE ö::Dn䷢hv͌Yehoeto`ކ ܡ6 y>vk&N%b/bՂIPßؗV˨ WG>DYrjS-φSXW_ :] %,΀ ,OM^L5 ' .]*4e" OiX)o=~Laʚ +,i-kc? AW.ĩg,Fvac=/\ !2=tТ HhQFD~YDk*v+$S9= ,lol _S[+-q-ڭJ#1$CG*lZ=֊,O(2H\zշ\?/c3Ԏ_-#a (D _ycwh'l@0} 2`e5(ӻ((uɿ0D2o`;CiB 0FC]L0b?^ڤUnPX`bXR NeUjY'=?/õc?ZD%%2yǶ1rF,I=<{@uEz`&n3"_ X$Ϟ<7dM<&e^Fl2´ʈMd.|bTtbc] Ml .t=P6dbϓb6U/'by S16n#}DoNlun\ ɀr%APV)zmr  LK^4:`JcN]&(O3M싛ɔDRH!-'GLzJ?j6mcT_Ոؼj$z5/-K;%ХZ&Icr &1I g؆%?j6񀹈(<4o޷;,^I [Aa4ajא% R<f|bbTw+F}\/رiy5\dd.&cV?#=zJw 9oݑm<9]c;BqR68KǶ^;M+F%'=SVfS ܨ]kZf?h~ݝĂ36?APVT":([}鎥b~w7'C'v3yo8r;@zY`QD o(J̛׼)V#,vGnPo#}ґqj=(^0ꑻ͆Z(JdEto\'|PA)&w[x׈(cH EME.Ѿ @x;۴}E| ˤzw29^(Š'6-{cB79yBr\,[X%flj @2 Pg`Yv0y d 7(Eo1C^N?kyVa‘ȳ'TK * z; uw>N9Ԏ[sB`D^  <\НT$`!䶱q brtǁ~7Ȑ{@_{q|:n u2D[vL gvLX@6~+ @=o:g "{*E)r9L3$CX ܉JCawBrrf>08mt[/4|'jU33?P"U#C)&+,2]ؒ31BFpsn.ZJg >w!5ѥXv!7@t"-J[[nrѵWѾӒe vؽӦwL%v˷BLGe3Tޞ&^fղCoёnޯIA}qLQ@b3X`7+]kq& \wdIsosC M|TWOspAa lb?)3([aW2EOovbqM^%Z2QY>dr-NiÂcU]޳z#j|ly]ڦ(e t| >to[`("Oఀ7‰O@T_ Scm_ Pwη9CTO!"On<;(pv&}lѪdyԹ"ר׀;,Y{YEVF辢C@rq)'9c2}PqЄ/|Ӂ.~Q|L2U=;}sҁ|F=n0.l0;AB3Tr(ؘ̤=ݠ=ַ(y؉^) qw"[&Qj(x"^1K_}9%3o*r`fs&KJ<& ;| ?њ!na]f*W"/gྫྷ52ep0]o4"\'O)~q0tka8Cw&}-xp#a[~D'(ƃ>!~?orX?c=p̭`*EY$ՠ$o# Tcq4hu׷[ HQ;ھ(I<Y~m KtL1 udg,U_I%o' ja #A*ӫۭWd'q| @9VN= .)`Amîq pXmsaHvYU",2*9o O˗?ӷ IDATIpmYb#8(قэP"~X<>nS {%flฎfks;e0${7E2b-斧 7:HY.+-SRqi;+ߝoX8)`;iB8(CYCP.g8bV rF>ly׾7bf\a}eX+]H)jN Iӎ0QF !"9 Lr3,4DW􃭥Ѿ[C[ &O"W'7LJ^$}&qםcL8=M9MNf4&RS^]HvS؄LT0%E@ܿ|g\puGG8p"Ra|sntB-sJOTT{7ΡJuT ?_%b}=[`{aVז=uOuB`($ B X0}zG<1_1ch=$˻a/FuXCß417~۶Q8T\[kDKf3in3,7N3"c®0 64ׅ1/1#O`@MA&rA|z".6q66 G?yY5U̖|;0VCRM4?`c @<{wr*1 =6ڗ|2- (bY$VEK*'0_ "_suF5~NpǩqݺUzyUl2980_ R_Ѐ/5+qpwAK  s͕]UA%?9|Bfɩb=Ħs*o{[^w>Vux7F`DE1l-rp6Ř >w,e3rS%ă$ fD=1!2܍8+[?!_*䗧,Ư{B fXd,F'Bٕ6 szc'of?.|\# nD.:ݥBc̟*GN\t`΅ `@'֌ :9vlonAA!lN LsP;̨0D&ozO/S"]+c$^\ơ5AF߾ S;hV" '%4I77 _=Ud@8z#3_]3<+vB?{8zhLEC@:Z c,lߌZ{̘y7i, wv,1\z[yXzv:m\hfyR$8Q6E40?`;ʎkI1`%#?غ(u,YϨNhuxr|KXM\b5Bg0ɐ2Cb8ʲpALdQLȀu 78V lm%QzI-&yqG@+L^ B_=ӊ~Ul`Xa+JyI«p[6N 1ˇL @!tvk } DEhQC-rԩ.gea]ty'dw--q78$p'㎱ +ŋyȝ WWNtuv%4/Q 3dSǀ惱 Ec~P3t}rCD4[QO)' k"džL kRk<7 E 1Y-4ڏۮϭ|[:B X@Q`nTVu*XfќyX@CLEDt̚\)4b7'0;.Q3$ꪩkx2ĠBς'*`;066b:Ll `6ގ~P͵ 6tv|Fج0QclbaHE:ZT!B |BQfoo*vLvx;DM]2Q_$e= +ũ/:1WY{B.OyM ;SujR;K^5uni9Q3r? 5`@B0wU'O1HJҮk0n:'|)sC;]1",7> yIb袓XPGmCK$c꠶YłT> [@Q}/jyV6c4KUf7֦|ɿ\J /@NːXIhrbŋh3?;gM )% F/p `3XM,YKnQ O$NPOƉ;{kHLIyv%&X}5#$$Q"+7kN$SH*zגBخii‘Iw8aBZAhRK @jDyH%!z7`rI~: ۖx~N_spF$U8`/$oPrVG@w$fN3`a〼 {NH.'jfьUTvny1Qы:ka#qJ`2<)0<P ] b,rX-ŋΔq ȟ/v݊XNEAD/ ġ*ʂ$F?OfrgK74`AO/v x(f&71о Ѡ;r֤!;ʪިm{Jц_ of!ٻHGx]ĩlgհn`7f! G~ /͉hM 1QB:NtF\XjFaOH*LפJE"xqkcw"` 1Ku %AFd IX5@TdI9G (8-[qSF5*F1[a ?)Ln#R e}-g\.H6x%>8su˽sЭUͣ&2eCYp"DO?c-5fr)("C}tdܭB\K鰭NnJ$jk_Ơ`?G%|ԋ?:zD"-8ypa0J7TFW*gw|tvQ ˆH%qE=0$ʭvD–2P2r$ܪy,-Fa+{?F %`0-6aL %4U]OH5\[L=Hjn¼kI5E':%)Ad $9F 0 ͠* PZqeVou]:bKf D+刻-[Qw?:=ຍA=1״CQP̔VfoY o ERgI4%p!(Sa`k,AಀY Ht*5:BCwO2$ߌH#(7D+F11BOԍuBX\1RlV~z@ŃKat.t1\IG &?~f :Y$+k%Q45¡wy[fcncUI6hjlP04?`wefo5Kjsܪ7u"W)n]V<4.-LCɁԫr&X[7Qa./ Si猚@4< )~^k yy2%N18vA}Uv9%!a19M5+C\@lޢ08phqAO X/0Pa8³k cb%þKX&] T&Pi +;*F7t[+;&-ugΉUV,!'IR]cϦ$XAD܊?=wf# μᦡY%,wE@=4؍S\gTD' ܠG "qϲ"]v6 ڻFᴴ?c)ԼĚM=(aЅM'db2 :PeNcMdQ>̬|έvE9!'A4|kWg$u}*(l)}ƛZ U -(\H;t)WZ2P6*=x,(:|@{ ǑYD aCWNׂݕq >FukSL-/lw"4\Z+k6] %g7#ߵ `Df8>#㏦fIDATe+ܶj<Xp[-ܴ@얰Y~kJS@p/껚!JǙ0: GIM tvUzNii߫޼u*KE*vS`rB3Vz (j2Qw^L MԠTޕ20Q-}wSBG&Şx]ڀ%: 7cr^G@UVqШƭo3T흷K~;iVߪGl_]]zǕ 8Cbcc\QY~wVőzwt֨X8}u~ت,,HQhc;T!?c}9h7aVgrڨ! YC!f .|s8Θd2W!\"!xE=>Q,9|tP(n[0:Y ">ڈ<$rXh~IFV,1,4BZ|Pfl&kS=bduˋ"Tmx(,nKfqyI;~P"cާW5[sn#≍hC,8 %xAx;Ez$-+H>2ҰWqRص(B ַ: nn^ȝ+C$ 7NbF[h<آ%q끡V(6`AIpxA@Jb-IH(>a!닩TG83WWPCTY/G+A..dL=|-|$LPN%$~~ݴ"WpߴH[3Y/pţ 4i@wlt$bPZS3W{0 wbHw[wm)D~iiBnM@ϵ&&8ͲL@<}1.Zr ;\ºi:h6mӀp/`[;\=R؀ء n)0ERyVEэٳ꿰Q"fŠ}!}4ghNE<1s.eQ̝(IUP Bmŝ:ӾhSѲB%Cv% =H$ Bo$L޺~qSF t{Hu縦"BE1쏇|y0N*>tӨ٣/ą`lZ0#3m$&Du.Q BnZ@.Qйi%\>ܴ(m.2 sQ9Ef it1FK$%98@B,f/r,prp`.V;bz Y[@HFtyGD5~g#9'ўq uXr"X'}s%,kI+ A$(f+q2tveJ|&ұ24ͪ4q2@hgF<=ڭ)< P VqWᛣR*ϐ@!&*^ePf\l(RG0\GM*OYQŠh8⠃6u9M^c xcPPàk;!X6iz aӹ-W9hH|4Lϧeְ}P3 -.e+ZjL'4!}o߷;!0 lBڈya-$dqGGms4Nc(7}o `{lN/J˗ c] )u;(7+l"!ǣ`K$*,4 XA--b~Za"EQ>Q\W#`S7'Mr$ɇYf-`jWxUgSz9/GсL:~  ?|>Ӻ AVŔG W[f̄o7):̧`fF7Xm3fG!q,~,rD2i|vB'd;y߿d&"_>U-ԯkWL/2DtcON|ٞTjʿ (F Y ak\L'.h,$vPs]jv3Řb@Lqƪ l']K`U3EjNC? -;%Ch0=زA|hKd-׺5^J5\}aH&MRF+UΰVwlCM]:X,crnPy@qy{/k+RjDAeNx|A$^vX;ɮ  v$;C_,A@c$h#M)Ӆ+~|jĴ pSMbn֚E4+H6 jl Ww(){.,Q X"s3CF_n؃Hr#$& HP/.k%Fm_nָy?tY$fAr@QX0apH_X]+o ר=rzctm$.T'Gn$|A+ڂ- Vٮ!-4h YWo ق%k.+@1BA`as񏴷QuV"2E z#. E?Fdg02p?z&%oT {mYnbW PCXiPYVh6ma"QDwݦwbC,nSÂM1s0WEu1?9PT~N1W7?^"]yv셙Ϗq ؝]J]Jq:S.Gw YYWq%V \Fɻ9gL?Ȍf9I)nl _8,#duC}T="'/4f%%`kܣA9+|@H; m9OYkL92jQ1pGpVZ |2ѝ4=-p(#ʉq/r.֤8/IS|y:\|df D"pTXRfg1Ԩf50*6Ewpm:0ˑcUxHOSkvUx?fć,Ysh~ox U59WNvC0RX]m@E$sM(FP O_0Q}B;P~d-I`3W˼YII,4s5y=,X'HW_xG'{tJ)>2W8*t5Aᔊ@-TB.\2]T``x|p{BDR.qݽ#d'REYB[()<*֝NY;k x?* `Em}I W"r0Y4 wtDat-}b(|j Or"ZoA&yx$f$ @jp<5{u7`sy:D%;u[3'G1OYu^Rh͖L+CEv,8M/G~s-#s}h:@lʰ5l֍EŞTmwuRKS_]0,>>RamjϟȓTcZNLJ cP'  ,bh<ÒKN,bow&1joڅ o;+}R߬ QBq y_5$/S|`&1WH 8.Q!!Ap&cIkmw)%b͎i/u0oX{݌yJ "  &0dSsV˃L0_t_o'7z} ^ NXFOnNeoIL)ـ ʜ)/#g<:"'OvF߭uC jV9Z$J47#m*`bcd͎lF(4M>~m4 | ]G/9KJlr i1^<@5/J>EϮBuA$/ :+@K=/S;by mwջ RLJ>qPTF=!v 'vmm"^Jslꂉ" VaQ;C{~:,ԓjILiB†|}%$s_z<~nPs wpG-_@ȰeBZK,ox6*ht,P[s20w]HԩI\_Naȥt Y,׮dj]-,I [!"Ebh'{d8-ՎW|,(1a͉ï_02GeomM@)4Eͼ*D.r:S\ʸ5-My(mUI[pwQ-@P.ڨ>UQ AamEP0p,K_X`s;n{n ta'C[tJmb<~"Næ3z*zη}h:p&c 64itP̿z'hK@v ؀g#LnBMΩo%oSp* -%y-v›;p6ئ*J)#TϚXq`2̂k kD[u^shJ2w7 *0Kc)o3/ +rVOтSKr bC=K"9O1{%zlх~'?iv Uj,uD?^Sz3/Zw]Gsyq<@]Pw6:ٺ`&qD={M_͈!衧,/_@x ,ۚ:Z>zeKtY!*LP0-2Cq٠W c]lK%{MGFq8f|)9qZOt0b=Y0^y!bq5ýεyIQ`@ O~*/%:!VYM;B{%/jod@:۴k=1L}X6lD呫r0Id*57gVG5,={I+[h H{Q7=)UZV>#,IflT1-pKJ 0E9j/ p.2nBSW şeUn2SSL FP0$ᘎ u]>A!;//%كpeq@<$I  5fP5WO[>jL!_D3|(HsjŃD (P%D+H<JĢWĿV> !jiW\ KVVG󢒿R=_g/~l`&_QZ=wzqS- \$gRGg>p@N# qh>n}: RQ}V1Ln |W+s;zu0~ #{i7[UYB}x >y/\2޽~a_~}]O Ca-[ETW;4obW3}G4Km Dx\}}'4] X*j7b_!lx|c,Ow_:YoWI^~C?hpM8> <#OKIENDB`libimage-png-libpng-perl-0.59/examples/png-cgi.pl000077500000000000000000000011371475730614500217330ustar00rootroot00000000000000#!/home/ben/software/install/bin/perl # This CGI script prints a PNG in a random colour. use warnings; use strict; use Image::PNG::Libpng ':all'; use Image::PNG::Const ':all'; my $png = create_write_struct (); my $size = 100; $png->set_IHDR ({height => $size, width => $size, bit_depth => 8, color_type => PNG_COLOR_TYPE_RGB}); my $bytes = pack "CCC", randcol (), randcol (), randcol (); my @rows = ($bytes x $size) x $size; $png->set_rows (\@rows); my $img = $png->write_to_scalar (); binmode STDOUT; print "Content-Type:image/png\r\n\r\n$img"; exit; sub randcol { return int (rand () * 0x100); } libimage-png-libpng-perl-0.59/examples/q.pl000077500000000000000000000026061475730614500206510ustar00rootroot00000000000000#!/home/ben/software/install/bin/perl use warnings; use strict; use utf8; use FindBin '$Bin'; use Image::PNG::Libpng ':all'; my $file = "wave.png"; my $ncolors = 40; my $palette = randompalette ($ncolors); write_with_palette ($file, $palette, $ncolors, [], "random"); my $picked = points ($file, $ncolors); my @hist = (1) x $ncolors; write_with_palette ($file, $picked, $ncolors, \@hist, "picked"); exit; sub write_with_palette { my ($file, $palette, $ncolors, $hist, $name) = @_; my $rpng = create_reader ($file); $rpng->set_quantize ($palette, $ncolors, $hist, 1); $rpng->read_png (); my $wpng = copy_png ($rpng); $wpng->set_PLTE ($palette); $wpng->write_png_file ("$name-$file"); } sub points { my ($pngfile, $ncolors) = @_; my $png = read_png_file ($pngfile); my $rows = $png->get_rows (); my $h = $png->height (); my $w = $png->width (); my $ch = $png->get_channels (); my @p; for (0..$ncolors-1) { my $x = int (rand ($w)); my $y = int (rand ($h)); my $row = $rows->[$y]; my @pix = split ('', substr ($row, $x*$ch, $ch)); push @p, { red => ord ($pix[0]), green => ord ($pix[1]), blue => ord ($pix[2]), }; } return \@p; } sub randompalette { my ($n) = @_; my @p; for (0..$n-1) { my %color; for my $c (qw!red green blue!) { $color{$c} = int (rand (256)) } push @p, \%color; } return \@p; } libimage-png-libpng-perl-0.59/examples/random-wave.png000066400000000000000000000346471475730614500230110ustar00rootroot00000000000000PNG  IHDRgAMA asRGB cHRMz&u0`:pQ<xPLTEVhyF@!(5T. N7g_6APJ܍H;RIf\ R@+=.Z6@20~X8(e-=9*ߔKd{uAaB pHYs&? IDATx]v:tqN >!#rR˷voY8@HRt?t?A?xo ?A?xoKJ)Okq[ς""G][ς/SD[{;K?vobDE!iPG7lY"3 Kk.IНb2\ɂS 0dD4Xr/pcp Ak]&] jh| ao: WX.)y|-JB᧲nπi{*7&DA%pkGa:*(-~JbpzƯv˵kSЋ'6 qomWk/ڨҘGjPL?;_=vV_yW 15Gf) zQLd@$'XTY\A( Z[r%I+8BP_үhi~2c5f >25YBSW~<8'>_@w 'C} DU ҹ(RS 2'"@yϖCy5_@lQE :P6#z SGWvݩȭR0,(14#xvxպ>_mΩj{w|+u[%Doy>c2FhEG`ኚS-8.^pP\ b74U߅T H bO!!l8Vň 1cq˫s`|S Aʨ3D¶ W3 &Z q,rR^xk.1L {F7mviB.OG`0ʂMzN_C1G^XX4y9++~ɓx`8IB@Y}60ս~-4 x4+lZH,3mؼcA sDJA{Dhm1| >ddMգ6hϰ [g ")!^66zٛ uC>K5RqD$A +^|]@k%v`G)箚0N5_.˂JP]Y K@' h }0.NA@{Cl=WI%,kL wo%A{!Pys[@ J@U_ApDWO"<**u!!*&\jp՟ FqԁwlϠ.y@K:O+_ #5eFeCp|4hsA~ 5)<+wrbD,(O x*| *DU X}R4-z-tXLO+Y>^2AQ3c`TyFS(r#'yB\6ߪe ߔ![m ㍲! [8[M|@A^e}6@ 1 ,@&Eq_?jhK7ՄZ]0+ԕe'Bv.iaOեDϠrQ^՜͜E?;LGeȩoqΑG;u?ߦ|>?j: A:ͪiav9 l'O APJ{r,X>>]S#HX-87 ԨA]uݍ緈T}0xMb-ځ4C^hE`~U'6%TPB= r{;RJKZ@px Oy$Zʪ$G9K+c0rڢG[~SqtD+mLBt I>LI~w[0KQ80] G:v_,i yށ9-GoG^QVJ,8]Y *[`^q-kc$6`flc@j+ ;AvŬ>ŎzʝcvKaFdod/XwR.+9ĖZ ݳT'*o}<`&3bTK'%eIYxGMlO/> JOZbVk1$ \M]}EȈ[v[G!x*Fc mbiXۉU[͋`+8!U ќo6q6jOYf' 1aN4t- bKqpAj`Je:o'0J&B- G /G0N4:AbQbg;3F|ޡOL!~i ɞ8+H-}^|jA5Yd!禝 D\%cfh\ atES"u"[3nA): ϦV˷;wknU2"l\p(0hZhvm3P܊p4\?4\qs IAKkB0 cbVmyec%ّ IɁ:i: 3U,i1f`CJTz\vwOtxZкPlY#a,FDN<<󌶂Ҍ,ߘ(FELc. F2mZk“-$J'S0wꝛLZ~ '!AQ1Ie\F 3΅o@$Bs fJ@ு أ2;Z͜! nes&- ]/ukZ 8{RY%6<=^X-}ͲnJҡv4B?V(^j(BBᰲ)Fر> XƉ,ABJ;a\bTl&AWbiT_[cji *ѡuN@*.]'1x̗SdF2uݗs٥ rS'?kRH>#"49%cU9loKBAjN_l܀>o A*\ʛߘ/!ǹ{٘k2lzb߭ :ӻ]9z/pRc9rZds>9 oRk0@3/4 Brf26mJR[N_4 G};6F 'hUn ɼYjP7}b!|f{JjLFd#lR)s;g޲]<# mӚ H>>M8AeeݍHѱm.B?ZݲB|*ɢWuW9$rI]Nr"$Kܩ[Dҫu1=XG}e7Ƹb[;K6ec]A@c\oytRz%&}z;5Qks'eYQ_菋 r88Qp[\l֙.9Z3&&kN\']tTƍq*7AfSq4ˋ×`SPLXFX^H_R#5m//^ls2|iS1)AN/`nb*)Wac֯F 4T~t4qE35U%`EykNx8kkwVtgDZ*(Y{$1嶍| Cbb7:8L߃9|w]⪫&. z{CNz#c)cP J״}\$m=Kr]}ųџoܞZŘup;¾)U.vs5A7k#:ec=G1+dEAhz[^UzԺ{)'VV+eQ-:\1,e6DL=y\0#ayQk/`wA@^9GssJBT:d@T_\"y$䚱BcM5+0j 9ω oP|:euPk'U* j=|據>;0I>5vʓAS$x&vF :ӦMDAOC[Q 0{y_.a?ApM:#t{x0Qpdk jiM$ NlxѽU =WLkK59m/LYfEATjl"29T,y hVz5jkZQކ?4t˜'/f鶵f,(6ƚqV gcL䷔ʘuf0&CqRk{_ ۧWppm's@@`ﱬM:EWhɲU)]E,{fLpus3]/b+ <.;XTQ-rjQ-ߏ "]!b4ȏILZiPv%e5m뚃μt>vN{#;zDűc*L`/ \Bޮr\E7h ѭ( _ߪQ𨋡Uwd@[:xc!žLPG-D_,SFҠ FA.zk!hKjo8Ivu",v—qCX{0|GsUc]S!J:JiQRi1N+_mГG dC"9T# fo_\&k.yuUa8(*S"B l`lh^|HEFlk HW@Nt;}㜻<㠑Tşgz\BV*\obB J𰸊T#uw_8OÇJ, <7ݏKi\ F~8x~}2ߌo KMR3V4ɎɆ4%]JRGj. (AqdHy 1dWC^r~om/37MLѫ^[.Vj)nc{tcόB$#O#] lт8J<ʂ|+ (X+J2r]Ag,5ۉ&wl?R/\yY- &$Xk`%)A|~i2I`GeXq. rrbΝꮠӫޘ|;{6A0i&Q Z%ԝ΍8<۝uxOUK›d0e'V82 goFXVH8EDsr:xij$|NJC0bp2b7V*> ,<]1 7]BO#ay-N7[o Xn MVJBB.4!1hG$vr B. 쨁, f 2uu0h]k퍎.s `|/^G( 3ưZ_e(ĥ_8Xlw!U%HRFpyX(iyS\! nbT.in82t2\ ɮn6T׾yqZ{Z/i fd z`@ 놈-̼it&-ʼh=\fRU rqk\b/oĠ-&peztu*SvYEM;'w6fc\$սo9bMN3iAYЭ;IDATgCP#*̦,d;rPDæ=\xҬ*Pީw؅6#OKN(D6>BOL4OZWFo\+F.IUE^dSUV,"z~p/4x=s!2- F2.ظz=,yßBթtIM:Co@#' z[Ye 3O!_Ìp2շNU SJkټ _rzATp3& +rq\PlAңLMF2 g ˖ӠlvWIhl3h^3zP1JZ%rYgF.$s ɗG@7 θARiY 1՚Ҥ@"a_Dxǖ;Sm-{ZBRbBx:JCͽ(aQOo'I?W[cDb)]0z7Ej'WQ}k-l<tiվQrGkq]<K f_ȉ FW\ ><6ѳ'bکXX"T#ѯ37ʂ4 [xesԌ놩t# Vo/l,^_"0obAܫ9I^vїKUm艪2Ԃx#v.BqGi:7Rr v/U![t8 [-|8R:!htNHUZWSacn@:V/Mw {# u[rglU;+ b!QH;6=m*zskuddKR4or680Oox~]9WPzC|fҐxN{_L-B/O׊j >KX9GlN{C>[u_.8$&hN2"i -8>5hߠtɏhJq+xB7efsfs1œlQ^߭IbHu0e^>?!<(WF$QkZWebdA ^ӝlFO>٦Ja2FwΉiI$X}tӁ/gAPs[ J!>Rdem=Pe;NC(WNP} Nsu41:|>m I'Cc N6{:oѿl49r4Im4k'~#AAqAIFVwdU&f`s_g (1yt(%OH|m\ѠH$/TJj2m#Xz5xc'o6@a§4y|Ԝa ν:X5WJ^l(/C0#74h$h|{GVdVJ֙AnW-wia GLJ.d_ vW'<6d ŬFV}BF[V,_1 Ζi&^k6 *Tv\Ƿ+aqm>.3r5ȶ YjqZ J*@,9 hr(-ZpMYOVݪ= ~,ngvQgmu BZ[WQ%8S";" =B00zMi{a? HQ\(ۗ\je۩$/=*i @"%a 1UôZ(3;6\pY#rҹpZeh%ΧQveB TS(Ya M[BEas?5Ij@%.?ۖ䇮b#,nء&|0'z(_iz=ݔ.(3 dxi#2rmKf[_U;#zSeTaO>Q;ýfaa@8~05lkD\R OK;g4!t E")*^dI/|0΄`Yr2>"139޹魅jlm G&l=TKb!6C/J rEn&QlF[)^c\pc@sM5ʜH^oF-7]{pXy,K-sK ^7zB/Ƴ^٢W Ҥ \lؕIӄ4dsfe0Y膧;1'.l"4p3 4:*Իټ$ "87oAaK)+ p*f:$o;Q'JIa 0m a $ig0!A*>"p$"h=>-EĔSV׊0B}4p=\BlQ.Ó,S)#z t>٫qA"Gͬ)<>?zA,|8ѤcHyzoz%Zj<cSFh#O)BW'<{XtpOo\"驞MAj֪u%ָR9gzQoז %7SQ$|Bnn GjtP@ i'5EPO~# gNމ' Abj¯jlHX?{ªcUVvN@hBxpfՍz˜κ @t۬,^u!3Dk;d4pi)n'k<`z sctdӡмKg߆i10휻L*m"ؐ[v: sfDݟl-ƝQJM߱Q.3 ph]yt)dG+vox[C&  zX+XtémpЦm<5yisAܤl"(D"ii9<3tr3>/[B]z\nr=d_l%ӞpUdx9%6bZa6=$2.u*@HW HF ?WF-}Jyg#D (*^CԂA\p$ 0@20q}d  | fK 4 ׁ%=CHdc13֙aeÿq>P~!Eˡ&0w8UGBmg}>4K%l.&o#Y5Lٓ~d1f{>K\\̟%.)RM9K#]WjGY*ﳹLx_<uib+*($ccE>a/ء0ZK }jc`!L&(Q䣍~782*mϾsǠ`u@hGEbH|Q8 h! D6s&4c6&qAP  Xq@@ǯWl6*=BP+êVZXS4{butGX 6v :H*_U!t\9S%p<l{Ԑ% 406 6y*el?M3,w0 8Yg{9^dW{φfAPF`(@¼:hd3FfőxRa @SSw؁ˈOupٌ10%O;HbeOU %|]]#uEPnf9:8zať2m-`Ġ3h}*Q4Dc{z?"ld<; '5SxA3 ;&WW N!+ ʜ>j5\nJ0h&P}&Xn>][W8ɄY繟˂y^%bzY㓻i;5Q ,R@Ù³lgy Ɖ^៩I L3[@ G훕I҃+j;.!xoh!0iP !B>&K& W4 &1P Zq1ۣ [:r]wǍ2bw@:"䦫-IYᚣI/:2iwf2җ]f+ AH`K2`E@h֒|&0 :u{MvaM1 }0̇L{x?W׌VRijͦpluiFdp>9<ܧM |8mɍvHe2%˰:/g0[yItC #)A69{iva}}-6' h>=! t^ۭJ\?(uI-cqޥ:ʨg 8s} { FxFHGӮs$ń>_HΖxl0ڍd&=R[VvΨ+˄KVw+necrɌ:H8-kt;7JCﱥ6׳5:LD>Drt m@8G Ԏcr!q+ c68j{oJ#2j.5N=J,{`q%cfKO^+g{(L:D8xfD!}FyX}.ay" "ia1fƪ=GZTZ޽ 0eH x[>џhDVҘ^wRO86AagukJI90 YTP;(!Wz*y)XvuW[INAq"wFgidmx~"?@W~'o^٫j,Y^7fNBY#j{a.^/{Mr0g5,M! U!ڇ$44P;m+#G^ ~;&U&NiܼvizKxp3£윀[طWiR2{OFA0iP8 = ['kzS&+Q8+Z׼ab~ pr'3eȒ]؞ ERME?AkCQc/ Ҷ /T=26uS=}v6uN]{7C:R"]]ìzi$951FAx <i Db>nQ6䚅[JaK;c,@C`ơ̺PbG .ɩ=:[ Fwq59?hg!X 0G28r rRgt2 =V?ʵ:q0Z>:Jo8|)ZT}jUJ$0|IENDB`libimage-png-libpng-perl-0.59/examples/rgb-to-gray.pl000066400000000000000000000007211475730614500225340ustar00rootroot00000000000000#!/home/ben/software/install/bin/perl use warnings; use strict; use utf8; use FindBin '$Bin'; use Image::PNG::Libpng ':all'; use Image::PNG::Const ':all'; my $png = create_reader ("$Bin/luv.png"); $png->read_info (); $png->set_rgb_to_gray (); $png->read_image (); $png->read_end (); my $wpng = $png->copy_png (); my $ihdr = $wpng->get_IHDR (); $ihdr->{color_type} = PNG_COLOR_TYPE_GRAY_ALPHA; $wpng->set_IHDR ($ihdr); $wpng->write_png_file ("$Bin/grayface.png"); libimage-png-libpng-perl-0.59/examples/set-background.pl000077500000000000000000000006611475730614500233200ustar00rootroot00000000000000#!/home/ben/software/install/bin/perl use warnings; use strict; use utf8; use FindBin '$Bin'; use Image::PNG::Libpng ':all'; use Image::PNG::Const ':all'; my $file = "$Bin/luv.png"; my %color = (red => 0xC0, green => 0xFF, blue => 0xFF); my $png = create_reader ($file); $png->set_background (\%color, PNG_BACKGROUND_GAMMA_SCREEN, 0); $png->read_png (); my $wpng = copy_png ($png); $wpng->write_png_file ("$Bin/set-background.png"); libimage-png-libpng-perl-0.59/examples/set-background.png000066400000000000000000000452211475730614500234670ustar00rootroot00000000000000PNG  IHDR,,"gAMA asRGB cHRMz&u0`:pQ< pHYsod IDATxy|SeM!M@6ަe) ؖbYEtFMatqpqqaJeas)#,@8,f閲6M{?nM&4Onnr0Yv{|_mzU=EA[ C~YLL LjI:#|" `(j w֫KH Bke[ϒw\^2nR{ڼфsY9 !u *Jն`_괻lv4x`WbidLa!YUj#}Eh.8Saf͉ypWܩ57w#:~:~=m\^yu4:wרE<."='3c4ӆ vn۳[kex>j(J1EHX?х oqEi8;}⬻"%RanӡCT[Κe!K Cr~ ]0-޼IK ޺vz \tn.1|D|\| 09d.`WձZ` DJJk49ϦMN*ϙ =YY>EC/a%$%$R $a"23o1 mo= UKȒrh\XyvCyhCch_!cG !.1iiAiA[5Յ~n,rC!NlO_0Zh´.EP kdykUw iYs#/͟_@De5 kG:$pڵg(Dh5qن[6d]2X@vX5<9(ho*P8\+|H[Uam̠;Ky-Bhz# p$ZD輿x>Mpߺv)1nR1 p$m4輿4ϟdkbgK}ru||rG {Q#F*%UU(jLh495\P~m?T+2d;6_F]]<<`Z>v Kѯ9}\w㭶5 C@.!Zఛn0 Vߪ'Vߞ#n/-1wT|ۇ{$N <QGi0X32XH CkEǃO2$I5tn<\Y@f%C|N<*D^Ɠ"\@D"Ub"3cG^] :[Cq˖ys[Y:V:%L²-X`Oo;qkzFoNHhT>?r_{!{U$C_=Y[Κ/KJL Eq1G{O.\'zme#NO?S^} v{ū'o:Nv0=uk=&pؗ_O64*=~!Ӵh9}\z go j[_:"_#F5@yur z K9Þ^ J$"oo76^RV %uoh`Xix=|5)˖ˣd(,G1|KDRV 즨OWh$Fd#FnOkGQT_l,> `E* LsqEg_)!>8gIY,M3&}k5I{`Bc抯 < D@ i-=p ޤTE+\fy-g [Z/~qv{\o2R@ ",# ]-Gk4l3³D 8~\XUAEøa#Xxo޾~ݫY_?ڌmX 5?<j,˸ 4BTciI4q")x MINxfss+DQ[eܲK 5knĈɩ>t4͆c:>> -MND8rp_khkC#S}^%~8;"HTNJթF v/ )2!wz<.Jjg`(Zum΃OoYL=ؒ-iw=4WΜxbO Ax;3=8D$t!a{o3]jG\QIpK %?>Dcg9=߉##e:C]CcUURM/"1zZfn%P c* pFXJ =%z>c=3E0;:BKhN0}0#سp?-G18?o3$<>/Ԓ-Zm؝x<^Rh1w[*VEf1zjxC-Z='D"Ɋ^=]E,& хI}ըzYѐ_σc3+$e(eIDh6.(CTxٳu8!Ky.#,t fٮMlF[c2ʃ=njM]B./Xn")jmiV>_7MNG-z>>\Fc'${~-a'ƪ*݃>_5j:UO4Az»c[{ɣ$rNwOk_|W^sa`DoE+4 NOms1gedvqgPG>O):a($hO6yDHSq@NF &O8i}W 2yZVP.,T,s/U |ք_=b/f* /dykF^ۭ[hYs+w;7TgfNTrTɩS tB +2Yq[MF!!hƴVU˔qŠ l>vgޜ,Xﷅw̘v~ ȔO.1ZyHlՒGBwpbX\^v|玟}y/#"'KEhXː,Olji[kee՟?zg=&̙+S*};Lb(ZT<8[ZU#Ԝ{i#=o3y"Bw>3/'FR3W//_fG0s[ ??aY뙞)}??Bz48v_=;tkO2E'g.7Z-ujPu1j4,yȹ`OL6$sVFFEBKpj>&! Ȕ ۧ\X ƘcY w `X"gϩ5 Nф7o(P, 85Uh1rI15{o.>PƇ$EF#%"fN/v,MʨceǨ!ij{=pCBCqƭ(EGe`OA d[Q E<(EȾ@7X'h06p'jjIASTn\還}嘱Yk- Wɔq>4LM&#Dk\Bī/N+s1NF<;L(v{3o_!FƼ4`Z|!`v{-/\RiR ?z"bzǩDY_,W0X䓽 3o_ADg>+_#e_~lheKDɋBI׽&xh+J6o]RbIy:>pC;~bB+@XĤ&57Bt9_XLx&{-1Cpt򍐴T Ob(꫻)[ 8gF؃Z5Z]X3" Z5L%N:\KR`cW ya[,eUg?=KjN4_҂fLn(*<1s/a—#oκoYGxGL~L<{%hdpkFŕ?'qR`Gz}u|=᧶, "QjDwᡏw8+ __cgDrYh$d~'e+4[Ռ?D`G=Ncm @5@Yf|^x8~zAŅ' WUwѶ6㘬 Qck8PVly,/DQ[CjaPw40ꝏ5pV[h3MWacR]1uF-D}r%JqYa< [wҺFkQ'z =n_c6:(uR`n 0`(j./?SpW7?E;~u&{8SIZcm]8qIk4< ̫e Eee1X"IɜZrق#3]D_Βg`(j<{軍k.;6ȼɯ5iKҚ;EW"l};`%W4wfV[LH@Qy/Nm_+o*Ks&&{"҆"OR6%{'gZZu q--o?:%\lZ 9H jh{]_50=|]~o{^嚸[Wczu:ּmn&e_~ۓJ2'e}pF‡UIIP| idӇh8uK$?93/e!g:@="TOn.4oޗkJmc4s)l y_!oDx Þt"i<٧6e_P׽uy+Ƕ1̀Vg1F;?OOQάϵz{Sx^eCѢLϮX3gTƽ;B,f Ƶ4"vVdM#b?Qw| FN.ۥJJ:hј)m-V|֡Xý7L|up/|7cX[2w /9Yy67gZeA;5|3~y;F~ "eGeL #b+@?ļVǨ*e3n 3| BJ`̡n\1g^Sw4 _u@e0'N{ zkUfΜ8^; $SӼ"`<ŝŨ:JX<`z|DDMd5E6B.߾ &ʓi TssmpLjavu]ow iXjv4l]E޶])<}cxTfд0Y<@_S3O| MVE R!uw~bZU$!IfW_8rߠcS;?A;k{;vʅXn~$VIx{]*{;OqZӉdIj2.r`yӑ.릴aoM8t~G)Mˤw>ܙg>p<[i|LwL@ke%=%Kzt)cV~JNke{g~4`tP,w9 e IDATdRƋ<Zr83Y7#oC^.1af1s}$HT"Qĭ./l~ui~ sg)~Ȝ-m,R j^R,s!uCZ< ?x ~<5ԙyO,wˑh#. ,!+ҕ]V kKOp}ٵ6vKsf$[IݓelD)Iư1mceuK$+4籤gc/\wKbR9p&f/2,RnͳL:QxkH3\`^7~qr17yʄ-s.`KsMK$I#RK*F4nvD49Ɋx\_z:هmh{M4E Ξuɽ9?AjM;⃾F"F{ J"7ļ i!CB]3Ai 2ن7Y8.M-gya#m e*͞M՗pͦ&e|K摗qr|F5zV^z۷][BgP`7Wsw 4}~()`X$E`1wﳏV/]}9SBcA K:d5?כLv6;tZ*pa7VU9\!Ry)3H;,Ezi] ;.9WFJz[SKH]ek1;5Y8 z\^""xDC4Gd^$.0?%Op/I/Ddg{yE^i!&''2lȾ7/<}u{I#,V41m !eXN!bQƮ;mslwч(|:2dI% pG6۠qH&P obngn`F6iB^[Bp"O|3L.E!hW߿ۭ`*ӧMS((7ҧ膆%~phݦB|!-A)=5*=upl*""+O[^]~tbSStUe!:f3K`:D (O;!9Ƒ w׼Zdd_2!J>G|9'Qs}85S^+\"8NE+! hR)c@͐^Zɢ]53o9԰)+UN;Hq>4_)i [oR Qjda[̟|m֞GVl7 jԍ&jf" ȜPؑlP..!&Bedr!TL\ƴ]Nm\}赤E4F{c45 GT_mXO$Gb\];11Ywz\$DWmp:ߴamMbdՋSk2e|Dc Dd_fT Qr٢b15ޯBU*/&->{/ݳ4o'A2$X33)*s31L {եBOg"W..ݖ4f g#uF| eY#!lZ.2lAip~Ϯ[_|>!J{ nDDrY5ʃ}no0:rBW Z-z"M4=bDmpOOMm_{j;soq$g%aZ?X4Ȳ[du?z$F(zI81Dעf"\SDS.s_O[-K 0^E& R9./0:C6-؀'đ}ɩBL`(Ze3 l{{B{S,"†ba{:'@D"U"`M &]ѿ^c7l6jo0_m +0X0Gj z>NK&m>p5>/9_&>Hn7[*țҡ34F'w** bdW%ĉV*ÇB}-]b;0'b$ɧAOzDO>z#Joa`0TUu0 $Nhv{sk@՝3iMt<.|hUa'DHN`g_o~q^Jdf9<%jE348| $H *2섃8EީY%Ak2(mQ s^I{X r!/+ATVW4 7c\* /xy+ڣ4ј+i3G҄鼯X"kIR0 HNI! ð#G>AF]mHESJ%a+BpZC L:c5(:g%SuP?8}֯*B24^犇*KWОkՆALD68/`E)1Ж.ݙ5Yُҙ%uzk jѵ151E3RR٠ih ܡÇ6y||(uI""Ht^pV \|{E~?JuRMIь5n)ʪbq_$hYIO?&"t 4,o @忏WqIKur5X,75%9crbFg\Ěz cx Mأ u9>hgYp4I}0I:?Puh/*vt8"ÏT_{H OL3TZE p6'HJGD"" (>pF"Bfl&|Dc-1JE{l#۩G8BDJӆeGw|[-aPR^T]#7AKxH;"-o5D2uO}tGޒؽX"cfϤ "S*?ӥe|f)O&ww%O~y%2ϱũunx$2aCpgɤ@<ℭ W/t%xYD/)lj,h4%ub"QO1IF˥>[6=u &E)^-QL-g&#S"EmC-BCFoNTa9TFb-#fkSFaF`;'EHu$R!l#`Qn!O*];! p[ND jMDJ ∈H4s c~:Qcԉ4$e;HRSf^d-g4t!Aޖ:gu'zrd&+h=Hꪗ"t:A_ݲ/Ȥu];/>U'uR(Ӏ- W1jͧN'EAU%gFb-FݜⰛ2w n*sHerjs [6lOG#kS[Yykn]C' 8[D$]Dn L $~Z&[R1(ڠ`'oiZ/vL/iٰ=%L UUn/^ gdykKO.S@@!,C~.#aS#W.n?ɔ'7-[@(.<CQsyE/%8h k| nVgθ',G;20F[@h=% W4BũoyݦE894-o;?d[m([DW &8$o4}B@V%Bڣu !]/MI{Ђ_=كcn>y4ޝT6Rd:l;t/Q+ErnUr6r1}Z03kkI/VH}2er_r]Q SS1j&i%j|/{ 1-Ty ֟8yd&(=n|^#mT.ng qHG QId_:BOi0[:WX"t.xcЉW$ `3H}ۭp4k ?+~|^8qI2ӝwRD~|SAd0Յ (ׇl$G9MK7zʉݎᥢ4MAS@k:EseEEԭNK6`H~7qh*ٯ޺v7յ&OW{J20۷uIC:kU.:sIWGG4\~zdJxIIUjTMZ+Yħ68bl ,GiVV5w$ps<)@P4O·N 9ƪ"iUQxVLVcFGpW lgH*%b+9viIlOQI?s4f#`OD " 4CB,D@.ă­kjh֍R Fa` 19`B5xBa Mu u1_";yAr2e2HlV}׹FM8ew E`^rJmhTQ";wq^H{hQ}}2ʞ[[ywl¼Ϟ_A'A>E/-|DM^D=`OY૲k]c)Sc]y d^V ut@ܐw7  "ty69/+>=e崋8e#zT VxCf!>W "gCfUUh{;˫tx>[y_K$rGdKOEtS:tHՏn! SyvsAdhTy]7퓛g32cKġi' ?|5#nQuxٰGS 6k zbM*V}ԉ0|^]iw@ы}P𪾦amKc aPRٻ'Uԟ"+|K0h}u"XBdJK?/b/>F/I\Pmt#'|z6ryϸmITE l{2H] (=^"A,T ^$2; d-&yZ@Er횚a*[)c(Zr*p8ZEsVX;ɏ@3 _֒A^RY1m,%(-a :m{uW:#`TqnOώ% L*VM+9>AfycqoCM+Boჴ |3&@,Fjt ȰxD$K$pd1Lp!Z_S1.-i2.@]5DEϵk&x=(D7n/=sl,Η K$D*FT{x)p E~. 6 Q1)px] DP\RL}ޣWTt!- {Cd5 N vW B9#)~2KLdr;*]QA=׀7v[6~212Mz A/o)SA0wK$Kh0jj" Xހ ?for8 ^\&nnǡs.hjh~OKhXR\vbD?r>(waQVsdni8 fX)j*:μphmYcX+04*Kf<q%%A_T c@<ݏ&"q؆(pz0Ў1&D=E}~:f\Fu B PA@D( d AAxmPIENDB`libimage-png-libpng-perl-0.59/examples/set-text.pl000066400000000000000000000012171475730614500221600ustar00rootroot00000000000000#!/home/ben/software/install/bin/perl use warnings; use strict; use utf8; use Image::PNG::Const ':all'; use Image::PNG::Libpng ':all'; my $png = create_write_struct (); $png->set_IHDR ({width => 1, height => 1, bit_depth => 8, color_type => PNG_COLOR_TYPE_GRAY}); $png->set_rows (['X']); $png->set_text ([{ compression => PNG_TEXT_COMPRESSION_NONE, key => "Copyright", text => "Copyright (C) 2020 Fat Cat", }, { compression => PNG_ITXT_COMPRESSION_zTXt, key => "Copyright", lang_key => '著者権', lang => 'ja_JP', text => '©令和2年茉莉ニャンバーガーさん', }]); $png->write_png_file ('copyright.png'); libimage-png-libpng-perl-0.59/examples/set-unknown-chunk.pl000066400000000000000000000012611475730614500240000ustar00rootroot00000000000000#!/home/ben/software/install/bin/perl use warnings; use strict; use Image::PNG::Const ':all'; use Image::PNG::Libpng ':all'; my $png = create_write_struct (); my $size = 100; $png->set_IHDR ({height => $size, width => $size, bit_depth => 8, color_type => PNG_COLOR_TYPE_RGB}); my @rows = (pack ("CCC", 0, 0, 0) x $size) x $size; $png->set_rows (\@rows); my @private_chunks = ({ name => 'prIV', data => 'My private Idaho', }); #$png->set_keep_unknown_chunks (PNG_HANDLE_CHUNK_IF_SAFE ); $png->set_unknown_chunks (\@private_chunks); #$png->set_unknown_chunk_location(PNG_AFTER_IDAT); $png->write_png_file ('chunky.png'); exit; sub randcol { return int (rand () * 0x100); } libimage-png-libpng-perl-0.59/examples/supports.pl000077500000000000000000000003251475730614500223040ustar00rootroot00000000000000#!/home/ben/software/install/bin/perl use warnings; use strict; use lib 'blib/lib'; use lib 'blib/arch'; use Image::PNG::Libpng ':all'; print libpng_supports ('zTXt'), "\n"; print libpng_supports ('tEXt'), "\n"; libimage-png-libpng-perl-0.59/examples/synopsis-easy.pl000066400000000000000000000011431475730614500232270ustar00rootroot00000000000000#!/home/ben/software/install/bin/perl use warnings; use strict; use Image::PNG::Libpng ':all'; my $png = read_png_file ('../t/tantei-san.png'); # Get all valid chunks my $valid = $png->get_valid (); my @valid_chunks = sort grep {$valid->{$_}} keys %$valid; print "Valid chunks are ", join (", ", @valid_chunks), "\n"; # Print image information my $header = $png->get_IHDR (); for my $k (keys %$header) { if ($k eq 'color_type') { print "$k: " . color_type_name ($header->{$k}) . "\n"; } else { print "$k: $header->{$k}\n"; } } my $wpng = $png->copy_png (); $wpng->write_png_file ('new.png'); libimage-png-libpng-perl-0.59/examples/synopsis.pl000077500000000000000000000010141475730614500222700ustar00rootroot00000000000000#!/home/ben/software/install/bin/perl use warnings; use strict; use Image::PNG::Libpng ':all'; my $png = create_read_struct (); open my $file, '<:raw', 'nice.png' or die $!; $png->init_io ($file); $png->read_png (); close $file; # Get all valid chunks my $valid = $png->get_valid (); my @valid_chunks = sort grep {$valid->{$_}} keys %$valid; print "Valid chunks are ", join (", ", @valid_chunks), "\n"; # Print image information my $header = $png->get_IHDR (); for my $k (keys %$header) { print "$k: $header->{$k}\n"; } libimage-png-libpng-perl-0.59/examples/wave.png000066400000000000000000006330161475730614500215260ustar00rootroot00000000000000PNG  IHDRtsRGBgAMA a pHYs&?IDATx^D\Yv7{ >2d5&,l:GYђ4FԒZlRdUd9Y6+MLMx<ވۑ\?nX,JIZ,K~X)Tʥ~ϒJVJ^R*մɊb&B EJ$V~'˲ͻiۅBTڭvT,iTRI+R^!%Fu^2WJz>- ͬWw{b/aRanPx$iTB4u ,oW*)$R/qKy7Tz\,vZ{Z( A\,E^~2εUJ)'hK^4GyUҴT!|ḑ>VtU}2%TfYׯ$IWZͦf }j B$jPF4WB(bF`BSDㅴ -wʮ+Lw}DZLk#NQEY&ˑ28r^%BQO3`4Kj7[EJ54N{VAKQlR$Pxk2/v;Xi;z@11b/Jb]Q fj3{ReP{/󭔅e U5q@,BtsX "wNP) ɰ<>E%8021SՊsPrzy T>-E@?Ȍ]hP)][4HϚ vPë4U|‡1eH?uDǮFxAát iNAUOc5M*o NwrZWxȸJx~ ;-@r[&* bW"L$lŒBnLl8VD=(4^.H*#r@&"ChI^B ʥn;1붑$ HU4&)! k* ݘәNIKj 't{PK}x>F+QQbA@8G?`(TKd]y$dRD `Ua NupA-,oOWZ>U|_L\qI`.&>iXLs4dfN8ln#LE-R6GfP> ȌQ(I h 00`u*%TCBS-kwyۿ eL[(CIb&b&"'¾Qw$25& dH!;1>t4 #V~aEmiN ©h@/b8üPZj9)CYǘTeIt}I͐N!ћ2"Hב苎~ÙKI^@&(}H)P4Ke t5$#LFK_39&KyfDkWش !ѲNQO[5r9YH/p]St>G@`fk*Xusкj?ѯB7s2@ f@K΋NnjmzҨ(+_⓹:)d0f0Wr"j lυ>Jh Ў |]Ch#BlfeJ`d[aܪC/k@@ IuȈtpɺO364DFr1pĀK؀px.dRFU!T~bWR8$vw59=$O~41#2żp0/ p`"FqXR Edv̋ 1qEJ-KD 4}0Z[RSRb,wͨ Kd4a<}lcgQJ8^}tyBa fRV=!HEDTAj]YH `s ,0夘jOAN☺B'J &a]d xtL|vIX=;5Ѕev ЅcX [%V3l/8cCRw6ffG^ -1 FV# 4@jv;k7 d.U|ЏCVY)RuHm'Q 5em= a7g t5+_RJhJ-H߇0 b;^MA&$].]87FԂRME?Sǥ+9N_!01GA*aLYl3,qẋx%Cihyel"|:6/͗>v[_2_br%7 "`EN3MYjZWy WLZ3땢4WlzJJ{#2zPA"e"_5@ `~f0R4ኵ$TçAHԌt~P!I,@PCǴhhALLUƆ Xt T#:FJcQ^Ȧ(LхKLɂ1"hU>:qYJHL,3]^@ѷiؔ^ FX@U"0 i )X˼gĠ$|UۨΐYԉ?n{zP|h[(|,Tokp]1B{{٘aV; `]S C-kܩw&FXBZ3GCfAz#EpEIK<⊑ P53k evCLSR)Kkb!*#z߅N{-²ݚe}p xlj `ԥ- ndyfu̿CBh8>aS3Pffxi6`%;-ۿ9a +îqb`SEu,{}FE@R_hs(@X\'y4S?HT:ilyyc: ^>$2U@S#1@ Y$" BD5X @tJŕ4y2mh5)_ 7Up "LB U2&4-J:>-GqCp H| ˈ/F!# rPi9L?cNbPhxJ{, VFKHL1"59V-V m9g8M!+1\hv77 ]ͅaIu0 :3ďo'H^!33E~f 3րhC@c(uaj.Z'Fdu{zG6Ä):աm9Ft+&u86& exG^(4U)%t;槓Rڐ]%eO4\!?gg4YJ)&X2w0P I?ʁ1b8LAd.S1P? 8TR?*Da5íˮ|!y A%R7CK)Y\\n XׁD4 2Qa{41 BtLfZt%% F vlP`P묱 dCFs"KZfd攆2ҀI Ґ s(5rXȂ0s(cs Ζ"1ADȀ),S#KR4MiϑC2 9bi,l vgZϴAV ^LS NDtnx$$2y+;#1]Jq g|yG38z:E%(8eh9yM"`J$ .aI0CR'u$\a c9&FBn܉p|~B@'DxjZ61eӑ}H ^BHΠ+B.AUU{Oh,HU}Q .w1$N%-RbS.20D9ʄ2hJ #~x(917*)@zD z]) 9j`T6HJK$p&)jFZ-p;}i+AHN$-MЀL&&1AK[a,q,PXet~İ:O4ӻImϊ*F6k@eWjzީ6H69#\0s &41  S3Y:*EI/M^;\ Ѩ{@EJCN DtSXb1: 1y̆[5hWb)c'3x {"9,cL]*(ԂL1 ի,vJQCRK9m6Ix%SbzFg(E=A/4R"(zL=e&2|?S7tX1Eh@ 8qT2sB?█-qU-I1I Kx6Ĥ*EaqkCjRϕ(&([(n#[D%tQd^F,?ΰ/0u|O0k0rd#\@2p$pL@ 7/BD55PPjH2) ټ.W^.|}p(S0u]'lCX$aWCGN([K{Tmx .!|ګuu5HJ\)͈^UNkmpPH?%jL/E>gӫnбc-pGg2&! Q\`#N:Ky,ɨKeh`}gB/ӊq5"霖rgQJ:ы}~@iݡJ> ӂ+aw>c(OƄ1]XGy3O 귚+}dᜁa`sIyωəWjWGpV73G|9ȗJJTX%yf LcM"TB#90n 1YVut 31 `E @6ҙA 2尦\`RaQm@tæT(~vy!X`;蓉Vl Ee8irbdFWc/4JUS'ˍ`&܍8W1H']e RhppX5|\sQE@s50 z7?IzB4 Y-/"5؍QHI x!Zt-Tp#QD-vكS!Wd c>94?6_\0 3D#lϺ ,5l$2a+ J ,'7JQhuH뢇[sijZ)MRZ8{d j;$ $[U6a9)bjWԬD9̚Fw 3e6˚(|Hq{bytۥYy[St cgnW Wk\FTT?{_<(8p Htr4eS $C~!u2>C, ']"<,ATہk\OFȠY@傢 Lw]ǔ0+q2t-m:'Eҫ}HaP GBٴЄL\2)&2M<aݙNStq@̈́AƤIJgh4VW4?}RõM 4@vqulR0eb8/ ƈxUd zd$>zV$@,R9-!NTmDQ|?Jd" {=/NCғ+9e4\wI,>3oq 6Fo%Q+(D2"p^zQNF0h)g߀66l1 3P6WZhLH BY)לWYL8Q)pJ8GWf!d(juٹHaN1 f3BQ4]c'*G9g,ZRzXrz+FC0o:!j c n,`AVɪڷ\G~W/-yn%=10݂h  N eɊkV +J(3ob `rܤZ$GюAt_mE '| cAjjg8.PE_q89Txt8ts V3ţT/vCր):cA``q+b*MP#n۲FBWȁy"v\RkIDT,b1S ׈w {~au, 4"a-$&qHC@(bnBynJTDezSX$ICV{\"edK*͟8nGut2ܣWR#$h:iIݐ>~>+ MM0iAPi$M&z̼΍nDzzS0 䧂9A%U KهTmۅ,V930&:rbElokHW;t$)-5͡1sg,'Ӡo'a`2n9z5f,^+l:s@"&".yO< ":ʕ%*@FdRJ3HMLRaFǵB8|īuf`Yzk@]G@NHhMJ7@]}^ LXŴJ>ϸҍUbBH) nmFXĥ{N.\p)]ad/Ŗ+1Bp65 @5T O;@xAʝlv3[7omb_d ,n-weJ DNwrbk#MY8.鏞fYiFRF_\=WRWfI<38zo[29 ѭ__W_HjVi;s~+q6)Bؙ酈X*HC71\ `RB 4Q0db}z:Nw% JNhPP}F*DfBIC]!qeT1׉(5PjC[zCyQ)a)Rf7(ݘ5)@cmkE3&:;`,7OԔE)/ILޤ'c ANZkXȥ&YSpD"C77ɁOZu"W$|vpcۺTwrp U TW>!kYM ÏKA`S0m, fɧL C&4k74]ͺ/rc$ԶȔ1 R, 3p3k? [MasMw7׌XRӖ[M%rŵg>5“;tOKA3DWgQڀdR.V%#cqjt/Ge 52s~nZ&čH6+Lyxm/^b<=`֦B@O|`d sYYOwJ2ي[`8bWb`4 jOkcU(BPFB0H$H_r.q{e.[ugCi*QRtߚ׆FVG[RZ b Q2Mu*zB |\[$&Qe kU@&Q((=mSdm,'m'R MQT&mɨ\B^Idk=IBt-nZK&V2PE43a΋鲾D @9`hGpzPr(١o򧈢Eb9 @h3;'ozfEVL4/^N50z8~WOƉgv&L83^hx=kLqcf5]"1oa#l)"%S,(~\5\Zrz\R6+`&!Ol1l[{G 4#>U8" <,Jb _+>NAfŸ%zG!{?yES6W#vF8[]4CZ(.1P\d4axAfH]{8JՍI̚\DU y`.B)ùa=6n9q%L˴+uJ*QUi 3ݐ7) avMFё l%|n/ѫ R;SB\Sh&uj#" VjVΧm$VBZ `Bj>Ez?ex1-ꔇrxbj`u^"NSo/{ L̝t ktxa>}" jDPi)YM%rj"똀kM 4x KT7&E:9jr@$W(ȺYm:j\;re. '9EA?.ҋEϥ ~tG Yrէ7܍EѤIA3^,y̡N}frf,^0:\iCwɤQoArd,rHSH1$ujYKܗJ a<+ gI5 U2* >e2όT /GsS f{YAxȬtpN3$6 !`1mG*\w[ VHgPqX 7I8ڧJ$ ` '֛mVgp#BO*hYw0窂ćV<+VG/p!4mN<{#0{~ll}^Ҁ I4AZA@ӧ @YtdѥaC.";b)Ti&yЃޮӋif7sH"^|HIdiaBCFԆث$Y3K"O>2%7A1ى% 9Lqp܄Z Pd)k-l)D\@lKHnzJ%@ŬZ/,T(KDAAn$2`"v@$J&c(mEv;HMq9syWrrS} A2ӗ]4(xW;7-زi)>Bc^jTLy}Z'={ ƪ2]^Cl pd-W B,]+Zsj%eT'3OKsB71QOIf/ .H;bUTf >RۼhUmWϓ PjF̭蔌i*x|0DZ212+?ΈB̍ʵ_HTy'k;.7( dR3_]Zl֭i9O},b@(сW\:gՠԆBC);rALVbl_e0EV)UYvRIګד0uƕL\\ZtwЕ%a'0LcŔkaԀfsx497h xUyk_6&cp Do}ӢҐX0, YP=IY4{Wfq" īu@_%XLfdCj9Q6Cz0~ǽ&.W#(\M&S; a[@@ptXI"wR(*ldBW6 eӍ 9Cݤ.,[Vs*UM.wey6j/rG JZQB/&Crc/,,v|y͛6E98 W+W痧f?x ;$)m婗(mj%G$)I%^tQɻp߁dؼW;eCs5T0d*=+T QRKO(77*v!2g+TL$M@ YIFCP=.wiRqB; ldkKc7w:(뵪 V]gAD^ʵko}37nuXE! LAq~205)&&M0fDL Eo7ɹh3JZI }UAt  U9=oZ$+>tK9i$?-Gblo 0@^(tEC(ƃ #D/%W170e "6!1vbT @o>k湱ja5#V:UY8RJD¯I3vdj:'C:\Ie2h;LiCI$On#,0BԕrЕ ս0PK.p>•#j1К0m ?AŪ^a%*@6TCwX. g)t^C崚 | un!k8Yurx9̚\ LSb$a;IJt\ ZPwaiŽ{v]Y$G=u~Rw538nk^Kcew/`YXVK_gBuE ]+ƪY %i1hF@^td(k>ԖR)VjI)zx` UrNGRaAv(cXg%+_&m]^<~Kpcfj!V[8XQ=f׌U ` ѣUʔEHNi6˯:}~ZOйu3, dE7CMu܃Lx^h\m0򧢖V1O&K%Ѩj36Euq⎹7ɿ$P[и;wB?gNX$\3pJ 509=+f" 9f`^FbK$ LY45ax$&m 랼D@EA҉HJ.oQx ?pY~aB'Z=9gx~t\5V#~7U AOWs8G&/`SXh1c:ɢ֋o ~|&N^ u5+(O8+RTCz̀D)rzq=UøPt+ta;[٦ f&r÷ݰl߸F2e9X:|B3'S4 fzPБCr#ꛐjWT&T~S#=5ಁɍRr?n=1%IT7" cF{20M"Џ&G1e<7Sڸ|ֹ[oܺnvdۖFeEeK!vf5ᐅ.&o! sN @F~FR#ĆNB4-|@ 4tgH ܂d'-RS ּB`LZE: ^}2,>K`eĉ&'҈YgXPTVRa\{RFCu}S1 .7@pi:**&J$H`2=vZZm IG! RwKQtĚAΣA z i:Ur -En8ZE%hi$#4sq vW^1dh]n[4;9T7(GԦlu f^Y6a,XZ%=Ћzԅw@+4|6 .C[Dyl!v\cȆ,ʯH˜jwhhtlh g̺C7\_:쨛t:7'U% uo`@Mh,tGpx=~fRV@_qQCs". oFL iU݅@a(. JG8mHvV93}oں˿-3skSlTA&ldd%M JQEω Lsx C{5Ophזq kHn]Y|]j t}6 Gh[N~ɂL|1|]߈Mq qP s*b3A{P^9?^d&PL,e&JQ[J\#Ā0]QVrJd" u flݸ-4[G E67D3ȍi 8!ZBNd" d(@ ˔e:$U/&>H(&nK9%EF郀/VQ|{!)WB3ȳӟU!gT,TA(IR4F,fN.ܡAZQXW$ScScq9~KaK #DԞ CSpp' m̹Գ֊`J}E ;MF I-{8/ܭs@Ѐ+`EI0C*޵"mF`Q)>Lo `wfNS 14(P gGo Z0G}#ׯgmGCb2V'3 ct&q8ȥ 2)}HbkvM4~+F)bJW*J?<_[n]<6\CRq/@*%1Ja@m6ؙOT&4$C4Bf 2 -MOT55Un h$A ӤC Q82F ։,C q5Gh@H9&u{JMA*>5+E*񮛹nc=I2&{$(VEmcYt;BCm&LQ=SD~b6^X(+8v?~rbOOW7o R#)5lzk`a WxBplUnHFhIDtT R>P@U\6V,x/ȌAj1Ziw =;1s:o   IFǻ \ЌTJBY.%Yn59>:96Be'V[օk޸~M3 Ȇa]Sd0{ 8hhl`|WT+P-g%$ _ٷp\ûXVL_H.^P\ ^#yК}y8f4 //ɱn~׭;vXϥĒ"q: ty$DŒy䥸[pep!Z' f'>q-ko5Pw'{{|'z{6^zmٍTͻݸ{mnpzlTĎ$ BT*#Q^|n* Ѳ80Lc8ѡ4Sf<A 0F$A'Ɉ;n4%q5guslekuZnFѐ1ADonLx-}цJ,P{\GЃϕpR"Buh݀٫FMcsIN|Z Q"{0HCX"(իD]&է>(XHern3ӑXIӹ٩='NV9CU/pCx:Ekp(3p VeJ1G,&ik JX $B4ŕ$ WCdT-ctg#aNFڃ[`Vm|AOT5/!ށ9BN6fzxI(8x #3~=a 4/:r\VTTD&d yMn6j JL"#|=2L*8PɍUNN||2w .,c߁=o6pA!OCuBE[5`k˗FET\rDz5M׳RVH{֜a Njt dNdF(Z6J.Ǜ9 6{LZ UcpK˅}쎏Æw-)S q CZ)I •= r^!"U,$ݛg//ݵ5RmQ]&G͂)p\q#W8@SN&z_ja.AlcPQ(As8D3+'p;qc3:+2} uF*f2G)nDDglQ4"DzY@+xz^6\!xU/ Qʢtho4:tT;epn-Ɣ- iBߏ%hmA&&F=Z_pM=ϼzܼngJ)S~3* G:'Z21,^6[/uA`]MB* [?thMFЗk=RTժ {3)nfז!&Sk Ft[~gx;FG]3 +P0D8 FxB(1Lbsek%2W>gk[Mnۧvn0=>t>xNwv^>Ǿ;J!Q{ЮȘ.^^Ώ_y-y80ERYuqT^C(PStG@` d.A@"](V' ^l%;]U_ZJEZ>1CMtZkbuԋ-77Ic!R;G]Cv,$bLD>ǍrҨi9UK^ :c..jZ?}*I:"l0Iu #N+2'н'## i%B:x~IK;$>z` g(բ?RT̳U|!B1뗣ɛ2;`veFQܹN5gShX+~eNt^T$\tJsY^.;u7u#^H3c}F-aǰ/Cb %zwPi3^KVi8U# POO+l?^^[#I2K^@ƫRbJf# }O XM}RĐ@E*`)ڡJv8Q͗!-65vw8.pYJWNv5 zGW 9`=d qFhD<\[4 U0-72 TcA-,^zAHW-VVǸ>,qp7ޤ'{@/jU^X}J,ެ `a)BBxU`!˿)ݞE!6ȭqk<0#/8>5GpJOٶiz'_xj)ռcZAF|tW[3c9iZ_he32Yxgp@,O"yGLe|eprAL]^z׾o ck~r6^̌,xTg Fit3en'#mg&ڍ~w׺<6kTh>\1uV;nobnڃ\زvV__o_pt`HP,6ƑIJߝ %`P5d͘Y{~)96<9 ų#Ť fC^z MB%Ds2#HZ+MTJp:rj#t#f.pkLjcd9406nEnj'1G% 8VkK`5s&疽eDox1;-U Jf iL h0mʐ.R-t!%;`dLRELޒ;0S0q1Xun^4wy1_%ҖAxhWӐbǢag:ՙ2"OAn8T|aWL6܂|]xc׮LMfƘ5@N^dٺq,Z7'~N|6Zdqdv*e7x+GPy4IcQ?mk1 .aݨ]U8nx*3.]׿QAJOv򜟈?gd>tpN3U p^5: JL abS6¢ B71njǦٵ3?x3kl^si@@I?𨺲l;yy ~[z[&J&' U)[Oxk#fLL)T1Yn[W7 B" yL!h[2>( &^$aIWҷACD vsCX;;Lgp!zF [t=rvm~Í[zdwluGqRj;5 ڵ3< ˅Ǯ<􉬛m0+Uϑy!)ɵHLU!4thۼ+t;l6 VY#V+0E hP:JRye8WIv@"5?A~$hӏ' 1}Ǩg"ͳmڄµx0`@5]9&xHe̴! wsPn1ytեŕmk2}X*% js>|, []K$\ך1 cפss:]ܗ#}*31էM[F*RHGQ-}wٱ m<Bg |]TEY x.0#9V: RF(vV]|髻oسoh'OăFz0H/am qW{e4 Nڭ=}޼}d+<} xmÕ*Vzy l߼m릹s{vlOKWwl7"e͢y$Hy)#\jB8]\EJ鈦BtN[Gj/9~8>Fqmzw["C*G`:z1a7$^#*1M)(_w; 5@ xbUVaƉNAx Gp@~]{MF6a`,l*v(ahBK\ EC>$ϼe)k{1Fj<z1нC.~/>^왪CL RQ Qr\磸%Qw$SIhq"BQ-ֺ|op)+ݿoӆ5SuڱZݯw0suaeyq#gD#nTGIMWB"w]t[CsgG#Ͽx_=扩_OM}~N tj -Ԏjc.@B41> mUbMIm#f@:aS薆'rs~N^oo[3a9K+ zSTGLR300**KčU~η@ Ud"S B+MȩͧWJƳ}7oضnxxw΍N.-/7}п/~s{3kGZZ\h)X7#W0y ouy}7 sRZnw?O>gF\nd4 XBJ粬3f؛jat x4)E:-6qow?-Px$)^8!mRA#FamNpP?²*zFn&D3Cr5>A"%@p-ĬbE-Q&B~׿ʙWv(Nʼ~szk3-sS_o>y=o6ֻpJsL<}\'XZLpirVJS:=ִ29g0Ҿt3Pk?|3޴kpܲD2.DL4#v5()AՂ5s\ K [G:|o֭c߶~ÁfN7n[ug?uwG?voۼ•??F=ٲqA^>p_cӣYs%igZaW^>xe~!|m9{M;"sWXj_}tr횤\\^^Y|^?vg޸strf^o1ERjug5W]OJ?'9W~`"i(8OxFJi%="Mb#j#3 _:#&enqƤu :&+8t,d x /ҜͤУ~Pί~)i7'LPD>NS^P"G>RUr.*U٣1T;gVY9ALNë ۄ獟x6x\<;*)?vT vG?BN!рP[jMQՄBWZK=ѓyرٽ7mҕ닄Z~݋7ύ'ёp6Hj5w=wߵ;?zut7>'9ݰkW:tfyxtvL99_Y^?;j7N_z͓C剉kKvo8qC=.>ay5;vM+K [fJ3 0#_I4.FEAu#bMWnxċ8lnaXy@Jbස8RtCM0 Մ}D{/~Xiaʸ8%i?EL&A^0\KŇ}Q`;̀LY (($Ι89<+-K'`Nex5QP_53L9 ZJj(! *Y  "\i@& 6T<:d"KF˛ޅkkDR_ʧMp! Bw,~?v޹[f.,uaNaxW!Xc~qW/,;t7ϢpqwCc:d΁H@ϐz1MC*ŧD* 9?*.bT¡![cJCo?zK?ր%Y@w 3߉ t'$J(]t۝R;-fݶI l?.%tY*ן=ot >Ɔ8rzfnM;kWNJq0J6MOKO=s>uf~nnrQpСTSsioJ3Wf#۳}揿={wLU(wl]7>6^ kncsݹ^o\[Yްf;{7?w{go1zNw۔ɶ.[ J?+`L2 Bׅr}I&z(jNz|d 7EXK0JdvmPa/aQG m8}vw\d $bu'{Q9D?8R+D"\& o:J.!&P]0ԼZB``.Z^Dć7ڌ+ ęZNAPh#i2-OulH/NqbΥcE cANcn K%܍#|2eRbPZM ˿C6pu:@kkG[>|꽷l @]֪7kRV vn;zb]?= /'WB̋VFoWӄ)a IT53mFqE0#;'XH!5sX0hM{gA+LDN{!h(4(_ɫTVFWO 5ȘN(wq]x wiu vS~ͭzm޼v5./o4OZ'reF5nrr v8+&1(.<׋Q[  E*2AFA1Nإ@zr=<} mj85PL?VB0*Ѽ2 EW&`+o[*xw9lUqߠTKT-4aBً[Z!8=/]oաG/RNskkg/5 jvr}0 +* +ÿ&9A͚ZKeMY#qNWݿNBȇDBEwG#X"Wүޥ%ʈjuS_}yuRJ3_)+܋@G+Jq<-=k׌baS/][ݹ}6ɟ}[v[jmP?uˍ\*Ȑ;=pޭ3~^X}wrSwn{Ňx};ׯoX?Ti>{-J]MeN5}8999]{}X^;igy&(:([ƭx>DƋ>)%n[ ]F߯r&kկ$,% Ea  o2ӣQ vL+@2`:>wp^B$Bc$ڑA611<3\1 zZyUJ.Znz*U5zSCXd VD6YtVLͩ*Nށ\o>&?.^HZ0pqw8~ׇgASᣥeAe"s`{ ]j2y> +>JR:m>\lpz'2>-5;Q& ӛ&}qE /\NTk%#9w+H%S wx Z +[:2D4x4T=|OsB>l4k^4x?|O_#`tj*ո ^0:G"ʣLHh}ݣ.gNmc)*/2@E)SNZc_ȺV)=oUVŦ kܸ-)䫭:Rpqf涮귞t&zՅڎ SϾijowǎGCcܔ@*UVV~|oG(c/W'^޵u홳y#?u Ͻvڽes3~ܙKO۳+ܽlfݶaJ@PL PMvjBEX/6yYEqwiY@JQ7Su;m"_SN `D=O~Dgה?䗒 %>Q}탃L d(#0\#>2mz İ#HqkqJ?/̠WHvUəQ^zI;'5N>3m5))nߔSG`($Is0 U4R&g~3t iJCc15 ~z- n#(v+29?"Ჿk?B;kx8 )vfkTkT+N4j>25 QuY W,]>Ҩ~mˌ93LTXX6E\ƥ$b;IL|"6\29OF'wѷ4ߨ7荷 -':?!c9izqQp7s k#5U*1fʹK,=Gߺw[ɧ_9 McCsft:2ڨt}7jC߿ ɏo?_kDK}~I99u o1w|ʥC篮LnY7mZ;~=,֍?pn;w[Yl-[6nWOyCX#`)qp#R*ĹcЀŕJYIQvV pYp|"]Jf@)ÅIˋX DӒ'躣 ?.WըA:$5+9򐚸lfH&~'y8+b+W*C$TW򋰍gFtGb/11&GdjcPR9jK0I3DZc3Eb.  3x옾?QxIsÍ>WEpLfwpNOgv|LZ>|raxZ1QNb2NݸHSꁓSí^ۻcutW®Hmkd,Qy&vg8oOژ(30H圶hWoOپYE☃.q4tWE\U4ݶy ;O9^~mf8k7Z{4M*Ќtsͱw/m<35~G/ۻ}w iR_o_7>έy=uؾuѳ7ݶn5[wmbr-˵8:33q:ui_~͏>«g:>(k)diώug,=ֻlzen=6㯾=ݞ_,4^ J!o:j#*Mf.!AQge76_, Gm5q:W24H*Sr<P@™1ޯT}Py^֦r/qJ (d BEgSQ-^ϬӢ{cvC%ϩHgIt?dT>ǖ{􍆙 !] ,ܥ$]  Q1). ,KժS(G˙ 7򕽓|݋K~KoUNݰu|%%/5Ók&FbcրC~7CGO{Ɇ҅D͍ VNH8TG*K]$H֎@ӖnbK)es 9WVWZ\jw󙵳tH$?6sKE3| *Wt݋>wϾqg^83ds'\[ 7yҦMӌ[S# N_S'Gt8yÚ{wܹ}[+'~u|4bJwמF6Ѩ:t?^[l© s'O\ػksNTlDR#0Uxǭ;ŋ ח}÷}wY^j~O닗[;95 (/<[;7ٺq?{4=5|{77aۚSiԤri _ZX FyN IFTH6RJI3 //e maNN+ZXM4@ x$58J}ؼ@+sӥ81]8 Kr,+&h Tj2o{rulHRVAnЧ_)in궖Vtw"EdZЯksax(Q ~]fgT!6M)cgϏHUG2;o%a%Nus(B L35]:joߎ{dlk7ukXhđ]_nV ʭPJJZV;;64<\<mv^EާU@EEpYLO`@ $6&ڌnn$ǖOqܯk~TC6mX]y ,P ~ Wk&o>g#O>odldpzȹٙݛ+ɡ*Zv}K͍''=p}qy EZU?re֕^7n;xuS&֑9bs 텱ZbcT+.wWW]]m7OG굤]?3z΍o?'>LB۴YuK>}׶m辽;wOkVNLTyً/^[ݴv7'VէC*v>:HO#k>7B8>Hg/.zәG~c疍:SgJ?#/o^?ܨ&7ݸK8UD5f&~?FH8wĥc'.[FHBӴZm߶ѡF^_}C~&^gfzM]?]#U+.o",}'-5GɻKcy}HutncL0`& v#D@YSn{0B0J N5Al9^n '2n(" Sɭ<BGvjw8Wam}Z$x(YU(NWx Ϩr ՓK>\2^BR6w&('eB8yZb8PO4GM"<ja NNjsQ!~ZўS*qNummQku}Z ,'dl@~Y鐞AtIyW5 "/З[rMlv.N sz}Ii93M!&9F?D~,ĹDfozAkG&b7a-UmY7uj!O+= xۚ'>x7كs?{l|Ƕxօ[oٱm6|[Vퟺ/õc_?nW[n['cr%@#<}̓g;nٙG߽xA~ꕗ={Tez2\-_g_}x-뷮ZM+.^Xso<;/vlߍ[\q, oyǍSӣZJOo~7>{_x0zv^JG˕[*Ý8ˤ`)duyȃ X>a4%1]qbֆܾo: E.{ <"ʿcdm,szmpnkqzm.1@n~.Q>T1¬RKܶ'*),ӭ ah vslFH`4EdF0A!xMiv'FG an]> I&r3B#F4&ĢP/6/Dyrxb㯿Qӗ+j|o<'.SG(~#4tHcC7߼'׍\[hTbז[yBn];=Vjp_?ʏ}np؅{fkv~mq׿;f&8{=7o_sk}?}'Ն-xGPo& "\hX#ޖjhrT+~Y\Ыq<{zWAJ0mL|iaD~|B8:bCxUl P =:=⹎E-H"gr$J)m._)V+®B+~O#W9^3spuoah X~y٧j+0tz(ʝV !69B4frL/ C2O[,;Vv׭GkX!G+Ik.Z2Hz%m0sY)"!*QO_ytٟg̶dUW Zc\3 -'5l"yP9ͯ}p޿vvj5^9xÎ 篭ڵ)- S(Tz맾+ͼw{޳c˥({Wo5w3{wmڷw'x`/_޹~%%lS;r [}V v&.% 2QABul b;ߕQ|{X }@ cuQyə ERdU'?Eb5:hcI 뀹lHFK_Ca♡ *ۣ8pIL ;KN [vZJP'K\#?+.-37Uogra(pxkAx& J{4T;-0% [Żg8*N1 OwR]`(3٢;a$Me:7U;;lG,ȉi5杔ɝoʧ]yұ鍞Crswu,V?K Icdvr|:d;sF@4jӉ*e+;x4G$sЙx@5X0bpYJgb/_i[=7~(7x7Nuof("B Ѕ0)!& hG3J}Ldצ)d߿-S./8tfzyrOnڹŃO1hep1pr۾W{w_||hs/eHpEˇ!\eDٳ Z&拉ֿx0l߶^,C#MGί[7=7T%7fZβ]+^-?ѝ޴k'>x;9seז5Ï<h \ZTٸaW[{6 Շ\tzu[OCD K6+{s{ܤ/PTzR:Y:sCyp<ݭ -a"" X7UPxDi/`I*bA#sa(Nc4GCP()-ꡞ2bzt4M%|vhw(HtJ58֏YMTF ![=ǫ'^;fh8WZX"Q4G.X)Xh-P#(;cQ6&g,"*Wo>`$ԚOuk'L)hZb]xZea.^]Y;5XHaR;˯/C 3J|ȻgU+=TYg/]IjȍbCH2oFhT.]9i\3A[o-r_CdVƫߵn[`KEˍh䠙VBG,__OpC'/{6=o_=M uݳDrqP293Vnw^U ,Q^$ |`jffԪMؾ_jܵ{oo.vԉҩY'k'SǐPP*_oى፛gn'_Yh,ϯvnq @M'rRk'sH S7WW&(>:qtى?5[v;yp;rv,}N8r Q%?xǺjlxB4qHK8*&X3&뙨"0Ws%fǏt"~wx[#k> _D Ә|pHxu *3Yg%ēWЫTys/yH/fU"ҫ\nޢPk4Fk8bg1,1{_KuH!2 ;H'owy"qJ 5eXroo̼\mM!BB%4Z:6`O3}RZ;%sJ ³TF'×KR3W>*G*AHzm\\i/Փ[+ JG C]: wS?O__=<-&Oϯ|}7VVB/_%>۝?cT Op4%zo#:03h u`*XFEf4 J#,2)=⪢dR@%~g9t\s"N6{ &sz#B)30gZz cI :hަ+2RڠEڂ$P/a,D"|0]˅ K:2:3<1eklө$3"k7:*}5&!t!.|&DC(,{]ȨG趒R&ImkUhL~?`o]{,W" vnt-)W|G=pQyPS+$5+(/ˡ{sR I:[;breVcv}FO$RlU͡ZK?/=3lՁKWo}%0O|W_?u[g{vo<{n&F`O"<>t$X0rP{myh 1(as;G^8OؾW4\QOC}! CǥJA26&"'1]->~P-[^ZyṷO?{Ϟ _N_\]\jT_zabz7K }g>_%OkU:!_߻en|KWofm}<J;>XV%1;Z3 ۧjMvl[~wZh'gF~ȫSc6]]l5Ƈ?-iZ Ii5zr/'*&0>ݩD ߭m4/zxÆ :wku7Y -"tʕWWjTT?շ/l+"; R6$ ""@[c ƑRB6b((yRZaI\z5 焀 c!=0V3.z})4}R&|UjxM3 xe0b& Ig-1Yng{\P퟼Űǩѣ7S5iEm#6P-$4Q| Ԡ 9?i "IL?QUOͨR 1xZh_^6͈k.nWÔ Լe0,ˣJɑ=7B 9]KNeܻmԨKή3ަiM^B(Z"X/F oC^g_g?glpބqT!ʑy m l ] c{Y1Dn}Ӛ[v|Fap_wߺk-f/k_?vGAzӯv_~^>:w69? _]N|isn{:y*> pnc޾>ͻܺzn߼(^K[NݙS/^_t#pk7WG?ph#Fk~RBFRZ3\%J;NM7w̺ug?{xӺIhB>$ʻ:7JWV?~J{^!Lˤ#dcW:.*13?JbR=+l/L+2/Y8#+l HѹA,E:M78:FlC ~t;eyq!T.cD::+U wG6|-JYH3X } hge%ǧOM=smb~id*Ӈ1KvKT7έѓonX;ʲmyWoq7m9t k\﬎ I,VDHo%hfSAIj瞊o #-~U|n] AXZ]ܡbk _A94i2.5f׬߳aw[w:7;N^Y7IG޷Ͽܚ[GN//F??s+ KFAFAGn/W9? 8r/.ޯ~duIzDJ lf7V6O_]mX?yryR,U]}Za>[h6_ѓHgʅ㏿kyϽIp߸~(ש2l\7;YNjixw4Fpn/i_}ȕ:Ow7vÆoFU8zL P3L Q>Up\sr߭pؤ6>B21T`eW8,x1IX(|+ rHZ#Ӂ+UL+9:> ,R|Gh),8$w %vtOSQUJӤ!nkuj$Y!y eG2 =|*vcK|UB!kƞ,D.xY=xI3 =)~eii?M3Z $scȁU: (BdDZQ $Z§$# ߸κx?4qLHwR[fn_%o9{ymyER>?}ۺ)ɋõkҩsfz^ 2V@9^Gjxqli8K+6gEi7I^ ZjZ vkR~KjA~eߠߺLo+O~hxߞo_?<޷s̙xv_MnyǎC^`?}Ӛ< MfN{?j]̧գ#I;'~RvfX67=K^R^bDU^kTe+F_R}_z֑O/|t6S<=_W Q w._826:Nd2 s۩HF8Y_XV1`vnø]׮^o}[Y07t,_gom-nu#/3YM;?ux'Gk6>8poݳyƛ|;K+kl];;GĔSH ؾX>W۷o_\}S3#C5r,@6f ext{1)e!WzG MZ\ޡW<31l%#y.3>AƠAP:ke0!j$B% ۼc JbJR$3ZF4湌E]ë7tn %A$R)E]U" qh0 ^^|,&J^4WjPwtVD @!˻bn@v125lMB>>mhu_=[N6L_n V7/&sk&s~yív6:T׫?S?xMsZze>1(t·׮O - e=77 W&ƒ8bnE-UwnKѢm8@o[PH[]m<}!{D,z;}Җ-jL'~7OS9>ua\p}q#?uO?]>a^s/ݲýn/] juɌ(fڡ;wˇ?~Ϧ_;oܱe͋ova$L\QV P;'tc={o~uӤrT3޷'^{S߸ :ֽO؛'!_8T߀ gs$zUGw}D{"&#v!6.h`^^͞n>(J8KiB4h#. ^'ޜrZ)VfM,N bފ  1#&N w!s8 lmfoDG^N4_:4MK%&@_pZh^n IMj,pCi4<[9]EQ1&g)qbjD`4uu$1M'y~~ͣpU3plȜ[6;wi;gό {6^zbH{XƷԱ =/v ^0!}Z?zݷ//V JC`FRN%63b:1Y (UIhL jZN#>wݾsw޴uxf/nzss׏-W?z;hyh/[wƧʻ!u\Rħ8m^wW&[K/_uf7ιż! C>CݱKco>>T&Ha|yw֍3vm#/ݻmPmaqX"v^{M6pn\֎y[-ڃm7Z[j-7<9<]<{'OO7yGO̫Goyw&g_멗۱.IBJƺ8(E0t؈ƤkO)F@iv|xL&3|;X3kQ|)ͳ|kTXDx65"TKG>HTvY^(.pxN2hyf<93.6 g@̤DR)[,[%|>$[dD)1 DN]lqfvr3:CtW ~*3Ҥ$ZoAmAj뚽)K.+uyEz3e7"'Ccyr  @M0&cH nAn+(3V"Mm73UyNP,?c(߸LΕ;?׆򭱙wBҨl@pD33&ZgW2{h˾ݽU e%\.+5=optN3 R+'bQ&1:P'"i7w dXfk:Oߐ ƉPTj 8!j^XolY_O|{m|Sz/m>W&Z4-/o=; +BiSu{wS< 7mEhUrbl5M&il@3y{ ^Y^YNz;غf`7_]_#YwcFΞq6Q+1W߽LsL]Mla5qmk|l6Zʇ59## WP:&ׯݫvʽF@#۱ qZkه߽cSomn==o|旿Di<|j{Mԓƒn {[@dyTOJE@ Wޡ°`@g FB+nb"[4J hXrDc8 6[",3 gGd9O@C\Avj\.UrTnl@Г4kFg1""0(d׼ w \)u&)jM-㽈Fk@@ @c@SPVq5K;ïDtVC h%<(",IIƸ9ŋ8)9<##=Sh¬1)jT>hW26@Cn T+4i#"){[p(+"HI?R^JflmD1^Fqy=O>PWf_~꾭vwǣX( Gbm  QŲNӹ?vny=HPa:D0B~⻲Zyc jpUnQy_ Ym7 o2op,Jgћ^9q=ىaOzjO<_Cr]zvd$>O߾0=ntyPlMc^b &\8ecB#Ylwi<3kU*Nq 䶩 ̓# _~u=߾gWWoƺ݋㩔׆Ԛ7.-;Y*UW޵L:<0s?GѰsXo[tt&[lхBy!v VٕN:PUm+K7Gvu׏ qXcm4z-^tK4uZr MT Ě/>7BtWqW~XZ$H;n=k=C[?T~Rİ(EJ NnL@fi!h4;@(-.1t٤ki%A愩jć(-BA~-k`1krAߐ[uaQ:UP4t@'56 ~d()h mk^ROnKUFMj9@[q-%UAH i"T213Y >:$jm-=&iBhTcY=[1ą<!^8CvVN$s>؃ǚ=ч\._hFBcliڿCˮa_vQR(@fE/!+7c#cV(q GeeG?eйdO`PB#eѠ\(N BSWFԅbLC}?p15we 5K[˅g?Go]ʖ|ᚺhWbG2yTQ&_MC1_`>P@$Z[t ^ vwC4w7VYb)`8=q)X_Ӈsm=rg_,^}xinknp4n'mnNqRZh wu4/&hKMH7ΕG;]ݵ_<|׶u$yppr=SwCKlqښLY%˾6[gPwfv;m.ٕ ׆g_{CooX!O܃=muSs Jykjw{݃{i2BQ)\q7`Da  VI.*+U. HlCcl qe1 C`E*F%7-WSYK3Ԣa KùZ|ʧкr(IMAU̙쌂 DYE=k B<(eX39h*3*)dr@ `xb{ 6Z#23n\L#:USUJ4Z&kv*$+[>e,͂!m5:+ mQmWiDt<"k-_MiI4:2w?yo"\sĔEL'Zi=HMM:S ˫ GLB7 By ϼ}zꪘI*pXF 0ϒى$ m4i*\=um`iODmw_Eϖ$eǜ<ҙ[uIIL._Բ>gra{4Ks\ R XʼgeStFj''~{Dw.OG8uos)BA9-SYXL;}aE{mjhфfwT_[\|] 5 sK}{b-1=)3\`&WoN}*!}a[E[F| '+8  9B0 5U?\n ɣS,{3 V"E4 Bwzؔ9&%K;Y:4%[Ks` "FyW;zZM(p CL*Bj&lZ[*3& #ռ_%xKaA\Hp-MxR$` ѻ$ASI^#Q:*=E0ڨB)A͡Ue[(:!CG̡vq94N˙={5gs`@šX,h6# ژC޸c7,|*N(/3W)?k)Mί>TW!*c^/:'Ò4 $ؖ|DH( `a\_ЎG(4[YO?;@.QӎO>h>RL:˝!L,zio #@Y: @5/l)ř* ]Thx?ޝ=믮*rfa׏xupߎPjhQ1rw!6D p=oSٹ~uC)ݠ^ IDsj 0+(Ve"BHF/P~aW*܅PLssDlzJt(l'Ugcd1'Kʖ0YN>JUq2=~C^\$c$UyaYP`ʛv-Z2tjY0 HDC~:J6Q_-C+~K9p-SBњy.H*t(jzzNCY\^CM,W(|t}֦joa"vKJH@6.c"%( M{%< 'qe -`q dŗN3Im_.Ah "|偑7NNuԨV_Kފ&7O R2N25w&Trkkٕ%)z|Gfiu%FDznK[eYL}p[אԙXŧ/=ӷ/h2$O=~ڽ]_j9O"Fިnڽ3s+u4uFVx܇|F&h^sFFFxR3COkh9s`{s]P, Cbym[O녻m jWg;b7s;{{[ͱڅwM/ZZMUEQOe(#PT`vv>oɰz :Cۣ}xbfwf,RNҜ74AN &HuA@'jm+ %1MHBe}Q|%`BQe/J:Dp12YM>/53. ρLOc2 QqReXr\֒Z.\n] 7?B!FܢXPko5pƱL?Po FJ!M*FmAB]X8C:²ȔE% ^lC47$rnO̾4ѷIt ^)E8J7e!FP/>v܀I|uYJ`cKfm x~K&2Yɤ(A+ tˏ=XPI7$'i? olֳrra}dt2:JO\κ naSsewZH..*x>" hJ:?<\G_~z7{`eE{wxv[_iʘ'z򑝝n_:mosy-Wo/lj [sKΦMu!=` ] j"K ;?;N{^}=mZ#u[7cnN/i͊H=R  8gS'UP%@óu4f5؁B-԰GQA"SB}ؤxJ^+'1Cl"Ę(4qhDyK8:1Oʼn;AO1ː%Bs 'yRNKBTЬ"=TK:U̯ǭ䵈e tu!#N#_ Q)MUOH業P `)I@d1ΤAO8 -nC2TKԲ`[ aoz>+F:F7 n-8Rk}HB^MNW^4tr m6$EQJH=ƀ`7t׊49 =KP2eˆK#2tt} %`^%T拶d%Z-E8燮 #,T;^SŽH)ȑ-Ơ3eO^_"!ѡI){ـ;h}汝#o]X]\.5 }ݗoLdE;'ڑ" o}tZn:[J QqaH-;W?7?{V~eJWtAiBT=s#KJ!/ot76noo|cuoԵ4L"1;/Sh)["1 ؜Q/9I1f!VKDg,zYZFH}QP],ArP"Cv0d UabT Sj'|osu1bRC8_k14\_>`[WKU(HX52_aaR,%=R2[6ڂn)?>1NK$ܰ_u|[qh)*kTp2&h83h$_VX^>tbBُr)B|p|bujfk H bVelΟP<5x&ڱ._Qs|\ZXwi(=J kkƲ訔68[ܿr0 G!7jO؅[ ݷo!{|*7;<\XC_ޢ \+l )նK;pۍ?CPwS5Z[i{烫;js>8pgXۭU5ƚŹE8-6TUD*4{aq=̡͛ڎ}t2XzcјnU/ޅwd4-ڍ I7D?jZ8n_$躅as*S?.]oZe'`*Ը^B4+$s4bEwCo5tsuxe ^L! ib Ir \ :ӐM 2!;r%'r4f(r Ca +\[H"rTIguv@$;Dye J; 8!bAؑN&2^(?2Mt:/?3LS0:Ki@b )NXoFUrrlն{?%PBJxS>r}`Xl pb:)@ J!bJ, ݕW?s?^S63ˮ(qsLCӨN(xˡ= SbaH5iv "ti@OrUѦz&Dz ;v5܃-cЎ,Gɮk\IH~ gl>{~I1"C5rZ߼6+d[eRPUp9j8s>Pug~4G5#E hTgT(MM_~k/;7886;6>R p? :O~~vv-qcxW'ZIm[N/ޙ:qqpdhM˗&|ԕm |ȱ̦,%nv}Ķ['&W2P4 w9?#2ZRy  x=syJ#D[6ČPW@ƫ&W!hIl6X! D/AHȐOIjv_ɮ AX3h.*SdbyAhHsMκTayPy:J@%KǽN f60QdjW2M+l^[όB̳a@##rrn bp=|`]p8$Gv<GY1tPԱg&2]i/-=5z& R@ÀMkULKtF~{;ZEXx^:>_}2մA,mC$`!l,TL'7)G:B.W|/ aؑbM}uyukg"Wtf5gBTF#+b&S\__y42Rj<0ʇd { 4y*;;.޾0=KmlG{JC e8Եk[LW\8lhDX4NX(=XO۾oO=;wlƟqLw[W__R*+WS75 ɻ#3Eģ|x~ x}]Mejm=?{'>w"T gsnO2S4NTU~ŵ${**LVGHUmG椧PhE~fckȌehY=8%Ɋ;TdFS1h "EFOPt@je^2PhdT6sI 5΢~#%b>2eӒ_s~H?6(L R56O'm>MgI0=q"^P(3  =Bt #QƪŇK#px嫛jDBnm>[;Gf-M1Qv]k39GL:R`3%)̬vq9ť_M,_Y" ]~27O Ļή${7EǦ4-`Hғ͚=G%ؓ*y1G%pRK!RZŚVpMWR]{+BL?IJř{`sk]}|tzu=["ê+֠:rʉiH(^]lػ:O^̯,JZ굓7Ү{S>sUݹOx#_}9+d_05RJA bFڏ|tuSA$L>L/SKx="Nؔ(<ޚPUV>ƞm]\dcђ|g{S}4vώo͛Gm:~nmusOOoE޹;hݝxWnIC9J^8r-onޱ*ᅻa;y wcZ Ops87ej0H2!%ȴa@GW "ej϶ )xc\36菾ƭ0M.BZ!%b" j0 n8P' )C{lܨpTchY :!#% y\) `8j]f4d# E{Q~uny^$? 4W %~DÎ>4!,~1|B.$B@U`prhOqk#OP#@,@M_)Dfs .@kvd!=vģ~=_Z@7T:C \\4Hh4x |Cɩla]μ2Xo ׶Š؛`Hh F/ p)2ky{y::NPkFxWA+o>__Y p*Tl-4D;hHT ڀAhU%kht.WC7:s^75σ#k8s"zJ?3W&۶w{{(l(+,;tsz}`vNVӏڹ؀VJ uD}U3zyui#RycdQQUvoZ/@n/pcue 2wi/X4;eB,71b[ ?4Z ݈($51d,Ow VA4 ZVʥeG7ڊ%= 5QMU"ހsp Qި< n+Vp^`a6NZ8m0hËe&"JJ]A0y/!Z ϧ>Z%|ciH+^Oiӕ4vHqH5CQgLNJ>h-"mV{*F! #YDFih6h6{hS. щ[|";(|54#5es9w'ʝC §Ě䅆̱j]B}ًL}ߛ+茮F\GR ܥERZ_=v9.!o1L!m6ûnͥGo LV?xs}MM/_cXpm'm쨉VLg&H;0 `Cb*f*[;{t| Jр7?sIHl<}XTUYm^*.gr\uC +嵵k~P4^Vr>{kxhg?/z=qq掾F4-\Aklfuplj{_Ww[f\yERv:3795-̯WGߚԃln9M]-CSow3}ĵ}Mܮc"λ`HzV yuwHbHx'l#((xnQGrR\"֡riC5T+):S =Jdq`W+HSn"`Q7D(JX  H! \b>P !;^sx!7*8!E@4Eٝ@@ .L!ijW㕵tVe ݠدIGWtT1o᯼Iv\i)XD.LrKJ9 $:DpI)`E[-~ǏJxQȧNuE: #oi]J5M!6*?ARQe&;i3@هwt-v4Ttw|pǻ stqЋ"ZoeoIPP)+ ¶Z]j/[aDzr_v55)TŸqv`bO>P}\6|pwB)W75g#wFfф9VT?W?ڍkFn9c_\euj.lmC[&o̬ Ὥ_pX>#P4ZBڽ-5H&+x.'(rz,b|PYz nS0@.A. v@0H%%{1'Ia۸'*[.@(4 Z\$QIc4>;$`K/iTӌ=BF*` ZɖWO5 ÍزT_$;"ƝXV \I:`P`vJK>'JaQۀ׌NAȨ5r|VjG%+Xœ][f $vݜ4CUnZc&p|G"l)@PjP4,©JP #.F&';Iɋaⴀ]$"g8co,^-R,yeS$co莾BX6"n+LV{&EP%hi`G({Q/%S8m%uͥR.оΆD:h:}3R:֣zޛ%=zx|)ۚ?̾ɥR+5Ck|>XYlZzlsDl[Mg{Ktv_t3#t <sV= W߽cWMW0M1fW¶XMo/8yifb"cWC4VDgy[>lצf=2v3g#@884<{xgۺ[tQ% `V\0!+l@Lct)T-.'.hdr@%Y4b5e1)=vLmE|r&iݳ'c21 -]q-riOJi=eWeGz _ #$r@D?rח~UTTY s(zc0jY]shnݾ=p֩{JW.L.<7:ZwwdnMhTTcሿ 报t.09m$$T]'N_(͛ZT_Z!OyKnӉ\ DC~*%=]jBR)՘"#S^hLW% R-%M- ZD#2j2,h zlVif;$h#ɷ$W2, P@K4EФu_|ϋBVFn5;e؞+%OB)Aw)P T#\j.+q dD6Ԭr0TCn!n0y_*dR"lfɯ}mtάāt~# anE#ah CE%.YLPа vTqg'G<t9l kUqE{ L啲J.m3>@cD98\gVmDZK҈fY(|:`eVmM,Ȟ]E(P3%sj,6j(ZGYҔ$;J|| e|蹲6?[xǦW/>S]]*p} CuuUL!Tʤl7rV!/D'zXRGIǶjtCgt<}pc)15U틏/8wWKAw$j{[Y_P7Vq̃p$/=;n~\COQ3nzs< 5y{EB_}}p:_(mj˥҄;;رT%X1/WS3Z3/zB/[kg3bQ 8P+ RN So`F)S. ձ'v~?M ܣaιO^10}[z]U}}M#˩d(C,k ʄ`UM٤;?ghcn78&69uS[}׾[hlrimnv;*f32JRrkk}w]Ĕq3|8?ޯs u}{7qXSMbTCq*CAQfTy#S1Pbf ٔLTkd1Ā AVR$8)>IR)qp@[2kʊm[gؕH@&$'_Ir> _0e^ BieH@pk۰H /ScXH)oಖqツ3AU۠'#;6*Z%s^"!w!?Pkn{dTi^Ȳc~)h(Ps'X 0 d4(O sGE7]ʹeq'XL@g, 4+U=2x;kǮ\J~jxh"۞z`DhN3Vb8 o)钒Nߠ7R-/}MtCtTOy("CQ4 6-+;BaP.-xH%`gΤ>% \u$ӥ[_|{}[Vu/}꾼;{]KZY]͢˥z  IX}Ud|!Uv'5_],j}z2öЮEmsv}&9Md}2anl OF"tF}p/Rh(\-Wfۻehz{KmX4WWs⣫#O<3bc!:IfK?[/糥u,٣tȋ j|p`{cA_ZYxζWv"Vʫ=dC1c3~/4%zaʑRa8Qg@ j :Mw#y-(",zYCS"axܧE'#Yʕ 9"DdԆA晋r3KjLjW(-ոWU"-I!i'+A̲DBL`^:̓IEB^ _k,_㷿Zױ*ݞq/-^;:,2+[EN\\MH ={Z˂(|xtDQ5ki- `Ha4E@IBh (Ї UD cR T )jw0'?‚[cv`NE t7W>@Ct;AK]x{g&^zón{uw{yKݝ+0qi*+=zslֶ[ Ly#By=99BԃAo<e+{旓Gš喸̓"3T^IDAT_jϯNy'ho}\#$#Η;H,IY7?L/$W>Jt׳h[pnZ^Z~k_o{A˿l̡D(A8 ƎrMs"v7^|J߿>~jqx_E3~> *@< QpUhŒ1-mBy2\dX *3"ؐ")_.~ϥ2&@֔YIڮFJc8JhS8iA3[X̓hEX &`t7Z\D^ F kex1Za )Q_h`I#;}`1 k*Iqɏ J|&OTU\Ig9E1)kOP( F !G:kK] M)rBQ9&%k35o.T-xn~p?wRAOdxPP 0)Y3skhF R/t2-N&iP֖b"\pk~Χ &)UȬUxe%S&<8:#O*Z=r&5ot <ᆫًdsw3y#;3dΓxSO=-{[C3inzdGDo˟8k}_KɃWݦPZ98y{i=[̤sW1Lƅɝ~WSzzB1HaWf{ k왞Y44\"֬%ӫO{nӸ1m3܅69RFMdըa p(8! gIȷ9X):C-$BsZ 2`)CF SF@W;*%o婣|&MuUΎ3P99/ \Z]wˁ6OL-zj+j+0B)ܝDO'w7ttoϵkI*:u11FgDV]ni]LDXmm__K{hnm Fb8/w uLщsٌ:1ЊG1Wb";Jv-"qf0$UZe^wlRmʇf5iޢdx f,K×Z ۀdaF``  j@W *ܖКBN6fD&K𥚁](&24$ܪt2P#[!-'D+[zi]yZYF 0,WB@dHE>79ōh ˠS+u4BF&f|K˼^2'9h'xŒIy/1 UUʺʖڪںx]EsGs$\[O.\:\1CU)KNNHLlwBzV㭿Zgp9({>-;0ĽK0ˤ0kA=ڙ+B׿HwS??޺h4ոcKǝᙐ?TW!@Ll_o'e"s@_ʔ%N#><{qh`rϦgojm;&I W]p ӎ׸,FRt$p(N+>^BNUVN:q!V*jC䜰-LҸ9GBԀ eyOSJ4@A=@p\ ԮH cF%c@VRmF,` 34]N-^FY4{V.&Aj,_i7?1iU8 b:%P ɲE0!A+@' ƎfM\@*h94b6\"\>ZQH@6Dʯ0hi _F沮;Vr=sD*3:216ݺ5:>42:{Ν>pkхX+;Tq7FY!U Qh*i,'LZd :QK1#SB .y24u֤'f7FR^*y7§QP(GhKɜ;t'ײJlmZ"5ֆ|S++xmձ-=N]~Gww,B"+ [ +VKZo?x܁ }KKO靘MШp,u*UBoCdv%M@z`1B-{u`ބɾEcs97wEGt*&kj!Dľ/+$CԲ:=q]]=u 1A\>csgRǦꀷpgh>q`,.*]۶$ՂQs<:Yf]UWN.ܷϿJ,loy{ *Tj֩+4F+x#/%KeRzJz) 1OdLI"/*o黋m2|,}9D)2$mR$CiwQHrLB1k zRt$X폕(}|Ho^=T*45v[\Zysڕ;7o\;q77FXJ'RCC%liﮛKwf̮<;HNt0ͦ\H i @!QZ.7GE>ёZ*vC2#$+BA!&L:I`l`>z22sCxXUKH{PA:,z&5jթ[pOޞ} T@SU!p 7b.1#] ;-\ፏlEMjXH;ښPu]-{#ٰ3TyG3ɻwǭl>~r`jW(w7E+*r[~ζC)o.?=si(Yf떋'ߺ8N?Y?2W#cZ(fO$s JFVUڑ*| ^yЁElX  Nu#e"K|wp}CHJzv[mz]!+{QSSޙ; sKS*|eH=4 Lv+3THU:12R.{%VJҤ)g4n#!1tdup1?r1/֡l3Ψ[L4̊@ kCM@ MĂ=.NJjiq, =Y\Lib6IlX/q7~n`̗Z n0Pn ,ȧfک!F='0A`3 9?226)Ca4QzAIfI $q"ulkAʑunR5P]ڙi =ge2)?Φ{+@4!?s}XYN_S?}CZHM֌Pp1C.  $`9f*"4HT~v$s'.er+Y 9kGZ>]S9 ~?A$ Ոp42)xqd{{ز̡4$o[: b j;cqͣy^s,%><(10@wtzw V2|Go__MN-}Wk\/zoztrԢ %RRjkVe9KKg"ܿ-zfN)~ { RrVL0Gb ȫTݶgr-Cm?/;*-3f|gdxUuE:Lѩ$b^U_ ZIyO=D&[/~~؅n,roN]=>=< GbXE<[(L/||:us-[ӓlS7FgV@a '`:5Փ` PFMNR!Rj&?|oftx{;ÿT\=C`4׀5/<;dq tSPͤ0^Pȥ& lQNfrX""ٴNN/ػ~zOKfvni}ֿFR嗏|h_[}X,Ω;vu0t7%2x 3;un'+a:tmNM$E0b6j9:VӇ4_i< ˖cC c+ZF[ȥĭ Nw(eF0>;L J^`ʛ[Ni$e(rJ=+4"@H#ų>(J@A -6O25<}*IP{)4$Z~ ZjE@Jۄ}C'솬v1 Kg; gfo._=8z}bGMܬZ&hB`[".tY+jZ-̮%ϞBs7Jɼ%썊4\olhCGs;:mmʗ}I%=nEl>#rjmҁmL gW7=rdK=jٹ^#WԥA ϪF^?q(̊Ǜc'|t:!"00QR7ewqjGg͎ֈdOmj>6,ef=:]DIZ5' ~'mjm.to_}P#)m+A {6"RcBz|.+:|N|t0"dgy5(6_qD-EIVr w\)v9 (3||a 7+p\\#>?Yq\\ܪDOhPzl%\~[P 2X)}VEBQZTM *қYfm ҔdؖP;;AN($yh#6kj",jp'>1i8\Fx,2Ƨ tѡdj$$kr=a1O!I%"`Dn=wA Ɉe 0G#RWg<q67s{8-w7wp,[ONwV t։>^mĊ` j{+,'pNwojsʇFrZ ~3ه5^xdwVSG_zPB*-(gS[' bb_Y Btıno3|iA- D1/cZk{戭2u};{\HG\2Ӌ Kkzhb-s5+ 3Ng" HEhEX6S.ǣC{{&]:}nwz(jzaG6TA4\9O޾t-Z^-}#ӋD}SoƆw;w}Xͧ2sF~ڹt[K'N ."Q30)Jy `Bpgӿ@Kc]P[̈1;Y`8b>m3!4u"ئX w& ;>(N''sgojGc%NE8s>7/e/}wWS7R5WKd;!7oܽscɎMs#:P$:gx|fq9Y făZCU؎K˹.ds:WhX5k+o6"Udgv!]4>()ڛ@lx:*I&yN`vvw5Մ"  ]cG["AGr ah@ꖞGjjxmD:j?wۮm=m Mo͸sFSi۩:#󫡠µ%UD3$f[`hqO.j| i9nA`6Ӧe>6Hm81a+o5\&Sp.Za(yUb|_)2U:9ྤ=2Ez>WS>m)U>VE8'Ҧ<Fc"(LC٘ u ;b1M`GA8ⰰQ|%<rbrʕ.,V7A]sAG=%XJq|-ʡZJӴ؆RV%۬9ʯ=NSׯ^e֭{S3ӫ3+n}<ҿ)љ 2AS.`T3e'ICyV=cdF)䄲r 5vu >*uZ:YW߾;K[3&%' RRA`jxλ-$s>o hk YΌeNӷVֶ6$Z4[Yo_λJHA`O_󾝽ҝA:z7u6FV\o<[*bX=<>k_?oTV?}z:_Y_OlfSݿՑ|&PVwkhVh-{H[ObLy|?ý\НO:hM-/%~j,?s9Ma,V(ZkAN=#{:tbORpTH],zKg]Ctsx~vmW ܛ}wۜhĥm ˋZ*`1<跃Q_qWwcފxxJ '<Ce|頶J)Hʦ0AD4Xi ydMLAge46C!NT_ z )lJaX 0"#Q5 )w$@hEC L'ip `tЅYd[m)_` ކBYÝ I)x4MD@{\V7”=`v`-?.ϊϗfWb_@BH}t|>  q6X\]Kd8ع#J#lNq+V⑾*=JGiԠ [>Ʉb@R>VNڸC-s9iǁHwT4j |GZIQ]B,ye[5SzXwe%t!X1q!\jj*?7tudqxH,˕eCn6?9|Lo{#Ά;zggҙ܋/<MoWG G.Ok){*_~Cup-FW{塱o&rtܱ3wד_;q#CJf} 9p HeVяb,w}ӽ.TWse_xxw(i MFy@'ivHVc1<2AJ|퉆Fwo(PqrNZeRl1c'VE3ݞܷSa'd񰿵T&qiŌM/ɧn%+Pz! 9:HR[ YEAQb&% R3EYG.hR=)0$̀.m6 mQA.k磜MB#B!$( . R7A~+ǖksEI4 .UR)2>$jآfaIk8}tIWo 4&rc&+4kNb+Q>P#Lȋ1 I LM-|p[mj7y--nPvx`g/bsmzH83g8Ip^_6  eH…T)jb16S,I[7;r=.WGH7WC3nvKMym- AxZ:^;vf}1ZnaGGBQdxQ9;sӿƄ,LI&҉-~twi? _vж{lPsXTszɕ =sߎ?xOokKpϭ04to"D#/J]5/~low廳+unr1W@9΃LbrgoϬ\h(ݨƼd(#r5 lZᐉ$R !3G#*sPGڊPD#K(pqbTFc:[kCEDZ㻷9vX})͗\jmSh&FS1LDAp&0`ٳeQ/ SO%.%P򫰆DO6thi |$_~g%%3+qrHܬH,RdD׸0D'+ hzi`Z+(**3b&4F Ls@nH4Q/ Z͑Z^Kx%C\(DYZGöev UPr$ |F*zR^ܴW4G M.M->x4BXpsM{r2l!l߿=9~1e2k߮--[{';Z`tCh?#J*J}ym)tؖ7U,/̭޶ s{/58VUKhb#QPջٝ:n?{W*|{j_yRceScgPk`]ndS+&5% s0)"VLٻobz`buHЏAh|"@4l3*. %P5|8g:Fd'`[c`D]yW+z-6Dj*b(H50Q0ř_d77WhVJR-^$,0 _\tL-_3y̋qH$0 _SU^W[SI]>co Ecrfuhd!T?sk塷޿B6ͯcBA[Cӕ5% U::.O|h4RY_ucG-q˛-•eLxXryv'~t*{uH$'[R$.&!/ tu>46sSa_?қn ^jnr2I(X@eߥ2|rCnsHe]MήT WpQ:*-0zr@7NP,/tfL&@W+RnӦ*:T(dPi,e)]04r|>dgijOrkڭ!rRr&_r;6NOv,'U߀ %< 9yLC#8tY:5BOޡm k ^a19e_PY)Tx J DH: y оx$KNYM(Cj< QXVP+騌 {6 9؈cQ a!HjϹP'4 ( R5O$:Ƨ=tRb K!Bc Z4A/$A^QCfBdlJS(#g_U[#DLp<2)^iVSHJ^AIXbWNIE]]:]FRl1]5!ġo! $©#K暎bٺ i}5)FWȇC/ u6N}k۶m5uƆ-/^+Zch$+r=W;Wxadl)biҭD*L +y2 ޵޻'ggm,sl=-g1U]&C} E(N,e暸/lix풛o/&u1[+r+h|)4P~J <] q\r%7d.wK+C.SWf 7b,&erinE0M@Mr Z'a>ˁS|EޥȺ\^NƗžoNG7uM2ӒH L:RW!  <ꕪHH>XZ1{("Gк6/JeLV⁼)cH/8q1MT!PL24]X)9A!ꄬAL~K($_C:x"\k2%5Ku]2&햠'B "4%DIHtAU-fjh&KQU^*LT ctmBh? )i _L LZ#rLi{?TPʨK/,N6 aE`0h%FI3E=(hݘWÇހϓ.xV rc & bA'V2ZZQ=;N ɻP@iHio_+D<JRA~1+\1{W:h ޢO-|?Q D(p&xg>rggH0J}Zۋg5]B{9(Œ|?\a0Uy `~YX!ǧEB4+9Mk f*ʔyli`TNib%;zϞ{t{Sm 2;ͻvv!Q$IhA6+T!/VaU/vhF۸:Kr WR |K-)b6`zD N^St%FI5é;7iQ7IkɒiN-XTDQ") XCp. =I ,%( $p_cW@ʯnDGԋQ5DRՔvEb}~f5{ibNsrV {L~'{xwW$EF2JEyhݯ /7{@MSNr(Vd_ .vtwuR& 5a@䫘 ?_T̗P8HNfh,&` -J9]y-X[QS_Ah^ǃy0Ef׎W뭛7QWXHLd 9jF`ә[k [Os{ͻӣ N=si ݷ.^[u/Wh(?;v;/ZЁGGv{ \Q[qC˯_[ɳwGGf;Z/Qup:_jaMuՑkHfJ= HZ ƣΖH&~ىW߿*zsx.5oǟtjb^NJB*cƊUrbyB7rLIW('A菂)k{ i!&p@a  I󇢄&,)C4<,Ր #9;ji~kY~88Oͯ^rq6Q_=@ؠfBh6v#V92 $To`+v,,B3l:'3DI,+h%,0 +_!93G{,suٌR, p"JC VE:4U*S&I }j$El0Zɝh\~A%$/FצdA) *@vZo: QaH!G  9.T@>}c϶f򲀪%˲d.o] %:B !;ixjTWL>3A{@}[>uda-95X_{ +sk|酿zg`v9S_a·ī"OoE( J4kX%Zjj]mt֒ȸo=5Ğ92L5T 9s-1ȓ7u64-ա`!pmy$ot:V_oi12[WUE4t޶G95a%"ۛ11Z:ex>f-[M3YC-x ձȗ?yؾ흯w7:{g`" R}{k8;Wh?H&ث7ѳ-j+f0MTǎ1 ap/= bAC\C VXcC>2R B@c\.<k3kwvnhBf#4<;ٷ sZh$lL].'/liQ5HTb&DGtAGB5R8_e^#Ҙ I~Jy)֡E 6ɗhŲ뫤9EB2DgMZU\ɜQ@}TvHt/b.PHW Nl@rQ ҃;)ګ2U(!:6acUmRkVlz 8؟tF|r%T3H "rCK?ڐ<.uI5! s_ 1[8GH|/?ykqw^n!ap}ǢvtG6GB_M;c[k͟|pwr9ɼwN\zc4~6>Ӊc=B4b*s5ȥc[vu}:[[[j A;p};'nomm" Mf2Ĺؿc=Īڪ"UݱD(J.ێѡժUO<':}[֯ vԣkoTWDBD:.nvpO7ew47֯D.jحO]]74k$Y/\=TO_SO?X\[ WǾw;}7WE# 1c<\mu}ˍD,RܡM- @u O7Lcn5b( *Zz;#Qg%}K5 owݬcA[ևwP`nZOx*jPpJ:{:d&2P!JLfI(EN#4+HIB#ȳe]p"Y$ׁ?[d\ڶe)׳h.V( y Y)D䙓yq>GK B2e~L0 "~m{*5X>.SG-S Zǃ@ _{j|2g^ Y~ QUp9M1LE |=X` yz`ڌ)âkF\B@0 *H$،WTfI\T5az7-R:)dhbK0bk\gVAJUpl.wڽ6O -ޠEPB8-e 7{ЎEtƵd`>W*Yν x3|KS4vS+vDF]k82"Ǐlq^6fS{{yWeXI!WkѹW޽ی٫(8sYwb9y@|CE8uo loMde;񚊳G_MMȨ:̮޺|gonmwNz`ꍿ{d(pNW]lqi][;Uх]EǞXN8kk[w73W5Fn ;]6QIph^ܯdRO#J5dd3?"}VʚAB,űÎcAo[;k"l}+Gs/t&x} Ev3yx{zs,ȡl𝟞kkܺL}{Sh9ʾJϝ[rU[*_P^Ilkln Z1?<ib}tiđ{`2[(:?]4\X={wwUu[!rgmx]0P :skO_=,_;qobڶYuWD+-OCMաgn 7?Jz:W<ihbv2I1Eȿ?Լc^ZYM>zhz2?;ܧs4`ƞ Gڽp_~m/|d!co~ԝHZ>Էc ^TbP$~Mu~8,=yTaM]c Y:)ӇyƯ>yKY*l܂GZΣo.CFL8P+jmi6dj[R0V(3)RdErG40УUV5U\lڀK+U|Mݘ\'%j\Q'P]ũ!L4>%PChTv3iCB楼AQ5~srE mh|J2f XXR½jƭ+ݥGR!nPTe"PJTѹb1'Ҵ&G+ J򯜸û _k8i8hTP#7+8\7|&|Jk" YV%۶At~QdϞ wonjB3scgN]ؼkK_K ׆#- :ȎotwttV^_ i_MSɉ+bDHbZw_:][#Uu0j¡haV ̗K>ulfLŻO݉3Dkc-u'77ĝMN{y׭ߟc}moZ̬f|h띑>,N.}O=wE[kF٬{p_s;{L/]ˤ2Ybeł^[N~h ^T_%++ǎ_^XNxӉB:bVMC&Iy_zfW0T)5VBE/i\s1lA ` q3P&Y lF(QQ,S=]}l "27uu. rEa $GE{p銘RM潫he~8IQOesX,J0vB$<=wk!Ny<|*TM9wȂJjD琳N3B;]"@{X wPie@PtD#-@|0$8 F!dl#B p)z=DC.R@Z  *j;frʵ"hBB>U FF NZ@.˻~ƺj. 77ujĊxs^[\]]ڳk UXay"-Cپdf/}ɽH2W(tkSmʥ'#p},|{po|ĹĶ[ZJk2",~L.joWSYaAЕugn1V.o(CDhw1dhb6yOku4L@sB  q iR@%ebFGx #`I[Uzhi)",cDx}PeK_KF]⽥S)D4B/8KײM yDmڸoid(2q t[ZZ@_h8eKQ Q-bՈZ=2S !씉(:!H /=hݕR(Z-+R*Yjvg 3UOw*) & Ү@JNڂ 3ch,ҸB/%t ,ZE༥?#^,("$RCxL |]wKk\XZzg̕ nC4Ɖt]'ҍ Evo][mc7KkɅdt.2wh֤L4FB+^;v޿/=rp[u܆>+^M{ɗ ;wwO|VgSY^^&pd_3C[7V_QP<̻ǯԷ׏-˻CNxzgo^S}#[-MДr&m )jC`فp8RlTFиt,ǰ(&+eDҟ_pd&:Gɚ]+s(/`;l^$s u iNX) F0s./r*+ C%'|&UZMRI$XQmB>PHl<c tw"8pqfo-DSb6-`{|!K!JvҠiI,p&<Rb8 .ʏ 5*bX`g|HO:F)`zf3&+tvBe:'pnOmn&E82LHZG3oW\2$>!C75\Q)\`]*Db؍N)-$1Cͩ[ڻ1 *{ðH_^[ʠH$usۧ?yCWב`: Li7*ͽ%ǯ_ܾ3Xe]%7<+g|bqmxhvjnc|$ov{b}a-Z^_H% Xo=~nۧgaUƐVݝxsz);{iW8V-KṞ\NKZfvpg]z6Eɰb54%h%rPo/plcD+24MA @'/c)M F7'+~T1@]T_ cT4Fd"p;[.2*=O;MzIUr@2.>0YS_mSd+9((B"bA(/d6Ӡ:H E=uV~@CklXVN+wzڪʛ[?؝/x's#+KKW =zڪc5U`AŜp޽k+`Z5`d=Xf wt{ $rg*/jB&B봣T al ?災T{ҽ}H8~eP_mnhys'co߿~7%moj?0"etȼyBgYuG88o~o~}D*siv߁ޚPȱ&UYNl8Kr'ޙ7xpfNв`OS!HP!٘2D F e.8-aCtၰ'Q~n`F{T3y3?_\Tމ;6ן=хGe9*ec⧟[]Mdݙ9|xs.[c|&VG;;~%c^0ih8!o; iyA\F.",!Pdꉝ$80 ǩ:- NJD"{ox"BLGՎu UIU߹qkb񆦪}X)H;³/ܝ߿3ʙމTW"\bt +d@bj2wݟxkSc`CY.#t73G*2;r*%;4Va~]{9lY T"T zPR<(b@0& %j?MFvLAz]r UrW$؎cO;,je=;o 0s˹|; p;;L86QPHzV]r;%dEUC]swؚ"hNSUn~`פ`M>bu4M`:1LӁdPXԝamώQ\xGfY1SZ5V.)8$@mNH`noփLqW:gcXƞcxıWaiP#X.dU\L4ȴ b*r"Uضw7 ˅FF0~ ٲo%=0`8eI/TRG+{*mlQ%Y.ݰ><̣jdĈ"| kv+|TĊD4*e /pk\0P.dpQ' dbdW[kqkS;vD}\ z;}O(Y?9=~ڴjkHW]еm-|%RsEѦ; ]jDCV7mⱍPY;$nȱ%|]_wrK#+|Ip'>].Lt.\'FsY[8TRPhWO{SFqDۣ ,DIo񅅍,\XZ ժ),={|hG{c>o fQpGS,}F4*6t)n䔇l4G{TZbqtPEh̤L9,XFT@^7*%&X5S'3A 8v̬r-Ňc\m 94~")硑mak=l;\L(vcg"lGY(@,jH[ K|aO"˄÷ep{72bC oM8ʇsHQ 0{POt@yOA`tU>AprX hU*Z!ؾ:9! 2=WhX Kv;[^FoC~\_GksB QOBǧ4Ŗ;Q7f4hdVG8}n4L_, ڌ+ppU5̬; H&ۻZ(bU):Ag5F#P,<0oyأ/^85sӽ1z֢acRi5ngcDIKfePM`H`O?}JfQll]M +SoΖ櫷燺ٲ?ր"g\5jWd@FUj~}={`q}|.yT@~9*l7xzCU`UZkF: Ww6ލPA-rbCGYӛS7ǖ=:x߿W4w+`0H{=/q}tI,@k&-i{!&@sdAx{9Ŗ—QPGj'D`vJ D]lo6s:~$ner&١`4 ӂE0R~oP6Y=J 7pq314Nnxbw#Dg/kLpvv.rɎ= =kcqRUBHޑ_zm}M w6pzxC QԊh DkիX?7 6EGJ;DjFі\/̂4xmuEen@GX,4z~x{s6UzhkЪJM&GvEXMs>|= ta#x9["Pȶ_}o9kOݙ__1v 6ٲ63٢696_7?=="!& 5^v =.>M@x`w:WҍjBQҡo|I"܍o~x/571˙ÿJVLH霙ގ+EcA5!_S6 mQITໃ8vG x*^+/ݛ芦K}|+O?㑜.9P6w5޸6tm '[ %wXMrh{ojv\\H 7+|x=_Ldp< ۨ-nt7tZ>`zz4PMu7U!LMax,l TFsj#y(I9_ro ۝NGFm!{b֭֓ݝ}G|dr=$߸=/|k Bnϟqet=Zϕ5 wu4M/%pWҫReہx8oPn ^onuw,bȗiom)D5\h_?}rkCx3g7 6zwv=uހW2Y[K󋏶6L,xt?譱EU5A_FN_KGkiP.sZ~WȗUaώwJR)>Ypr^5^ 3gּO*W0k>"ϱr <[~[幕8tϡRSAgܘ|g %wCS^; y)/?}]Mxu83__z;r5n5 jP3 )]$XrD'FVyI4L!mmf*P͞s^Ӵ=̑C @4t6Б2\!Ԋ<+rHÕTDHKiTS.$4xX>2to `Ȃ6g+,PI4<:V3ZWԀō0T X(51+2@2Lh0t+^f'Kl:\ QўD(*'&;;j@&hdtɎ Z?Zn~6JABx$-g2T3\/2BAjkq-?Fcǣ$m PڇaAm,DwH{wON**h![4lΕIBjAS\M?hPSUSzZۚ[Zr%~znmmU K;[g/;8$HxV$g1lf V¡[-͑"66ٚJ+ dIny^8\TJ|j~N~-J?v`_W..Mljw@:Hfݑ6@x&$8Vp4n.$;x@z"ԓO֝sf81iİT*puQfSPաݭRA- +~΍{OaUVS|ټ9:7o^R|7t(^A3PQɩD q9jM] le=,j}Ҝߩ /|? ebJzZⵅAtt.Nll3)[MI{g(&[ $n)NS'UtpU:a(u#4ȺK p=1ЎlXϣ`GЮPc`6,Ti[M Y:O@ !V15$eXWRFȩZmQ6BtB84De-I-6&$ i$P $0YdγY h2M qaN0d^|R hPA+A\D_1!=$O%BځX/>|wҐ%r2S9G}lwTxk(ZBn|L+kHRGuyi#3tpw)#~uمNNn$R%G~+-M~P|}mueu6SgXdMTC,{7~rN%O=tet9U\_|܄@n'6~߻4SʖEÞP5T_8ڳo0-73٢c}$zZʖ}IGdFϩsjwt6}@O>9ہ#M' ͓uUw <ɬjz2:}u&CݥP,]Fulr}^M;jf:W]O$QbݥBPsG{C7RQH}--%PK 0EyZJ`h zTN0;0q$MIjj SlG4P/֋fp$:Cx5>u!?Ԋ Svw\ˑfK"܊ 8N.PUp '![&Dȸ Aq%BmJq/ čqa?r2,}jLFs!zH[S?tk3L#Bɻŏ5KG$$QQB=$ @}&sc!i֪O'^Eqׯ-ߞ ['ZZ4vs!S~+:?8 u}ofctz҆:=~qf8,aҢ2k Q`w˛ݙO4׎'/ E$( 1&$'hy֪ehΣrƃu/4k !Wښ7CQpEF:8ým9mf-g5޿8i882kBS Zխ4 ޚ}GB,7* ێhY]|NߩU& @esZ|жmۻLw@ozylՍ ]-|ʅɅ٥;^ݠV9|pGG<",둽]ϞNK-bcP2tNd`Pf Re `^@8G%CSXd,0 fs9?\HEќ^zlcV _u' b|ypFJ (@F_@h 8 ʈ.089K3p5Ꮖ.B˲LwEH#Zb X#7e{[ )QSU(:e׀h*!1`-7D"0lOE3gሕx0+C(䘔orqֈ ` ;l. 9 zFFY2tԪPU ̻ "UJ:2?v7՝U+pz$ .٫Po~ :WX,\w+yם[s=M>٪^941h4$.g^W&ytɳ'߼yT191'zc2ަ (!o-zc=ƍSo{\u"c#Qdwf6P~͹BɀȒkOo'_9EΞN x~|NMe?{o^ ӬpK=Q[յKQх'>Gyc%*&"?K_z8tZqeib7 y%MȲܱfWAJí?]cz L^v7 G*xZC7("uמ~7ɑ-b@AhdPAM>錫>VRd-@pA@Cvو=DX]*ن3CT !b ,oj< 9OBhürM#,{ K%'dE`nR!IEZ?bYȊ\zBzE\d!H4aU%[d( D`^&"7,9NHC\MxVFJvv:М aS!lp. "+@.#pf!ͥK"#Q%Q HZոXʣYK9 X B"@mc=HP(ߟ\yw򃊦 /Bc,$!$^-]΃Diz1s͕B):EI6QNnn^1.Y]!%#')(22Ȫv}/xZdIh@{soÜJzjcETKwVGH47:u61^p4Z)j?Y63۶uOήwߺ6ij_WSGS8+y{7.>x`k쬻m^D%ْ jzbe}~*[3;olN5UDnWUۣٹx)JFb/?sOxrb=Zxx_!}YYKThYd:of5'tXMaGy6i,:@}` 7 d\k m#G.D[$ b,'G#St lII X:aCE6asXkbT70 bK;Ӷ9`C & u.q!qUW@9$(@ڭHy )J;ʜCHxAlQXlrdQ`vÕ(jd!Ckԛn(|,-s#` p~B̋nKJ%oƒ ݸцȟgT |n+C7)p A7NޙZ~wן;|ktqf1quE5~dC2s(.gboK,TBΦP$8/Ϯs-aB<=1OܒIs{=ZyߞΏ.8DoF4{t[z{s˓}]YϮ ԞN~} eT͚Ɨ?х㇇x-&ɢwzaHB\._lTY(sf,Ƚ\HM_M,K+?GYZZ^/֗^:t7;-}O=IE[xYߞL$ຽ#(f$ly\?{1Z\JydEhZ6mpL:ApѪщ ?_Z焂w4h!U3fO !FF\D@VyEQm$VR-Z&{㬄*,d d`h]S8M!^1H%0{O0Pq)r e9&Jd\rRj殽CS8?>X(8Wo}^H9w S"5UC[7;?8yԝxT}&)X6ٔ/\og!{t*|@KUյKx\Y<C/A_p[{ ^?[BCcӊ)+d+A剕~*" .off ! ڈ՚kn~ж@H=m&|A . u4|hEm3,At`uu쵩f,S gTsZ& .@A2C+`ό:54I.h' ӥhqJ#vȮȶxs$5lf8qJ({l%Ma|r걆x&+P/Ja jϙ5یM{#Pa)a3}-*[TP:=tzH>2)"|] y`|$GCl!0 :J-1Þ TJ ԝ&UtiM9@,JtKSU"cHe:Tݟ^Daѝ}B@lilbɳZ55GGL12CQ*{CQjL0vT*R޻>g(TTn##G7?wm}nvtjYp>U qk6 ːMm@ ]i>gBU@dosul z>g'S;kq#}_Oܾpe|J&ֽRt:y6<-+ [d"hp`<s`PKw>sloG[Aav   q ɈP/ {}w({w_4 Fw1= "@Zsv[{ġFU?k؊Q\TAwۃ;vh= 08NȢd-PDp Y"h$fx#C:V n1,rqwq QCa0n6@ȌUA/mW'"G]UIzeRN;#2O+B~Wء ,>ҭI^\M/Ð B b>Qyb: W ݷoLfͼa4-O. Ihj ~5e@F5LV`w#(?Cns[̇[PGv(3Z5x$DzхI%>AOlC߇Zk8zgzUb+3Ɋfܝ2{KF׶o,'o-t u7K~c~rރv" u{ۓrQrO^]MMdF6st[S/&@vzЩ 憾ÁnN; ͯ Zw뺵k5+"]Ȯ3@ъYohYC+ͯgQQl0%IƒsKpH_;k3%>8|=Y8j)PVzC{tHL4TL "4'6!}0-1Nb03 ҕv%˔,V 7ܘXXNʞ]u G 6{UPh?wjr#F[2W'ɩͱB\}ݍkyo\lN$;zێj3;:0XzmG|Xg +Ūo2&X4\YgZ(\Xn :N'$ \) >-ؑ5d#'Səj"oͮt[nY<[ϓ ad mB@i , >傊\pD=bb|s12`Qp@ţUJ[Eo1#(7? <"" ԬDChmyM!b?uP`o JC6a2b~ W,Y\[\:Ĝ['EEQls,ޚ CgnΦ7V$>}1l;d@t;Z@.&{$ .sg66edY,Fs[HO+w_|{;Wg'_~bJW{ʮJwnuêYvvjVJ)9* CA.wk,fٴ˛9$z!»}NAng,kܻ޼ @ BE/ԳOoqOռg==C!3;>yq=nX_[;*-ZQ=usk9};7*@LrK]̖v_+צZAO7HJO,CseKF::Y\C/ KɪzZR0lvDG_ꈞ4EJb)C7ԋ,|Gx-4:6Egq,PLAAuuow\zD#!%Ay8ljGi@ =Mf}^s$х,`ȉˌZ|'P?.աAHBch^j-qu=\,LAAZ̃|B܃j1>-Dhyڴi\`T l):gһ4K.]_=i~-SCxqcX#{_xɃ?zTv{{USA+;98yeX662G4O<82;݇ jf_WT}5U[vw3^)y^0r <zBNOg$O~o-V|9$r'N]{tըݷ=<}{oZw׿TsK嶮aU:֓䱽>|WB*olel5$筻IڰS£mk1voz@˿nW6 jp{[3wSKՕ pɿMl=g21՛i Z!&ַżGvtc:$/wabR-q8gƝ}`;ʗ_M#x`O^7wΌy]js$x}[7M!oڥl.2ϔ+8OOdy>= kpCGo_AEDIV$fnllᕧ>s;G{|r{sqMܚ>w>Hs[ۧn߹[ZV6mݚ_Z!j@BgrSG["[Z^X\Dp;7򖸽Yɨk3)TVֳ;GڦWEk) c3@5u)h* ۄh6:/,Bm_eU-9L~S9uA 6Q2\R1J y}a( v6@g WlFG$F5[Cl9BF0*HƇw'm`6N2"#l6W`d ($vPV pFa9@aT_zH+-= G0w60^e^/Wah^Z)S6HU 9nJ-{|jp쒮{v GB~\iDfWVB2[٤(oj_ Aȉ_Cu8tU\9D[T-R!Lͧ={3_9%mlKKo͘iOt1ߚ;'n[,[/poajUG|c:h,\?fK'/=s|ϫ9v`cG{zZ={b+}ύ+0:We>e:;n[ȣSj Tʕ9[*j{D鉣 Adžn'bz%dU;~0ގW{krSNGz¼u~h^*|px{F)|L~e#lOwSثsJDrI7c{O]zwM]K^];rtOo"]/;ݜYpVTOvgtwk|O.KuKnPufܣXKܚYad|Eh]//o:rhGSr&`PR$/X8(=Xt@`kR ^3H+\fsr  ¦* 8MDhxYQkh>%MvĄ,x&"C6هV`,"AHL`g 8u0 ӡi6zM3r 4ͪ*>YRQUXC2/F:% uO g.=:8S~酇#! (F}3hÖ8|7'5ǢPS rc 鬵)ב^R:]\ZEM{~CjQ uU`^MnUs*^ccn X|R]kۿѽ`ܭ|j3X ޽0}KI&dj䭱DTuci3?w|k'< C%@ΩhE*vtt5~K>{|cG{:FZ ]Mf ]l@"[¡ ~S\ MaO^]Kv6'6/ܚri yb^㷮=xh~v׍zOWNKfƟ~n|F/N\:JUt_ϽK޵q2|מwx}wjU@d=07=>7+i߼5ЭWJZ.ok(Vt,gGCAKl;= -% P Cy+ <F %C3BwQFi%:e0IX@]NF@n$4',WfX j^@0G<-4_% |.PIz Z]'ȑsa<=$ H5T5 4艊c udY,"1Q"ОhCsQWT ]cch` ȌL;G/l/@BFeh*`bHLiܠ`M1pzZ(,əyv︑)^ ^_^ό,?ܠj݈?jC$A}9dᅂЙ/>!J%OQ8p.$rogđf|YCC˾\8/?ީ;+_3i\AY/T1|d[rr1L.S9í6_zb)gʺ%n.緲JKG}}W,ٷw=[,m%Q`Z)YH&S?;s VUV@+ۖQͥ91V&~Gg3r-<ľ3⺥3ɍd~n-OqL&IT(Dy 1yεM!KA4GZRBb|i𞾇{-_6Vo~pC5m\yJܨSE%JPt:')ֵ̚_܃K|A$;كڡ.oG@뵱E˂̉_0>xstJ0+ZUMaP_xw =o*Yt%r*QX5ÄBr*P)* T _@pY" Y Cl퇚"(rUJ%D@Pv]B G.ܥ##͡.d0jk~q?IHOxVzqUUt`y h Az Υ-(v95! @р8 g/s* #@A50*A. DNȜ/鬩fT! `GJaUh;!E.˺ad \s+7iARvHǽJY]ȎM-ݝ;nafrbCqEp˦hHbHҮ%nl*\l!/G [)~h[k'!x Ղ]i.Rp:S9Ի@Gwˉurz)myi ׌XJ8lT4p`@舟n N0;7;O6+5Żb K酥M&m'ׯ_lmH XTź ĸau@Y)B׋joS||^ɃUhW vF+ezcͪsi0ڳ#:]o/.|Oxًc՗߿_DT~}2U+fݎzOGS& &zY }ףh~50_4(rw{cGTC,捅GgZVAPM-C>8 ܝ7O_h/XJLb[O& Q.(#za@LI6hM/b3șX Q~$@nّ[ _K䱂wbe?,$5 Ḫ4_?jͤ'A+8H; ϗ29NEBd0E@rFrǒ-s A%1} 뉂9-Uǭ$3l &bku޾0{gzu9[ȏO.mmi010>_K[".OluG_\,*8G0*5 z* t$¢΃;z:~E7*U-eWEkn[J^ :lm_ϔ6RޠWRuO᝕#o){i?ٱ8h|esBit9(tԫnbnQ;:s9EQwZ_}ןs""LAU=/=<=9(tz1)UHO cPۛͫ?y{fn=,ܷD85bŷE)rŭ4_ CȇY{9oMve\@R(g[Ǝ]Q_h xS^"q~-nחQm?"'o| = p7!{bSpnDlq39%drӳWP}~zξFWjn %^8>rsjtxƆ`yNVʐCӅg戴0ig;-yw dօeZ?έY\=-x[Ϋ1'W8%,& ⽾No7J B5Oa ϙV} *Մŧ*WRgޜ\7.md+/>[M,&usbOdtrT!䑟ydOE3컧'u6oH ^$g#=̄e >w{O7&s"pشfZ}wr6 ю'zmq;:;ځFڎx<=f6X x_a-2_~TIT @ !`s#,G*@|-AT NƶAch4pVj9(Z2pMCO(,Î}PUE$d xڈ`QfȄcE&CMDn0H"Kqt!'dWN "=C%/8kT2DRՍ|r M@p*!Āi: =sYjRT!$3_'GZ@0T\(x%[mBnVnh>HFi95{ŗ_x>'&03tT|"M-l޾}~|\u7yEw[[ccc%:dZo.E'69nϖQad}9 Xt4LU D:;wItNtJIk{uZzEđL:*B[,'[VZxn{KO=od2P_}D\6K>1jfŴRqS@O?vR<^߅0f;oHeJ=w'痃m-l}aST/-Al@ֆпWscаfS1^zbן̓t{~q%/~_O<͓c`Ǫ-9~!J\kk?V=_Cp%0 HJJ x]usp .~ѽ;wGg#YZW%=>_Td [Vpy` [Z_{uܱXSwk%-͞v4Uݥ|%mz֒x:oSSk5!ZTAoLMlы=ÍZݡ\(Y 7 oxl& CEnb|~n* 6BBYG_t|jC!HW6ґ[Kvvݚ\_H{ō ,s @[zWGC5=bG3r rBb@=p ׹5p`7!ۤQ/=&vSpAGmpWp, U{a@+n_Q!=:T͹eUy`Ą;(*%QY CRIĝ--H pac񑞗x4 8KM[^@io%ey *tUe.S,veΦd@P0dJ'`?B݈l~ӗO+4i._"}BE_,(1Bѷ޻3/$x'`!>+ףt<<||*WB + ‹nee)Rf=а22BMfhU2aQ_ lGV8X:l p#R0+k,`C@= %"%%|*T`S/zf83b].!4HAU^Mڜ!$ɱDH:4@[mAf-3cVug}=ɃC2 L 4(0VB dnPp"F}q?2vg };،L b炙?2R9-,ju\ʤݵ"m{3,T#h$ ]Ca (~AEPAS"$-;Ihkݾ5>9R*zkk٪TxV Q[/~܀N{(=[DS]]KP'EW,_րǢ E#'7RlcSBq?4>Nr$$ mGtmԝ?$%DCPBC:bT1Z%X[U;^\Nꅻ?:9##‚z'<i,-X,\p W^BW 5GH>>yclTLZ>R|HZok(IYpuu,eW7WO 42gO݆byo}ݍ4O;REFz@^?H sܾ8qPޮg|dS "JY1 ;ZC -[4o#+Z(|FkPH85oB $ќ(KIxOGHLa m`X i H(lAm,./Wt \nU78 :Dm s|mT ٠nLa0Z~CRhEɴ7\|bA!oRq- 1$IȞchTP~1hrRVuyXACa5MQ$T-LA54*.躥¬kNJVBAT▔ן>|֮pC/7<{>yfH%!YvoC$C,CGJ\sUWbGT54GnŸ|O< W'+JΓW\:tttr}학m=SO_[o8qtqo19\##msB"]lȲ06Wwk{h=0!hg/6>juO^XK/TUĜZ>{Z[\f-uŻ8L^Ǐ Sřep.L̶t Z,yްY!j^ruh Yʅ7?ul;6rzʈ܆ly3eKm9̥+t-nОvG$,{cr𮮉Mc(Wyo16wF:+d͒5l& ̃><hS+CGS8J ϱ7}9,7Wҟ|ПO.n[)e=?:59 Iz[`5 ,6l\/jӈר5 B2gh#>ÌQmWT1|knvҲk`4#:I*ܦ y!7=A;Ɓ`' d'UM@t`SPԆHP./P^Ɵ/3Ba/`BBKX 'Ɉ+\p &#Em GRdk4l˸ |d r ` A3.psbdZUM( v ZCgJKb2A{Krkry<=mpX2 \@?AQ"N$,Fߣ4FG( F2[KTtޅ˛94՚f^ # yz{a&a'pTrFruQqT ?8}5q-"[`ʧ5OjIg}ľקᕈ}O ‰]gE[$ F%o ػgRQ"zn'K@E:@WD|7x<022>;SWF?0{>Zr1u;⣻r2a?[QѸD9,%M5Q\l,DcKp+{uJb 4^l37˦ɤ k9룋] > ND!dV_28%z6#&j+&2`{%0՜f  9_&=H-Ά#]G=p`))k`o09>.*ܘt \@5C婃0!3g*ӷ+BH*f|f qXB'sCm ~0#IUѭ8D3u elLn[/~VμVtyAQn&)Bw7Rx_}ضNiBb.<#504wHQ1w`MPiDžхw̮%K|q3V*Tnߙ\W, uʚ9B{IUw4<_܃{vv^<YPy (d3Kiן*Z4GB*WTGI eaoCPd(^Q<'ZZ)'ȷGκYk \ 5S߽0~7Sp4 dy'Pw+ڢ'b?k+@8! e Y}"^z_O of.xX8;և7Q roriueH3 V7oR*k5j-^[O—las3aJ,fHg*l4pqtajmFQ=4h^na FGr5P @Tm"I^F=UeŃ/@ Hpt057@J`Ff0B)v _*olu#J(6 @pHN1UwgB9Chi{܍>%Y܉6Cau_t 'AkXQ",/wZFnET ?/=voo2zw!Sݺ ;;M*ׅ{daSlŁg Ze/c$#4kw/ݜkEp*)KkХGҍ œx"fuM}쨙Z;YQBUs,mdYj®mmPM#(OZ}op[س5Svt2   _RSHD'%ċ&菣ʉ4IjjkLusemjf՞PSc0]:9$K"x޾  *Iq'z]Wn/䶨W}nәr0Dg(lQ ylO_{b[Z/iVC44rAxC-!Pꮯ/\:_}c_رu8Hk_{PV ߡ_?j\嘥=j. !PPJ^ap|a6@s rD/zJwk0]>7{~|>w;} Kom_9 fb3K@U K- _ʧ^"-.n&tr__OpEd/'-W 6<⨦TܾͧwvǶ<|nE=Wpݸpjteqi剅:Һqh,'K^sPJj%ѢAif9}G:cp|Yꠔ\ƒEUQST_I0vofթdNrcڨQ漏K!*i4'%.$Syt{U/ֳ%kpBYbD[𹝊թ/N|Ï{ _еӯ<~lGbMşo!S)KP`(<9钝BllQZC2@voo2П2uwb` &)Mv*jŒ* @jL qǶMص$e fN&nr*SQ 'ld>0uX[z2<׃v H x@pqL0< J cEW@vbFP|Pn(`+t$x0 3C^:=/ If }d^pse/-+8B b.\DP8SKn~IP^"А4OTcd =(і.svj)-fQ%[B>Z]?WTs+=nY6 mчnX5\4pI3.nw>o޵_<Ý]][Bs3T%pg|ԙQPOyt( TR:E C!ZIAnD;/\~HWpB-U ;C>)<5вz):+ XORRw{jO?mw>_^nCp}vXR`$!䉮N.q# ]!Gxjc>;wmчwB>8JJYr@ū} ᨛ"zz:My0#]ӻvQ**zzٌ>ĵwJ\,THs= t7)T a!_*%*,ܳkRFx5PTv P-&!] Vh us8ͩȾ~^Յ']W&hZ+JxCglAe H;:T%=.Yt]޼<0 <^b]=h5\;Ƨ7v~@Qw1Hh;Qo &`鍖p1Swv3(9ۛ"]NN#ٶ[s;jATs{mt'vD"W6,%)j[g0?y7k{ _r!6[ 8oZ/=4!׽;z7|*j|.+25.=;?, _W'j78㷿;3VT߽ujWpX4^F-@QQXa@cv~&D ( q'~B3+ -0x&WPDjMeDg %\}[X\6?Q:ڞZlMR('|GJ77ui5WuuUkphi}ޯ`eWΎ:=Uc0|hG0+pzѣv`fe Պ;[Gۊd~E.dOM.;z=K_U7:~ogPw.XE$v)9gG@swetjɇw]2{`dN)/|Sm l݃]MMdO[]u{j927zޑt΅g8D7΃(HήP@ǂ0ʦ ;Zb2 }ckbF_L ;wwf w-+'BYx}~5om=G<yN78<*V2 k|rulmj\F}!?_ucf6=Me<(2W9waaP,gJڥ a/XJXZbɇ7?س?7 9U'525P2 z F@;cP& :pKlmbz:1p_jk__9_M&*x+2[ }n\AoΡͱ)@#5` )0!D[( 0K:퍍q@ >:QdpBAQjD4|,lS5%VHcwUAH6 E@@B:Σ3 lmmwK<4a8it+ e*Qn72X:@G"/ wPk@@H"b)䆷'-E[ -AhD %N'KI) y+U9_# n ,Vʺ,K>{]hXCMu$A!cFݱC ].M=ֶhmj.=g|v7L^x\czj`"$i?/[Vp F$#is`(YT81Y!<=QlӸ@8 _Ue3Z6 ê]̕%Q:bU#' {x׿̽{zO'ȕV⹛=5 p~z*Ծ Z8y[̆N)o]jڛκ~$"K=/Zd=ԱJfVW|UC ܰxGjhze\XQϿHg̥i#Z@}%풔Ɲ[wF/\튵8g>ޛM;ӇgW})hq "F /`s |[!p i^( 5/x l Gx ,Rc .eT㍣rx.pC-TqaP(}fUE`Df5456ۃv:!iiR9JEApG3ZeJXreyd3B@8Q(8 Pir㙒Zt,O}c7'sk\Ǟ;,Px.bZ4ռ{re&?4+q\<:Ų~` C~;voyrj5U< rP2Kq/L;y̆UÃsv:S>2uf~-sloGgZ׳iuH/Rb",;?GbF1wB&8n[mUʋuC dYyp{[Gغj3ן>x[kqK T.Լem$Bzi%1ڎC~:Zh2A d`7(> 1Ji@F,*.FEqqo%( C$÷ŏ/@ >\ߺ7VRY^st9Y.:\R߰j HF{{oܚX]]Wd #730oYWaӾޮL65䲟HˮX!h&u46ƍ`( nS+[ qQ5/+'?ƒp [w8A4g^Y ̺]vc:us6wyRzUU^ .{&g7P@P4zO<04R yC{r(-ɀ>}UE_RCE:[Hc ηnyu)/nd5+N]ZO'.~+']*%dLt|9U>q332 s_twOw"ZSKtc; hE7&6ía%\1=߆.3gIqD@4%gjfZ:yere5p;_;g'ǧ֗gݾw$>}l3S{;>C bLaq-ؿkKo/45V4+8"B:%#]kig ͜$"wEeˆ^s#m}-  zdTI M#5OddE>;Bqai=3_Cwt @6"&Ҥp[^6PR=(4j2Wj=\Dձj#rnQzVacVqOy`b#Ye"kd[/ш7 k ,_:6)qLڛ*\a9$@(Me. 2Yf 4ՂԶFX *ڠ#rz;!"hiT p@ J*Бa@bLM "r$md'p "Ԋe-gsEڰ(X9:i"7N+ s~Z\hՠ_h;pV ч!5H\ɰj?<МsL29#w~ |d#y[ܒ+_1|qcj [>~@2\YZO={de3Ɂh؛-opia`SpKĦZydwW];V1kzl$@M_}|{gSZ]\3 Օ Fݾfu6St"xEP+!z0?`g~z'ڨU:r3Eo zLJ۶uKL 3 Uyq#ƗN<>O!ǶP'(\ B&N#!uDŅ;9m40G-!NZqݎϰ FY߃xǤjPCn+ ̯w6Rerj^LX0ee5 \Y`ɧhx~o>WB Iyhc{&A&h!vauZAWQi3`hHL@r(4J8K%+bq0`AS].Zh+k sh@ j + @4*92Pv ?^b`d]9Uε{R] {m$6x9B^]V$D"_̦Q-UY~~wlh zr#Jjl ̮44xn_3ٚ@xP!ɆR9P!JcRU>F(5ҙ_:mZMRی[@u+ .4;OWsj1meRF6fbHtJ\JZ.^vTM,=t_8ݍ\V=a|vZo䠔˔Zbۚ,US:Z'Q2h \tK+2-QP ں{^1W6{–^?NmdR[=O?f~xeyqp֦twMGʭ{+{>}=j4WW+:Ѭ7Vnz]k'fU  4 `;WL%zc~X -UyC3Kl)e:xvSF}R7@``*Ԅ H'Lb/TFv ȖawJE3f%?oEYp~g423j ; o&PmMA3\ac3ba9[dX(`C]*L'"H6n nAlMNTFi`Bm8@KE4ѭBFL\mŊj8RA> ![p$U^s"]_wacQ#t.Bh@"#,\(JGx2FA IP[a?.yRNbvZKMj-][i􆅝-s3sx!(KdP1]_x9BAK6'AyYdWTT{7؃TrZ^=67gLtAG)`>19h)j_rf08<\gŠajao蛟OcSP0TxZE2+֍OHһ۲xD_NmFL.rdt3kѩ3fo[OsSE)4M!\" ߿ũDsG^91][vw޶=#-sW:t=xjR?[܄Cߝ_=~?0kok>UsH]A'r " tPP-uĎ?g`[HOveh3`D}7}?qXkkh!8B&_F;cf@B#XIkK3+~8v;ޝz|~S'fas!#$JU#.9 '`{4&,j!"p,)cHi ?50ƽ  $AoQ('= }^oo0(k[7jyG' Q<@Y $`<ƄWD6*jo[5" t A(7͡y*yѽ6I B2!ZX@jjPJJ+r;)|E .Q&*IQwn5.{.σ|ןNŻby3 hSzIfp_9~$6uD H|crLvk% ܦxNIr16( Gv/=51:2uc\/ft!"؇#"b.=pc]̂ 4-G6(BgW>]/hwf@gпo[1zf!y\l/mft#C f&k1kO퉅CyyUB^veEӳ^&Νim8pD#a>ϣX[Oy>5Qs= KKDJàd>,"V؀*vhͱH,Q_,2zzBOC:[ٳcd(f2?> 8jܚLm5&RsήHbS'M #M"*8lonNܝ^3>ZHjOJaRbg,O[Z粅Y wn[U/X-ƫ^( %ԫ[~6EuIl}-rLJS5jeO'GpO.f̂l3 x,OoVs{*>q4 vR >jx`#%͔f-3ZXP+ a*,QFQp~BȀ-0E٦Ec"DU9 J&lg{[QÄ?TAV@| T_33t}ta`[2/<$u&Z݅peffFhɖAqql&ـlޮ'1L5 㝹0w.35sWx_Kj|;?&Ipsj8weaV_X\yeDT9àmCWuz*P9V@3)J.3\yǎt<2, RB6FG#.#`~sA?x۰iΑFJ(͞<[uRgE.ZN ksf6F'N__<mvtPo|W*|=)GnG[zꔫF.lkB7C!zZ#w6s_-mXI{cs˙Bi+nhuxHQȟ?Ȁ$qXVkc|qw:"molebj%q6L]{y8/'t}79n(9<ЂV |pj/ . (VQ5amn!' eh5{";'A7@N\@+Hp;<t'zgwg0^ɤ3!1sT !uyQ#ȼ(Dz:*K:q6E]{q Q_1u4PKq4Eub$vG<@?u:{2贬`FJ'] |܆#C܈!pnT--^Pj95PԉnEA>(eLAU?zalC%S=WMI#Gє#%A^WQ]X֊nNO׷iiF$m崎VgFJc/ܪ=$ ;3J}4V@S  z8{qtp{_4K1/~\"y WLCl2 iBKmxjoޛUPEu#WI2#{_4r&~A%^hoFGood3C2ؿ-f f%The˚}p06łW3vvƽ^sS^ x`@\Z__\Zj1`oϬ cުbYgp{>+p: 7l{?W< 0WT`4#|G؁` W*%ö+gn vmkL&^Kh$;etPHh(y!:1 h!ퟝ{}9; 2v ݻòZ)[/NX{T:zt mle2y~'W[9->ȜH.!LY/xF}wmh)J LHrG :G6Mg J4149 }# )DmDTQ0lmq;N-Pynw˝7TJ.~ėHZj(Q hg* x>i#::T)'JEiHz@dE<iy>?D:e)kD:{9CC(MMo~ n-}[=LfM 3p&3 [~ [U]'GLBrwv^x"p&x^dOxm<6l VUT#+USe1#11K`id0dB%ͱo<2rgaLVrжVr__,0*r;R[ݍ{,aCռ&qhSwnԡ|q%cN-E=,B]4R;9A99cfrv/]MqFZ[_6QC;^+2hu4zjjȹ$@/ jAg4 uyu+4I M]9\ͱc)c;LҤJ?;5 Dtޚ։ћϟD}ٚڸ|'Pw\ڬAr^F(g6㾃]1U 5^yD70gO!s'T&2 ]<3}QM~(5؏~Ξp4C47n/D 1($|}W68  ='DHEPg?UmZOC,V;A>[A҄7:ֻ߿6972DMXwk]Qe,jpn#+.khP@YIw 47  $^5iuqwV|e&sziŦ}Oɡ?~#r`Ѐ,*ORiQ‰? `; uLQwG{[o3^JMؾEO9<wL^FO[@:Hcvt Uj9\ 6Rj$ln@v6a9}uTi핦Te\^^sn:+.Hd?Qr;EWp,X9@Gs`hutH(N 1D0=_tj i:Y vˡ(Zw9:СC>y7Sq-%n!#^EfFhH (j ":G.z B5᪓Ip3zY,H?F\&0 vx<],V]w6RmXzdǾ(xmkڪ{˺1Wx?TO&spLDA. R|-.*Q mN_[T[ W`yb0xxOFz+C|6g r!ޥɲH*x4u dC?9DaX ofJ|;UDh2~ D ^:>yml"  uh{ӶMRAFx7:u"zG^+[N?~cRN%dy }VRWdQ`VӃ7GmMM#s,f{O4.!mkNέya<*hXD<7X @R}m.-_>r,כּ۶Ur&bౣp0Xf,p;=9u eHɜ ;2\0 Iwl)uQIr<6cOeɥƆ&(-`A|$ï+uPtn\ԝŕT,PPw AB {t}=>pMjrBWdT 4 N u'6,y$xPOEXz[SSK.A}4go M Jc2@: 4? #V;usVn2P oY`3WH^-SPo{NV\]'@qT7Ur&Ǩ -j4tk klʿ8)TϜl;2XOCEJdݠg&+}nжyP)1)։Kଲ!aevG Dp8\^M~V}{ڀԛ /xtokJ" tCya x{k?ÿ{qY+H!Y!k8."M~ fS$,E֢okPߝNij싧u4ֆo-nݜI.X}<ҵ)xG[LlbMw~4ɮwkjlO&lQ0$Yќ.SP;jq|"Srmrbf}tz}b>=.?#]њh,@_ɧu5ئ%9@(C56GN}AZPA ZBhK8N&';ÞY>}m6$*˴ɽ;[g6\J8u7nj ˥mݵ+\02 0Kd]Cё3DT;e!dI>;K1uN:mIT J i/+DB fG`DYPzpx)߆ş9ݗ/oۻ{BlG^kL{&WaD{ʉr0SB(nO$јIAL_ꭠ.rO^?@m;$;9s /4WKL!xnp@ eRl|` G/8$y#hZ̉V>_ȍ "'{\Kds".@ H]_Zl~ÏՏgQ H[I A( gyWRUA^HYofWA'F n:e#I$i$-pO| 5z8_mSDnjP$\m}p^C6ܰQF1ȪR*$.N?vjRU~J3aQ)=>wX^9:I  S6|OꧾgR'Yy.\uTSbNZ٦eCEwnE 7 nqߘ05I @y(BN\0G8I ҸR;7 ׀ࢻ0J=Ahhj!JtUIӮ\8ʖտ߯B 0xy+&P)|cAHT:\4p៕rC C>B`tzG6s@ \j!Ig?̃R>Be{,jVnJT䜤BL+o]>ЂmC;%IؿwGM?3 h!!>`ߣ J@'VF6ΔK[):! .;UP5D]Iҩ !S_H*އ8E#!Ȑ4CEY:̄:/9PgnDIZy4mcAo{]()ثdX,$C?&\^AQ{W?rw>qߑ}}PXU YRм]I^ESjǛ>!9:I~.V k4 f^Χ;2%ԫ UM*Vm[.Am-Uþ42ΦbHZ7d>t7XO33tg9K+nWe=3 Zwqf[c0W2ZOR]-]XM4D[ª檨ڥkɢK45Q$2挛5U1 >zт^)g b+S{?~rX tc@,s0_r\t/⼧Fkde |~I7cٕtS:ҩ.DۖVX={e&槖(TKQͭd}?97VhcC乽;'֦>)++,{=^}%rvs֬ߥ$Q #HAsk^@wxGgL\J貢?DhM a<-U,v3oyCa96Wѿ莞:?Gpg.˛^)G)$p!A`mm-WO!GJL9{Q-oRmzz,YY8@O=}?Z!bC<Р1VVٗ$jk+ MqL̉j0CdoNœL h;QҾzx]_[!L;-ٕ]pdvwbEEeh4Ay  |{:[B)-ׯ eם+g]޻q$Kj/kFA69 &P3CTd@)hba!޺<{3[^JaFHדKr!p[K0[ZN>T&_*+P,Kner /-ZBDq=UV9VˉJ&[ٍ:;5PŅֈɢW;Zkg7'ϵw#r5AS=bYv'A( I [Z%_c{m w0Fl @g y0½f}ah3wI.b,B1\Xt9.^]~PC$$peu;v׮K՝= ᜄt LjM)x aNvF4Yg^iowԿ}nPL9]?4ش*pQG]H iE⾝=uC"CKݐRe*mK1uEm`H&Lbr7`O疳>X3*7C~՛-;/ok_lxzZ_vCps6̖HcOm敞V1` 0IQ0j޹LD m!,-C:wIqmuOֶt>u هnio$g&ѳaC YYy᭩_ڵK}|@* NjD{&%RZXЙgΏnll85HQ8I=0rr;@z_}vWg/F`ȱ&<Kw#[5],-5HHPBsΚTTB@%Zр:DJJYΊe_Jˊ]fsDS_/o$^9=>6T(wnޙ~hǷO/~NN- <+_ E&H4Ud $ ix7tqdAzDt{fC+DKiikNo_+k n,duj51~lrE,lږOkb8r­l>oOpoVNҚV_CM 8j2[T)[AٺEHK@>&y'V]yt x8s>H ǿESiF|·4\@At;\LŮ "# n }'eSIJ5`3_RRgo6V/⑚;nNё%eg7w4;Z2<3L͠9(Z"tupSL??]p>W~[;GvZ WZk}[ ¹(?E^E hh>C) #y9cъ3&) θ={9x@CW5fJWm 9wwtCl_W|dl>W3]qͶ^Q,>4ӶAO_u3J*^_ۏ/5GAn$]呤T6.hRkS Y*V衎;jwvƣ$j'2i֒c-`C0&#S`@JÃݿtAO F^MoY(u!hqtr~caisp'J,?x{LloYJ8<{=·_[ȝ:{cdoSѯMĢ)t.߿H АM;EՄҙ΄# m(Å@ZOѭy?N*quE7˪9YyB~?ra"c5D&6 uʍtjёF& ru))ux[\\U׳rbg{W&V,{=m\5Q+r ~c7oЪU@NkX%n{G8Kc/-nmOB%YUICJS 1̬d02$<2/Vn/^p~3 Yk+U$ay=wH}/oIg޻qkւ<<ùH8P|&Vʂ:4<BqB37zD |mhApPÄdLUl+OζTʥ:xr9vΎ&-#- ӼssrJWetq[E[3ww6KEs/A{t}]MQ Cٰ*ԡ#u[Y\lxj+-!7C{zZ`L#?tghB#~&5G'xUڼ8LJ)`C;tk*ljUiU?k#wV?+i^P[/Oln,-Uth'Ӗ M>/r藗?䞷oW=~6Â+ɠPW~>;@N>P'D|hs}|'^O?peMֲB`|}lg \-U&NS 6]EFZC+.; I nKƈBZQ\ 8y0xh^Ԕ KDV ^]y@9eYEpe+ 8ϑ&F>#3'N8y>C,U`ܰr.⹢~w7#kf\5KwD}\M-JmG7AD }^_]Qi,3jt"qҾV߁C{|P&"a @,hV-Ã,{odRō= .%i9PL<(2wg5>R5f10 B#4 Cqz-WawrL&Uhn 7~~3A/_vZN[?) cvf,f@ԏ*$Kg'!e7Xn[g_ҭ?OrT+DX鸇c{uőkԓ@BСì U5޼D$Mu;?j2t?"?$$ cn&12=:إ@J%qCP_^^Zޜ\nh=q`7zvDphnn `0_}/gNuc=wp@oϞԃ6| )Ӣl{%Q,.=r$Å8͜: 8Yi]53WXCN #*xn_wY:,^֌W?/pi*Q"dA lJD&c/lai&4kSՌ* z;NwV\ѻJ.oq]Ύd\]XiGNs6CAgnse+ˊRQp,:jCL -ZV*d[Xɶ @>1-T*tD&\>mkk22Εj~8Z$sՐOlʥĉ/< Uۛ|Y$qm߳ƙOcd(AکL9PͰYɂkعȣQkΌLyoTc]u/ʳ[ 7Ӣī _[OZĶCBDy&( Uv#Toeo,O.sy5n+5Oo}d}DZ\UFI5"A?g[Ys#f4>bqGR%I6 R rtL֏ S4ę& UUׇ JR''7d5s3_hǚ$sb/~DOFE7/$MѴU8^ȱ\=x4D@ D$_!lz4:vl.)p'c]dLGEi L\ x* ڦNa R"!ZA~N${G^ӗ2KHu&nhGAVd k}i}u-ͬeZ ?v¹ w<ݸu}_YՔ^_=899komݼ1s䶺1f|h#loܜym-A 7mտ> q,Ӗm!UqyOuü Dl0lR)^0^" ,bGj5wߚPiM7Jl'X*4J% .Zß>ybg2\TFlUUIa`h]\ ITaznM-h:]ڈuT0_ʗ|bX-X":!)WedY>SÂaW ub1?2,(U<={~$8?Ԉ,BdY~'W 3z$/'63u6A>^TM^9ȓTHO0'泼l %c$mG5օhv8BlAfTLW|9 +Z6g5SzbI`#X>Ii|m'*E S6Lhwc5ge]1),p.4 b .Q\* 'x9SKP(޹0;yy*.*bCRv) y ޯ~˷N6fFx\c̿C5aMq G PCI&I`&u!P{L`ْ]Hx C%8ZDyMCw?SOt]$]WGv>~d@G=ijPKӥRvQ~BZ)|꧟:>00 ]SBs͛xvst̹fswv6,,=PwZnL~#^X1hO>y( R+h{iz.ޜ$r!>ht>p@plSpvR VLU^>=WlK tl>Q@њM*vl#EE=%zҩ@^5I8a@Qj |m4O?=(-^M}M,Tԭ҆m 5'%[ 50%(]<m,8c]A h #FE<_Ac;-KTf*ttw<0} THD mf(YL#'c;29VUpK{㛴CDhҁ pMmĂ"1Vv!VSkW?m nV rwJ0aڈObv̋e1 W-Pij!}T.)ZBֽ< ́pñ:yӴ 8){.Og%3ga=c%`"  =0/T0A4jDx|u#qs&1˗X{@jUm9&hI BAmRXim݄dFx/͋WZrc$ `}<팥6VŊM.I]$D\|YVф &$4!`΢.<XÀ!GD Sw CHp$ *?k{T yPim$ F油  ;<>yV*H[W=Évh)uxX_o.ހzOT?~auBv楳Y`|>qljmñUmfz(N_^}?TޓxVZ. %ԪT֢aIB`~6H=A$`# <:D"M[e[œbO\NǓμ* ?w_Lz{l,`^$ F%7)lq`sO{ G9 #lY%&|%[HuV){Z7 sT6(ls*(Kԓj=qLH%hAH=Aȹh@L)+FtHW8C@01IY^OCWl(\쑆T}jx*ʔS+W$TZPZ9ԬRVR+>^xx7 ;0`=RD8TT3U)W; c)HpEWP> x%Lh":Avq>]Eά7$/CPF| w4JF(@!\zPA0W'WRe%_8'AwH'B|~2̟>7ޮx{n|> 3rks-q_ByĈg; l(:t )⇟8\5][%RV ?ϘP"'EO$T0`#_!H&me71:%3']z#^0؁xq!hO}MԹP(BFpFֵ=vP }»RFf@qhQH 7FE?M h_H QId.5\yQ\:0_UQA{xϗQo[d-)#/^/M5p}>1 ;sNP*.n6ʕl$SJ7ao2u3eY7O 9h)MbQd+6k% 7ztOEuO%vyWإh(HpLd x<"帲Lj,4N+Vy}1o3@\*BKxZB0 :Ol1Ĩ - |YX|ۮUSlF:Б̻yd(D74zE{x)HVF0XHc*w|tq-/x ]C\@,%qsM|lv&h"h/J&&<4 Cu zIAPsƙ7-kv\VHp|` dr<| ގ;]5@=p!h2`?啧?p`v9n%Nݿ F\ z!FrRT_| ߾g~'4׆2/q% ?tr&³68"! 5$ X^X pZ֪E,5M& r#+r;*⚦_ ղ;~pW?ǹoYͪFSKWB`r9;`hxk U5ׅK~䩇~}y'|!bX((BM@o%@w̨tX"2#CG .޺0{tٷt0KNI!IUlFUheC[;?xf&W1 δDޥ J 9**mX vfzۢ]m۳JEn55dzHWKp}3B jo"#;FD,Yh(+#ww vF~4 7ڀH/' _?Jᔠ@=O @ x{x>?Ft5dinxYU%N(ڌ()ԬZ@T JQs+?)D9M.!? :'ImD / ~ʻ7V ėpyUV/Po ZЀ?epDCl Fb(yuNY9dSs؊3-S@5ipIEɿm: f@g !p<CȑS ]iCs,"0 /Q6 ᢬r:=0&Yd=G. a M6ɲAB4LKRmfo|xdG޳+Jc7w H90lڷ^HNta`_ݙGC3;.9G> CNPD`=]hI*K|?XPΕׯĖ;?GnM%r#msGe PDN$V;v;2^<0+KoeDyߡw5zܵ~q9ԌVtEPD( lbN ,ʢiCP>~'y*MQv:(#O1)AdC ^TId?x|>2r G݇dW[?Z:$-mmdL$%ģxWoжf[ “}h$)(rP׋z"Z(&Scs0zVNavO~yC Wƙ'4ɠdxV`yvokj 䙆Q0@^T֝ρP>xbWD&WK*yA "āWWE.{P?$3zx{OޝG fe/mH/qX< YP?~Rmsm}<@+Xp{̍yeKnm͗'4X(W?'N"+ZIh)W|MqdH90kB \Ml t{78k(%g$Bԝð$EF zDP>B!L#H.MP3U@TAV\ξ#hxX^p2N/K{ 40[^ G-X7?2 J^ nkɂ"$dI~[Ao~#?/ r%  EPi9>/H@ Z}8h[o@ 25KWLpN##uj۵^d4L#p!A}D qFu T+ʪ1Wpd7n,$MuA}\*m몕 껅o~_3+ُ>{I9Df%I<+?;d*Mmec`*? 3*03 x[2"\ݻ:\W[Rz~f{v^qt~hheU1FG|;$cuinµKeE47N?N"@؉ᦁ& vtcv6{w~k^t+`?u&(!gew~a3sygJ:=X$eYm!L <>80h^c5x$ƒ,# 0p̡cY-6WrRTIeU26KtC0!Ľۚ"|Ԅx/ k"eE$X7+3n!R!y]3̛RO_G|TYK+ϯtaܩЗG` 8_͇XgrGf6?936o}^ޅÈI_Sv/xs/M߹xga%{t/t 4!Ϲ%Q$lyq,/nM$~wq5'Y/+Cdt|o%in3d 1ٽAM 1.nX1Y5^xk'@&.M|2Hc,1߽ /\|}}_/T2+ݒ5,^/Rd%[$ 'I\Nu5t~!lvO/=CD44莫8 [7۳wV>a`GksTxq()5.p]%.>9( PΌ :ϋ5n's7Tb#!APsEoy-U|{S7L_=Ёpg@S'moU͏fA !['|\Y ԋĄt7HY+)SnN^G҉?paC%@]Y-bRP5 E9_V_-z*Gyn] b"@njamI |h|@;E. .m{YV"TT`P%>d50]fnH/{c>!SJ/PNyqO_Op:hPK!Gm m"Ctz'L ݑJldY4ж4NT2,-%DNKPPRdY6* Z| [tRw "*\9L @)vE(lݳ5y(HZ4dڴBGqP $Qũ%$Kx<ՍH,t䞶XP 65RXΝ&j{  kt6)kn˲Q B&!Df+F~I񋗟|`{kslޅ S-ut_>MD03265*o^mmѐ7,ʓO,ldvd>\X{gnoj"W p20@&k=}ezjC|+K"{t[KKwJ m+{Ԫi<[)RL1ӧuL/T&Vru~2*mid4Y3Ҋ G3< 75ǗF+iB&X" Z,BPp0ԫ NlzEѓE\oivG,ˬǻkBA<`XPT\Lkc"KzE>v-yp->S;9s8JEs N=tINPE8:օ$͉4#av֖TcN$aYvG>.^TKW~LE@pFݴ GOf4ztCV=nW64-ːx2\uB d+("+(j{#B Pm$hݱ_N\3p@˝""z/\].K4@XT"ނHJṶK@WwxM(`M+y--#N*K?W/~`=:k"A]E @C3lsRExuf.HJh<7/Ϻ c7\4ӽ k 61Zm%d4ŬT\)jys*fbNIo)Rl }߳Mc^_^3,@ȓ uԸ7Zp)-P0Qיx K.3PWX_Chf"&r=S[J5~ 꺢82$g?FEi. ɏi%*UUټ!{0aDcz hYmY͊*$"GC "o th }[7B*'26C@Q<姨 RAZMm} QIxJJ>A~PL4bW9n1UѐdWejzʥG~֍_j5FWw SÝQ4>9FBxh DAYU^j7kg .WC7L L Lk6௧ZT1Xa"+H._1bHx2:8ܸX@>7V/P25F.OAqy>'ݎ9K#8ꃢj#c+"ٱs;aCG1""u9X0$y`ZB[XXޚOޞOά^FtG*4A`Yِp3ڃMDd E;MWY3e]8%IWiD`]BtdfjR5YJ7R\mO[|l:jjohm{mQ:LQ8Aa.\Zt򡄂tMxh*Th$Yp|O̅OhQĢ4*tlfc`Uzh 2M8T-*r2JQmǯ@U08|hPkt5KH>\' Ԍ'(:lZ1ֲeVD*O^8{8T%%=ĚB80ajRrzb{#i w6C P[ә)N]cI͛_{њX㇇$<XWݚvcj H10&1[9_7--K?l+NeeS,._x;a ƵC͍OOfO={X~_w?ޙi܉N-h_)5%ٌp_%O}{ -+̯iX+c'@':wm (y2||iHXJjxܨ3(fi.&ؾlptԳlIU#T !$#$DROgM=A"F!uS(܇Vb4E:\MM-V ݵSJ;Kg[XնeD[BF{DHbAly3S߼zx2n8zĪfܦXDŪr, w&J|p4Cn'*bn dDjBx0v1 S+2` 4݈`0gQ E_+\\_Mܸ1͖Ys D/d/3UCTtpt@ RiFIӞxo4zGI:As(;rZCd2 փ_aIVhbп}G̱:4Iqy+@'hFEI\|#vJԃ,6 {m=Yl ӓG`w3=csmZ#º=HaY1_V 50zh_}]O*bq>ww]b|pasA$0ȁf}r~ ?khE!r[}->?<ŀضuilg(@jUa _x?8?>C>7;?WX2#?RG#G|bAo޿wg>#U3 VsR~3G;971(x/?rz,m}_T*WxhzѓC 1^ea!p7?`W;ZMFAz~$F,ᝌ'ub;N\ 84Fq zK@6؆..Fxf)N!T&K8AS!6$ @dj4͊lfȧ~h ;y~H7O1\LA5*T"6p\(Y;860F[MBU)Ѱ%^Ns#lmQ/>ϹEedjh!oGp-sd[#ݽkI>'J{3+#C +\+Bģ;n_p|o{wwkǺ'V2y29_4U` QȂp4͇tDZ S5#ZY (J=\xO]AiER4$HAtB/@Bsk)|I$>L&Nn@.CѸ#=T`BA 9 RvVcJVGz|x55[emkE˦LRmn7˛z%tS֦KJ-W>ieZ:a7|&R.f9M)gRV>eRf&id!wId5hN"%T0 TZ&bТtG}2 eR &u 2Q1H i$.G~J #:n<aA!B,Pmȃ2gڙ%@oj WCxj!j6! ^]I-0P@eu^l:8!~ \8@3RUp~g ܿ q2;N9$2ZuGdt=ꏦrg7/ݘ$Rk)E#G {w/˪6_\mkc9TF޽:5?v;㹶 ^R 7QWxן|dP=8tqbuwWK7Vl^d :)&E6?}~b( &iĭ*՛|wS ϻ^pTf:Rs 24m %akoQ /] ~H5WU54XB=%.b˦NkM!R#(r8Ua/ gq<<OUpw{c,gpk -ƕďȞ9"]2Bb@JU=4wiO ,m40u5E|d̻[L4Rb*MPv u O8P2@3/>rAhmmZaTbU1#e舲6{lfn. H'Yua@}M@XOt0&|MKAl=,Ω-8Ƃ'SP{TZ+RACU>~4)RBV:QՋ|Jw!ݢqx -DCv\Q.%Q<ŸEX AJL-g%EcZhd0~ t (C: ڈDtadμ;=F@oT0@^7ӈBXp¶oi~1xLs{]j}4F'ϧa^?#ѕHOx>ghupj YWܫBTk}Q"ܵ e,Uz|fS֘/[o}ۺBE{v-?UxͱM9Pw& 6EmGjlU@5U>^ɹw6J̫ߺj66ժLJۖ&"ܤI]3 |Su/Gcu T2a(h7e 22A+[r^4z6C .`r~%D nSUف,}MU;;{;si , 9 yp`)+Pi2i*0O^K,A%{Q q}+7cey6LSPSkL:CVLs7w^-T2~ZYs'K(,(rRp /wC}p+u`O[cpv繦|*1f/N([)Zoβ=-DbώUXmS jŭ*ɒ-y"|[!w734^ͳk M?}͍qJS]i(']S^<-9j:'zo߿bڰ+w I. BۣkMM_=-5(0&OLogd߃<r.;v{w 8##^6MتX!/4Z.1~BP쀳E+;,B4j2$]ѭLv&:3w`4eq/'+]U 킚 KǹCV pX*Ua@)@dhH}5qz*U%[T IxxGJ-ݢ/@zkbt ( i2-'WH~j~Ii l34V+UۼU5HboK[K%9dV7L^h2`oCì)sutH0oʹ=6Kק/]_޶87Vt[D R^kMpь˽O,gy`][ThFL*A^s BC=i2,qh3U];;oM/r w@o5I708STm(Y%xrZU?sM(mA`pA%) ;/ZC<B7tI]U&L972gyM^d31=F#v*p3d&gQ"S\0/ʻ0 0e(Gb8M$ /M & ݸY:MJndd^4?C.G-Ƨ72$%"4Εhf![T N8$\&X >ųH.d n#Y2,EQLzG?Q/mB2H\5,:S sV]4EHLLmU67LK[łMk H̬ή據9m]B=C.I5qK m`f= <w S7]vY\b%a`ĂݓKk_ڵŲw& {@{[쟿{GyD/]zɃ_^]\II>;7ZAV5EUu:X 3 %Y3>p]B4g.^羝W63?+A]!d6VI[֥{N k.@gPb@ q-@@ I "\dNdE^P2j{wi-~x~a~tE 4hiˬyhKqFA3R@ ᖩO{!?}MO=P?uo?_)U]{C&rSy(_| wy:pqos_$LSaY O'cyYE"'Ux[N_.ݾ]`eUnO hl6k}{j~\*&hlN4Ð8si 䂮Vh,s/D1/n[1\,FA"i@uE5,fettVE&OI*,oڼ/ !\*R ,,kVXtI>JAq#SE .+E7m gآ%+|^+wAp Y2EôPY@.IQbEjSBk_0Lar%&2jQy elѰpplf^3&d^'2JdԽlDSڢg&p ̂TCa" -K8-?=X aD8rsnk~d\bfU- #zic5g$ux Pr_GYJצ M`p>{}㋩ȳ:?qlw70qV[s x:jtIjm1RE?| !KϭMwfO:sm{ٴXjq~15,\M],Sǰ5/1vbdJٻBW4Œ3W%5zl՜j++iKJN]VVT ׎v}pRPFƺȞ/#!"e$)^rV$n{W+3zv  ME@DAH6/yֺබؓ91p|@ݾކ&:+_$j{UA|eۢu c "Ͻ}~zqx荹|RJݷ3^Z*цKf6 4emuamadfe~p@l{]kPZK\~E},b" )&TK幹5e]|lMܗf7F|_#6V̩C5^G+l?ȣ?6 ~sǽj6Gč0Xr% !cPBqP!El:HNx}ν;{r'5 څ wtZ᡾oa1ESK.BUK徎z ͝8JyקC Y Sjjdl S&a#|`oSʴ+dˠXdj[:o#j VtQ..M~4VԂ-j"J&KF(zg1'+> ;QJEƭwVӥJGK@B)Lے9/zt4m[tj]S 9uMy4-ʺA&͖`aTUUKٜO$΍NduU3ֳ0h<HUtJ1B",xq-XaUsj]ɼ>Y,*:40-f⦭LRE_KE8*Rު|FK'\T%5(fx}Hrk#!Fh,4^VºLF\,-YG#!Gd"hw[}Ws,6w?̩ v@a2ٶP)gӅf tf$i#!0)Z- lzn>7{w#:= Xwr6FDز ry#(C]nCSh,ޛ{SzHP_˗g9_IŕMŔ$-gus-7UEܽu^pR-\`#.uKMkze^L)Vy ˆki'Atokl@]UJ _O 㐠V)G.qU"WpXw^[Qh .+ #$T6BnC>VI1rqvmf8ʣicdPQ5i EQ9uY'EDdM1(A.h0tUuۧwְugzer"F;6K3Ly)*!k3LPo@\9uVEIFRd\Ռ:,'Uw\8K1Q$4-d#40@9ΎsWHԟP ˁB^l*CpmݰNҰKD/@@ Dvu6F%g@b4eB%@1my%QM$Fק֋gRZ6~wNOveol«WG8Z \'H -SڐS-)c KBi=Q]n6Ճ^o1383>4\Wbiz$M s/9Ƅ7L $zn+K%]=;kc'8[uד +Z]HVJ^Qf嬌wjհ~ Muo̞83 ,xPQ8#|ͽ[pD@A,+[eaguf)|P*M{8LP]_wg#]MLAlIOo[̗eꕱCCb=k7…{g2yi:}u>ws>Rd9\EgS*"o:s u60\5 T"CbbCLM</P b喈3?w8h tyxw[lޞ_k 6]/Ntć"2w̽z&擲fp`b}bިWܛo_ݱc咳2+pcB]<) \s}<}`LC!"XHSb9۱wzn a%4im{lAmPReǣHGNjQ-PB$/ÝuxgO ǖZ"+]I #wyƦGFgJ0ej9wsyy%B,{{qgtlx_ቛ}F屵l"ؐ yټtgS\ zڀ^Q" d}'u!AeLZwB lrh;-LhW d *FI3?R{ \T֜ˀ6ȒR' M1:K#,ތMcxnh' ho:FUʚקfVs\ )A<窊- .&jL25Rh%':67Jml*kn&+^6:Xz \{23Ji`ٲd)vC 5mm)%}Iڦ8Y8i2g4s眽^[߷{oTfٛ//5ƅZ0Φh_G?|qxk6 Ax*fJ5Vc ɨ6ۭk?z/a /(M՛DnߎT`9bKD.0\}e:}z# ̬)Q2`́FP%BK3p$0p:A޼%i3qή˓B3@ lkrr9n&ЎPg:x{Ik:BY7n'Ol^x䵱|$@PVl2E#H{~1jmCXq'e˭E#}ܶ߱RYVٌW67Mq\|r˺Vԧ6&s_\|뗖/nrz2i}m:8 dҨl0>`k0ng/m9a-eMӵzp2|c!'9jlĢHgYt6Y=}csz[X)ΦnղQz)իpul)5J>LC A*o2+bdաIl%HSiIL&E 3E|2[TZ JVu.ͯg_]h6%uMe.:bebj7ylh%"x^qGZLg(AZH{ERxΞ߹w Z)rn6qไ(p,ָ9|ᑶ+sZ~4 +{L8CE4hzkejX>Б-墺ʃLRuc=]Y[X\+-("%GuZ, iZB}l v6__5MKk\X居gn$$>?؜j]fO JE<//>ܩo֕%: KM1tr;؝;:<Q*̰ewWJZI]]וS.jgzRk[C@emq\]_ɿpv+Vnd/R/}p@ƋA:=@dpPiV[n(؏'e` f7h%$s?xyk+-6KϵԆDkJ h;D4>CFE@VP0o~6|o$Ur4T> ")=j?}3f:8j8>tpȶɹ͎d4#&ʟ/KNMggy3?1z]%E߿41XՑ-BᎅTh.%t0 iOcGhr?@{ۋKh pplPF,q`TSB izna48$e(Lo?rH$?{$\h][kk*kzӔ9:$R{aXMWxlj~#gH h|D.I~JvT֬!c \r:Re==-ёm-ʗC&U^9է.ޛ-8 єD4 i9y`&Je4",M{1eԦݣ`pln6. x0Z6=UQGe #]@!c4-{Z\u]6{KB%"2&e:LO[ g<9dJesccj=S(x1/TMNǶ?zϮсVQղ506&hֆSl7RtP8jV1r)O>U_]r9R:gf1oQSx-w;/8ytRETT>+a5D zAO-z~7 h!tkz6m3i F!9:^~JaiF_LډkERIr$!rIwt{"]_vYszvHG LO7 2ֳUe~÷|5ݺ6g%=dzyuD/O-5}M_6> ~cĂSK/ttPUc,7n5Sg:9kYw';B O.97lhiE#Kg5ӓHa*pJ*ZZ]&ݵa= t+D_wSCؚ'~qa5YyٙpPǏԷNX_=ojIR!]7;$Ͻ1Nq ySߕ)tT Bp+%7_FwY)6K5}i\נ;F|rʍZZC~b{slR1,7ԩtpmGQ5mK\ZԐm.Re $)  $ Rv|Oם: .4) R/z{k"ux6F*DFIssvJAiWqQeڠ3Kks׮VkPP,hnQFu閕J,w*VKz{'ǯ^ͥ s鹵ll ټo{׃GoўA:$aL] D9A "'h;F =[mG;[c#8$qfDkդƑ"5 d;PctZ=t~I'%ڵ̏ޚ}ٛYXc.OUu 5JJ9@ӢiNZN$| X +x6(+̀d n ~k1thl-`5߸{CLJ2gV'Yz*[ۂ!-ڕҁ}le;Iy>Q9}kܱu1'ֿ䉗\Mb̍t|kW16@_v5[n j7.QG ׹tuhO^k; ˤJ?X4Q~+d)eFow3  (u$vo޷έMWB+F6|Vrrg{'(y=teh|ga֙__Bo; st}=3k?tw7sD"vAKTȄEt|:}y Դ FZT5%i.<;ȋLWBxžxK|]-XKL%^T-Ue.*G-J6{q~JG{to߹u.J"?|&N5^DcY/'ŲIS1JZq)fJ/?K5(V/U(i4 _ݙºǢa}wkΎm{{ۦg׋5r982Hr23|eqGKkք&Q ;9~dnY.0 dDj-f6OqilڵlXԞܽCݹcXo[=ޖ e8MZ4Q@Dgz#1,k~D`/8n:_3߸bD2\ÆC3B#a^Dc")vCr>j'' U+Nz2ZdVJe7@eץi&j.Z{ÿtR-@'L k|r( w&w nDQƻSoWlD'QHMHVc\~03˖Nln~{\zwpm?ЕP UG7]2xӽA'ϟ{R}miK "`u^wZK/|o\W@hytNNάΧ?aZr?~O=ˏpO^nRY;yK4rYcV"Ggn3So~$Uӻ>LC[7$Ȃ{P Mrls"s?HRVaߗ׻NW ؛;y~%4M5I/ \MgRK0(0mR,4: /spCmw*Y1YeO\joQ8+ @S%Zĵkwzoj3H^GwK;yc{F[K2<9_i`͆A&KZޘZ ЛM^fANDc7Eo;mp7/*_'e[BPPmjOxM">9p":=Q- N3 X:zw!۸4,nFptХ6IZx=ՖƂ7 B!WXkk޻=KAȰ+WAP,j,JmͯqVzLGb_rn޾W?qg4^ pp #W6,Bg/L' o]< |Ϊ{fgkIA[ϟc^V: E4kh!dj ˙H2]Ymlwݾd cvGr2Ay챩 i0ǐ/L쌗+gzh2mf`^ʾNt>Kӵ?Ǘ~kёǵla'=tWTWkKs.~GdIu#=_gS [45EZlHʪ*+ٮ$bو\ H@C[p>{O5+IiŶ97MD~ d F8/~*ßO;wkrlrm#Sh JMk߼w +,m̤֮oWu*Lcw2;[hljٹk ᅰU*Ox}@_Ӈ%ֵ{Ӈvv^[cG;h9t KUXLC۹/Ώ-J N}؎L|KC4 o$_?k&vt!{;>iyur`^GК :Oṋ ۛ[bC}WZKT.֫nki{/*aOg{Mv>ptG[SyX˲ayƩqMUR)-G:'4 l.|TZfML:{(8b!uj7zۂO땪a]ave KKg.L.B .`wݷn=0Ҏ`qFi[[ z;cca=?~QNWw/-lns۶ v%/_ӗ_8|}[Z{:in3N@]Y+.\{ fF_>>uzjmyPz~Ӭլzh8ԍN8;jvI!0G@4rҕ+sR/?phpg_ޡ}[;t%H<,5TT9UP2g3f6&s,e 0Lh>S S1T Bkݿɛc3 --9PK|<;־/"0ܽGg*ȭvyW~ߙv}yq fe$JiafWA4+N$#;!p?zz_{ozH]@nrmqpm[ k ,%&0;4jo--z6wh8G‰\) 7'.)/Op}v3STSj*ёWe0wtL:JJ<{m);[t\3j[#e%0&t>C<pUL0{!,J> `Q#WG08E27jݭ#3+sGwCJȁ.-f6..g چ'QGU5{=o^t2y]m/߼R4)NUs|ZVtt$k /[^]*(@N) zЍ=w^ ghdnRymtxXuUݨb;n;>Il!C3ԦHP7޵DWX&`B,=?辯|'h "CpVWl<•fͻ-oɀB 5(zk ʆꋍcho?{k5/PϥrKk Sg}!Im~~brG^\W5%(}>z @4!#57y4C5Yk<| $%["M(TI gW["uÚUɢJ,zkG5#@pgWNO>tt;mݣ*>BU3ZnD !ʧxVDUA QtB0O;vt4ө̏:GvA9!^۠a|uvɕ%<6ўgg&6_N$}Rk:Q3!fYdx1_L'~!$*)aEׅ`țˁmMϟt^_N3 V:R<mdanlΔՉc{q) ګggtÙ]BG+=c7hRjeTi/-}dmH=]T!-UOO-inyPf$/*6#I^[t.\̕T@If9Z9>ܢl5Ny*y/#ooqBȐ޵{:v݀$Aw>_zrwnn+@Z #NszumE6Xd7iJy3][at&ip{l Q 3ENW% ~*DR_U gV֫>z[K_Ѓ7*L=^5 MfDȎth'ZNwn?p~js=жwG؄/Ռ_gR[ CWD/kB['-!Ծ1^I5S94>px{t3=d$ր8VME"rwX׮=g|L,$-&&Ғ 4+3NobSD{.'x U{1;z!q Ųs%{xS`旳andkZÃ-5UZ8Wۛè>~o|%.+񨯳%IZ^״ D/?9zc!ws.=9VWMHJ )h zE(NF 8 -pӍ^[S}qdu-;w #˚. |w0?y%D6X ^ѝRʼn5ӕJj`N3< YPZuշeԄR AxkvVMۺ1ƔDfRC_n@س@i r.4ˋ@&FעK|&-Gkhh2-sg|Tp /fT`v1bfa.uH, о%1p\V \3/e:Yp`xFaL-zYgtx)s[+TQ_,\uwRhZWf>sn&[VvB ϭd6ćnnM;Z΅[vr瑝GMl* Ra8kY_4bSSk114;4<^U'\NW5Y`jbEtq~!o?r/8!T*ב@'g..goi j|vÌP+n,-.zSWJuU |DbPӍ ?wo~ Ғ+Z7T8seӓS=ZM[=ɩ5k7ୡT9q&6^y,wl[X/ih=,O]qQV#fcuk:C"`꙲tڿU)e[ Cyȵz?~:RϱRUUӕ{3c: IAģ/`!֥55*vDXP,B*W +k빒Aݾsmh$?|^ZuV!#Uы/^[]Gct)K޾w(ޙ }FZ_KerUM/xPׁ}w1zX"$i`pk%.iMX:f 24$b _,@e>q}v~msfLW ˖;#;w]ZN`5l&fAZ:z]D(fMի߲="ҁZ]{=Ԓ+UElں@Y#1 Pбk_|Ow[m`L.SJ@Nl6[MXY:,3M  *CSiQGd.1{z y4k5*>u#NN?ub_-T ̤AꊣZM:[ͦrI- BΣThk̬ϼѢ&z! ,O4 k%0N04 >I^yO{wٽW [biv~S;;N+W],37fc߿}}痪НDlX]a Wj((4˼횚1S-TQqhzbO{KQI͜Y^XM}m;G{ Z͕F9& u&t%Z;Ŋٛ% aG^Cx<ˁ@}c2\P]]ɔ+*]SWu\UJZ>]G^f{gTSWމ@'LUF񼷿;qhޚa~꩹"#ts5(?2^owmE}4OPifqqkZOYA`geVϿ7Թ*ׂQGmVv7|xgP` X^BhU1@,mjSOP4 4k^V IC+i1m1$:TN{]p**BU_T`'QCPeJ]k&*抪B`yQև5lQ)M:__שQ^E n/Ab ?0OȲ @6&x{=uZwlޜYExeb~1YOg=Df [?7^`dwWI$x71viF_2G72sWgrr1$D;M ?$q] 6J^WW $P??ct>?\MCi;[޽g3aIL"2Tj٨RPQ_ ~}j?G\L߾0}]X`W_{vcw10vH4ViC {=~ew`Q>m.h/|\Nx7yf/O٠Hv}e덉^4v)]~seq~4xyoWk=|#cڥA:lڣD篏lm߉*S)qX s, ^zg2TRl F{bO/GǏ |GF|5wAPz,AYGT*"'Tc{;^|DO 4HGo ٌŊ'B2ۤNlБ bP^cż+BK77fU%r|Rj9*&9lgr 67U)uESxJҕ 03[Q 8ٜMLkd2"~(o7yme]X9Q5O,J'<# 9-{nLだk0Aoc t綦zZ[ۄ =ȾggE9`hײ>wxPt􊮩]r] ꫳ442@$p﮶so$,Jp!Yx*Wikh6ybݨLoTs"j(푁{;] tSAe^c ͓~h70q?,+}| FpGS}) _dC/f"t,ޭ}͏ܻWBD_ȗOٳuEjh96s x/mjYX<ML[FsD)Tf?r׭#Hpv9JrUU3LTdE@'q;v[_@E0홵ܫhw$]Qu?w~'&>aefU{bz.6بW}+w2Ly7櫧޺{g)> {"GM00&Zia% >{f hZa~:ͮn.-!PĪk/ "%AtЏhړ~dG~Wuu72Iz0}m\<m]ps#hϠB5)xMږ@8ŢrY%53Zv` JQ*'٬rTi(GkExĉDfFїN/dړzCH^Pgϯ=w7_>qsn>}hI0 {ԻM_x qٕw _;7Sz-rPWWAN\YHŴ ߑR!IĖHK['HGpz ב{nέwF|/0Z//o^{{,_ӟy#۶mI#0 T~AQ@#ҒWEt8]:_|0;1;7z UU!ƚ~ٳ6Zaڤ4Mt' ˄@Kݭў ޣL?m̅?~@c "-e?A=Ĝ73*eªc+J93,GEOlEs#So4E7yӞ]NЗZg]\IJ]Yϩs󩖦0R+)E˲+QǦHB%7]uA=5aY`cA9c)'=ph8~h8q׶;Zoݻ[nܻ5g[AYÁl}5Q |5֊}11u߹SoΦK̾=r\s}ma|jDzK6vt@

&7B3=ޓO]m5ͷv|o癳nA28{ F3ؙޱ-K+BY!zdIZjs*2\>Q2UmGoSWOr.y Lj1 (lÃp&ӽs}Ϟ KZD?w7}"ģ麬?V2c̳{z~KxhϽGY5(X$@IIm{Ojnz!gzA @VkJĀ|#b,u"W\\*{[*5 g5[(F}>z}z߻YKk x xC=1ё@8p#SY-eӾyA5\LYOkZn,D; >tZ }}n6PJ24nimwn~h{3"ći?o^8w.U }mj' k^in 9#3:Ai34BNDvGf‡LJѽ݀UO[w$FZ|it^.y.\f GH~# ]xoUגU٦֨v3MtuۮMrIGBML2xҁ8u4Jm +3KTT7=|t[˦b)$y?xXc_g2?G'UgY;}7vc~S=D Y GkbvꀧFDX99y!dYDtkrr.+)B|D2R4(s l9|>ܛ͡کu],r3{ڣ+}CmBqvUove$wXgl:4` c)u &SPߌc-^4UKsmJlW[B6:cr]m̀t\3*JȔx(M=,D L)$u<`U*M(@Uˤ /-E,,z1 <)۶h"X D,DлXUGӌhŪd9˹[:$hA ]OYw6kZ^Չÿ\0 #BJ`J,h $nz3M{[Qth(CwjR]Z/kŜ^.Y]h^*腌[sKP<6p6b 1!)b1dAN8y \I}`kB.}~ȱhHIaY@W,:εշ/.9 vŦ'ҥbyyoW/^02c,/]hW.M^64޾;*qP%6VIAj5Y`AeyP9P݄ N6 1.!|Y emYp& ""YËضx;mN~ A4I<Ύm 1k5O 'kmMU3.MeQk|QvPt-yޤmyAT&p㇆lX[6$ٱ* m6Ц!%҇u-ӏTiJUקbAmYPdO, 7^nJ&ں}-=ɞަdG\a!gϥՒ9ZX+(o̩ `L$q9rT%p 'cITr/H< i=:|<^#UH8;ui7A=:xH ͰFڤ#;]1 tJ-ZggĎdk4N\OUTz``m;{w'?DZiV o)(..t9Ѡ0 `4*t"4XFn7o0u HD6-i"N?]T$RS)xs%Rtk@2|nudV[W-]eԪZ*2)3jM p4e)% },$~faUBecXwq鷮Hhˉ^NVJ }Q]Id>n@bPM i?~y>v~&Y`4AfprYU}e^yiHOHdZ~[n+ifMߟ:Cݤ2f%{eZCfYhEG h$ 3& =QYoO5aaW-/[`]` T`[4T5Ð7EtK,|.M:_6t:ܭqz69ԓ\M]K/:h[6/}ꃇ2;?9 R~˃Ÿ#γM5Ʌ\Š6G4]$Sچ H d%W/ycjAhzq!һg'S BZ `x B G'o$/z '7_"HhkH$&~ W[]r?Xj*f6ET8ݴeX&hgdloYhp *T7s tm륵]ZLP,()21 JL^8\ ю P| kBPXv(ģ"讀4!p/};~h" W-H"ɪF)SڙC-K0s];!etӸłSUf0ABDFaoZ&O[DK51U"][uLaG@]_HeJksxAmS|ol0# 4:^U*ߥU:Ɠ#tfX=q`{ppo+FˤYɏ!Qj:ֳEӁu|u-S]U7rl^ժ@LJYfh>@|v~5GٽskVsҫ+ MHв'NSEjj ֩q> f3nKM6y߮ˋ0=G_?q/-JM]D/NN=@Gb׎Q12/@,ˢܶsgayV,|jZ8hiLN(4kCC <㇇f嫬Klݤb \7xw'T`6t@;w¸FSfD&:mu ugoXXIo=;%l)qXeO:#QBr] UnxL9:*(ω2hW'! 2Ā#E;G~pbmYίdc)YbWlLEso/BtU>x#h Ĉ,>{#DG-BgARN6+u!Ǝm<3 6Y&o4MAxp [ТJit^ Jܘ@(ޒ-ׂN)hKh*܇́Gi%(e*;NYc( ' 2@:9uI+jsWo.uH:S]4&ЗGL`,@w x$жC;;~8X:}&Je:p<=HDP 9d,s/˼7u':"-0Bt D@- )Eb* Zo 4ap>U&k饥TzJZuT įӛ*\bp˖\Zl\*|/T,Y=*4J%3E ?pp HC , -ے&yMIW?-4)K nT:(wKs޲{^^)IEbi/ ".r`F=X=wb-Ky`x xsI#QFS@)kJw W&պ{Po}MayT)h C>T{}7%`Жmέ~ʇV TȜݿ͛W~5IDATu6v}d/B![Gx'nC:<6cy;5gvAK+?i*o\KcҊ.CHׄC׭zűIMARi+i-4H iTcr}RS/azhCrssB'B];_@2"$Xrs3 !ݾu>Y ߗIYs">$jh+Xnc0)C*Lp=tq%]y3g4k^|g#? 53!Am_Xʂ 0A":0P]tܜo,6fDk40J"xqL΢YLUK+ŪZF3+$mr|`]7RU#r<+4czw6rՀM҉N2aO-msϾzyim- ;?5 AI1~zadۤM?>~{Jjfjcjf>p39k%ԕM(w~xwnLLeq%l0޵[@$gRdz6-ǒ?hhLr.` ]u5:U{Zzu\^--UdOadg6ƗK zI10 ljRI&HBpcd gzcvi} "ڄ $~P  }x9'jkN4'd9ēd2ܚlh#A_q 3Ý}[tJ8ޅƓb25dyͪקSϽ;o^1+lk:–Bh4Ue}O6h(siR @*xS6Nx/_)XeTsgƖ6;cf:Aͫ!4*" FmΧo&$9tC#Fe0<Q!&h7ߠ$0Xh;Տb! <;Wь#+uVX*ie%(<ʴCK|l=8ܨ '(/ |}c#-R FExgO/fj*mҤ0a8p N3o}xd[j7x[+4~Eהjݞ[!ׁ&$(1ь4VX_wdE|uÄ]H8٧VKytWkno /[Q݊ŠK(?^$t.2«Wo;, 쥷"c̍e[BxPaum4]:v|9R̤w߶mv++/1V)!9?S*Uӛܹ/;Ḷ{x9%|tWX(w4Wi> $we9k[#i@6Xha_:-MlAmd.ȒNxC&Sʊdò%U_-)JJ\`1=&D%7h +%>DKhhx?E#!A1_wx*9 Dd.Gt:Hm0 !ZF p"gpGgt821W\]|JZi~}t76u4ld+ٕ+޽[SϾ3ŵ TEAlԋiz55tD۷XS׋Y^ OrP i4ߤCi5 Z2Tn*Uިxuds9IZKFx`}mmAͽ4&ߟ7TD O'񴗞C{ 1 nM}b܁!4@ z+Jo֯#C{i|m3Ubn7i1QBSmhD"'l !qb!w Wчt$N ţ5\Ջ ڋp\,mMSbVR6ƒבė?L7^>5sir?sҜep +1dthlcmJTΧ=w87s`Gwg}u oOe -U!i{ VjvX1;W.ly泵7w-iWumm#ƩɈ_҅Ptc%WOgK0E$Ϸ* )Ma[jgH<[H75v4'wLsUIhD\]V7JřUkA1518<#k)S~6Ir6AG‡ 02:"o#8;!*5Xj*p:epE傭.1wQ> szlB5q1 3YU7b4I_@pܕhdC:9Vs ]0 _! $ v8!̀f:e OimP^cs)v<|;;z;8$J FȂmg鹉w_|j>]TH܆}jepINUB/( T+ybx3pI꣣;)`܀F@k!2hRT^-`yޯS0N̮u P[]]lQwżj)ZXz=dSYkHeJMl|c/hB(ۑ:an;=ݾX4 cH( %CBjVT z"Y`=Yʦ/P$΅ ں~upbd4]wCe8w/-7VڳlxT//4eE &,kx86slІ]2_g •Zɟ'Wj@q}!m+7*B-k Qro R7/Z-nMw_w~բ< Ox?C{3VX~$[l zx)04۳?vanNss*(aB22*{2*{tk+a*|]%(T,Sx1r/1P#"B z-R2MmlOL1ftGX)Бe6MM*W'S) f+ ^a"koi|*iL*5UcMn̬d73| D`C?8.;k3A}{=G Ir$>`>t4T-]a*F8"ޯr앥_sR8&|e rp+Pō֪ U2j.^e-]1T PUxIb1ke+<;Z}Ю- P K1HnUE D*ҤH`!DDY״fҩ5x-lǸu`%KC,[hr>&5hcW7.Ty ʾ`Dzb͔pͭ4``ٲaldJphfՓY^7@ol~lP?B=2{RT$$:,Km}Ue"d|j#W3ֳKk-Z)M$f:_ޑ ' x$߻)."G-Rʨp148)_KW`h(kOc0# J8IJRRO_}gltsg,6E:UъCnX 43/O~wO݌8BK7<}^ƍ{z M}4zt?}2Jg|ZRN:XE0?"B8Z kŵށV 2TOE)#Ɇb:}=A3.S:i_/IS\8NSl]YaFb^v fX6f!G)o:HM=BJMצjg6N]]>qakgo7nN]A /l!] ) ޸>ys)?\4:28ŵ>2ȶ9B!¥?b–VN}G':3Jş|4xR]sdiײUb]͕z s"d>gi<]-bxQFA|C|J P>?4^B{HkwbWmz?t/=~K?z-=!6܍v4{nTEshc+3MD<+ڗgchssXhZ%b`{P:/1CO(AeTL Q~iԺP_tu,ࠆ͢]_g}AəT:SDўZC]"2Z67^TTA3ayX-蚖^)鶯3zRi(mjK, |xtG\؅zGB#FAfY^-ٸ\NlQ*%%Gj@Q!i@hKQ&&l5￱kgׯ/eN'6<-UkYY-,?8ʩ>,ܥmoo?wz!%9wpw?ÉhPGSgkt^]m;|q5~1U;~|Oz%U)&1:BR!NX\<ҕs{$Nyp3O Hik#᭖Ժf! 1 +5|{}M`9UM/Jeo$:M킪#@IIBS 6:_6^h1εA8Rܯ@ UTg?H^t^.'Z$>*ݖ 㛼?0us鉻Jj/ͯfn/7%#Lwt1 =`ƈHs~?// `utKrtW?~˟<[wnhIF@3@d4|ԡbL.I}^Tga$^:dBa"C=c?x=rwehΤ? 봒B#A%,}>_n;⾭M;Zӿo{GݟO'ѝFmih|]LBshCh Jh%,IG@.$" eR^aI! ^`R@Wm345Ch` 5/ݔGۏߧQA ǣ-}ME[ ԛBUV-WJb^."8(q\za~JheV׌_ljo+P26uDD UU@jYC=g.{X+`'J=Ԅ:q &9+6nEh3ɏҙ7O t-/ Gwߜɧ"[c{S4oPMoep@f$_wJEA)>t-CWZh,".A>}QEnd:q%7>blgnrFE][B;g<:DW?{W>}`WTS>0:4*s$Ʃ '^<xy ɭk>Qϟ=1vc m} o;tסg[B0_`ˎ6vP{=#8}T |_ĝa |Hlĸ FX\N ɩwM-l L F4oyTTBq,x <韮y17S89oV.ٌU}^I >MD$? RQ(`3s-`DG[sTSDJtq U-> nRKB*MAT[L Aez/7Ak}כ-VW7@7f/s`s[NPZ2>K AreD*P5_M(-`Xa߀ SWjx,J0F (aÐƹ^7Z$84ubEuxnC`"f@VThJjLgbI<[uCS`b'4eZҮ= 6v7V!Wu_moYZ-%5aaAz=0K,,Q/WV4xFvUST5E-BrNđ`4[s<"W*uTUkd[zϹ 2Eup cZ)E&Xl_Աk0|ﶮ0zĒZO=6 ,Gbl tz\`(nBD||l tn ͥ ! aho3pm[sG8vsVdi7RYV %\ +`1jZ+E ͢OzS4܁N"FFTфc^P[Klߎ{nww~#>pth$΂#D"qD `&h"W6؄SPfJ[,2)jNYՊYMͦ<Dt! 7IL8@@K=`Xs"@@$bmn2R0v*AP/mX2-i% -"v{m<#/'Y "Ѱ¨eD&'X?.Le BtvKu`tK9J9>@PHfUfϛb="ӌ3RROYCä|Oz\\Q*y< }o_z//g uhQ$P QGk]4(c-IMU,>cG9_gί~{ 4/F4?9*՛c鵂k:Ѡl_/^F`h0+Ue~1۸LDGI}O_D@` mϞ_ͨ Ĉlα=<ز(O&W &>)FVRxwl'.nœw Ag1btf*o?s(Q=JrpBT(Mߴu Fҵ~o YnXfJ*L; N2,Mlu'i6+g 4@@Sď@#IsX;7|pwG:4akey ]8M!t`TN7U-9JH=<͆c|$!e9o8 %mЮO?;{[?mR]h:"% U\ Zyެk*`b K LQ uc4%GY1]]pa'C%Hx-| ZT(hJlrwE@; rmTE)^ۜJ>zD,ېd0@AP4yYu, ww+uS1 lL꤬L ݡ?C״}_s <źOV.'tPCT6MF_j%Nףh{fk=G}鉙%m}K @ޣŵ `WH I3׎'6%U ١NO$T#ir<;t,F'r[FI6+m'ចMd֑w/T 6FvnBcZ[ bFg+! t&|ŰS+ԿK9r 4aWwp-]GbHd oo=A_sHvеbpoܹ}qqs D&u@_}yqumj5*7&rA8Ϳz۵]/ז4'D~B[R,NC`G???Q_zp%&ekݷgS'1z%nHhטQFxSA KA5c!GHNR5)g 5'|\^\lPv@B@<j:v""N4qhk:*8.BSAT"HxAdAq +%hB<_ʮ M]љpB@F`!/BP_| C;#^̀: }N>x te.`@Zc59u<9KDhZS< V|}! 5%05")k1E FMj*/lpOZ(HËߗ@U @{S݄E /TIVOp1 mhQWY70DC8a펰iOQfc0,fI5zR߽qabNË2@@˅ ?Gju!R<`mE)hB((jkK˟}aǖrmMަWhH &iHP ˀwbwٳ5GZ.H.Cg<CC/C^7֪F .er+У93b[_s`ŊQTS)qdsyr2ӅC/+% ;7O?eITПcKaĥ j׿~߱C]Zx嵱o|~^3/Ol F٠jBa< i)P! 4 $ A܁\"qmʹ!16Jբ=t5 tmv0ugh/<@P/= m`- fAEȲ@O NN?XJdT 1FUWhxӄ* Y8SCu(@6H"O( 8؈6E\`I%uC'4/{يjW*iVEU ֐8M^тUCcP75>nG)&Hk-DOި~ 2Ļ DC~xkSNu|wu~% Gz8Te2,Jd[9}a^Uə51J Ż(W2Y` ,Eh镢 0t9%m":FH$R^&cOFE3,c-[C1ǥ ժZ/ұ uPl:(K&h׋FY!ܠWȨp(PG"6sܻgg0H4HڲQR'V84p蝃-Mw/ֵ2+55W%fr@-hŕSUmVߺP/oѾIS`80/O̦黇9u;#韝Tȗ UD;}A _#^AONMMLQ,Jv,C#{?|lЮnʁdk3щ5'0!Cc_V(:Dh 1OS pd 5Dj8/SFh,f3c[lie S'  iБ%͂nui`.`/ބL.o^ fh6L\q0 f^d=t5IDQaP*-MWjcDcBݘtÿ?pe4ݨhX :Pa>@ȼw={y3٫+}>5l`ED$eqOk#s *ڣIR`]Z>3؂_&r ֙Cs2R<'v 4:FZi)G{{v.1gLVvHReQT44|.?i5G-~gj}0M/&*n͇݃C}"-?y[-v*.=}t}q,Bt:^v+Q D}x7yZ}٪Uw9p=,Z@ϣ-ng3Z4Xo\nqxijh@aˍHJӊDq)p\k+VL?]Y}peRUݨJjo\ٴd-[V*˳%6&F%!A%^Xzp0f Xbː3-{`0 0u  #ӥ@K#UcxKEEq^%Lz-Z.0yH1de ^!rj9rread_info (); $png->set_rgb_to_gray (); if ($png->get_rgb_to_gray_status ()) { print "The image contained non-gray pixels.\n"; } else { print "The image was grayscale already.\n"; } $png->read_image (); $png->read_end (); my $wpng = $png->copy_png (); my $ihdr = $wpng->get_IHDR (); $ihdr->{color_type} = PNG_COLOR_TYPE_GRAY; $wpng->set_IHDR ($ihdr); my $after = "life-gray.png"; $wpng->write_png_file ($after); print "Size after: ", -s $after, "\n"; if (! png_compare ($file, $after)) { print "The two files contain exactly the same image data.\n"; } else { print "The two files contain different image data.\n"; } libimage-png-libpng-perl-0.59/get-pixel.pl000077500000000000000000000014311475730614500204640ustar00rootroot00000000000000#!/home/ben/software/install/bin/perl use warnings; use strict; use utf8; use FindBin '$Bin'; use lib "$Bin/blib/lib"; use lib "$Bin/blib/arch"; use Image::PNG::Libpng ':all'; my $png = read_png_file ("$Bin/qrpng-small.png"); #my $png = read_png_file ("$Bin/unt/logo_icon128.v101.png"); #exit; #my $png = read_png_file ("$Bin/examples/luv.png"); my $h = $png->height (); my $w = $png->width (); for my $y (0..$h-1) { # if ($y % 2 != 0) { # next; # } for my $x (0..$w-1) { # if ($x % 2 != 0) { # next; # } # print "$y $x\n"; my $pixel = $png->get_pixel ($x, $y); # print "$pixel\n"; # if ($pixel->{red} > 100 && # $pixel->{green} < 100 && # $pixel->{blue} < 100) { if ($pixel->{gray}) { print " "; } else { print "#"; } } print "\n"; } libimage-png-libpng-perl-0.59/inc/000077500000000000000000000000001475730614500170005ustar00rootroot00000000000000libimage-png-libpng-perl-0.59/inc/CheckForLibPng.pm000066400000000000000000000221711475730614500221210ustar00rootroot00000000000000# ____ _ _ __ _ _ _ # / ___| |__ ___ ___| | __ / _| ___ _ __ | (_) |__ _ __ _ __ __ _ # | | | '_ \ / _ \/ __| |/ / | |_ / _ \| '__| | | | '_ \| '_ \| '_ \ / _` | # | |___| | | | __/ (__| < | _| (_) | | | | | |_) | |_) | | | | (_| | # \____|_| |_|\___|\___|_|\_\ |_| \___/|_| |_|_|_.__/| .__/|_| |_|\__, | # |_| |___/ # # Repository: https://github.com/benkasminbullock/check4libpng # # This file lives in ~/projects/check4libpng/lib and should be copied # from there. # # 0.03 2018-09-16 # # - Use $Config{cc} to get the C compiler # # 0.02 2017-07-01 # # - Remove "Template" stuff # - Change file to edit # - Debugging messages all go through "msg". # # 0.01 2017-06-28 # # Old method of checking for libpng recovered from Image::PNG::Libpng # git commit 50c6032e3f61624736159930026f2b2a306fcd35. package CheckForLibPng; use parent Exporter; our @EXPORT = qw/check_for_libpng/; use warnings; use strict; use utf8; use FindBin '$Bin'; use Carp; our $VERSION = '0.03'; # This uses $Config{cc}, $Config{ldflags} and $Config{ccflags} to try # to compile a small program which links against libpng. use Config qw/%Config/; # If the test compilation doesn't work, edit the following two lines # to point to your libpng library's location and the location of the # directory containing the file "png.h". my $png_lib_dir; # = /usr/local/lib , etc. my $png_include_dir; # = /usr/local/include, etc. # The following variable switches on printing of non-error messages #my $verbose = 1; my $verbose; # Debugging messages sub msg { my (undef, $file, $line) = caller (0); if ($verbose) { printf ("%s:%d: @_.\n", $file, $line); } } # Find an executable program called $program in $ENV{PATH}. sub find_program { my ($program) = @_; msg ("looking for $program in \$PATH"); my $found; if ($ENV{PATH}) { my @path = split /:/, $ENV{PATH}; for my $dir (@path) { msg ("Looking in '$dir' for '$program'"); my $dprogram = "$dir/$program"; if (-f $dprogram && -x $dprogram) { msg ("Found"); $found = $dprogram; last; } msg ("Not found"); } } else { msg ("There is no PATH environment variable"); } return $found; } # Look for libpng. If found, return value is a hash ref containing # keys "libs" and "inc" for the library directory and the include file # directory of libpng. If not found, return value is the undefined # value. sub check_for_libpng { my (%options) = @_; if ($options{verbose}) { $verbose = 1; } if ($options{prefix}) { $png_include_dir = "$options{prefix}/include"; if (! -d $png_include_dir) { die "$png_include_dir doesn't exist"; } $png_lib_dir = "$options{prefix}/lib"; if (! -d $png_lib_dir) { die "$png_lib_dir doesn't exist"; } } msg ("Debugging messages in 'check_for_libpng' are switched on"); # $inc is a flag for the C compiler to tell it where to find header # files. my $inc = ''; if ($png_include_dir) { $inc = "-I $png_include_dir"; } if ($inc) { msg ("\$inc is '$inc'"); } # $libs is a flag for the C compiler to tell it where to find library # files. my $libs = '-lpng -lz -lm'; if ($png_lib_dir) { $libs = "-L$png_lib_dir $libs"; } if ($options{prefix}) { if ($verbose) { print "Overriding library and include directories with $options{prefix}.\n"; } } else { my $has_pkg_config = find_program ('pkg-config', $verbose); if ($has_pkg_config) { msg ('I found "pkg-config" in your PATH so I am going to use that to help with the compilation of the C part of this module.'); my $pkg_config_cflags = `pkg-config --cflags libpng`; $pkg_config_cflags =~ s/\s+$//; my $pkg_config_ldflags = `pkg-config --libs libpng`; $pkg_config_ldflags =~ s/\s+$//; if ($pkg_config_cflags) { msg ("Adding '$pkg_config_cflags' to C compiler flags from pkg-config"); $inc = $pkg_config_cflags; } if ($pkg_config_ldflags) { msg ("Adding '$pkg_config_ldflags' to linker flags from pkg-config"); $libs = $pkg_config_ldflags; } } } # A minimal C program to test compilation and running. my $test_c = <<'EOF'; #include #include #include "png.h" void fatal_error (const char * message) { fprintf (stderr, "%s.\n", message); exit (1); } int main () { png_structp png_ptr; png_infop info_ptr; FILE * file; png_uint_32 libpng_vn = png_access_version_number(); printf ("%s:%d: IMAGE-PNG LIBPNG VERSION: <<%s>>\n", __FILE__, __LINE__, png_get_libpng_ver (0)); /* Create a file because there are some CPAN testers who seem to have bogus libpngs. */ /* file = fopen ("temporary.png", "wb"); if (! file) { fatal_error ("cannot open file"); }*/ png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, 0, 0, 0); if (! png_ptr) { fatal_error ("cannot create write struct"); } info_ptr = png_create_info_struct (png_ptr); if (! png_ptr) { fatal_error ("cannot create info struct"); } // png_init_io (png_ptr, file); return 0; } EOF # The name of our test program. my $exe_file_name = 'png-compile-test'; my $c_file_name = "$exe_file_name.c"; # Booleans which record whether our test program could be compiled and # run. The default is false. my $compile_ok; my $run_ok; if (! -f $c_file_name && ! -f $exe_file_name) { msg ("compiling and running a test program called '$c_file_name'"); # Get $ldflags and $ccflags from Config.pm. my $ldflags = $Config{ldflags}; # my $ccflags; my $ccflags = $Config{ccflags}; # The C compiler to use my $cc = $Config{cc}; if (! $cc) { die "I cannot find a C compiler in your \%Config"; } open my $output, ">", $c_file_name or die "Error opening file '$c_file_name' for writing: $!"; print $output $test_c; close $output or die "Error closing file '$c_file_name': $!"; if ($options{prefix}) { $libs .= " -Wl,--rpath -Wl,$png_lib_dir "; } my $compile = "$cc $inc $ccflags -o $exe_file_name $c_file_name $libs $ldflags "; msg ("The compile command is '$compile'"); $compile_ok = (system ($compile) == 0); if ($compile_ok) { $run_ok = (system ("./$exe_file_name") == 0); } for my $file ($exe_file_name, $c_file_name) { if (-f $file) { unlink $file or print STDERR < \@EXPORT_OK); use warnings; use strict; use constant { SUPPORTED => 1, PNG_GAMMA_THRESHOLD_FIXED => 1, }; use constant { PNG_AFTER_IDAT => 0x08, PNG_ALL_FILTERS => ((0x08 | 0x10 | 0x20) | 0x40 | 0x80), PNG_ALL_MNG_FEATURES => 0x05, PNG_ALPHA_ASSOCIATED => 1, PNG_ALPHA_BROKEN => 3, PNG_ALPHA_OPTIMIZED => 2, PNG_ALPHA_PNG => 0, PNG_ALPHA_PREMULTIPLIED => 1, PNG_ALPHA_STANDARD => 1, PNG_ARM_NEON => 0, PNG_BACKGROUND_GAMMA_FILE => 2, PNG_BACKGROUND_GAMMA_SCREEN => 1, PNG_BACKGROUND_GAMMA_UNIQUE => 3, PNG_BACKGROUND_GAMMA_UNKNOWN => 0, PNG_BLEND_OP_OVER => 0x01, PNG_BLEND_OP_SOURCE => 0x00, PNG_COLOR_MASK_ALPHA => 4, PNG_COLOR_MASK_COLOR => 2, PNG_COLOR_MASK_PALETTE => 1, PNG_COLOR_TYPE_GA => (4), PNG_COLOR_TYPE_GRAY => 0, PNG_COLOR_TYPE_GRAY_ALPHA => (4), PNG_COLOR_TYPE_PALETTE => (2 | 1), PNG_COLOR_TYPE_RGB => (2), PNG_COLOR_TYPE_RGBA => (2 | 4), PNG_COLOR_TYPE_RGB_ALPHA => (2 | 4), PNG_COMPRESSION_TYPE_BASE => 0, PNG_COMPRESSION_TYPE_DEFAULT => 0, PNG_CRC_DEFAULT => 0, PNG_CRC_ERROR_QUIT => 1, PNG_CRC_NO_CHANGE => 5, PNG_CRC_QUIET_USE => 4, PNG_CRC_WARN_DISCARD => 2, PNG_CRC_WARN_USE => 3, PNG_DEFAULT_sRGB => -1, PNG_DISPOSE_OP_BACKGROUND => 0x01, PNG_DISPOSE_OP_NONE => 0x00, PNG_DISPOSE_OP_PREVIOUS => 0x02, PNG_EQUATION_ARBITRARY => 2, PNG_EQUATION_BASE_E => 1, PNG_EQUATION_HYPERBOLIC => 3, PNG_EQUATION_LINEAR => 0, PNG_ERROR_ACTION_ERROR => 3, PNG_ERROR_ACTION_NONE => 1, PNG_ERROR_ACTION_WARN => 2, PNG_FAST_FILTERS => (0x08 | 0x10 | 0x20), PNG_FILLER_AFTER => 1, PNG_FILLER_BEFORE => 0, PNG_FILTER_AVG => 0x40, PNG_FILTER_HEURISTIC_DEFAULT => 0, PNG_FILTER_HEURISTIC_UNWEIGHTED => 1, PNG_FILTER_HEURISTIC_WEIGHTED => 2, PNG_FILTER_NONE => 0x08, PNG_FILTER_PAETH => 0x80, PNG_FILTER_SUB => 0x10, PNG_FILTER_TYPE_BASE => 0, PNG_FILTER_TYPE_DEFAULT => 0, PNG_FILTER_UP => 0x20, PNG_FILTER_VALUE_AVG => 3, PNG_FILTER_VALUE_NONE => 0, PNG_FILTER_VALUE_PAETH => 4, PNG_FILTER_VALUE_SUB => 1, PNG_FILTER_VALUE_UP => 2, PNG_FLAG_MNG_EMPTY_PLTE => 0x01, PNG_FLAG_MNG_FILTER_64 => 0x04, PNG_FORMAT_ABGR => (((0x02|0x10)|0x01)|0x20), PNG_FORMAT_ABGR_COLORMAP => ((((0x02|0x10)|0x01)|0x20)|0x08), PNG_FORMAT_AG => (0x01|0x20), PNG_FORMAT_ARGB => ((0x02|0x01)|0x20), PNG_FORMAT_ARGB_COLORMAP => (((0x02|0x01)|0x20)|0x08), PNG_FORMAT_BGR => (0x02|0x10), PNG_FORMAT_BGRA => ((0x02|0x10)|0x01), PNG_FORMAT_BGRA_COLORMAP => (((0x02|0x10)|0x01)|0x08), PNG_FORMAT_BGR_COLORMAP => ((0x02|0x10)|0x08), PNG_FORMAT_FLAG_AFIRST => 0x20, PNG_FORMAT_FLAG_ALPHA => 0x01, PNG_FORMAT_FLAG_ASSOCIATED_ALPHA => 0x40, PNG_FORMAT_FLAG_BGR => 0x10, PNG_FORMAT_FLAG_COLOR => 0x02, PNG_FORMAT_FLAG_COLORMAP => 0x08, PNG_FORMAT_FLAG_LINEAR => 0x04, PNG_FORMAT_GA => 0x01, PNG_FORMAT_GRAY => 0, PNG_FORMAT_LINEAR_RGB => (0x04|0x02), PNG_FORMAT_LINEAR_Y => 0x04, PNG_FORMAT_LINEAR_Y_ALPHA => (0x04|0x01), PNG_FORMAT_RGB => 0x02, PNG_FORMAT_RGBA => (0x02|0x01), PNG_FORMAT_RGBA_COLORMAP => ((0x02|0x01)|0x08), PNG_FORMAT_RGB_COLORMAP => (0x02|0x08), PNG_FP_1 => 100000, PNG_FP_HALF => 50000, PNG_FP_MIN => (-PNG_FP_MAX), PNG_FREE_ALL => 0xffff, PNG_FREE_EXIF => 0x8000, PNG_FREE_HIST => 0x0008, PNG_FREE_ICCP => 0x0010, PNG_FREE_MUL => 0x4220, PNG_FREE_PCAL => 0x0080, PNG_FREE_PLTE => 0x1000, PNG_FREE_ROWS => 0x0040, PNG_FREE_SCAL => 0x0100, PNG_FREE_SPLT => 0x0020, PNG_FREE_TEXT => 0x4000, PNG_FREE_TRNS => 0x2000, PNG_FREE_UNKN => 0x0200, PNG_GAMMA_LINEAR => 100000, PNG_GAMMA_MAC_18 => -2, PNG_GAMMA_THRESHOLD => (PNG_GAMMA_THRESHOLD_FIXED*.00001), PNG_GAMMA_sRGB => 220000, PNG_HANDLE_CHUNK_ALWAYS => 3, PNG_HANDLE_CHUNK_AS_DEFAULT => 0, PNG_HANDLE_CHUNK_IF_SAFE => 2, PNG_HANDLE_CHUNK_NEVER => 1, PNG_HAVE_IHDR => 0x01, PNG_HAVE_PLTE => 0x02, PNG_IGNORE_ADLER32 => 8, PNG_IMAGE_ERROR => 2, PNG_IMAGE_FLAG_16BIT_sRGB => 0x04, PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB => 0x01, PNG_IMAGE_FLAG_FAST => 0x02, PNG_IMAGE_VERSION => 1, PNG_IMAGE_WARNING => 1, PNG_INFO_IDAT => 0x8000, PNG_INFO_PLTE => 0x0008, PNG_INFO_acTL => 0x40000, PNG_INFO_bKGD => 0x0020, PNG_INFO_cHRM => 0x0004, PNG_INFO_cICP => 0x20000, PNG_INFO_eXIf => 0x10000, PNG_INFO_fcTL => 0x80000, PNG_INFO_gAMA => 0x0001, PNG_INFO_hIST => 0x0040, PNG_INFO_iCCP => 0x1000, PNG_INFO_oFFs => 0x0100, PNG_INFO_pCAL => 0x0400, PNG_INFO_pHYs => 0x0080, PNG_INFO_sBIT => 0x0002, PNG_INFO_sCAL => 0x4000, PNG_INFO_sPLT => 0x2000, PNG_INFO_sRGB => 0x0800, PNG_INFO_tIME => 0x0200, PNG_INFO_tRNS => 0x0010, PNG_INTERLACE_ADAM7 => 1, PNG_INTERLACE_ADAM7_PASSES => 7, PNG_INTERLACE_NONE => 0, PNG_INTRAPIXEL_DIFFERENCING => 64, PNG_IO_CHUNK_CRC => 0x0080, PNG_IO_CHUNK_DATA => 0x0040, PNG_IO_CHUNK_HDR => 0x0020, PNG_IO_MASK_LOC => 0x00f0, PNG_IO_MASK_OP => 0x000f, PNG_IO_NONE => 0x0000, PNG_IO_READING => 0x0001, PNG_IO_SIGNATURE => 0x0010, PNG_IO_WRITING => 0x0002, PNG_ITXT_COMPRESSION_NONE => 1, PNG_ITXT_COMPRESSION_zTXt => 2, PNG_KEYWORD_MAX_LENGTH => 79, PNG_MAXIMUM_INFLATE_WINDOW => 2, PNG_MAX_PALETTE_LENGTH => 256, PNG_MIPS_MMI => 12, PNG_MIPS_MSA => 6, PNG_NO_FILTERS => 0x00, PNG_OFFSET_MICROMETER => 1, PNG_OFFSET_PIXEL => 0, PNG_OPTION_INVALID => 1, PNG_OPTION_NEXT => 14, PNG_OPTION_OFF => 2, PNG_OPTION_ON => 3, PNG_OPTION_UNSET => 0, PNG_POWERPC_VSX => 10, PNG_RESOLUTION_METER => 1, PNG_RESOLUTION_UNKNOWN => 0, PNG_RGB_TO_GRAY_DEFAULT => (-1), PNG_SCALE_METER => 1, PNG_SCALE_RADIAN => 2, PNG_SCALE_UNKNOWN => 0, PNG_SKIP_sRGB_CHECK_PROFILE => 4, PNG_TEXT_COMPRESSION_NONE => -1, PNG_TEXT_COMPRESSION_NONE_WR => -3, PNG_TEXT_COMPRESSION_zTXt => 0, PNG_TEXT_COMPRESSION_zTXt_WR => -2, PNG_TRANSFORM_BGR => 0x0080, PNG_TRANSFORM_EXPAND => 0x0010, PNG_TRANSFORM_EXPAND_16 => 0x4000, PNG_TRANSFORM_GRAY_TO_RGB => 0x2000, PNG_TRANSFORM_IDENTITY => 0x0000, PNG_TRANSFORM_INVERT_ALPHA => 0x0400, PNG_TRANSFORM_INVERT_MONO => 0x0020, PNG_TRANSFORM_PACKING => 0x0004, PNG_TRANSFORM_PACKSWAP => 0x0008, PNG_TRANSFORM_SCALE_16 => 0x8000, PNG_TRANSFORM_SHIFT => 0x0040, PNG_TRANSFORM_STRIP_16 => 0x0001, PNG_TRANSFORM_STRIP_ALPHA => 0x0002, PNG_TRANSFORM_STRIP_FILLER => 0x0800, PNG_TRANSFORM_STRIP_FILLER_AFTER => 0x1000, PNG_TRANSFORM_STRIP_FILLER_BEFORE => 0x0800, PNG_TRANSFORM_SWAP_ALPHA => 0x0100, PNG_TRANSFORM_SWAP_ENDIAN => 0x0200, PNG_sRGB_INTENT_ABSOLUTE => 3, PNG_sRGB_INTENT_PERCEPTUAL => 0, PNG_sRGB_INTENT_RELATIVE => 1, PNG_sRGB_INTENT_SATURATION => 2, }; =head1 NAME Image::PNG::Const - Constants for libpng =head1 SYNOPSIS # Get just the constants you need: use Image::PNG::Const qw/PNG_TRANSFORM_INVERT_ALPHA PNG_COLOR_MASK_ALPHA/; # Get everything: use Image::PNG::Const ':all'; This module is a helper for L. It contains no functions, only constants. =head1 CONSTANTS This file contains the following constants, from the header file of the PNG library, C: =over =item PNG_AFTER_IDAT PNG_AFTER_IDAT has value 0x08. =item PNG_ALL_FILTERS PNG_ALL_FILTERS has value ((0x08 | 0x10 | 0x20) | 0x40 | 0x80). =item PNG_ALL_MNG_FEATURES PNG_ALL_MNG_FEATURES has value 0x05. =item PNG_ALPHA_ASSOCIATED PNG_ALPHA_ASSOCIATED has value 1. =item PNG_ALPHA_BROKEN PNG_ALPHA_BROKEN has value 3. =item PNG_ALPHA_OPTIMIZED PNG_ALPHA_OPTIMIZED has value 2. =item PNG_ALPHA_PNG PNG_ALPHA_PNG has value 0. =item PNG_ALPHA_PREMULTIPLIED PNG_ALPHA_PREMULTIPLIED has value 1. =item PNG_ALPHA_STANDARD PNG_ALPHA_STANDARD has value 1. =item PNG_ARM_NEON PNG_ARM_NEON has value 0. =item PNG_BACKGROUND_GAMMA_FILE PNG_BACKGROUND_GAMMA_FILE has value 2. =item PNG_BACKGROUND_GAMMA_SCREEN PNG_BACKGROUND_GAMMA_SCREEN has value 1. =item PNG_BACKGROUND_GAMMA_UNIQUE PNG_BACKGROUND_GAMMA_UNIQUE has value 3. =item PNG_BACKGROUND_GAMMA_UNKNOWN PNG_BACKGROUND_GAMMA_UNKNOWN has value 0. =item PNG_BLEND_OP_OVER PNG_BLEND_OP_OVER has value 0x01. =item PNG_BLEND_OP_SOURCE PNG_BLEND_OP_SOURCE has value 0x00. =item PNG_COLOR_MASK_ALPHA PNG_COLOR_MASK_ALPHA has value 4. =item PNG_COLOR_MASK_COLOR PNG_COLOR_MASK_COLOR has value 2. =item PNG_COLOR_MASK_PALETTE PNG_COLOR_MASK_PALETTE has value 1. =item PNG_COLOR_TYPE_GA PNG_COLOR_TYPE_GA has value (4). =item PNG_COLOR_TYPE_GRAY PNG_COLOR_TYPE_GRAY has value 0. =item PNG_COLOR_TYPE_GRAY_ALPHA PNG_COLOR_TYPE_GRAY_ALPHA has value (4). =item PNG_COLOR_TYPE_PALETTE PNG_COLOR_TYPE_PALETTE has value (2 | 1). =item PNG_COLOR_TYPE_RGB PNG_COLOR_TYPE_RGB has value (2). =item PNG_COLOR_TYPE_RGBA PNG_COLOR_TYPE_RGBA has value (2 | 4). =item PNG_COLOR_TYPE_RGB_ALPHA PNG_COLOR_TYPE_RGB_ALPHA has value (2 | 4). =item PNG_COMPRESSION_TYPE_BASE PNG_COMPRESSION_TYPE_BASE has value 0. =item PNG_COMPRESSION_TYPE_DEFAULT PNG_COMPRESSION_TYPE_DEFAULT has value 0. =item PNG_CRC_DEFAULT PNG_CRC_DEFAULT has value 0. =item PNG_CRC_ERROR_QUIT PNG_CRC_ERROR_QUIT has value 1. =item PNG_CRC_NO_CHANGE PNG_CRC_NO_CHANGE has value 5. =item PNG_CRC_QUIET_USE PNG_CRC_QUIET_USE has value 4. =item PNG_CRC_WARN_DISCARD PNG_CRC_WARN_DISCARD has value 2. =item PNG_CRC_WARN_USE PNG_CRC_WARN_USE has value 3. =item PNG_DEFAULT_sRGB PNG_DEFAULT_sRGB has value -1. =item PNG_DISPOSE_OP_BACKGROUND PNG_DISPOSE_OP_BACKGROUND has value 0x01. =item PNG_DISPOSE_OP_NONE PNG_DISPOSE_OP_NONE has value 0x00. =item PNG_DISPOSE_OP_PREVIOUS PNG_DISPOSE_OP_PREVIOUS has value 0x02. =item PNG_EQUATION_ARBITRARY PNG_EQUATION_ARBITRARY has value 2. =item PNG_EQUATION_BASE_E PNG_EQUATION_BASE_E has value 1. =item PNG_EQUATION_HYPERBOLIC PNG_EQUATION_HYPERBOLIC has value 3. =item PNG_EQUATION_LINEAR PNG_EQUATION_LINEAR has value 0. =item PNG_ERROR_ACTION_ERROR PNG_ERROR_ACTION_ERROR has value 3. =item PNG_ERROR_ACTION_NONE PNG_ERROR_ACTION_NONE has value 1. =item PNG_ERROR_ACTION_WARN PNG_ERROR_ACTION_WARN has value 2. =item PNG_FAST_FILTERS PNG_FAST_FILTERS has value (0x08 | 0x10 | 0x20). =item PNG_FILLER_AFTER PNG_FILLER_AFTER has value 1. =item PNG_FILLER_BEFORE PNG_FILLER_BEFORE has value 0. =item PNG_FILTER_AVG PNG_FILTER_AVG has value 0x40. =item PNG_FILTER_HEURISTIC_DEFAULT PNG_FILTER_HEURISTIC_DEFAULT has value 0. =item PNG_FILTER_HEURISTIC_UNWEIGHTED PNG_FILTER_HEURISTIC_UNWEIGHTED has value 1. =item PNG_FILTER_HEURISTIC_WEIGHTED PNG_FILTER_HEURISTIC_WEIGHTED has value 2. =item PNG_FILTER_NONE PNG_FILTER_NONE has value 0x08. =item PNG_FILTER_PAETH PNG_FILTER_PAETH has value 0x80. =item PNG_FILTER_SUB PNG_FILTER_SUB has value 0x10. =item PNG_FILTER_TYPE_BASE PNG_FILTER_TYPE_BASE has value 0. =item PNG_FILTER_TYPE_DEFAULT PNG_FILTER_TYPE_DEFAULT has value 0. =item PNG_FILTER_UP PNG_FILTER_UP has value 0x20. =item PNG_FILTER_VALUE_AVG PNG_FILTER_VALUE_AVG has value 3. =item PNG_FILTER_VALUE_NONE PNG_FILTER_VALUE_NONE has value 0. =item PNG_FILTER_VALUE_PAETH PNG_FILTER_VALUE_PAETH has value 4. =item PNG_FILTER_VALUE_SUB PNG_FILTER_VALUE_SUB has value 1. =item PNG_FILTER_VALUE_UP PNG_FILTER_VALUE_UP has value 2. =item PNG_FLAG_MNG_EMPTY_PLTE PNG_FLAG_MNG_EMPTY_PLTE has value 0x01. =item PNG_FLAG_MNG_FILTER_64 PNG_FLAG_MNG_FILTER_64 has value 0x04. =item PNG_FORMAT_ABGR PNG_FORMAT_ABGR has value (((0x02|0x10)|0x01)|0x20). =item PNG_FORMAT_ABGR_COLORMAP PNG_FORMAT_ABGR_COLORMAP has value ((((0x02|0x10)|0x01)|0x20)|0x08). =item PNG_FORMAT_AG PNG_FORMAT_AG has value (0x01|0x20). =item PNG_FORMAT_ARGB PNG_FORMAT_ARGB has value ((0x02|0x01)|0x20). =item PNG_FORMAT_ARGB_COLORMAP PNG_FORMAT_ARGB_COLORMAP has value (((0x02|0x01)|0x20)|0x08). =item PNG_FORMAT_BGR PNG_FORMAT_BGR has value (0x02|0x10). =item PNG_FORMAT_BGRA PNG_FORMAT_BGRA has value ((0x02|0x10)|0x01). =item PNG_FORMAT_BGRA_COLORMAP PNG_FORMAT_BGRA_COLORMAP has value (((0x02|0x10)|0x01)|0x08). =item PNG_FORMAT_BGR_COLORMAP PNG_FORMAT_BGR_COLORMAP has value ((0x02|0x10)|0x08). =item PNG_FORMAT_FLAG_AFIRST PNG_FORMAT_FLAG_AFIRST has value 0x20. =item PNG_FORMAT_FLAG_ALPHA PNG_FORMAT_FLAG_ALPHA has value 0x01. =item PNG_FORMAT_FLAG_ASSOCIATED_ALPHA PNG_FORMAT_FLAG_ASSOCIATED_ALPHA has value 0x40. =item PNG_FORMAT_FLAG_BGR PNG_FORMAT_FLAG_BGR has value 0x10. =item PNG_FORMAT_FLAG_COLOR PNG_FORMAT_FLAG_COLOR has value 0x02. =item PNG_FORMAT_FLAG_COLORMAP PNG_FORMAT_FLAG_COLORMAP has value 0x08. =item PNG_FORMAT_FLAG_LINEAR PNG_FORMAT_FLAG_LINEAR has value 0x04. =item PNG_FORMAT_GA PNG_FORMAT_GA has value 0x01. =item PNG_FORMAT_GRAY PNG_FORMAT_GRAY has value 0. =item PNG_FORMAT_LINEAR_RGB PNG_FORMAT_LINEAR_RGB has value (0x04|0x02). =item PNG_FORMAT_LINEAR_Y PNG_FORMAT_LINEAR_Y has value 0x04. =item PNG_FORMAT_LINEAR_Y_ALPHA PNG_FORMAT_LINEAR_Y_ALPHA has value (0x04|0x01). =item PNG_FORMAT_RGB PNG_FORMAT_RGB has value 0x02. =item PNG_FORMAT_RGBA PNG_FORMAT_RGBA has value (0x02|0x01). =item PNG_FORMAT_RGBA_COLORMAP PNG_FORMAT_RGBA_COLORMAP has value ((0x02|0x01)|0x08). =item PNG_FORMAT_RGB_COLORMAP PNG_FORMAT_RGB_COLORMAP has value (0x02|0x08). =item PNG_FP_1 PNG_FP_1 has value 100000. =item PNG_FP_HALF PNG_FP_HALF has value 50000. =item PNG_FP_MIN PNG_FP_MIN has value (-PNG_FP_MAX). =item PNG_FREE_ALL PNG_FREE_ALL has value 0xffff. =item PNG_FREE_EXIF PNG_FREE_EXIF has value 0x8000. =item PNG_FREE_HIST PNG_FREE_HIST has value 0x0008. =item PNG_FREE_ICCP PNG_FREE_ICCP has value 0x0010. =item PNG_FREE_MUL PNG_FREE_MUL has value 0x4220. =item PNG_FREE_PCAL PNG_FREE_PCAL has value 0x0080. =item PNG_FREE_PLTE PNG_FREE_PLTE has value 0x1000. =item PNG_FREE_ROWS PNG_FREE_ROWS has value 0x0040. =item PNG_FREE_SCAL PNG_FREE_SCAL has value 0x0100. =item PNG_FREE_SPLT PNG_FREE_SPLT has value 0x0020. =item PNG_FREE_TEXT PNG_FREE_TEXT has value 0x4000. =item PNG_FREE_TRNS PNG_FREE_TRNS has value 0x2000. =item PNG_FREE_UNKN PNG_FREE_UNKN has value 0x0200. =item PNG_GAMMA_LINEAR PNG_GAMMA_LINEAR has value 100000. =item PNG_GAMMA_MAC_18 PNG_GAMMA_MAC_18 has value -2. =item PNG_GAMMA_THRESHOLD PNG_GAMMA_THRESHOLD has value (PNG_GAMMA_THRESHOLD_FIXED*.00001). =item PNG_GAMMA_sRGB PNG_GAMMA_sRGB has value 220000. =item PNG_HANDLE_CHUNK_ALWAYS PNG_HANDLE_CHUNK_ALWAYS has value 3. =item PNG_HANDLE_CHUNK_AS_DEFAULT PNG_HANDLE_CHUNK_AS_DEFAULT has value 0. =item PNG_HANDLE_CHUNK_IF_SAFE PNG_HANDLE_CHUNK_IF_SAFE has value 2. =item PNG_HANDLE_CHUNK_NEVER PNG_HANDLE_CHUNK_NEVER has value 1. =item PNG_HAVE_IHDR PNG_HAVE_IHDR has value 0x01. =item PNG_HAVE_PLTE PNG_HAVE_PLTE has value 0x02. =item PNG_IGNORE_ADLER32 PNG_IGNORE_ADLER32 has value 8. =item PNG_IMAGE_ERROR PNG_IMAGE_ERROR has value 2. =item PNG_IMAGE_FLAG_16BIT_sRGB PNG_IMAGE_FLAG_16BIT_sRGB has value 0x04. =item PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB has value 0x01. =item PNG_IMAGE_FLAG_FAST PNG_IMAGE_FLAG_FAST has value 0x02. =item PNG_IMAGE_VERSION PNG_IMAGE_VERSION has value 1. =item PNG_IMAGE_WARNING PNG_IMAGE_WARNING has value 1. =item PNG_INFO_IDAT PNG_INFO_IDAT has value 0x8000. =item PNG_INFO_PLTE PNG_INFO_PLTE has value 0x0008. =item PNG_INFO_acTL PNG_INFO_acTL has value 0x40000. =item PNG_INFO_bKGD PNG_INFO_bKGD has value 0x0020. =item PNG_INFO_cHRM PNG_INFO_cHRM has value 0x0004. =item PNG_INFO_cICP PNG_INFO_cICP has value 0x20000. =item PNG_INFO_eXIf PNG_INFO_eXIf has value 0x10000. =item PNG_INFO_fcTL PNG_INFO_fcTL has value 0x80000. =item PNG_INFO_gAMA PNG_INFO_gAMA has value 0x0001. =item PNG_INFO_hIST PNG_INFO_hIST has value 0x0040. =item PNG_INFO_iCCP PNG_INFO_iCCP has value 0x1000. =item PNG_INFO_oFFs PNG_INFO_oFFs has value 0x0100. =item PNG_INFO_pCAL PNG_INFO_pCAL has value 0x0400. =item PNG_INFO_pHYs PNG_INFO_pHYs has value 0x0080. =item PNG_INFO_sBIT PNG_INFO_sBIT has value 0x0002. =item PNG_INFO_sCAL PNG_INFO_sCAL has value 0x4000. =item PNG_INFO_sPLT PNG_INFO_sPLT has value 0x2000. =item PNG_INFO_sRGB PNG_INFO_sRGB has value 0x0800. =item PNG_INFO_tIME PNG_INFO_tIME has value 0x0200. =item PNG_INFO_tRNS PNG_INFO_tRNS has value 0x0010. =item PNG_INTERLACE_ADAM7 PNG_INTERLACE_ADAM7 has value 1. =item PNG_INTERLACE_ADAM7_PASSES PNG_INTERLACE_ADAM7_PASSES has value 7. =item PNG_INTERLACE_NONE PNG_INTERLACE_NONE has value 0. =item PNG_INTRAPIXEL_DIFFERENCING PNG_INTRAPIXEL_DIFFERENCING has value 64. =item PNG_IO_CHUNK_CRC PNG_IO_CHUNK_CRC has value 0x0080. =item PNG_IO_CHUNK_DATA PNG_IO_CHUNK_DATA has value 0x0040. =item PNG_IO_CHUNK_HDR PNG_IO_CHUNK_HDR has value 0x0020. =item PNG_IO_MASK_LOC PNG_IO_MASK_LOC has value 0x00f0. =item PNG_IO_MASK_OP PNG_IO_MASK_OP has value 0x000f. =item PNG_IO_NONE PNG_IO_NONE has value 0x0000. =item PNG_IO_READING PNG_IO_READING has value 0x0001. =item PNG_IO_SIGNATURE PNG_IO_SIGNATURE has value 0x0010. =item PNG_IO_WRITING PNG_IO_WRITING has value 0x0002. =item PNG_ITXT_COMPRESSION_NONE PNG_ITXT_COMPRESSION_NONE has value 1. =item PNG_ITXT_COMPRESSION_zTXt PNG_ITXT_COMPRESSION_zTXt has value 2. =item PNG_KEYWORD_MAX_LENGTH PNG_KEYWORD_MAX_LENGTH has value 79. =item PNG_MAXIMUM_INFLATE_WINDOW PNG_MAXIMUM_INFLATE_WINDOW has value 2. =item PNG_MAX_PALETTE_LENGTH PNG_MAX_PALETTE_LENGTH has value 256. =item PNG_MIPS_MMI PNG_MIPS_MMI has value 12. =item PNG_MIPS_MSA PNG_MIPS_MSA has value 6. =item PNG_NO_FILTERS PNG_NO_FILTERS has value 0x00. =item PNG_OFFSET_MICROMETER PNG_OFFSET_MICROMETER has value 1. =item PNG_OFFSET_PIXEL PNG_OFFSET_PIXEL has value 0. =item PNG_OPTION_INVALID PNG_OPTION_INVALID has value 1. =item PNG_OPTION_NEXT PNG_OPTION_NEXT has value 14. =item PNG_OPTION_OFF PNG_OPTION_OFF has value 2. =item PNG_OPTION_ON PNG_OPTION_ON has value 3. =item PNG_OPTION_UNSET PNG_OPTION_UNSET has value 0. =item PNG_POWERPC_VSX PNG_POWERPC_VSX has value 10. =item PNG_RESOLUTION_METER PNG_RESOLUTION_METER has value 1. =item PNG_RESOLUTION_UNKNOWN PNG_RESOLUTION_UNKNOWN has value 0. =item PNG_RGB_TO_GRAY_DEFAULT PNG_RGB_TO_GRAY_DEFAULT has value (-1). =item PNG_SCALE_METER PNG_SCALE_METER has value 1. =item PNG_SCALE_RADIAN PNG_SCALE_RADIAN has value 2. =item PNG_SCALE_UNKNOWN PNG_SCALE_UNKNOWN has value 0. =item PNG_SKIP_sRGB_CHECK_PROFILE PNG_SKIP_sRGB_CHECK_PROFILE has value 4. =item PNG_TEXT_COMPRESSION_NONE PNG_TEXT_COMPRESSION_NONE has value -1. =item PNG_TEXT_COMPRESSION_NONE_WR PNG_TEXT_COMPRESSION_NONE_WR has value -3. =item PNG_TEXT_COMPRESSION_zTXt PNG_TEXT_COMPRESSION_zTXt has value 0. =item PNG_TEXT_COMPRESSION_zTXt_WR PNG_TEXT_COMPRESSION_zTXt_WR has value -2. =item PNG_TRANSFORM_BGR PNG_TRANSFORM_BGR has value 0x0080. =item PNG_TRANSFORM_EXPAND PNG_TRANSFORM_EXPAND has value 0x0010. =item PNG_TRANSFORM_EXPAND_16 PNG_TRANSFORM_EXPAND_16 has value 0x4000. =item PNG_TRANSFORM_GRAY_TO_RGB PNG_TRANSFORM_GRAY_TO_RGB has value 0x2000. =item PNG_TRANSFORM_IDENTITY PNG_TRANSFORM_IDENTITY has value 0x0000. =item PNG_TRANSFORM_INVERT_ALPHA PNG_TRANSFORM_INVERT_ALPHA has value 0x0400. =item PNG_TRANSFORM_INVERT_MONO PNG_TRANSFORM_INVERT_MONO has value 0x0020. =item PNG_TRANSFORM_PACKING PNG_TRANSFORM_PACKING has value 0x0004. =item PNG_TRANSFORM_PACKSWAP PNG_TRANSFORM_PACKSWAP has value 0x0008. =item PNG_TRANSFORM_SCALE_16 PNG_TRANSFORM_SCALE_16 has value 0x8000. =item PNG_TRANSFORM_SHIFT PNG_TRANSFORM_SHIFT has value 0x0040. =item PNG_TRANSFORM_STRIP_16 PNG_TRANSFORM_STRIP_16 has value 0x0001. =item PNG_TRANSFORM_STRIP_ALPHA PNG_TRANSFORM_STRIP_ALPHA has value 0x0002. =item PNG_TRANSFORM_STRIP_FILLER PNG_TRANSFORM_STRIP_FILLER has value 0x0800. =item PNG_TRANSFORM_STRIP_FILLER_AFTER PNG_TRANSFORM_STRIP_FILLER_AFTER has value 0x1000. =item PNG_TRANSFORM_STRIP_FILLER_BEFORE PNG_TRANSFORM_STRIP_FILLER_BEFORE has value 0x0800. =item PNG_TRANSFORM_SWAP_ALPHA PNG_TRANSFORM_SWAP_ALPHA has value 0x0100. =item PNG_TRANSFORM_SWAP_ENDIAN PNG_TRANSFORM_SWAP_ENDIAN has value 0x0200. =item PNG_sRGB_INTENT_ABSOLUTE PNG_sRGB_INTENT_ABSOLUTE has value 3. =item PNG_sRGB_INTENT_PERCEPTUAL PNG_sRGB_INTENT_PERCEPTUAL has value 0. =item PNG_sRGB_INTENT_RELATIVE PNG_sRGB_INTENT_RELATIVE has value 1. =item PNG_sRGB_INTENT_SATURATION PNG_sRGB_INTENT_SATURATION has value 2. =back =head1 EXPORTS Nothing is exported by default, but all the symbols in this module can be exported on request. There is one export tag, 'all', which exports all the symbols in this module: use Image::PNG::Const ':all'; =head1 ABOUT THIS MODULE This Perl module was generated from the file F supplied with version 1.6.45 of libpng. =head1 AUTHOR Ben Bullock, =head1 COPYRIGHT & LICENCE This package and associated files are copyright (C) 2011-2025 Ben Bullock. You can use, copy, modify and redistribute this package and associated files under the Perl Artistic Licence or the GNU General Public Licence. =cut # Local variables: # mode: perl # End: libimage-png-libpng-perl-0.59/lib/Image/PNG/Libpng.pm000066400000000000000000000211341475730614500222150ustar00rootroot00000000000000 # This file is just a list of exports and documentation. The source # code for this file is in Libpng.xs in the top directory. package Image::PNG::Libpng; use warnings; use strict; require Exporter; use Carp; our @ISA = qw(Exporter); our @EXPORT_OK = qw/ access_version_number color_type_channels color_type_name copy_row_pointers create_read_struct create_write_struct destroy_read_struct destroy_write_struct get_IHDR get_PLTE get_bKGD get_bit_depth get_cHRM get_cHRM_XYZ get_channels get_chunk_cache_max get_chunk_malloc_max get_color_type get_compression_buffer_size get_eXIf get_gAMA get_hIST get_iCCP get_interlace_type get_internals get_libpng_ver get_oFFs get_pCAL get_pHYs get_palette_max get_pixel get_rgb_to_gray_status get_rowbytes get_rows get_sBIT get_sCAL get_sPLT get_sRGB get_tIME get_tRNS get_tRNS_palette get_text get_unknown_chunks get_valid init_io init_io_x libpng_supports permit_mng_features read_end read_from_scalar read_image read_info read_png read_struct read_update_info scalar_as_input set_IHDR set_PLTE set_add_alpha set_alpha_mode set_bKGD set_back set_background set_bgr set_cHRM set_cHRM_XYZ set_chunk_cache_max set_chunk_malloc_max set_compression_buffer_size set_compression_level set_compression_mem_level set_compression_method set_compression_strategy set_compression_window_bits set_crc_action set_eXIf set_expand set_expand_16 set_expand_gray_1_2_4_to_8 set_filler set_filter set_gAMA set_gamma set_gray_to_rgb set_hIST set_iCCP set_image_data set_invert_alpha set_invert_mono set_keep_unknown_chunks set_oFFs set_pCAL set_pHYs set_packing set_packswap set_palette_to_rgb set_quantize set_rgb_to_gray set_row_pointers set_rows set_sBIT set_sCAL set_sPLT set_sRGB set_scale_16 set_strip_16 set_strip_alpha set_swap set_swap_alpha set_tIME set_tRNS set_tRNS_pointer set_tRNS_to_alpha set_text set_text_compression_level set_text_compression_mem_level set_text_compression_strategy set_text_compression_window_bits set_transforms set_unknown_chunks set_user_limits set_verbosity sig_cmp split_alpha text_compression_name write_end write_image write_info write_png write_to_scalar copy_png create_reader create_writer get_contents get_internals image_data_diff png_compare read_png_file split_alpha write_png_file /; our %EXPORT_TAGS = ( all => \@EXPORT_OK, ); require XSLoader; our $VERSION = '0.59'; XSLoader::load('Image::PNG::Libpng', $VERSION); use Image::PNG::Const ':all'; # Old undocumented function name sub read_file { goto & read_png_file; } # Old undocumented function name sub write_file { goto & write_png_file; } sub read_png_file { my ($file_name, %options) = @_; my $png = create_read_struct (); if ($options{transforms}) { $png->set_transforms ($options{transforms}); } if ($options{verbosity}) { $png->set_verbosity ($options{verbosity}); } open my $in, "<:raw", $file_name or croak "Cannot open '$file_name' for reading: $!"; $png->init_io ($in); $png->read_png (); close $in or croak $!; return $png; } sub write_png_file { my ($png, $file_name) = @_; if ($png->read_struct ()) { # The following is more convenient but might not work in some # cases, depending on how libpng handles different # transformations and so on, so I don't really want to risk # it. # my $copy = $png->copy_png (); # write_png_file ($copy, $file_name); # return; croak "The png is a read structure, use copy_png to copy it to a write structure"; } if (! $file_name) { croak "Supply a file name"; } open my $in, ">:raw", $file_name or croak "Cannot open '$file_name' for writing: $!"; $png->init_io ($in); $png->write_png (); close $in or croak $!; } my %known_chunks = ( bKGD => 1, cHRM => 1, gAMA => 1, hIST => 1, iCCP => 1, IDAT => 1, oFFs => 1, pCAL => 1, pHYs => 1, PLTE => 1, sBIT => 1, sCAL => 1, sPLT => 1, sRGB => 1, tIME => 1, tRNS => 1, ); sub get_chunk { my ($png, $chunk) = @_; if ($chunk eq 'IDAT') { croak "Use get_rows"; } if ($known_chunks{$chunk}) { no strict 'refs'; my $sub = "get_$chunk"; return &$sub ($png); } return undef; } sub set_chunk { my ($png, $chunk, $value) = @_; if ($chunk eq 'IDAT') { croak "Use set_rows"; } if ($known_chunks{$chunk}) { no strict 'refs'; my $sub = "set_$chunk"; return &$sub ($png, $value); } croak "Unknown chunk $chunk"; } sub copy_png { my ($png, %options) = @_; my $opng = create_write_struct (); if ($options{verbosity}) { $opng->set_verbosity ($options{verbosity}); } my $strip = $options{strip}; my $strip_all; if ($strip) { if ($strip eq 'all') { $strip_all = 1; } } my $valid = $png->get_valid (); $opng->set_IHDR ($png->get_IHDR ()); my $rows = $png->get_rows (); $opng->set_rows ($rows); # Set PLTE up first because hIST needs it to be set. if ($valid->{PLTE}) { $opng->set_chunk ('PLTE', $png->get_chunk ('PLTE')); } if (! $strip_all) { # Make a list of valid chunks excluding IHDR (header), IDAT # (image data), and PLTE (palette). my @valid = grep {!/IHDR|IDAT|PLTE/ && $valid->{$_}} sort keys %$valid; for my $chunk (@valid) { $opng->set_chunk ($chunk, $png->get_chunk ($chunk)); } } return $opng; } sub width { goto & get_image_width; } sub height { goto & get_image_height; } sub image_data_diff { my ($file1, $file2, %options) = @_; my $transforms = PNG_TRANSFORM_EXPAND | PNG_TRANSFORM_GRAY_TO_RGB; my $png1 = read_png_file ($file1, transforms => $transforms); my $png2 = read_png_file ($file2, transforms => $transforms); my $ihdr1 = $png1->get_IHDR (); my $ihdr2 = $png2->get_IHDR (); my @fields = qw/height width/; for my $field (@fields) { print "$field: $ihdr1->{$field} != $ihdr2->{$field}\n"; if ($ihdr1->{$field} != $ihdr2->{$field}) { return "$field differs: $file1: ". "$ihdr1->{field}; $file2: $ihdr2->{field}"; } } my $h = $ihdr1->{height}; my $rows1 = $png1->get_rows (); my $rows2 = $png2->get_rows (); for my $r (0..$h - 1) { my $row1 = $rows1->[$r]; my $row2 = $rows2->[$r]; if ($row1 ne $row2) { if ($options{print_bytes}) { my @bytes1 = unpack "C*", $row1; my @bytes2 = unpack "C*", $row2; for my $byte (0..$#bytes1) { if ($bytes1[$byte] != $bytes2[$byte]) { printf 'byte %0d: %02X,%02X' . "\n", $byte, $bytes1[$byte], $bytes2[$byte]; } } print "\n"; } return "Row $r of image data differs"; } } # No difference. return undef; } sub png_compare { my ($file1, $file2, %options) = @_; my $transforms = PNG_TRANSFORM_EXPAND | PNG_TRANSFORM_GRAY_TO_RGB; my $png1 = read_png_file ($file1, transforms => $transforms); my $png2 = read_png_file ($file2, transforms => $transforms); my $ihdr1 = $png1->get_IHDR (); my $ihdr2 = $png2->get_IHDR (); my @fields = qw/height width/; for my $field (@fields) { if ($ihdr1->{$field} != $ihdr2->{$field}) { return 1; } } my $h = $ihdr1->{height}; my $rows1 = $png1->get_rows (); my $rows2 = $png2->get_rows (); for my $r (0..$h - 1) { my $row1 = $rows1->[$r]; my $row2 = $rows2->[$r]; if ($row1 ne $row2) { return 1; } } # No difference. return 0; } sub create_reader { my ($file) = @_; open my $in, "<:raw", $file or croak "Can't open '$file': $!"; my $png = create_read_struct (); $png->init_io ($in); return $png; } sub create_writer { my ($file) = @_; open my $in, ">:raw", $file or croak "Can't open '$file': $!"; my $png = create_write_struct (); $png->init_io ($in); return $png; } # This is a helper for pnginspect which pulls out the information from # a PNG file and sticks it into a hash. sub get_contents { # The PNG "file" might also be some data pulled from the web and # not saved to a file, so the fields $name and $size in the # argument list might be a URL and the size of a bit of binary # data in Perl's memory. my ($png, $name, $size) = @_; if (! $name) { croak "No name"; } if (! $size || $size !~ /^[0-9]+$/) { croak "No size or bad size"; } my %contents; $contents{name} = $name; $contents{size} = $size; $contents{ihdr} = $png->get_IHDR (); my $valid = $png->get_valid (); for my $key (%$valid) { if ($key eq 'IDAT') { $contents{IDAT} = 'OK'; } else { $contents{$key} = $png->get_chunk ($key); } } $contents{text} = $png->get_text (); return \%contents; } 1; # Local Variables: # mode: perl # End: libimage-png-libpng-perl-0.59/lib/Image/PNG/Libpng.pod000066400000000000000000003522301475730614500223670ustar00rootroot00000000000000 =pod =encoding UTF-8 =head1 NAME Image::PNG::Libpng - Perl interface to the C library "libpng". =head1 SYNOPSIS Libpng-like interface: use Image::PNG::Libpng ':all'; my $png = create_read_struct (); open my $file, '<:raw', 'nice.png' or die $!; $png->init_io ($file); $png->read_png (); close $file; # Get all valid chunks my $valid = $png->get_valid (); my @valid_chunks = sort grep {$valid->{$_}} keys %$valid; print "Valid chunks are ", join (", ", @valid_chunks), "\n"; # Print image information my $header = $png->get_IHDR (); for my $k (keys %$header) { print "$k: $header->{$k}\n"; } (This example is included as L|https://fastapi.metacpan.org/source/BKB/Image-PNG-Libpng-0.59/examples/synopsis.pl> in the distribution.) Simple interface: use Image::PNG::Libpng ':all'; my $png = read_png_file ('../t/tantei-san.png'); # Get all valid chunks my $valid = $png->get_valid (); my @valid_chunks = sort grep {$valid->{$_}} keys %$valid; print "Valid chunks are ", join (", ", @valid_chunks), "\n"; # Print image information my $header = $png->get_IHDR (); for my $k (keys %$header) { if ($k eq 'color_type') { print "$k: " . color_type_name ($header->{$k}) . "\n"; } else { print "$k: $header->{$k}\n"; } } my $wpng = $png->copy_png (); $wpng->write_png_file ('new.png'); (This example is included as L|https://fastapi.metacpan.org/source/BKB/Image-PNG-Libpng-0.59/examples/synopsis-easy.pl> in the distribution.) =head1 VERSION This document describes Image::PNG::Libpng version 0.59, corresponding to git commit L<1b99f6eb7a1bf68bb4d3c392454d0ace5fb1d81c|https://github.com/benkasminbullock/image-png-libpng/commit/1b99f6eb7a1bf68bb4d3c392454d0ace5fb1d81c> at Mon Feb 24 15:00:50 2025 +0900. Unless otherwise qualified, comments in this document on the libpng source code and documentation refer to libpng version 1.6.45. Libpng is not bundled with this distribution, so your installed version may vary. =head1 DESCRIPTION Image::PNG::Libpng is a Perl library for accessing the contents of PNG (Portable Network Graphics) images. Image::PNG::Libpng enables Perl to use the "libpng" library to read and write files in PNG format. Image::PNG::Libpng does not contain the libpng library. The libpng library must be installed on your computer prior to installing Image::PNG::Libpng. Image::PNG::Libpng consists of Perl subroutines which mirror the C functions in libpng, plus helper subroutines to make it easier to read and write PNG data in Perl. For those familiar with libpng, the section L explains the differences with libpng. =head1 FUNCTIONS The functions in the module are gathered into the following categories: L, which describes some convenience functions, L, which describes functions which closely mirror libpng, L, which describes functions for reading and writing the meta-information about PNG images, L, which describes functions for accessing the image data itself, L, L, L, L, L, L, L, functions from libpng which don't fit elsewhere, and L, which are functions specific to this module. =head1 Simple input and output These convenience functions combine common operations. They are not part of the original libpng API. =head2 copy_png my $outpng = $png->copy_png (); Copy a PNG from a read to a write structure. This function bridges two kinds of object, "read a png" objects created by L and "write a png" objects created by L. This function copies all the valid chunks from a read structure to a write structure. The following example demonstrates copying a PNG. use utf8; use FindBin '$Bin'; use Image::PNG::Libpng qw(read_png_file write_png_file) ; my $pngin = read_png_file ("$Bin/../t/tantei-san.png"); my $pngout = $pngin->copy_png (); $pngout->set_text ([{key => 'Name', text => 'Shunsaku Kudo'}]); # $pngout->write_png_file ('copy.png'); (This example is included as L|https://fastapi.metacpan.org/source/BKB/Image-PNG-Libpng-0.59/examples/copy-png.pl> in the distribution.) =head2 create_reader my $png = create_reader ('file.png'); $png->read_png (); This combines L, C, and L on the specified file name but does not read the file in. This is for the case that the user wants to apply some kind of transformation. =head3 Setting the background In the following example, the user sets the background with L to replace the alpha channel. use utf8; use FindBin '$Bin'; use Image::PNG::Libpng ':all'; use Image::PNG::Const ':all'; my $file = "$Bin/luv.png"; my %color = (red => 0xC0, green => 0xFF, blue => 0xFF); my $png = create_reader ($file); $png->set_background (\%color, PNG_BACKGROUND_GAMMA_SCREEN, 0); $png->read_png (); my $wpng = copy_png ($png); $wpng->write_png_file ("$Bin/set-background.png"); (This example is included as L|https://fastapi.metacpan.org/source/BKB/Image-PNG-Libpng-0.59/examples/set-background.pl> in the distribution.) L is included in the distribution. =begin html

The input image has a transparent background:

examples/luv.png
=end html L is included in the distribution. =begin html

The output image has a blue background:

examples/set-background.png
=end html This function was added to the module in version 0.53. =head2 create_writer my $png = create_writer ('file.png'); $png->set_IHDR (\%ihdr); $png->set_rows (\@rows); $png->write_png (); This combines L, C, and L on the specified file name but does not read the file in. This is for the case that the user wants to apply some kind of transformation before writing. This function was added to the module in version 0.53. =head2 read_from_scalar my $png = read_from_scalar ($string); This creates an image structure C<$png> from the contents of a Perl scalar variable C<$string> containing PNG image data, for example data read from a file, or data obtained from a web page. The first argument, C<$png>, is a PNG structure created with L. It reads in all the data from the structure on being called. This is useful when image data is stored in a Perl scalar. For example use Image::PNG::Libpng 'read_from_scalar'; use LWP::Simple; use JSON::Create; my $image_data = get 'http://libpng.org/pub/png/img_png/libpng-88x31.png'; # Now $image_data contains the PNG file my $png = read_from_scalar ($image_data); # Now $png contains the PNG information from the image. # Get the header. my $header = $png->get_IHDR (); my $jc = JSON::Create->new (indent => 1, sort => 1); print $jc->run ($header); (This example is included as L|https://fastapi.metacpan.org/source/BKB/Image-PNG-Libpng-0.59/examples/get-www-png.pl> in the distribution.) The output looks like this: { "bit_depth":4, "color_type":3, "height":31, "interlace_method":0, "width":88 } See also L. =head2 read_png_file my $png = read_png_file ('q.png'); Open F and read its contents into C<$png>. This combines L, C, L, and L. The return value is the same as that of L with the entire PNG image already read in. The optional argument to L can be specified using an optional C argument: my $png = read_png_file ('file.png', transforms => PNG_TRANSFORM_EXPAND); L is used to signal errors opening or closing the file. =head2 set_transforms $png->set_transforms (PNG_TRANSFORM_BGR); Set transforms for reading and writing. This is the same as the optional argument to L or L. If both this and the optional argument are given, the optional argument overrides what is set here. =head2 write_png_file $png->write_png_file ('nice.png'); This combines open, L, and L to write an entire PNG image out to the file name specified by the argument. C<$png> must be the object created by L, so L followed by a call to this does not work. See L if you need to do that kind of operation. The optional argument to L can be specified using L. L is used to signal errors opening or closing the file. =head2 write_to_scalar my $image_data = $png->write_to_scalar (); This writes the PNG image data in C<$png> into a Perl scalar. The first argument, C<$png>, is a writeable PNG structure created with L. The return value of the subroutine is the Perl scalar containing the image data. So, for example, # This CGI script prints a PNG in a random colour. use Image::PNG::Libpng ':all'; use Image::PNG::Const ':all'; my $png = create_write_struct (); my $size = 100; $png->set_IHDR ({height => $size, width => $size, bit_depth => 8, color_type => PNG_COLOR_TYPE_RGB}); my $bytes = pack "CCC", randcol (), randcol (), randcol (); my @rows = ($bytes x $size) x $size; $png->set_rows (\@rows); my $img = $png->write_to_scalar (); binmode STDOUT; print "Content-Type:image/png\r\n\r\n$img"; exit; sub randcol { return int (rand () * 0x100); } (This example is included as L|https://fastapi.metacpan.org/source/BKB/Image-PNG-Libpng-0.59/examples/png-cgi.pl> in the distribution.) See also L. The optional argument to L can be specified using L. =head1 Libpng-style input and output There are two different "new"-like functions, depending on whether you want to read or write a PNG, L and L. These are based on the libpng API. Input uses C plus L followed by L or L. =head2 Examples =head3 A self-pixellating program This example demonstrates writing a monochrome PNG by creating a write structure with L, opening a filehandle to write it, associating the filehandle with the PNG structure with L, then using the functions L, L, and then L to actually write the PNG data to the file. use utf8; use FindBin '$Bin'; use Image::PNG::Libpng ':all'; use Image::PNG::Const ':all'; my $outfile = "$Bin/mono.png"; my ($height, $width, $rows) = pixelate (__FILE__, 5); my $png = create_write_struct (); open my $out, ">:raw", $outfile or die $!; $png->init_io ($out); $png->set_IHDR ({height => $height, width => $width, bit_depth => 1, color_type => PNG_COLOR_TYPE_GRAY}); $png->set_text ([{key => 'silly', text => 'finely-tuned breakfast cereal',}]); $png->set_tIME ({year => 1999}); $png->write_info (); $png->set_invert_mono (); # PNG puts the leftmost pixel in the high-order part of the byte. $png->set_packswap (); $png->write_image ($rows); $png->write_end (); close $out or die $!; exit; sub pixelate { my ($file, $box) = @_; open my $in, "<", $file or die "Can't open '$file': $!"; my $width = 0; my @lines; while (<$in>) { chomp; s/\t/ /g; push @lines, $_; if (length ($_) > $width) { $width = length ($_); } } close $in or die $!; $width *= $box; my $height = scalar (@lines) * $box; my $zero = pack "C", 0; my $bwidth = int(($width+7)/8); my @rows = ($zero x $bwidth) x $height; for my $r (0..$height-1) { my $y = int ($r/$box); my $line = $lines[$y]; for my $x (0..length ($line) - 1) { if (substr ($line, $x, 1) ne ' ') { for my $c (0..$box - 1) { my $offset = $x*$box + $c; my $byte = int ($offset / 8); my $bit = $offset % 8; my $octet = ord (substr ($rows[$r], $byte, 1)); substr ($rows[$r], $byte, 1) = chr ($octet | 1<<$bit); } } } } return ($height, $width, \@rows); } (This example is included as L|https://fastapi.metacpan.org/source/BKB/Image-PNG-Libpng-0.59/examples/libpng-write.pl> in the distribution.) L is included in the distribution. =begin html

The output has a bit depth of 1:

examples/mono.png
=end html =head2 create_read_struct my $png = create_read_struct (); Create a structure for reading a PNG. The return value can be used as an object with the other functions as methods. It can be copied to a write structure with L. This function corresponds to C in libpng plus C (see L) with the error and warning handler variables set up to use Perl's error reporting. =head2 create_write_struct my $png = create_write_struct (); Create a structure for writing a PNG. This can be used as an object with the other functions as methods. This function corresponds to C in libpng plus C (see L) with the error and warning handler variables set up to use Perl's error reporting. =head2 init_io open my $file, "<", 'nice.png'; $png->init_io ($file); Set the file which C<$png> reads or writes to C<$file>. C<$file> must be an already-opened Perl file handle. If C<$png> was created with L, C<$file> must be opened for writing. If C<$png> was created with L, C<$file> must be open for reading. Since PNG files are binary files, it is safest to specify the "raw" pragma or use "binmode" with the file to override any default text file encoding which Perl might be using: open my $file, ">:raw", 'output.png'; or open my $file, ">", 'output.png'; binmode $file; This function corresponds to C in libpng, with a Perl file handle substituting for the C C. =head3 Caveats when using init_io =head4 Check the return value of open On some versions of Perl, L may crash in some circumstances with an error like "segmentation fault", if you use code like my $png = create_read_struct (); open my $file, "<:raw", "some.png"; $png->init_io ($file); and you do not check whether the call to C was successful, and F does not exist. The crash occurs within Perl's conversion of C<$file> into a C C pointer, before this module's code runs. This bug was fixed in Perls after version 5.24.1. To avoid trouble, please check the return value of C. =head4 Cannot deal with non-file filehandles Since C is a Perl access to an underlying C function C, it requires something which can be passed to the underlying C as a C, C's file structure. If, for example you use L or open a scalar reference as a file handle, since these actions do not create a C file structure, an error of the form C will occur. If you have a PNG in the form of a Perl scalar, use L instead of C, which uses a C function called C so that the C library can access the data in the Perl scalar. See also L. =head2 read_end $png->read_end (); Read the part of the PNG file after the image data. This function corresponds to C in libpng. =head2 read_image my $rows = $png->read_image (); Read the image data of the PNG file. This function corresponds to C in libpng. =head2 read_info $png->read_info (); Read the part of the PNG file before the image data. This function corresponds to C in libpng. =head2 read_png $png->read_png (); Read the entire PNG file into memory. You can provide an argument containing transformations to apply to the image: use Image::PNG::Const qw/PNG_TRANSFORM_STRIP_ALPHA/; $png->read_png (PNG_TRANSFORM_STRIP_ALPHA); If the argument is omitted, the default value of C (the "do nothing" value) is applied. The possible transformations which can be applied are =over =item PNG_TRANSFORM_BGR Flip RGB to BGR, RGBA to BGRA. See also L. =item PNG_TRANSFORM_EXPAND Perform set_expand(). See also L. =item PNG_TRANSFORM_EXPAND_16 Expand samples to 16 bits. See also L. =item PNG_TRANSFORM_GRAY_TO_RGB Expand grayscale samples to RGB (or GA to RGBA). See also L. =item PNG_TRANSFORM_IDENTITY No transformation. =item PNG_TRANSFORM_INVERT_ALPHA Change alpha from opacity to transparency. See also L. =item PNG_TRANSFORM_INVERT_MONO Invert monochrome images. See also L. =item PNG_TRANSFORM_PACKING Expand 1, 2 and 4-bit samples to bytes. See also L. =item PNG_TRANSFORM_PACKSWAP Change order of packed pixels to LSB first. See also L. =item PNG_TRANSFORM_SCALE_16 Strip 16-bit samples to 8-bit accurately. See also L. =item PNG_TRANSFORM_SHIFT Normalize pixels to the sBIT depth. =item PNG_TRANSFORM_STRIP_16 Chop 16-bit samples to 8-bit less accurately. See also L. =item PNG_TRANSFORM_STRIP_ALPHA Discard the alpha channel. =item PNG_TRANSFORM_SWAP_ALPHA Flip RGBA to ARGB or GA to AG. See also L. =item PNG_TRANSFORM_SWAP_ENDIAN Byte-swap 16-bit samples. See also L. =back This function corresponds to C in libpng with a default value for the third argument. The fourth, unused, argument to C does not need to be supplied. See L. It does not take a second "info" argument. See L. =head2 read_update_info $png->read_update_info (); ⛐🤪⚠ Inside Image::PNG::Libpng, the libpng function C is called before reading image data. According to L, this function may only be called once for any particular info structure. So although the above Perl interface exists in the module, it is strongly recommended to not use this unless you know exactly what you are doing, since it will usually cause an error when the image data is read. This function corresponds to C in libpng =head2 write_end $png->write_end (); Write the final part of the PNG file. This function corresponds to C in libpng. =head2 write_image $png->write_image ($rows); Write the image of the PNG file. C<$rows> is an array reference as per L. This function corresponds to C in libpng. =head2 write_info $png->write_info (); Write the first part of the PNG file. This function corresponds to C in libpng. =head2 write_png $png->write_png (); This writes the PNG to the file stream which was associated with it using L. For example, open my $output, ">:raw", 'out.png'; $png->init_io ($output); $png->write_png (); close $output; An optional argument consists of transformations to apply to the PNG image before writing it: use Image::PNG::Const qw/PNG_TRANSFORM_STRIP_ALPHA/; $png->write_png (PNG_TRANSFORM_STRIP_ALPHA); The transformations which can be applied are as follows: =over =item PNG_TRANSFORM_BGR Flip RGB to BGR, RGBA to BGRA. See also L. =item PNG_TRANSFORM_INVERT_ALPHA Change alpha from opacity to transparency. See also L. =item PNG_TRANSFORM_INVERT_MONO Invert monochrome images. See also L. =item PNG_TRANSFORM_PACKING Expand 1, 2 and 4-bit samples to bytes. See also L. =item PNG_TRANSFORM_PACKSWAP Change order of packed pixels to LSB first. See also L. =item PNG_TRANSFORM_SHIFT Normalize pixels to the sBIT depth. =item PNG_TRANSFORM_STRIP_FILLER_AFTER Strip out trailing filler bytes. =item PNG_TRANSFORM_STRIP_FILLER_BEFORE Strip out leading filler bytes. =item PNG_TRANSFORM_SWAP_ALPHA Flip RGBA to ARGB or GA to AG. See also L. =item PNG_TRANSFORM_SWAP_ENDIAN Byte-swap 16-bit samples. See also L. =back This function corresponds to C in libpng. =head1 The image header These functions handle the header part of PNG image data. See L of L for information on the PNG standards for the image header. =head2 color_type_name $name = color_type_name ($color_type); This is a convenience function which returns a string corresponding to the numerical color type in C<$color_type>. The name is in upper case, with words separated by underscores, as in C. use Image::PNG::Libpng ':all'; my $png = read_png_file ('tantei-san.png'); my $name = color_type_name ($png->get_IHDR->{color_type}); print "Your PNG has colour type $name.\n"; (This example is included as L|https://fastapi.metacpan.org/source/BKB/Image-PNG-Libpng-0.59/examples/color-type-name.pl> in the distribution.) This function does not correspond to anything in libpng. The names of the color types are taken from those defined in the libpng header file, C. =head2 get_bit_depth my $bit_depth = $png->get_bit_depth (); Get the bit depth, the number of bits for one channel of one pixel. This function corresponds to C in libpng =head2 get_channels my $channels = $png->get_channels (); Get the number of channels, from one to four. The channels are the components of pixels, for example the red channel or the alpha (transparency) channel. The return value is 1 for color type C and C, 2 for C, 3 for C and 4 for C or C with a filler byte. Note that the number of channels does not necessarily correspond to the number of bytes, since the bit depth can also be 1, 2, 4, 8, or 16, depending on the color type. See also the convenience function L. This function corresponds to C in libpng =head2 get_color_type my $color_type = $png->get_color_type (); This returns an integer value. If you want to get a name for the color type, use L. This function corresponds to C in libpng. =head2 get_IHDR my $IHDR = $png->get_IHDR (); Read the IHDR information from the PNG file. The return value is a hash reference containing the following key/value pairs: =over =item width The width of the image in pixels. =item height The height of the image in pixels. =item bit_depth The bit depth of the image (the number of bits used for each color in a pixel). This can take the values 1, 2, 4, 8, 16. =item color_type The color type. This can take the values PNG_COLOR_TYPE_GRAY, PNG_COLOR_TYPE_GRAY_ALPHA, PNG_COLOR_TYPE_PALETTE, PNG_COLOR_TYPE_RGB, PNG_COLOR_TYPE_RGB_ALPHA. =item interlace_method The method of interlacing. This can take the values PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7. =back So, for example, to get the width and height of an image, my $ihdr = $png->get_IHDR (); printf "Your image is %d x %d\n", $ihdr->{width}, $ihdr->{height}; This function corresponds to C in libpng, with a single Perl hash reference used instead of the several pointers to integers used in libpng. It does not return the fields C and C, since these are always 0. See L. =head2 get_image_height my $height = $png->get_image_height (); Get the image's height from the header. This function corresponds to C in libpng =head2 get_image_width my $width = $png->get_image_width (); Get the image's width from the header. This function corresponds to C in libpng =head2 get_interlace_type my $interlace_type = $png->get_interlace_type (); Get the interlace type. This is either PNG_INTERLACE_NONE or PNG_INTERLACE_ADAM7. This function corresponds to C in libpng =head2 get_valid my $valid = $png->get_valid (); if ($valid->{oFFs}) { print "The PNG has valid screen offsets.\n"; } This function returns a hash with a key for each possible chunk which may or may not be valid. The chunks which you can test for are L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, and L. Whereas L tells you whether the installed libpng on your system supports various chunks, this tells you whether the chunks are present in a particular PNG image file. The first argument, C<$png>, is a PNG structure created with L. This function corresponds to C in libpng, with the difference being that the return value is a hash containing a key for each possible chunk. =head2 height my $height = $png->height (); Alias for L. This is not exported, it's intended for use with the object only. =head2 set_IHDR my $ihdr = {width => 10, height => 10, bit_depth => 8, color_type => PNG_COLOR_TYPE_RGB}; $png->set_IHDR ($ihdr); Set the IHDR chunk (the image header) of the PNG image. The first argument, C<$png>, is a writeable PNG structure created with L. The second argument is a hash with the following values: =over =item width The width of the image in pixels. This cannot be zero, negative, or omitted. =item height The height of the image in pixels. This cannot be zero, negative, or omitted. =item bit_depth The bit depth of the image (the number of bits used for each color in a pixel). This cannot be omitted. This can have the values 1, 2, 4, 8, 16. =item color_type The color type. This cannot be omitted. This can have the values PNG_COLOR_TYPE_GRAY, PNG_COLOR_TYPE_GRAY_ALPHA, PNG_COLOR_TYPE_PALETTE, PNG_COLOR_TYPE_RGB, PNG_COLOR_TYPE_RGB_ALPHA. =item interlace_method The method of interlacing. If this is omitted, it's set to PNG_INTERLACE_NONE. This can have the values PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7. =back Other fields in the hash are ignored. This function corresponds to C in libpng, with a single Perl hash reference used instead of the seven integers. The values C, C, may be supplied by the user but are ignored since they may only take the value 0. See L. =head2 sig_cmp if (sig_cmp ($should_be_png)) { print "Your data does not have a PNG signature.\n"; } This subroutine looks at C<$should_be_png> and checks whether its first bytes correspond to a valid PNG signature. It returns a true value if they do not. It can also take two further arguments consisting of a byte offset and a number of bytes to check respectively: sig_cmp ($should_be_png, 0, 8); If these arguments are not supplied, the byte offset is assumed to be zero, and the number of bytes to check is assumed to be eight. This function corresponds to C in libpng, with default arguments of 0 and 8 if second and third arguments are not supplied. =head2 width my $width = $png->width (); Alias for L. This is not exported, it's intended for use with the object only. =head1 Image data These functions deal with accessing the image data itself. =head2 get_rowbytes my $bytes_in_a_row = $png->get_rowbytes (); This returns the number of bytes needed to hold a transformed row of an image. This function corresponds to C in libpng. =head2 get_rows my $rows = $png->get_rows (); my $pixel = substr ($rows->[10], 20, 1); This returns the rows of the PNG image, after uncompressing and unfiltering, as binary data. The return value, C<$rows> in the example, is an array reference with a number of rows equal to the height of the PNG image. Each element of the array reference is a string containing the binary data making up a row of the image. The values of individual pixels can be extracted from using a function such as C or C. This binary data is likely to contain bytes equal to zero. L gives the number of bytes in each row. Each row is a Perl string. Perl terminates each row of data with an extra zero byte at the end. This function corresponds to C in libpng. =head2 set_rows $png->set_rows (\@rows); Set the rows of data to be written in to the PNG to C<@rows>. C<@rows> needs to contain at least the same number of rows of data as the height of the PNG image set with L, and the length of each entry needs to be at least the width of the image multiplied by the number of bytes required for each pixel. This function was changed to copy the data in version 0.46. This function corresponds to C in libpng. =head1 Text chunks See L of L for information on the PNG standards for text information. =head2 get_text my $text_chunks = $png->get_text (); This gets all of the text chunks in the PNG image and returns them as an array reference. Each element of the array represents one text chunk. This element is a hash reference with keys such as C, C, or C taken from the PNG's information. The text data is uncompressed by libpng. If it is international text (C), it is put into Perl's internal Unicode encoding if it is found to be valid UTF-8. (PNG "international text", C is required to be in the UTF-8 encoding, and non-international text is required to contain whitespace and printable ASCII characters only. See L for more on the requirements of a PNG text section.) This function corresponds to C in libpng, with a Perl array of hash references substituted for the C array of structs used by libpng. See L for details of the keys and values which may be returned. =head2 set_text $png->set_text ([\%chunk1, \%chunk2]); This sets the text chunks in a writeable image. The input value is an array reference containing one or more hash references. Each hash reference must have a C value for the text. According to the PNG specification, this should be between one and 79 bytes in length. This module enforces that restriction, so if you supply a key longer than that, the chunk cannot be added. A hash reference may also have the following: =over =item C The value of C controls the compression of the text. If C is not supplied, a default value of PNG_TEXT_COMPRESSION_NONE is applied. The C field can take the following values, available from L: =over =item PNG_TEXT_COMPRESSION_NONE TEXT = Printable ASCII and space characters. =item PNG_TEXT_COMPRESSION_zTXt TEXT = Printable ASCII and space characters. =item PNG_ITXT_COMPRESSION_NONE ITXT = International text, should be UTF-8. =item PNG_ITXT_COMPRESSION_zTXt ITXT = International text, should be UTF-8. =back =item C The string length of international text in bytes. ⛐🤪⚠ This is ignored by libpng when writing text chunks. When reading text chunks, if the text is marked as international text, libpng adds the length of the string in bytes in this field rather than in L. =item C This should be set to name of the language of the text, if the text chunk is iTXt. According to the PNG specification, "It is an ISO 646.IRV:1991 [ISO 646] string consisting of hyphen-separated words of 1-8 alphanumeric characters each (for example cn, en-uk, no-bok, x-klingon, x-KlInGoN)." Support for writing C was added in version 0.49 of this module. (Prior to that undocumented support existed via a differently-named key.) ⛐🤪⚠ This module does not attempt to check the supplied value, but merely passes it to libpng. libpng appears not to check the value either, nor to enforce restrictions on its length. =item C This corresponds to the "Translated keyword" of the PNG specification. Note that the user needs to supply C and L as well as C. Support for writing C was added in version 0.49 of this module. (Prior to that undocumented support existed via a differently-named key.) =item C The value of "text" is added to the PNG as the text segment. This can be omitted if you just want to write a key value without any accompanying text. =item C The string length in bytes. The user may set this, but it is ignored when writing PNG text chunks, instead this module uses the string length obtained from Perl. This key contains the length of the string when reading text chunks via L, but if the text is marked as international text, L is used to return its length in bytes, rather than this. =back Whether or not the value of C is an ITXT field is decided by the value of C. People who want to fiddle with the text compression applied can do so via L and the other functions described below that. If C is called more than once, the chunks are not overwritten but appended to the existing ones. (This behaviour is from libpng itself.) Prior to version 0.50, C would fail silently if the user added invalid chunks, for example hash references without a valid C, or things which were not hash references at all. From version 0.50, all invalid inputs cause fatal errors. However, unknown keys in the hash references do not cause fatal errors. This function corresponds to C in libpng. =head3 Example use utf8; use Image::PNG::Const ':all'; use Image::PNG::Libpng ':all'; my $png = create_write_struct (); $png->set_IHDR ({width => 1, height => 1, bit_depth => 8, color_type => PNG_COLOR_TYPE_GRAY}); $png->set_rows (['X']); $png->set_text ([{ compression => PNG_TEXT_COMPRESSION_NONE, key => "Copyright", text => "Copyright (C) 2020 Fat Cat", }, { compression => PNG_ITXT_COMPRESSION_zTXt, key => "Copyright", lang_key => '著者権', lang => 'ja_JP', text => '©令和2年茉莉ニャンバーガーさん', }]); $png->write_png_file ('copyright.png'); (This example is included as L|https://fastapi.metacpan.org/source/BKB/Image-PNG-Libpng-0.59/examples/set-text.pl> in the distribution.) =head2 text_compression_name my $name = Image::PNG::Libpng::text_compression_name ($text->{compression}); Given a numerical text compression type, return the equivalent name. The name is in upper case. The possible return values are =over =item TEXT_NONE =item TEXT_zTXt =item ITXT_NONE =item ITXT_zTXt =item an empty string if the compression method is unknown. =back The compression field is also used to store the information about whether the text is "international text" in UTF-8 or not. This function does not correspond to anything in libpng. The names of the text compression types are based on those in C, but without the word "COMPRESSION", so for example the libpng constant C corresponds to a return value of C. =head1 Private chunks See L of L for information on the PNG standards for private chunks. To test whether your version of libpng supports C, use L with argument 'L': if (libpng_supports ('UNKNOWN_CHUNKS')) { # do something } =head2 get_chunk_malloc_max my $max = $png->get_chunk_malloc_max (); This gets the maximum amount of memory that a chunk can use. To test whether your version of libpng supports C, use L with argument 'L': if (libpng_supports ('CHUNK_MALLOC_MAX')) { # do something } This function corresponds to C in libpng =head2 set_chunk_malloc_max $png->set_chunk_malloc_max ($max); This sets the maximum amount of memory that a chunk can use. The default value of libpng 1.6.45 is 8 megabytes. To test whether your version of libpng supports C, use L with argument 'L': if (libpng_supports ('CHUNK_MALLOC_MAX')) { # do something } This function corresponds to C in libpng =head2 set_keep_unknown_chunks use Image::PNG::Const 'PNG_HANDLE_CHUNK_ALWAYS'; $png->set_keep_unknown_chunks (PNG_HANDLE_CHUNK_ALWAYS); Tell libpng not to discard unknown chunks when reading the file. =head2 get_unknown_chunks my $private_chunks = $png->get_unknown_chunks (); # Get some data from a private chunk my $chunk_three_data = $private_chunks->[3]->{data}; # Get the size of the data print length $chunk_three_data; This gets all of the private chunks from the image. The return value is an array reference containing hash references. If there are no private chunks, this returns an undefined value. There is one element of the array for each chunk member. It is necessary to call L with an appropriate value before reading the file, otherwise libpng discards unknown chunks when reading the file. Each member hash reference has the following keys: =over =item name The name of the unknown chunk, in the PNG chunk format (four bytes). =item location The location of the unknown chunk. =item data The data of the unknown chunk =back The "size" field of the PNG structure is not stored, because the "data" member of the hash contains information on its length. This function corresponds to C in libpng =head2 set_unknown_chunks $png->set_unknown_chunks (name => 'dUCk', data => 'abcdefg', location => PNG_AFTER_IDAT); ⛐🤪⚠ This currently does not fully function. This function corresponds to C in libpng =head1 Library version functions =head2 access_version_number my $libpng_version_number = Image::PNG::Libpng::access_version_number (); This function returns the version of the libpng library which the module is using as an integer number. This function corresponds to C in libpng. =head2 get_libpng_ver my $libpng_version = Image::PNG::Libpng::get_libpng_ver (); This function returns the version of the libpng library which the module is using. This function corresponds to C in libpng. However, it doesn't require the C argument of the C function. See L. =head1 Compression and filtering =head2 get_compression_buffer_size my $size = $png->get_compression_buffer_size (); Returns the value of the compression buffer size, which may be altered with L. =head2 set_compression_buffer_size $png->set_compression_buffer_size (100); Set the size of the buffer which zlib uses to compress or decompress the image data. It takes one argument, an integer number. This cannot be less than 6. =head2 set_compression_level $png->set_compression_level ($number); Set the compression level used to make the PNG. A value of 0 (C) corresponds to no compression at all, otherwise C<$number> may take values of 1 (C) to 9 (C), with smaller values giving faster, and larger values giving better, that is with smaller output, compression. These correspond to the -1, -2, ... -9 options to the C utility, or the compression level parameter of C. Calling with C<-1> (C) reverts to the default compression. Calling with any other number outside the range 0 to 9 results in a fatal error. This function was added to the module in version 0.49. =head2 set_compression_mem_level $png->set_compression_mem_level ($argument); ⛐🤪⚠ Untested function corresponding to C. Takes one integer argument. Sets the C parameter of C in zlib when writing PNG image data. Argument between 1 for minimum memory and 9 for maximum speed. The default is 8. See L. =head2 set_compression_window_bits $png->set_compression_window_bits ($argument); ⛐🤪⚠ Untested function corresponding to C. Takes one integer argument. Sets the C parameter of C in zlib when writing PNG image data. Argument value must be between 8 and 15 for libpng. The default is 15. See the L. =head2 set_compression_strategy $png->set_compression_strategy ($argument); ⛐🤪⚠ Untested function corresponding to C. Takes one integer argument. Sets the C parameter of C when writing PNG image data. Setting this with libpng overrides libpng's default behaviour of changing the value depending on the filter in use. For zlib, the argument is either 0 for default behaviour, or 1 to 4. See the L. libpng uses the default strategy 0 (C) for unfiltered image data, and 1 (C) for filtered image data. =head2 set_filter use Image::PNG::Const 'PNG_FILTER_NONE'; $png->set_filter (PNG_FILTER_NONE); This sets the filters which are allowed to be used for writing a PNG image. The possible values are =over =item PNG_NO_FILTERS =item PNG_FILTER_NONE =item PNG_FILTER_SUB =item PNG_FILTER_UP =item PNG_FILTER_AVG =item PNG_FILTER_PAETH =item PNG_ALL_FILTERS =back These can be combined using C<|> (logical or): use Image::PNG::Const ':all'; set_filter ($png, PNG_FILTER_UP | PNG_FILTER_AVG); Please see L of L for the meanings of these filter types. This function corresponds to C in libpng with the second (unused) argument omitted. See L. =head2 set_text_compression_level $png->set_text_compression_level ($argument); ⛐🤪⚠ Untested function corresponding to C. Takes one integer argument. As L but for compressed text. =head2 set_text_compression_mem_level $png->set_text_compression_mem_level ($argument); ⛐🤪⚠ Untested function corresponding to C. Takes one integer argument. As L but for compressed text. =head2 set_text_compression_window_bits $png->set_text_compression_window_bits ($argument); ⛐🤪⚠ Untested function corresponding to C. Takes one integer argument. As L but for compressed text. =head2 set_text_compression_strategy $png->set_text_compression_strategy ($argument); ⛐🤪⚠ Untested function corresponding to C. Takes one integer argument. As L but for compressed text. =head1 Other chunks These routines deal with the other possible chunks of PNGs. The getter and setter routines for all other chunks are designed so that the return value of C is able to be used directly as the value for C, so the values of chunks can easily be copied from one PNG to another. my $values = $png1->get_wXYZ (); $png2->set_wXYZ ($values); If the chunk is not present, or if the chunk is not supported by the user's version of libpng, the return value of C is the undefined value. =head2 bKGD The background color of the PNG image. See L of L for information on the PNG standards for the background chunk. =head3 get_bKGD my $bkgd = $png->get_bKGD (); Get the bKGD (background) chunk of the image. The return value is a hash with the following keys, depending on the color type of the image: =over =item index For palette color types, this is the offset into the palette. =item gray For grayscale color types. =item red =item green =item blue =back This function corresponds to C in libpng with a hash function instead of a C struct. =head3 set_bKGD $png->set_bKGD ($bkgd); Set the bKGD (background) chunk of the image. C<$bkgd> is a hash reference. The keys of the hash reference are as described in L. This function corresponds to C in libpng with a hash function instead of a C struct. =head2 cHRM See L of L "cHRM Primary chromaticities and white point". =head3 get_cHRM my $cHRM = $png->get_cHRM (); Get the cHRM chunk as a hash reference. The keys of the hash are white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y. The values of the hash are floating point numbers between 0 and 1. This function corresponds to C in libpng with a hash reference supplying the arguments. The hash's keys correspond to the names of the C arguments in libpng. =head3 get_cHRM_XYZ my $cHRM = $png->get_cHRM_XYZ (); Get the cHRM chunk as a hash reference for the XYZ color space. The keys of the hash are red_x, red_y, red_z, green_x, green_y, green_z, blue_x, blue_y, blue_z. The values of the hash are floating point numbers between 0 and 1. This function corresponds to C in libpng with a hash reference supplying the arguments. The hash's keys correspond to the names of the C arguments in libpng. =head3 set_cHRM $png->set_cHRM (\%cHRM); Set the cHRM chunk from a hash reference. The keys of the hash are as for L. The values are floating point numbers between 0 and 1. This function corresponds to C in libpng with a hash reference instead of the C arguments. =head3 set_cHRM_XYZ $png->set_cHRM_XYZ (\%cHRM); Set the cHRM chunk from a hash reference for the XYZ color space. The keys of the hash are as for L. The values are floating point numbers between 0 and 1. The C values C, C, and C should sum to 1. If you supply values outside the allowed range, libpng corrects them silently on writing rather than producing an error. This function corresponds to C in libpng with a hash reference instead of the C arguments. =head2 eXIf The C chunk is an extension to the PNG specification. See L. Support for this chunk was added in version 0.50 of this module. =head3 get_eXIf my $exif = $png->get_eXIf (); This retrieves the C chunk from C<$png> but does not process the internal information. =head3 set_eXIf $png->set_eXIf ($exif); libpng checks whether the chunk's first two bytes are either C for little-endian (from Intel) or C for big-endian (from Motorola) then adds the entire chunk, including the first two bytes, to the PNG. ⛐🤪⚠ As of December 2020, there appears to be a bug in libpng in which the eXIf chunk is added twice, causing a warning of the form C on reading a PNG file back in. See L. =head2 gAMA See L of L. =head3 get_gAMA my $gamma = $png->get_gAMA (); Get the gamma value or gAMA chunk. The return value is a floating-point number. This function corresponds to C in libpng =head3 set_gAMA $png->set_gAMA (0.2); Set the gamma value or gAMA chunk. This function corresponds to C in libpng =head2 hIST See L of L. =head3 get_hIST my $hist = $png->get_hIST (); If the PNG file contains a histogram, the return value is array reference, otherwise it is the undefined value. The number of entries in the array reference is the same as in the palette. This function corresponds to C in libpng =head3 set_hIST $png->set_hIST (\@hist); Set the histogram of frequencies of the colors of a paletted (L) image. The entries of the histogram are 16 bit unsigned integers, so the maximum value that can be entered is 65535 = 2^16 - 1. Larger numbers and floating point numbers will cause a warning to be printed and the value to be set to zero. The histogram must have exactly the same number of entries as the palette or the call will fail with a warning. A histogram cannot be added to an image without a palette. A call to set_hIST for an image without a palette will cause a warning and return without setting the value. (I'm not sure of the best form of error handling for this function so it may change in future versions to have errors for a bad histogram rather than warnings.) This function corresponds to C in libpng =head2 iCCP See L of L. =head3 get_iCCP my $iccp = $png->get_iCCP (); The return value is a hash with two keys, =over =item name The name of the profile. =item profile The color profile. =back The C value, which is always 0, is not returned. See L. This function corresponds to C in libpng. =head3 set_iCCP $png->set_iCCP ({name => 'name', profile => 'profile'}); This function corresponds to C in libpng. For details of the arguments, see L. A C argument, which must always be 0 anyway, is ignored. See L. =head2 oFFs This is an extension to the PNG specification. See L. =head3 get_oFFs my $phys = $png->get_oFFs (); Get oFFs chunk. Return value is a hash reference This function corresponds to C in libpng =head3 set_oFFs $png->set_oFFs ({x_offset => 1, y_offset => 1, unit_type => 0}); Set oFFs chunk. See the specification linked above for the meanings of the parameters. If C is not 0 or 1, a warning is produced. This function corresponds to C in libpng =head2 pCAL pCAL is an extension of the PNG specification which allows one to associate pixels in the PNG image with non-image data such as a heat map. See L. To test whether your version of libpng supports C, use L with argument 'L': if (libpng_supports ('pCAL')) { # do something } =head3 get_pCAL my $pcal = $png->get_pCAL (); The return value is a hash reference with the following keys: =over =item params If this exists, its value is a reference to an array containing the parameter list of the pCAL chunk, which are floating point numbers. Within the PNG file chunk, these parameters are stored as strings representing floating point numbers, but you can pass in Perl floating point numbers rather than strings. The number of parameters you should set is fixed by the C parameter. Refer to the PNG specification for full details. =item purpose The purpose string of the pCAL chunk. =item type The equation type as a number, from 0 to 3. See the PNG specification for the meanings. Other numbers cause an error. =item units The units as a string. See the PNG specification for details. =item x0 The zero value for the equation, an integer. =item x1 The max value for the equation, an integer. =back This function corresponds to C in libpng =head3 set_pCAL $png->set_pCAL (\%values); See L for the parameters of C<%values>. This function corresponds to C in libpng =head2 pHYs See L of L. =head3 get_pHYs my $phys = $png->get_pHYs (); The return value is a hash reference with the keys =over =item res_x =item res_y =item unit_type Is either 0 or 1. =back This function corresponds to C in libpng =head3 set_pHYs $png->set_pHYs ({res_x => 1, res_y => 1, unit_type => 1}); This function corresponds to C in libpng =head2 PLTE See L of L for information on the PNG standards for the palette chunk. =head3 get_palette_max my $pmax = $png->get_palette_max (); If your libpng supports it, this will return the maximum palette index found in the image, or "-1" if the palette was not checked, or "0" if no palette was found. To test whether your version of libpng supports C, use L with argument 'L': if (libpng_supports ('GET_PALETTE_MAX')) { # do something } ⛐🤪⚠ This function is implemented but so far it is not very clear to me what it does, since, for example, it returns zero for the test image F which is an image with a fully-used 256-color palette. I've L, but so far nobody has responded. =head3 get_PLTE my $colors = $png->get_PLTE (); # Get the green value of the twentieth entry in the palette. my $green = $colors->[20]->{green}; This function gets the palette from the PNG. The return value is an array reference containing the palette. This array contains hash references with the values "green", "blue" and "red" for the color of each pixel in the palette. If the PNG has no palette, it returns an undefined value. A PNG image may or may not contain a palette. To check whether the image contains a palette, use something of the following form: use Image::PNG::Const ':all'; my $color_type = $png->get_color_type (); if ($color_type == PNG_COLOR_TYPE_PALETTE) { # The PNG uses a palette. } A PNG image may also contain a palette even when the "color_type" does not indicate that. To check for that case, use L. This function corresponds to C in libpng. =head3 set_PLTE $png->set_PLTE ($palette); Set the palette of C<$png>. The argument is an array reference containing hash references. There is one hash reference for each palette entry. The hash references contain three fields, red, green, and blue, corresponding to the pixel value for that palette entry. Other values in the hash references are ignored. For example, $png->set_PLTE ([{red => 1, green => 99, blue => 0x10}, {red => 0xFF, green => 0xFF, blue => 0xFF}]); creates a palette with two entries in C<$png>. This function corresponds to C in libpng. =head2 sBIT See L of L. =head3 get_sBIT my $sbit = $png->get_sBIT (); The return value is a hash reference containing integer values for the keys C, C, C, C and C, depending on the C of C<$png>. ⛐🤪⚠ Prior to version 0.50 of this module, get_sBIT wrote values of 0 for all of the keys, regardless of the C, causing errors in some circumstances. From version 0.50, hash keys are not entered if the C of the image makes them invalid. This function corresponds to C in libpng =head3 set_sBIT $png->set_sBIT ({red => 1, blue => 2, green => 3}); The argument is a hash reference containing integer values for the keys C, C, C, C, and C, as required by the C of C<$png>. This function corresponds to C in libpng =head2 sCAL This is an extension to the PNG specification. See L. To test whether your version of libpng supports C, use L with argument 'L': if (libpng_supports ('sCAL')) { # do something } =head3 get_sCAL my $scal = $png->get_sCAL (); The returned hash value contains the following keys: =over =item unit The unit type, which is either PNG_SCALE_UNKNOWN, PNG_SCALE_METER, or PNG_SCALE_RADIAN. =item width The width, as a string. =item height The height, as a string. =back This function corresponds to C in libpng. Note that this uses the sCAL_s function rather than the get_sCAL and the returned values are the strings themselves rather than parsed numbers. =head3 set_sCAL $png->set_sCAL ($scal); C<$scal> is a hash reference containing the keys described in L. This function corresponds to C in libpng. Note that this uses the C function rather than C and the input values are the strings themselves rather than numbers. =head2 sPLT See L of L. =head3 get_sPLT ⛐🤪⚠ Provisional. See L for documentation, the return value is like the input of that. =head3 set_sPLT $png->set_sPLT ([{ name => 'palette', depth => 8, entries => [{red => 1, blue => 2},]}]); Set suggested palettes. The input is an array reference containing hash references with the following fields: =over =item name The name of the suggested palette. =item depth The depth of the suggested palette. =item entries The entries of the palette. This is an array reference containing hash references with keys as follows: =over =item red =item blue =item green =item frequency =item alpha =back =back The field C which is returned by L does not need to be specified, it is calculated from the length of C. =head2 sRGB See L of L. =head3 get_sRGB my $sRGB = $png->get_sRGB (); The return value is an integer number corresponding to one of the following: =over =item PNG_sRGB_INTENT_SATURATION =item PNG_sRGB_INTENT_PERCEPTUAL =item PNG_sRGB_INTENT_ABSOLUTE =item PNG_sRGB_INTENT_RELATIVE =back This function corresponds to C in libpng =head3 set_sRGB $png->set_sRGB ($srgb); C<$srgb> is one of the values described in L. This function corresponds to C in libpng =head2 tIME See L of L for information on the PNG standards for time stamp information. =head3 get_tIME my $time = $png->get_tIME (); if ($time && $time->{year} < 2005) { warn "Your PNG is now getting old. Don't forget to oil it to prevent rust."; } The return value is either the undefined value, if no C chunk? =item FIXED_POINT =item FIXED_POINT_MACRO =item FLOATING_ARITHMETIC =item FLOATING_POINT =item FORMAT_AFIRST =item FORMAT_BGR =item gAMA Does the libpng support the L chunk? =item GAMMA =item GET_PALETTE_MAX Does your libpng support L? =item HANDLE_AS_UNKNOWN =item HANDLE_AS_UNKNOWN =item hIST Does the libpng support the L chunk? =item iCCP Does the libpng support the L chunk? =item INCH_CONVERSIONS =item INFO_IMAGE =item IO_STATE =item iTXt Does the libpng support international text? =item MIPS_MSA_API =item MNG_FEATURES =item oFFs Does the libpng support the L chunk? =item pCAL Does the libpng support the L extension? =item PEDANTIC_WARNINGS =item pHYs Does the libpng support the L chunk? =item POINTER_INDEXING =item POWERPC_VSX_API =item PROGRESSIVE_READ =item READ Can libpng read PNGs? =item READ_16_TO_8 =item READ_ALPHA_MODE See L. =item READ_BACKGROUND See L. =item READ_BGR See L. =item READ_COMPOSITE_NODIV =item READ_COMPRESSED_TEXT =item READ_EXPAND =item READ_EXPAND_16 =item READ_FILLER =item READ_GAMMA See L. =item READ_GRAY_TO_RGB =item READ_INTERLACING =item READ_INT_FUNCTIONS =item READ_INVERT =item READ_INVERT_ALPHA =item READ_OPT_PLTE =item READ_PACK =item READ_PACKSWAP =item READ_QUANTIZE =item READ_RGB_TO_GRAY =item READ_SCALE_16_TO_8 =item READ_SHIFT =item READ_STRIP_16_TO_8 =item READ_STRIP_ALPHA =item READ_SWAP =item READ_SWAP_ALPHA =item READ_tEXt =item READ_TRANSFORMS =item READ_USER_TRANSFORM =item READ_zTXt =item SAVE_INT_32 =item SAVE_UNKNOWN_CHUNKS =item sBIT Does the libpng support the L chunk? =item sCAL Does the libpng support the L extension? This actually tests for the presence of the C/C functions, so its behaviour is dependent on other factors for versions 1.2 and 1.4 of libpng. =item SEQUENTIAL_READ =item SETJMP =item SET_OPTION =item SET_UNKNOWN_CHUNKS =item SET_USER_LIMITS =item SIMPLIFIED_READ =item SIMPLIFIED_READ_AFIRST =item SIMPLIFIED_WRITE =item SIMPLIFIED_WRITE_AFIRST =item SIMPLIFIED_WRITE_BGR =item SIMPLIFIED_WRITE_STDIO =item sPLT Does the libpng support L chunks? =item sRGB Does the libpng support the L chunk? =item STDIO =item STORE_UNKNOWN_CHUNKS =item TEXT Does the libpng support text? =item tEXt Does the libpng support tEXt chunks? =item tIME Does the libpng support the L chunk? =item TIME_RFC1123 =item tRNS Does the libpng support the L chunk? =item UNKNOWN_CHUNKS Does the libpng support unknown chunks (see L)? =item USER_CHUNKS =item USER_LIMITS Does the libpng support L and the related functions L, and L? =item USER_LIMITS =item USER_MEM =item USER_TRANSFORM_INFO =item USER_TRANSFORM_PTR =item WARNINGS =item WRITE Can libpng write pngs? =item WRITE_BGR =item WRITE_COMPRESSED_TEXT =item WRITE_CUSTOMIZE_COMPRESSION Does the libpng support L and similar functions? ⛐🤪⚠ It's not very clear that this returns a useful value, since L seems to be in libpngs from at least as far back as C<1.5.1>, and yet this macro was only added to libpng in version C<1.6.13>. =item WRITE_CUSTOMIZE_ZTXT_COMPRESSION Does the libpng support L and similar functions? =item WRITE_FILLER =item WRITE_FILTER =item WRITE_FLUSH =item WRITE_FLUSH_AFTER_IEND =item WRITE_INTERLACING =item WRITE_INT_FUNCTIONS =item WRITE_INVERT =item WRITE_INVERT_ALPHA =item WRITE_OPTIMIZE_CMF =item WRITE_PACK =item WRITE_PACKSWAP =item WRITE_SHIFT =item WRITE_SWAP =item WRITE_SWAP_ALPHA =item WRITE_TRANSFORMS =item WRITE_USER_TRANSFORM =item WRITE_WEIGHTED_FILTER =item zTXt Does the libpng support C chunks? =back =head2 png_compare if (png_compare ('a.png', 'b.png') == 0) { print "The PNGs are the same.\n"; } This compares the image data in two PNGs and returns 0 if they contain exactly the same image data, or 1 if they contain different image data. For a more detailed comparison, see L. This does not compare to see if the PNG files "look like" each other, but whether each pixel contains exactly the same values. Please see L for a looser comparison of images. This uses the "expand" transform of libpng to read both the images, so it is able to compare images of different color types. It compares the alpha values as well as the color pixels. See L for an example of comparing an RGB and a grayscale image. =head2 read_struct if ($png->read_struct ()) { warn "Can't write this, use copy_png to copy it"; } This returns a true value if C<$png> was created with L or allied functions like L, and a false value if C<$png> was created with L or allied functions like L. =head2 set_chunk $png->set_chunk ('tIME', $timechunk); Set the specified chunk. This produces a fatal error if given an C (image data) chunk, use L instead. This produces a fatal error if given an unknown chunk name. The first argument is the chunk name and then the second argument is a scalar containing whatever the chunk requires, for example a hash reference for the C