rmagick-2.13.2/0000755000004100000410000000000012147515547013257 5ustar www-datawww-datarmagick-2.13.2/uninstall.rb0000644000004100000410000000401412147515547015614 0ustar www-datawww-data# uninstall RMagick - called from Makefile uninstall target require 'fileutils' class Dir def Dir.safe_unlink(dir) begin File.chmod 0777, dir unlink dir $stderr.puts dir rescue end end end # remove directory & contents if the directory was created by post-install.rb def rmdir(dir, no_check=false) # This can 't happen, but you can never be too safe... if dir == '/' then raise RuntimeError, "rm -rf /? I don't think so!" end if no_check || File.file?(dir+'/.rmagick') then targets = Dir[dir+'/*'] targets += Dir[dir+'/.*'].delete_if { |f| FileTest.directory?(f) } if not targets.empty? FileUtils.safe_unlink(targets) end Dir.safe_unlink(dir) end end # Load up default values rbconfig = 'rbconfig' while arg = ARGV.shift case arg when /\A--rbconfig=(.*)\z/ # Get overriding rbconfig file name rbconfig = $1 when /\A--prefix=(.*)\z/ path = $1 path = File.expand_path(path) unless path[0,1] == '/' prefix = path when /\A--site-ruby=(.*)\z/ # where RMagick.rb is site_ruby = $1 when /\A--so-dir=(.*)\z/ # where RMagick.so is so_dir = $1 when /\A--doc-dir=(.*)\z/ # where doc is doc_dir = $1 end end require rbconfig # get specified/default rbconfig.rb config = defined?(RbConfig) ? ::RbConfig : ::Config version = config::CONFIG['ruby_version'] arch = config::CONFIG['arch'] prefix ||= config::CONFIG['prefix'] site_ruby ||= config::CONFIG['sitelibdir'] so_dir ||= config::CONFIG['sitearchdir'] doc_dir ||= File.join(prefix, 'share', 'RMagick') dlext = config::CONFIG['DLEXT'] FileUtils.safe_unlink File.join(site_ruby, 'RMagick.rb'), :verbose => true FileUtils.safe_unlink File.join(so_dir, 'RMagick.' + dlext), :verbose => true puts site_ruby puts doc_dir rmdir File.join(site_ruby, 'rvg'), true rmdir File.join(doc_dir, 'ex', 'images') rmdir File.join(doc_dir, 'ex') rmdir File.join(doc_dir, 'css') rmdir File.join(doc_dir, 'scripts') rmdir doc_dir exit rmagick-2.13.2/metaconfig0000644000004100000410000000103612147515547015316 0ustar www-datawww-data# define additional install.rb config options # add --allow-example-errors - default is false (only allow 5 examples to fail) add_bool_config('allow-example-errors', false, 'Allow installation to proceed even if a lot of examples fail') # add --disable-htmldoc - default is false, if true don't build doc and examples add_bool_config('disable-htmldoc', false, "don't build HTML doc and examples") # add --doc-dir - default is $prefix/share/RMagick add_path_config('doc-dir', "$prefix/share/RMagick", 'where to install RMagick documentation') rmagick-2.13.2/post-install.rb0000644000004100000410000000223012147515547016232 0ustar www-datawww-data# install RMagick documentation require 'fileutils' require 'find' if defined?(Installer) && self.class == Installer BUILD_HTMLDOC = get_config('disable-htmldoc') != 'yes' $docdir = nil # Where to install the documentation def docdir return $docdir if $docdir dir = get_config('doc-dir')+'/' dir.sub!(/\A$prefix/, get_config('prefix')) $docdir = dir end else BUILD_HTMLDOC = true def docdir return ARGV[0] end end if BUILD_HTMLDOC puts "\npost-install.rb: installing documentation..." Find.find('doc') do |file| next if FileTest.directory? file target = file.sub(/^doc\//,docdir()) unless FileTest.exists? File.dirname(target) FileUtils.mkdir_p(File.dirname(target), :verbose => true) # Mark this directory as one we created so # that uninstall.rb knows it's okay to delete FileUtils.touch("#{File.dirname(target)}/.rmagick") end FileUtils.install(file, target, :mode => 0644) end else puts "\npost-install.rb: --disable-htmldoc specified. No documentation will be installed." end exit rmagick-2.13.2/ext/0000755000004100000410000000000012147515547014057 5ustar www-datawww-datarmagick-2.13.2/ext/RMagick/0000755000004100000410000000000012147515547015374 5ustar www-datawww-datarmagick-2.13.2/ext/RMagick/extconf.rb0000644000004100000410000003760012147515547017375 0ustar www-datawww-datarequire "mkmf" require "date" RMAGICK_VERS = "2.13.2" MIN_RUBY_VERS = "1.8.5" MIN_RUBY_VERS_NO = MIN_RUBY_VERS.tr(".","").to_i MIN_IM_VERS = "6.4.9" MIN_IM_VERS_NO = MIN_IM_VERS.tr(".","").to_i # Test for a specific value in an enum type def have_enum_value(enum, value, headers=nil, &b) checking_for "#{enum}.#{value}" do if try_compile(<<"SRC", &b) #{COMMON_HEADERS} #{cpp_include(headers)} /*top*/ int main() { #{enum} t = #{value}; t = t; return 0; } SRC $defs.push(format("-DHAVE_ENUM_%s", value.upcase)) true else false end end end # Test for multiple values of the same enum type def have_enum_values(enum, values, headers=nil, &b) values.each do |value| have_enum_value(enum, value, headers, &b) end end def exit_failure(msg) Logging::message msg message msg+"\n" exit(1) end # Seems like lots of people have multiple versions of ImageMagick installed. def check_multiple_imagemagick_versions() versions = [] path = ENV['PATH'].split(File::PATH_SEPARATOR) path.each do |dir| file = File.join(dir, "Magick-config") if File.executable? file vers = `#{file} --version`.chomp.strip prefix = `#{file} --prefix`.chomp.strip versions << [vers, prefix, dir] end end versions.uniq! if versions.size > 1 msg = "\nWarning: Found more than one ImageMagick installation. This could cause problems at runtime.\n" versions.each do |vers, prefix, dir| msg << " #{dir}/Magick-config reports version #{vers} is installed in #{prefix}\n" end msg << "Using #{versions[0][0]} from #{versions[0][1]}.\n\n" Logging::message msg message msg end end # Ubuntu (maybe other systems) comes with a partial installation of # ImageMagick in the prefix /usr (some libraries, no includes, and no # binaries). This causes problems when /usr/lib is in the path (e.g., using # the default Ruby installation). def check_partial_imagemagick_versions() prefix = config_string("prefix") matches = [ prefix+"/lib/lib?agick*", prefix+"/include/ImageMagick", prefix+"/bin/Magick-config", ].map do |file_glob| Dir.glob(file_glob) end matches.delete_if { |arr| arr.empty? } if 0 < matches.length and matches.length < 3 msg = "\nWarning: Found a partial ImageMagick installation. Your operating system likely has some built-in ImageMagick libraries but not all of ImageMagick. This will most likely cause problems at both compile and runtime.\nFound partial installation at: "+prefix+"\n" Logging::message msg message msg end end if RUBY_PLATFORM =~ /mswin/ abort <= #{MIN_RUBY_VERS}") do version = RUBY_VERSION.tr(".","").to_i version >= MIN_RUBY_VERS_NO end exit_failure "Can't install RMagick #{RMAGICK_VERS}. Ruby #{MIN_RUBY_VERS} or later required.\n" end # Magick-config is not available on Windows if RUBY_PLATFORM !~ /mswin|mingw/ # Check for compiler. Extract first word so ENV['CC'] can be a program name with arguments. config = defined?(RbConfig) ? ::RbConfig : ::Config cc = (ENV["CC"] or config::CONFIG["CC"] or "gcc").split(' ').first unless find_executable(cc) exit_failure "No C compiler found in ${ENV['PATH']}. See mkmf.log for details." end # Check for Magick-config unless find_executable("Magick-config") exit_failure "Can't install RMagick #{RMAGICK_VERS}. Can't find Magick-config in #{ENV['PATH']}\n" end check_multiple_imagemagick_versions() check_partial_imagemagick_versions() # Ensure minimum ImageMagick version unless checking_for("ImageMagick version >= #{MIN_IM_VERS}") do version = `Magick-config --version`.chomp.tr(".","").to_i version >= MIN_IM_VERS_NO end exit_failure "Can't install RMagick #{RMAGICK_VERS}. You must have ImageMagick #{MIN_IM_VERS} or later.\n" end $magick_version = `Magick-config --version`.chomp # Ensure ImageMagick is not configured for HDRI unless checking_for("HDRI disabled version of ImageMagick") do not (`Magick-config --version`["HDRI"]) end exit_failure "\nCan't install RMagick #{RMAGICK_VERS}."+ "\nRMagick does not work when ImageMagick is configured for High Dynamic Range Images."+ "\nDon't use the --enable-hdri option when configuring ImageMagick.\n" end # Save flags $CFLAGS = ENV["CFLAGS"].to_s + " " + `Magick-config --cflags`.chomp $CPPFLAGS = ENV["CPPFLAGS"].to_s + " " + `Magick-config --cppflags`.chomp $LDFLAGS = ENV["LDFLAGS"].to_s + " " + `Magick-config --ldflags`.chomp $LOCAL_LIBS = ENV["LIBS"].to_s + " " + `Magick-config --libs`.chomp elsif RUBY_PLATFORM =~ /mingw/ # mingw `convert -version` =~ /Version: ImageMagick (\d+\.\d+\.\d+)-\d+ / abort "Unable to get ImageMagick version" unless $1 $magick_version = $1 $LOCAL_LIBS = '-lCORE_RL_magick_ -lX11' else # mswin `convert -version` =~ /Version: ImageMagick (\d+\.\d+\.\d+)-\d+ / abort "Unable to get ImageMagick version" unless $1 $magick_version = $1 $CFLAGS = "-W3" $CPPFLAGS = %Q{-I"C:\\Program Files\\Microsoft Platform SDK for Windows Server 2003 R2\\Include" -I"C:\\Program Files\\ImageMagick-#{$magick_version}-Q8\\include"} # The /link option is required by the Makefile but causes warnings in the mkmf.log file. $LDFLAGS = %Q{/link /LIBPATH:"C:\\Program Files\\Microsoft Platform SDK for Windows Server 2003 R2\\Lib" /LIBPATH:"C:\\Program Files\\ImageMagick-#{$magick_version}-Q8\\lib" /LIBPATH:"C:\\ruby\\lib"} $LOCAL_LIBS = 'CORE_RL_magick_.lib X11.lib' end #headers = %w{assert.h ctype.h errno.h float.h limits.h math.h stdarg.h stddef.h stdint.h stdio.h stdlib.h string.h time.h} headers = %w{assert.h ctype.h stdio.h stdlib.h math.h time.h} headers << "stdint.h" if have_header("stdint.h") # defines uint64_t headers << "sys/types.h" if have_header("sys/types.h") if have_header("wand/MagickWand.h") headers << "wand/MagickWand.h" else exit_failure "\nCan't install RMagick #{RMAGICK_VERS}. Can't find MagickWand.h." end if RUBY_PLATFORM !~ /mswin|mingw/ unless `Magick-config --libs`[/\bl\s*(MagickCore|Magick)\b/] exit_failure "Can't install RMagick #{RMAGICK_VERS}. " + "Can't find the ImageMagick library or one of the dependent libraries. " + "Check the mkmf.log file for more detailed information.\n" end end have_func("snprintf", headers) ["AcquireImage", # 6.4.1 "AffinityImage", # 6.4.3-6 "AffinityImages", # 6.4.3-6 "AutoGammaImageChannel", # 6.5.5-1 "AutoLevelImageChannel", # 6.5.5-1 "BlueShiftImage", # 6.5.4-3 "ConstituteComponentTerminus", # 6.5.7-9 "DeskewImage", # 6.4.2-5 "EncipherImage", # 6.3.8-6 "EqualizeImageChannel", # 6.3.6-9 "FloodfillPaintImage", # 6.3.7 "FunctionImageChannel", # 6.4.8-8 "GetAuthenticIndexQueue", # 6.4.5-6 "GetAuthenticPixels", # 6.4.5-6 "GetImageAlphaChannel", # 6.3.9-2 "GetVirtualPixels", # 6.4.5-6 "LevelImageColors", # 6.4.2 "LevelColorsImageChannel", # 6.5.6-4 "LevelizeImageChannel", # 6.4.2 "LiquidRescaleImage", # 6.3.8-2 "MagickLibAddendum", # 6.5.9-1 "OpaquePaintImageChannel", # 6.3.7-10 "QueueAuthenticPixels", # 6.4.5-6 "RemapImage", # 6.4.4-0 "RemoveImageArtifact", # 6.3.6 "SelectiveBlurImageChannel", # 6.5.0-3 "SetImageAlphaChannel", # 6.3.6-9 "SetImageArtifact", # 6.3.6 "SetMagickMemoryMethods", # 6.4.1 "SparseColorImage", # 6.3.6-? "SyncAuthenticPixels", # 6.4.5-6 "TransformImageColorspace", # 6.5.1 "TransparentPaintImage", # 6.3.7-10 "TransparentPaintImageChroma" # 6.4.5-6 ].each do |func| have_func(func, headers) end checking_for("QueryMagickColorname() new signature") do if try_compile(<<"SRC") #{COMMON_HEADERS} #{cpp_include(headers)} /*top*/ int main() { MagickBooleanType okay; Image *image; MagickPixelPacket *color; char *name; ExceptionInfo *exception; okay = QueryMagickColorname(image, color, SVGCompliance, name, exception); return 0; } SRC $defs.push("-DHAVE_NEW_QUERYMAGICKCOLORNAME") true else false end end have_struct_member("Image", "type", headers) # ??? have_struct_member("DrawInfo", "kerning", headers) # 6.4.7-8 have_struct_member("DrawInfo", "interline_spacing", headers) # 6.5.5-8 have_struct_member("DrawInfo", "interword_spacing", headers) # 6.4.8-0 have_type("DitherMethod", headers) # 6.4.2 have_type("MagickFunction", headers) # 6.4.8-8 have_type("ImageLayerMethod", headers) # 6.3.6 replaces MagickLayerMethod have_type("long double", headers) #have_type("unsigned long long", headers) #have_type("uint64_t", headers) #have_type("__int64", headers) #have_type("uintmax_t", headers) #check_sizeof("unsigned long", headers) #check_sizeof("Image *", headers) have_enum_values("AlphaChannelType", ["CopyAlphaChannel", # 6.4.3-7 "BackgroundAlphaChannel"], headers) # 6.5.2-5 have_enum_values("CompositeOperator", ["BlurCompositeOp", # 6.5.3-7 "DistortCompositeOp", # 6.5.3-10 "LinearBurnCompositeOp", # 6.5.4-3 "LinearDodgeCompositeOp", # 6.5.4-3 "MathematicsCompositeOp", # 6.5.4-3 "PegtopLightCompositeOp", # 6.5.4-3 "PinLightCompositeOp", # 6.5.4-3 "VividLightCompositeOp"], headers) # 6.5.4-3 have_enum_values("CompressionType", ["DXT1Compression", # 6.3.9-3 "DXT3Compression", # 6.3.9-3 "DXT5Compression", # 6.3.9-3 "ZipSCompression", # 6.5.5-4 "PizCompression", # 6.5.5-4 "Pxr24Compression", # 6.5.5-4 "B44Compression", # 6.5.5-4 "B44ACompression"], headers) # 6.5.5-4 have_enum_values("DistortImageMethod", ["BarrelDistortion", # 6.4.2-5 "BarrelInverseDistortion", # 6.4.3-8 "BilinearForwardDistortion", # 6.5.1-2 "BilinearReverseDistortion", # 6.5.1-2 "DePolarDistortion", # 6.4.2-6 "PolarDistortion", # 6.4.2-6 "PolynomialDistortion", # 6.4.2-4 "ShepardsDistortion"], headers) # 6.4.2-4 have_enum_value("DitherMethod", "NoDitherMethod", headers) # 6.4.3 have_enum_values("FilterTypes", ["KaiserFilter", # 6.3.6 "WelshFilter", # 6.3.6-4 "ParzenFilter", # 6.3.6-4 "LagrangeFilter", # 6.3.7-2 "BohmanFilter", # 6.3.7-2 "BartlettFilter", # 6.3.7-2 "SentinelFilter"], headers) # 6.3.7-2 have_enum_values("MagickEvaluateOperator", ["PowEvaluateOperator", # 6.4.1-9 "LogEvaluateOperator", # 6.4.2 "ThresholdEvaluateOperator", # 6.4.3 "ThresholdBlackEvaluateOperator", # 6.4.3 "ThresholdWhiteEvaluateOperator", # 6.4.3 "GaussianNoiseEvaluateOperator", # 6.4.3 "ImpulseNoiseEvaluateOperator", # 6.4.3 "LaplacianNoiseEvaluateOperator", # 6.4.3 "MultiplicativeNoiseEvaluateOperator", # 6.4.3 "PoissonNoiseEvaluateOperator", # 6.4.3 "UniformNoiseEvaluateOperator", # 6.4.3 "CosineEvaluateOperator", # 6.4.8-5 "SineEvaluateOperator", # 6.4.8-5 "AddModulusEvaluateOperator"], # 6.4.8-5 headers) have_enum_values("MagickFunction", ["ArcsinFunction", # 6.5.2-8 "ArctanFunction", # 6.5.2-8 "PolynomialFunction", # 6.4.8-8 "SinusoidFunction"], headers) # 6.4.8-8 have_enum_values("ImageLayerMethod", ["FlattenLayer", # 6.3.6-2 "MergeLayer", # 6.3.6 "MosaicLayer", # 6.3.6-2 "TrimBoundsLayer" ], headers) # 6.4.3-8 have_enum_values("VirtualPixelMethod", ["HorizontalTileVirtualPixelMethod", # 6.4.2-6 "VerticalTileVirtualPixelMethod", # 6.4.2-6 "HorizontalTileEdgeVirtualPixelMethod", # 6.5.0-1 "VerticalTileEdgeVirtualPixelMethod", # 6.5.0-1 "CheckerTileVirtualPixelMethod"], # 6.5.0-1 headers) # Now test Ruby 1.9.0 features. headers = ["ruby.h"] if have_header("ruby/io.h") headers << "ruby/io.h" else headers << "rubyio.h" end have_func("rb_frame_this_func", headers) # Miscellaneous constants $defs.push("-DRUBY_VERSION_STRING=\"ruby #{RUBY_VERSION}\"") $defs.push("-DRMAGICK_VERSION_STRING=\"RMagick #{RMAGICK_VERS}\"") create_header() # Prior to 1.8.5 mkmf duplicated the symbols on the command line and in the # extconf.h header. Suppress that behavior by removing the symbol array. $defs = [] # Force re-compilation if the generated Makefile changed. $config_h = "Makefile rmagick.h" create_makefile("RMagick2") SUMMARY = <<"END_SUMMARY" #{"=" * 70} #{DateTime.now.strftime("%a %d%b%y %T")} This installation of RMagick #{RMAGICK_VERS} is configured for Ruby #{RUBY_VERSION} (#{RUBY_PLATFORM}) and ImageMagick #{$magick_version} #{"=" * 70} END_SUMMARY Logging::message SUMMARY message SUMMARY rmagick-2.13.2/ext/RMagick/rmagick.c0000644000004100000410000002472012147515547017162 0ustar www-datawww-data/**************************************************************************//** * Contains Magick module methods. * * Copyright © 2002 - 2009 by Timothy P. Hunter * * Changes since Nov. 2009 copyright © by Benjamin Thomas and Omer Bar-or * * @file rmagick.c * @version $Id: rmagick.c,v 1.4 2009/12/20 02:33:32 baror Exp $ * @author Tim Hunter ******************************************************************************/ #include "rmagick.h" /** * If called with the optional block, iterates over the colors, otherwise * returns an array of Magick::Color objects. * * Ruby usage: * - @verbatim Magick::colors @endverbatim * - @verbatim Magick::colors { |colorinfo| } @endverbatim * * Notes: * - There are 3 implementations. * * @param class the class on which the method is run. * @return either the input class (if a block was given) or the array of colors. */ VALUE Magick_colors(VALUE class) { const ColorInfo **color_info_list; unsigned long number_colors, x; volatile VALUE ary; ExceptionInfo exception; GetExceptionInfo(&exception); color_info_list = GetColorInfoList("*", &number_colors, &exception); CHECK_EXCEPTION() (void) DestroyExceptionInfo(&exception); if (rb_block_given_p()) { for (x = 0; x < number_colors; x++) { (void) rb_yield(Import_ColorInfo(color_info_list[x])); } magick_free((void *)color_info_list); return class; } else { ary = rb_ary_new2((long) number_colors); for (x = 0; x < number_colors; x++) { (void) rb_ary_push(ary, Import_ColorInfo(color_info_list[x])); } magick_free((void *)color_info_list); return ary; } } /** * If called with the optional block, iterates over the fonts, otherwise returns * an array of Magick::Font objects. * * Ruby usage: * - @verbatim Magick::fonts @endverbatim * - @verbatim Magick::fonts { |fontinfo| } @endverbatim * * @param class the class on which the method is run. * @return either the input class (if a block was given) or the array of fonts. */ VALUE Magick_fonts(VALUE class) { const TypeInfo **type_info; unsigned long number_types, x; volatile VALUE ary; ExceptionInfo exception; GetExceptionInfo(&exception); type_info = GetTypeInfoList("*", &number_types, &exception); CHECK_EXCEPTION() (void) DestroyExceptionInfo(&exception); if (rb_block_given_p()) { for (x = 0; x < number_types; x++) { (void) rb_yield(Import_TypeInfo((const TypeInfo *)type_info[x])); } magick_free((void *)type_info); return class; } else { ary = rb_ary_new2((long)number_types); for (x = 0; x < number_types; x++) { (void) rb_ary_push(ary, Import_TypeInfo((const TypeInfo *)type_info[x])); } magick_free((void *)type_info); return ary; } } /** * Build the @@formats hash. The hash keys are image formats. The hash values * specify the format "mode string", i.e. a description of what ImageMagick can * do with that format. The mode string is in the form "BRWA", where * - "B" is "*" if the format has native blob support, or " " otherwise. * - "R" is "r" if ImageMagick can read that format, or "-" otherwise. * - "W" is "w" if ImageMagick can write that format, or "-" otherwise. * - "A" is "+" if the format supports multi-image files, or "-" otherwise. * * No Ruby usage (internal function) * * @param magick_info a MagickInfo object. * @return the formats hash. */ static VALUE MagickInfo_to_format(const MagickInfo *magick_info) { char mode[4]; mode[0] = magick_info->blob_support ? '*': ' '; mode[1] = magick_info->decoder ? 'r' : '-'; mode[2] = magick_info->encoder ? 'w' : '-'; mode[3] = magick_info->encoder && magick_info->adjoin ? '+' : '-'; return rb_str_new(mode, sizeof(mode)); } /** * Build the @@formats hash. The hash keys are image formats. The hash values * specify the format "mode string", i.e. a description of what ImageMagick can * do with that format. The mode string is in the form "BRWA", where * - "B" is "*" if the format has native blob support, or " " otherwise. * - "R" is "r" if ImageMagick can read that format, or "-" otherwise. * - "W" is "w" if ImageMagick can write that format, or "-" otherwise. * - "A" is "+" if the format supports multi-image files, or "-" otherwise. * * Ruby usage: * - @verbatim Magick.init_formats @endverbatim * * Notes: * - Only called once. * - There are 3 implementations. * * @param class the class on which the method is run. * @return the formats hash. * @see MagickInfo_to_format */ VALUE Magick_init_formats(VALUE class) { const MagickInfo **magick_info; unsigned long number_formats, x; volatile VALUE formats; ExceptionInfo exception; class = class; // defeat "never referenced" message from icc formats = rb_hash_new(); // IM 6.1.3 added an exception argument to GetMagickInfoList GetExceptionInfo(&exception); magick_info = GetMagickInfoList("*", &number_formats, &exception); CHECK_EXCEPTION() (void) DestroyExceptionInfo(&exception); for (x = 0; x < number_formats; x++) { (void) rb_hash_aset(formats , rb_str_new2(magick_info[x]->name) , MagickInfo_to_format((const MagickInfo *)magick_info[x])); } return formats; } /** * Get/set resource limits. If a limit is specified the old limit is set to the * new value. Either way the current/old limit is returned. * * Ruby usage: * - @verbatim Magick.limit_resource(resource) @endverbatim * - @verbatim Magick.limit_resource(resource, limit) @endverbatim * * @param argc number of input arguments. * @param argv array of input arguments. * @param class the class on which the method is run. * @return the current/old limit. */ VALUE Magick_limit_resource(int argc, VALUE *argv, VALUE class) { volatile VALUE resource, limit; ResourceType res = UndefinedResource; char *str; ID id; unsigned long cur_limit; rb_scan_args(argc, argv, "11", &resource, &limit); switch (TYPE(resource)) { case T_NIL: return class; case T_SYMBOL: id = (ID)SYM2ID(resource); if (id == rb_intern("area")) { res = AreaResource; } else if (id == rb_intern("memory")) { res = MemoryResource; } else if (id == rb_intern("map")) { res = MapResource; } else if (id == rb_intern("disk")) { res = DiskResource; } else if (id == rb_intern("file")) { res = FileResource; } else { rb_raise(rb_eArgError, "unknown resource: `:%s'", rb_id2name(id)); } break; default: str = StringValuePtr(resource); if (*str == '\0') { return class; } else if (rm_strcasecmp("area", str) == 0) { res = AreaResource; } else if (rm_strcasecmp("memory", str) == 0) { res = MemoryResource; } else if (rm_strcasecmp("map", str) == 0) { res = MapResource; } else if (rm_strcasecmp("disk", str) == 0) { res = DiskResource; } else if (rm_strcasecmp("file", str) == 0) { res = FileResource; } else { rb_raise(rb_eArgError, "unknown resource: `%s'", str); } break; } cur_limit = GetMagickResourceLimit(res); if (argc > 1) { (void) SetMagickResourceLimit(res, (MagickSizeType)NUM2ULONG(limit)); } return ULONG2NUM(cur_limit); } /** * Set the amount of free memory allocated for the pixel cache. Once this * threshold is exceeded, all subsequent pixels cache operations are to/from * disk. * * Ruby usage: * - @verbatim Magick.set_cache_threshold(megabytes) @endverbatim * * Notes: * - singleton method * * @param class the class on which the method is run. * @param threshold the number of megabytes to set. * @return the class. */ VALUE Magick_set_cache_threshold(VALUE class, VALUE threshold) { unsigned long thrshld = NUM2ULONG(threshold); (void) SetMagickResourceLimit(MemoryResource, (MagickSizeType)thrshld); (void) SetMagickResourceLimit(MapResource, (MagickSizeType)(2*thrshld)); return class; } /** * Set the log event mask. * * Ruby usage: * - @verbatim Magick.set_log_event_mask(event) @endverbatim * - @verbatim Magick.set_log_event_mask(event,...) @endverbatim * * Notes: * - "event" is one of * - "all" * - "annotate" * - "blob" * - "cache" * - "coder" * - "configure" * - "deprecate" * - "locale" * - "none" * - "render" * - "transform" * - "user" * - "x11" * - Multiple events can be specified. * - Event names may be capitalized. * * @param argc number of input arguments. * @param argv array of input arguments. * @param class the class on which the method is run. * @return the class. */ VALUE Magick_set_log_event_mask(int argc, VALUE *argv, VALUE class) { int x; if (argc == 0) { rb_raise(rb_eArgError, "wrong number of arguments (at least 1 required)"); } for (x = 0; x < argc; x++) { (void) SetLogEventMask(StringValuePtr(argv[x])); } return class; } /** * Set the format for log messages. * * Ruby usage: * - @verbatim Magick.set_log_format(format) @endverbatim * * Notes: * - Format is a string containing one or more of: * - %t - current time * - %r - elapsed time * - %u - user time * - %p - pid * - %m - module (source file name) * - %f - function name * - %l - line number * - %d - event domain (one of the events listed above) * - %e - event name * - Plus other characters, including \\n, etc. * * @param class the class on which the method is run. * @param format the format to set. * @return the class. */ VALUE Magick_set_log_format(VALUE class, VALUE format) { SetLogFormat(StringValuePtr(format)); return class; } rmagick-2.13.2/ext/RMagick/rmmain.c0000644000004100000410000021042512147515547017027 0ustar www-datawww-data/**************************************************************************//** * Contains all module, class, method declarations. Defines all constants. * Contains Magick module methods. * * Copyright © 2002 - 2009 by Timothy P. Hunter * * Changes since Nov. 2009 copyright © by Benjamin Thomas and Omer Bar-or * * @file rmmain.c * @version $Id: rmmain.c,v 1.303 2009/12/20 02:33:33 baror Exp $ * @author Tim Hunter ******************************************************************************/ #define MAIN // Define external variables #include "rmagick.h" #include "magick/version.h" /*----------------------------------------------------------------------------\ | External declarations \----------------------------------------------------------------------------*/ void Init_RMagick(void); static void test_Magick_version(void); static void version_constants(void); /* * Handle transferring ImageMagick memory allocations/frees to Ruby. * These functions have the same signature as the equivalent C functions. */ #if defined(HAVE_SETMAGICKMEMORYMETHODS) /** * Allocate memory. * * No Ruby usage (internal function) * * @param size the size of memory to allocate * @return pointer to a block of memory */ static void *rm_malloc(size_t size) { void *p; // int old_state; // old_state = rb_gc_disable(); p = xmalloc((long)size); // if (!RTEST(old_state)) // { // rb_gc_enable(); // } return p; } /** * Reallocate memory. * * No Ruby usage (internal function) * * @param ptr pointer to the existing block of memory * @param size the new size of memory to allocate * @return pointer to a block of memory */ static void *rm_realloc(void *ptr, size_t size) { void *p; // int old_state; // old_state = rb_gc_disable(); p = xrealloc(ptr, (long)size); // if (!RTEST(old_state)) // { // rb_gc_enable(); // } return p; } /** * Free memory. * * No Ruby usage (internal function) * * @param ptr pointer to the existing block of memory */ static void rm_free(void *ptr) { xfree(ptr); } /** * Use managed memory. * * No Ruby usage (internal function) */ static void set_managed_memory(void) { ID enable_mm = rb_intern("RMAGICK_ENABLE_MANAGED_MEMORY"); if (RTEST(rb_const_defined(rb_cObject, enable_mm)) && RTEST(rb_const_get(rb_cObject, enable_mm))) { rb_warning("RMagick: %s", "managed memory enabled. This is an experimental feature."); SetMagickMemoryMethods(rm_malloc, rm_realloc, rm_free); rb_define_const(Module_Magick, "MANAGED_MEMORY", Qtrue); } else { rb_define_const(Module_Magick, "MANAGED_MEMORY", Qfalse); } } #endif /** * Define the classes and constants. * * No Ruby usage (internal function) */ void Init_RMagick2(void) { volatile VALUE observable; MagickCoreGenesis("RMagick", MagickFalse); test_Magick_version(); Module_Magick = rb_define_module("Magick"); #if defined(HAVE_SETMAGICKMEMORYMETHODS) set_managed_memory(); #else rb_define_const(Module_Magick, "MANAGED_MEMORY", Qfalse); #endif /*-----------------------------------------------------------------------*/ /* Create IDs for frequently used methods, etc. */ /*-----------------------------------------------------------------------*/ rm_ID_trace_proc = rb_intern("@trace_proc"); rm_ID_call = rb_intern("call"); rm_ID_changed = rb_intern("changed"); rm_ID_cur_image = rb_intern("cur_image"); rm_ID_dup = rb_intern("dup"); rm_ID_fill = rb_intern("fill"); rm_ID_flag = rb_intern("flag"); rm_ID_from_s = rb_intern("from_s"); rm_ID_Geometry = rb_intern("Geometry"); rm_ID_GeometryValue = rb_intern("GeometryValue"); rm_ID_has_key_q = rb_intern("has_key?"); rm_ID_height = rb_intern("height"); rm_ID_initialize_copy = rb_intern("initialize_copy"); rm_ID_length = rb_intern("length"); rm_ID_notify_observers = rb_intern("notify_observers"); rm_ID_new = rb_intern("new"); rm_ID_push = rb_intern("push"); rm_ID_spaceship = rb_intern("<=>"); rm_ID_to_i = rb_intern("to_i"); rm_ID_to_s = rb_intern("to_s"); rm_ID_values = rb_intern("values"); rm_ID_width = rb_intern("width"); rm_ID_x = rb_intern("x"); rm_ID_y = rb_intern("y"); /*-----------------------------------------------------------------------*/ /* Module Magick methods */ /*-----------------------------------------------------------------------*/ rb_define_module_function(Module_Magick, "colors", Magick_colors, 0); rb_define_module_function(Module_Magick, "fonts", Magick_fonts, 0); rb_define_module_function(Module_Magick, "init_formats", Magick_init_formats, 0); rb_define_module_function(Module_Magick, "limit_resource", Magick_limit_resource, -1); rb_define_module_function(Module_Magick, "set_cache_threshold", Magick_set_cache_threshold, 1); rb_define_module_function(Module_Magick, "set_log_event_mask", Magick_set_log_event_mask, -1); rb_define_module_function(Module_Magick, "set_log_format", Magick_set_log_format, 1); /*-----------------------------------------------------------------------*/ /* Class Magick::Image methods */ /*-----------------------------------------------------------------------*/ Class_Image = rb_define_class_under(Module_Magick, "Image", rb_cObject); // Define an alias for Object#display before we override it rb_define_alias(Class_Image, "__display__", "display"); rb_define_alloc_func(Class_Image, Image_alloc); rb_define_method(Class_Image, "initialize", Image_initialize, -1); rb_define_singleton_method(Class_Image, "combine", Image_combine, -1); rb_define_singleton_method(Class_Image, "constitute", Image_constitute, 4); rb_define_singleton_method(Class_Image, "_load", Image__load, 1); rb_define_singleton_method(Class_Image, "capture", Image_capture, -1); rb_define_singleton_method(Class_Image, "ping", Image_ping, 1); rb_define_singleton_method(Class_Image, "read", Image_read, 1); rb_define_singleton_method(Class_Image, "read_inline", Image_read_inline, 1); rb_define_singleton_method(Class_Image, "from_blob", Image_from_blob, 1); DCL_ATTR_WRITER(Image, alpha) DCL_ATTR_ACCESSOR(Image, background_color) DCL_ATTR_READER(Image, base_columns) DCL_ATTR_READER(Image, base_filename) DCL_ATTR_READER(Image, base_rows) DCL_ATTR_ACCESSOR(Image, bias) DCL_ATTR_ACCESSOR(Image, black_point_compensation) DCL_ATTR_ACCESSOR(Image, blur) DCL_ATTR_ACCESSOR(Image, border_color) DCL_ATTR_READER(Image, bounding_box) DCL_ATTR_ACCESSOR(Image, chromaticity) DCL_ATTR_ACCESSOR(Image, color_profile) DCL_ATTR_READER(Image, colors) DCL_ATTR_ACCESSOR(Image, colorspace) DCL_ATTR_READER(Image, columns) DCL_ATTR_ACCESSOR(Image, compose) DCL_ATTR_ACCESSOR(Image, compression) DCL_ATTR_ACCESSOR(Image, delay) DCL_ATTR_ACCESSOR(Image, density) DCL_ATTR_READER(Image, depth) DCL_ATTR_READER(Image, directory) DCL_ATTR_ACCESSOR(Image, dispose) DCL_ATTR_ACCESSOR(Image, endian) DCL_ATTR_ACCESSOR(Image, extract_info) DCL_ATTR_READER(Image, filename) DCL_ATTR_READER(Image, filesize) DCL_ATTR_ACCESSOR(Image, filter) DCL_ATTR_ACCESSOR(Image, format) DCL_ATTR_ACCESSOR(Image, fuzz) DCL_ATTR_ACCESSOR(Image, gamma) DCL_ATTR_ACCESSOR(Image, geometry) DCL_ATTR_ACCESSOR(Image, gravity) DCL_ATTR_ACCESSOR(Image, image_type) DCL_ATTR_ACCESSOR(Image, interlace) DCL_ATTR_ACCESSOR(Image, iptc_profile) DCL_ATTR_ACCESSOR(Image, iterations) // do not document! Only used by Image#iterations= DCL_ATTR_WRITER(Image, mask) DCL_ATTR_ACCESSOR(Image, matte) DCL_ATTR_ACCESSOR(Image, matte_color) DCL_ATTR_READER(Image, mean_error_per_pixel) DCL_ATTR_READER(Image, mime_type) DCL_ATTR_WRITER(Image, monitor) DCL_ATTR_READER(Image, montage) DCL_ATTR_READER(Image, normalized_mean_error) DCL_ATTR_READER(Image, normalized_maximum_error) DCL_ATTR_READER(Image, number_colors) DCL_ATTR_ACCESSOR(Image, offset) DCL_ATTR_WRITER(Image, opacity) DCL_ATTR_ACCESSOR(Image, orientation) DCL_ATTR_ACCESSOR(Image, page) DCL_ATTR_ACCESSOR(Image, pixel_interpolation_method) DCL_ATTR_READER(Image, quality) DCL_ATTR_READER(Image, quantum_depth) DCL_ATTR_ACCESSOR(Image, rendering_intent) DCL_ATTR_READER(Image, rows) DCL_ATTR_READER(Image, scene) DCL_ATTR_ACCESSOR(Image, start_loop) DCL_ATTR_ACCESSOR(Image, class_type) DCL_ATTR_ACCESSOR(Image, ticks_per_second) DCL_ATTR_READER(Image, total_colors) DCL_ATTR_READER(Image, total_ink_density) DCL_ATTR_ACCESSOR(Image, transparent_color) DCL_ATTR_ACCESSOR(Image, units) DCL_ATTR_ACCESSOR(Image, virtual_pixel_method) DCL_ATTR_ACCESSOR(Image, x_resolution) DCL_ATTR_ACCESSOR(Image, y_resolution) rb_define_method(Class_Image, "adaptive_blur", Image_adaptive_blur, -1); rb_define_method(Class_Image, "adaptive_blur_channel", Image_adaptive_blur_channel, -1); rb_define_method(Class_Image, "adaptive_resize", Image_adaptive_resize, -1); rb_define_method(Class_Image, "adaptive_sharpen", Image_adaptive_sharpen, -1); rb_define_method(Class_Image, "adaptive_sharpen_channel", Image_adaptive_sharpen_channel, -1); rb_define_method(Class_Image, "adaptive_threshold", Image_adaptive_threshold, -1); rb_define_method(Class_Image, "add_compose_mask", Image_add_compose_mask, 1); rb_define_method(Class_Image, "add_noise", Image_add_noise, 1); rb_define_method(Class_Image, "add_noise_channel", Image_add_noise_channel, -1); rb_define_method(Class_Image, "add_profile", Image_add_profile, 1); rb_define_method(Class_Image, "affine_transform", Image_affine_transform, 1); rb_define_method(Class_Image, "remap", Image_remap, -1); rb_define_method(Class_Image, "alpha", Image_alpha, -1); rb_define_method(Class_Image, "alpha?", Image_alpha_q, 0); rb_define_method(Class_Image, "[]", Image_aref, 1); rb_define_method(Class_Image, "[]=", Image_aset, 2); rb_define_method(Class_Image, "auto_gamma_channel", Image_auto_gamma_channel, -1); rb_define_method(Class_Image, "auto_level_channel", Image_auto_level_channel, -1); rb_define_method(Class_Image, "auto_orient", Image_auto_orient, 0); rb_define_method(Class_Image, "auto_orient!", Image_auto_orient_bang, 0); rb_define_method(Class_Image, "properties", Image_properties, 0); rb_define_method(Class_Image, "bilevel_channel", Image_bilevel_channel, -1); rb_define_method(Class_Image, "black_threshold", Image_black_threshold, -1); rb_define_method(Class_Image, "blend", Image_blend, -1); rb_define_method(Class_Image, "blue_shift", Image_blue_shift, -1); rb_define_method(Class_Image, "blur_image", Image_blur_image, -1); rb_define_method(Class_Image, "blur_channel", Image_blur_channel, -1); rb_define_method(Class_Image, "border", Image_border, 3); rb_define_method(Class_Image, "border!", Image_border_bang, 3); rb_define_method(Class_Image, "change_geometry", Image_change_geometry, 1); rb_define_method(Class_Image, "change_geometry!", Image_change_geometry, 1); rb_define_method(Class_Image, "changed?", Image_changed_q, 0); rb_define_method(Class_Image, "channel", Image_channel, 1); // An alias for compare_channel rb_define_method(Class_Image, "channel_compare", Image_compare_channel, -1); rb_define_method(Class_Image, "check_destroyed", Image_check_destroyed, 0); rb_define_method(Class_Image, "compare_channel", Image_compare_channel, -1); rb_define_method(Class_Image, "channel_depth", Image_channel_depth, -1); rb_define_method(Class_Image, "channel_extrema", Image_channel_extrema, -1); rb_define_method(Class_Image, "channel_mean", Image_channel_mean, -1); rb_define_method(Class_Image, "charcoal", Image_charcoal, -1); rb_define_method(Class_Image, "chop", Image_chop, 4); rb_define_method(Class_Image, "clut_channel", Image_clut_channel, -1); rb_define_method(Class_Image, "clone", Image_clone, 0); rb_define_method(Class_Image, "color_flood_fill", Image_color_flood_fill, 5); rb_define_method(Class_Image, "color_histogram", Image_color_histogram, 0); rb_define_method(Class_Image, "colorize", Image_colorize, -1); rb_define_method(Class_Image, "colormap", Image_colormap, -1); rb_define_method(Class_Image, "composite", Image_composite, -1); rb_define_method(Class_Image, "composite!", Image_composite_bang, -1); rb_define_method(Class_Image, "composite_affine", Image_composite_affine, 2); rb_define_method(Class_Image, "composite_channel", Image_composite_channel, -1); rb_define_method(Class_Image, "composite_channel!", Image_composite_channel_bang, -1); rb_define_method(Class_Image, "composite_mathematics", Image_composite_mathematics, -1); rb_define_method(Class_Image, "composite_tiled", Image_composite_tiled, -1); rb_define_method(Class_Image, "composite_tiled!", Image_composite_tiled_bang, -1); rb_define_method(Class_Image, "compress_colormap!", Image_compress_colormap_bang, 0); rb_define_method(Class_Image, "contrast", Image_contrast, -1); rb_define_method(Class_Image, "contrast_stretch_channel", Image_contrast_stretch_channel, -1); rb_define_method(Class_Image, "convolve", Image_convolve, 2); rb_define_method(Class_Image, "convolve_channel", Image_convolve_channel, -1); rb_define_method(Class_Image, "copy", Image_copy, 0); rb_define_method(Class_Image, "crop", Image_crop, -1); rb_define_method(Class_Image, "crop!", Image_crop_bang, -1); rb_define_method(Class_Image, "cycle_colormap", Image_cycle_colormap, 1); rb_define_method(Class_Image, "decipher", Image_decipher, 1); rb_define_method(Class_Image, "define", Image_define, 2); rb_define_method(Class_Image, "deskew", Image_deskew, -1); rb_define_method(Class_Image, "delete_compose_mask", Image_delete_compose_mask, 0); rb_define_method(Class_Image, "delete_profile", Image_delete_profile, 1); rb_define_method(Class_Image, "despeckle", Image_despeckle, 0); rb_define_method(Class_Image, "destroy!", Image_destroy_bang, 0); rb_define_method(Class_Image, "destroyed?", Image_destroyed_q, 0); rb_define_method(Class_Image, "difference", Image_difference, 1); rb_define_method(Class_Image, "dispatch", Image_dispatch, -1); rb_define_method(Class_Image, "displace", Image_displace, -1); rb_define_method(Class_Image, "display", Image_display, 0); rb_define_method(Class_Image, "dissolve", Image_dissolve, -1); rb_define_method(Class_Image, "distort", Image_distort, -1); rb_define_method(Class_Image, "distortion_channel", Image_distortion_channel, -1); rb_define_method(Class_Image, "_dump", Image__dump, 1); rb_define_method(Class_Image, "dup", Image_dup, 0); rb_define_method(Class_Image, "each_profile", Image_each_profile, 0); rb_define_method(Class_Image, "edge", Image_edge, -1); rb_define_method(Class_Image, "emboss", Image_emboss, -1); rb_define_method(Class_Image, "encipher", Image_encipher, 1); rb_define_method(Class_Image, "enhance", Image_enhance, 0); rb_define_method(Class_Image, "equalize", Image_equalize, 0); rb_define_method(Class_Image, "equalize_channel", Image_equalize_channel, -1); rb_define_method(Class_Image, "erase!", Image_erase_bang, 0); rb_define_method(Class_Image, "excerpt", Image_excerpt, 4); rb_define_method(Class_Image, "excerpt!", Image_excerpt_bang, 4); rb_define_method(Class_Image, "export_pixels", Image_export_pixels, -1); rb_define_method(Class_Image, "export_pixels_to_str", Image_export_pixels_to_str, -1); rb_define_method(Class_Image, "extent", Image_extent, -1); rb_define_method(Class_Image, "find_similar_region", Image_find_similar_region, -1); rb_define_method(Class_Image, "flip", Image_flip, 0); rb_define_method(Class_Image, "flip!", Image_flip_bang, 0); rb_define_method(Class_Image, "flop", Image_flop, 0); rb_define_method(Class_Image, "flop!", Image_flop_bang, 0); rb_define_method(Class_Image, "frame", Image_frame, -1); rb_define_method(Class_Image, "function_channel", Image_function_channel, -1); rb_define_method(Class_Image, "gamma_channel", Image_gamma_channel, -1); rb_define_method(Class_Image, "gamma_correct", Image_gamma_correct, -1); rb_define_method(Class_Image, "gaussian_blur", Image_gaussian_blur, -1); rb_define_method(Class_Image, "gaussian_blur_channel", Image_gaussian_blur_channel, -1); rb_define_method(Class_Image, "get_pixels", Image_get_pixels, 4); rb_define_method(Class_Image, "gray?", Image_gray_q, 0); rb_define_method(Class_Image, "grey?", Image_gray_q, 0); rb_define_method(Class_Image, "histogram?", Image_histogram_q, 0); rb_define_method(Class_Image, "implode", Image_implode, -1); rb_define_method(Class_Image, "import_pixels", Image_import_pixels, -1); rb_define_method(Class_Image, "initialize_copy", Image_init_copy, 1); rb_define_method(Class_Image, "inspect", Image_inspect, 0); rb_define_method(Class_Image, "level2", Image_level2, -1); rb_define_method(Class_Image, "level_channel", Image_level_channel, -1); rb_define_method(Class_Image, "level_colors", Image_level_colors, -1); rb_define_method(Class_Image, "levelize_channel", Image_levelize_channel, -1); rb_define_method(Class_Image, "linear_stretch", Image_linear_stretch, -1); rb_define_method(Class_Image, "liquid_rescale", Image_liquid_rescale, -1); rb_define_method(Class_Image, "magnify", Image_magnify, 0); rb_define_method(Class_Image, "magnify!", Image_magnify_bang, 0); rb_define_method(Class_Image, "map", Image_map, -1); rb_define_method(Class_Image, "marshal_dump", Image_marshal_dump, 0); rb_define_method(Class_Image, "marshal_load", Image_marshal_load, 1); rb_define_method(Class_Image, "mask", Image_mask, -1); rb_define_method(Class_Image, "matte_flood_fill", Image_matte_flood_fill, 5); rb_define_method(Class_Image, "median_filter", Image_median_filter, -1); rb_define_method(Class_Image, "minify", Image_minify, 0); rb_define_method(Class_Image, "minify!", Image_minify_bang, 0); rb_define_method(Class_Image, "modulate", Image_modulate, -1); rb_define_method(Class_Image, "monochrome?", Image_monochrome_q, 0); rb_define_method(Class_Image, "motion_blur", Image_motion_blur, -1); rb_define_method(Class_Image, "negate", Image_negate, -1); rb_define_method(Class_Image, "negate_channel", Image_negate_channel, -1); rb_define_method(Class_Image, "normalize", Image_normalize, 0); rb_define_method(Class_Image, "normalize_channel", Image_normalize_channel, -1); rb_define_method(Class_Image, "oil_paint", Image_oil_paint, -1); rb_define_method(Class_Image, "opaque", Image_opaque, 2); rb_define_method(Class_Image, "opaque_channel", Image_opaque_channel, -1); rb_define_method(Class_Image, "opaque?", Image_opaque_q, 0); rb_define_method(Class_Image, "ordered_dither", Image_ordered_dither, -1); rb_define_method(Class_Image, "paint_transparent", Image_paint_transparent, -1); rb_define_method(Class_Image, "palette?", Image_palette_q, 0); rb_define_method(Class_Image, "pixel_color", Image_pixel_color, -1); rb_define_method(Class_Image, "polaroid", Image_polaroid, -1); rb_define_method(Class_Image, "posterize", Image_posterize, -1); // rb_define_method(Class_Image, "plasma", Image_plasma, 6); rb_define_method(Class_Image, "preview", Image_preview, 1); rb_define_method(Class_Image, "profile!", Image_profile_bang, 2); rb_define_method(Class_Image, "quantize", Image_quantize, -1); rb_define_method(Class_Image, "quantum_operator", Image_quantum_operator, -1); rb_define_method(Class_Image, "radial_blur", Image_radial_blur, 1); rb_define_method(Class_Image, "radial_blur_channel", Image_radial_blur_channel, -1); rb_define_method(Class_Image, "raise", Image_raise, -1); rb_define_method(Class_Image, "random_threshold_channel", Image_random_threshold_channel, -1); rb_define_method(Class_Image, "recolor", Image_recolor, 1); rb_define_method(Class_Image, "reduce_noise", Image_reduce_noise, 1); rb_define_method(Class_Image, "resize", Image_resize, -1); rb_define_method(Class_Image, "resize!", Image_resize_bang, -1); rb_define_method(Class_Image, "roll", Image_roll, 2); rb_define_method(Class_Image, "rotate", Image_rotate, -1); rb_define_method(Class_Image, "rotate!", Image_rotate_bang, -1); rb_define_method(Class_Image, "sample", Image_sample, -1); rb_define_method(Class_Image, "sample!", Image_sample_bang, -1); rb_define_method(Class_Image, "scale", Image_scale, -1); rb_define_method(Class_Image, "scale!", Image_scale_bang, -1); rb_define_method(Class_Image, "segment", Image_segment, -1); rb_define_method(Class_Image, "selective_blur_channel", Image_selective_blur_channel, -1); rb_define_method(Class_Image, "separate", Image_separate, -1); rb_define_method(Class_Image, "sepiatone", Image_sepiatone, -1); rb_define_method(Class_Image, "set_channel_depth", Image_set_channel_depth, 2); rb_define_method(Class_Image, "shade", Image_shade, -1); rb_define_method(Class_Image, "shadow", Image_shadow, -1); rb_define_method(Class_Image, "sharpen", Image_sharpen, -1); rb_define_method(Class_Image, "sharpen_channel", Image_sharpen_channel, -1); rb_define_method(Class_Image, "shave", Image_shave, 2); rb_define_method(Class_Image, "shave!", Image_shave_bang, 2); rb_define_method(Class_Image, "shear", Image_shear, 2); rb_define_method(Class_Image, "sigmoidal_contrast_channel", Image_sigmoidal_contrast_channel, -1); rb_define_method(Class_Image, "signature", Image_signature, 0); rb_define_method(Class_Image, "sketch", Image_sketch, -1); rb_define_method(Class_Image, "solarize", Image_solarize, -1); rb_define_method(Class_Image, "<=>", Image_spaceship, 1); rb_define_method(Class_Image, "sparse_color", Image_sparse_color, -1); rb_define_method(Class_Image, "splice", Image_splice, -1); rb_define_method(Class_Image, "spread", Image_spread, -1); rb_define_method(Class_Image, "stegano", Image_stegano, 2); rb_define_method(Class_Image, "stereo", Image_stereo, 1); rb_define_method(Class_Image, "strip!", Image_strip_bang, 0); rb_define_method(Class_Image, "store_pixels", Image_store_pixels, 5); rb_define_method(Class_Image, "swirl", Image_swirl, 1); rb_define_method(Class_Image, "sync_profiles", Image_sync_profiles, 0); rb_define_method(Class_Image, "texture_flood_fill", Image_texture_flood_fill, 5); rb_define_method(Class_Image, "threshold", Image_threshold, 1); rb_define_method(Class_Image, "thumbnail", Image_thumbnail, -1); rb_define_method(Class_Image, "thumbnail!", Image_thumbnail_bang, -1); rb_define_method(Class_Image, "tint", Image_tint, -1); rb_define_method(Class_Image, "to_color", Image_to_color, 1); rb_define_method(Class_Image, "to_blob", Image_to_blob, 0); rb_define_method(Class_Image, "transparent", Image_transparent, -1); rb_define_method(Class_Image, "transparent_chroma", Image_transparent_chroma, -1); rb_define_method(Class_Image, "transpose", Image_transpose, 0); rb_define_method(Class_Image, "transpose!", Image_transpose_bang, 0); rb_define_method(Class_Image, "transverse", Image_transverse, 0); rb_define_method(Class_Image, "transverse!", Image_transverse_bang, 0); rb_define_method(Class_Image, "trim", Image_trim, -1); rb_define_method(Class_Image, "trim!", Image_trim_bang, -1); rb_define_method(Class_Image, "undefine", Image_undefine, 1); rb_define_method(Class_Image, "unique_colors", Image_unique_colors, 0); rb_define_method(Class_Image, "unsharp_mask", Image_unsharp_mask, -1); rb_define_method(Class_Image, "unsharp_mask_channel", Image_unsharp_mask_channel, -1); rb_define_method(Class_Image, "vignette", Image_vignette, -1); rb_define_method(Class_Image, "watermark", Image_watermark, -1); rb_define_method(Class_Image, "wave", Image_wave, -1); rb_define_method(Class_Image, "wet_floor", Image_wet_floor, -1); rb_define_method(Class_Image, "white_threshold", Image_white_threshold, -1); rb_define_method(Class_Image, "write", Image_write, 1); /*-----------------------------------------------------------------------*/ /* Class Magick::ImageList methods (see also RMagick.rb) */ /*-----------------------------------------------------------------------*/ Class_ImageList = rb_define_class_under(Module_Magick, "ImageList", rb_cObject); // Define an alias for Object#display before we override it rb_define_alias(Class_ImageList, "__display__", "display"); rb_define_method(Class_ImageList, "remap", ImageList_remap, -1); rb_define_method(Class_ImageList, "animate", ImageList_animate, -1); rb_define_method(Class_ImageList, "append", ImageList_append, 1); rb_define_method(Class_ImageList, "average", ImageList_average, 0); rb_define_method(Class_ImageList, "coalesce", ImageList_coalesce, 0); rb_define_method(Class_ImageList, "composite_layers", ImageList_composite_layers, -1); rb_define_method(Class_ImageList, "deconstruct", ImageList_deconstruct, 0); rb_define_method(Class_ImageList, "display", ImageList_display, 0); rb_define_method(Class_ImageList, "flatten_images", ImageList_flatten_images, 0); rb_define_method(Class_ImageList, "fx", ImageList_fx, -1); rb_define_method(Class_ImageList, "map", ImageList_map, -1); rb_define_method(Class_ImageList, "montage", ImageList_montage, 0); rb_define_method(Class_ImageList, "morph", ImageList_morph, 1); rb_define_method(Class_ImageList, "mosaic", ImageList_mosaic, 0); rb_define_method(Class_ImageList, "optimize_layers", ImageList_optimize_layers, 1); rb_define_method(Class_ImageList, "quantize", ImageList_quantize, -1); rb_define_method(Class_ImageList, "to_blob", ImageList_to_blob, 0); rb_define_method(Class_ImageList, "write", ImageList_write, 1); /*-----------------------------------------------------------------------*/ /* Class Magick::Draw methods */ /*-----------------------------------------------------------------------*/ Class_Draw = rb_define_class_under(Module_Magick, "Draw", rb_cObject); rb_define_alloc_func(Class_Draw, Draw_alloc); DCL_ATTR_WRITER(Draw, affine) DCL_ATTR_WRITER(Draw, align) DCL_ATTR_WRITER(Draw, decorate) DCL_ATTR_WRITER(Draw, density) DCL_ATTR_WRITER(Draw, encoding) DCL_ATTR_WRITER(Draw, fill) DCL_ATTR_WRITER(Draw, fill_pattern) DCL_ATTR_WRITER(Draw, font) DCL_ATTR_WRITER(Draw, font_family) DCL_ATTR_WRITER(Draw, font_stretch) DCL_ATTR_WRITER(Draw, font_style) DCL_ATTR_WRITER(Draw, font_weight) DCL_ATTR_WRITER(Draw, gravity) DCL_ATTR_WRITER(Draw, interline_spacing) DCL_ATTR_WRITER(Draw, interword_spacing) DCL_ATTR_WRITER(Draw, kerning) DCL_ATTR_WRITER(Draw, pointsize) DCL_ATTR_WRITER(Draw, rotation) DCL_ATTR_WRITER(Draw, stroke) DCL_ATTR_WRITER(Draw, stroke_pattern) DCL_ATTR_WRITER(Draw, stroke_width) DCL_ATTR_WRITER(Draw, text_antialias) DCL_ATTR_WRITER(Draw, tile) DCL_ATTR_WRITER(Draw, undercolor) rb_define_method(Class_Draw, "annotate", Draw_annotate, 6); rb_define_method(Class_Draw, "clone", Draw_clone, 0); rb_define_method(Class_Draw, "composite", Draw_composite, -1); rb_define_method(Class_Draw, "draw", Draw_draw, 1); rb_define_method(Class_Draw, "dup", Draw_dup, 0); rb_define_method(Class_Draw, "get_type_metrics", Draw_get_type_metrics, -1); rb_define_method(Class_Draw, "get_multiline_type_metrics", Draw_get_multiline_type_metrics, -1); rb_define_method(Class_Draw, "initialize", Draw_initialize, 0); rb_define_method(Class_Draw, "initialize_copy", Draw_init_copy, 1); rb_define_method(Class_Draw, "inspect", Draw_inspect, 0); rb_define_method(Class_Draw, "marshal_dump", Draw_marshal_dump, 0); rb_define_method(Class_Draw, "marshal_load", Draw_marshal_load, 1); rb_define_method(Class_Draw, "primitive", Draw_primitive, 1); /*-----------------------------------------------------------------------*/ /* Class Magick::DrawOptions is identical to Magick::Draw but with */ /* only the attribute writer methods. This is the object that is passed */ /* to the block associated with the Draw.new method call. */ /*-----------------------------------------------------------------------*/ Class_DrawOptions = rb_define_class_under(Class_Image, "DrawOptions", rb_cObject); rb_define_alloc_func(Class_DrawOptions, DrawOptions_alloc); rb_define_method(Class_DrawOptions, "initialize", DrawOptions_initialize, 0); SHARE_ATTR_WRITER(DrawOptions, Draw, affine) SHARE_ATTR_WRITER(DrawOptions, Draw, align) SHARE_ATTR_WRITER(DrawOptions, Draw, decorate) SHARE_ATTR_WRITER(DrawOptions, Draw, density) SHARE_ATTR_WRITER(DrawOptions, Draw, encoding) SHARE_ATTR_WRITER(DrawOptions, Draw, fill) SHARE_ATTR_WRITER(DrawOptions, Draw, fill_pattern) SHARE_ATTR_WRITER(DrawOptions, Draw, font) SHARE_ATTR_WRITER(DrawOptions, Draw, font_family) SHARE_ATTR_WRITER(DrawOptions, Draw, font_stretch) SHARE_ATTR_WRITER(DrawOptions, Draw, font_style) SHARE_ATTR_WRITER(DrawOptions, Draw, font_weight) SHARE_ATTR_WRITER(DrawOptions, Draw, gravity) SHARE_ATTR_WRITER(DrawOptions, Draw, pointsize) SHARE_ATTR_WRITER(DrawOptions, Draw, rotation) SHARE_ATTR_WRITER(DrawOptions, Draw, stroke) SHARE_ATTR_WRITER(DrawOptions, Draw, stroke_pattern) SHARE_ATTR_WRITER(DrawOptions, Draw, stroke_width) SHARE_ATTR_WRITER(DrawOptions, Draw, text_antialias) SHARE_ATTR_WRITER(DrawOptions, Draw, tile) SHARE_ATTR_WRITER(DrawOptions, Draw, undercolor) /*-----------------------------------------------------------------------*/ /* Class Magick::Pixel */ /*-----------------------------------------------------------------------*/ Class_Pixel = rb_define_class_under(Module_Magick, "Pixel", rb_cObject); // include Observable in Pixel for Image::View class (void) rb_require("observer"); observable = rb_const_get(rb_cObject, rb_intern("Observable")); rb_include_module(Class_Pixel, observable); // include Comparable rb_include_module(Class_Pixel, rb_mComparable); // Magick::Pixel has 4 constructors: "new" "from_color", "from_hsla", // and the deprecated "from_HSL". rb_define_alloc_func(Class_Pixel, Pixel_alloc); rb_define_singleton_method(Class_Pixel, "from_color", Pixel_from_color, 1); rb_define_singleton_method(Class_Pixel, "from_HSL", Pixel_from_HSL, 1); rb_define_singleton_method(Class_Pixel, "from_hsla", Pixel_from_hsla, -1); // Define the RGBA attributes DCL_ATTR_ACCESSOR(Pixel, red) DCL_ATTR_ACCESSOR(Pixel, green) DCL_ATTR_ACCESSOR(Pixel, blue) DCL_ATTR_ACCESSOR(Pixel, opacity) // Define the CMYK attributes DCL_ATTR_ACCESSOR(Pixel, cyan) DCL_ATTR_ACCESSOR(Pixel, magenta) DCL_ATTR_ACCESSOR(Pixel, yellow) DCL_ATTR_ACCESSOR(Pixel, black) // Define the instance methods rb_define_method(Class_Pixel, "<=>", Pixel_spaceship, 1); rb_define_method(Class_Pixel, "===", Pixel_case_eq, 1); rb_define_method(Class_Pixel, "eql?", Pixel_eql_q, 1); rb_define_method(Class_Pixel, "initialize", Pixel_initialize, -1); rb_define_method(Class_Pixel, "initialize_copy", Pixel_init_copy, 1); rb_define_method(Class_Pixel, "clone", Pixel_clone, 0); rb_define_method(Class_Pixel, "dup", Pixel_dup, 0); rb_define_method(Class_Pixel, "fcmp", Pixel_fcmp, -1); rb_define_method(Class_Pixel, "hash", Pixel_hash, 0); rb_define_method(Class_Pixel, "intensity", Pixel_intensity, 0); rb_define_method(Class_Pixel, "marshal_dump", Pixel_marshal_dump, 0); rb_define_method(Class_Pixel, "marshal_load", Pixel_marshal_load, 1); rb_define_method(Class_Pixel, "to_color", Pixel_to_color, -1); rb_define_method(Class_Pixel, "to_HSL", Pixel_to_HSL, 0); // deprecated rb_define_method(Class_Pixel, "to_hsla", Pixel_to_hsla, 0); rb_define_method(Class_Pixel, "to_s", Pixel_to_s, 0); /*-----------------------------------------------------------------------*/ /* Class Magick::ImageList::Montage methods */ /*-----------------------------------------------------------------------*/ Class_Montage = rb_define_class_under(Class_ImageList, "Montage", rb_cObject); rb_define_alloc_func(Class_Montage, Montage_alloc); rb_define_method(Class_Montage, "initialize", Montage_initialize, 0); rb_define_method(Class_Montage, "freeze", rm_no_freeze, 0); // These accessors supply optional arguments for Magick::ImageList::Montage.new DCL_ATTR_WRITER(Montage, background_color) DCL_ATTR_WRITER(Montage, border_color) DCL_ATTR_WRITER(Montage, border_width) DCL_ATTR_WRITER(Montage, compose) DCL_ATTR_WRITER(Montage, filename) DCL_ATTR_WRITER(Montage, fill) DCL_ATTR_WRITER(Montage, font) DCL_ATTR_WRITER(Montage, frame) DCL_ATTR_WRITER(Montage, geometry) DCL_ATTR_WRITER(Montage, gravity) DCL_ATTR_WRITER(Montage, matte_color) DCL_ATTR_WRITER(Montage, pointsize) DCL_ATTR_WRITER(Montage, shadow) DCL_ATTR_WRITER(Montage, stroke) DCL_ATTR_WRITER(Montage, texture) DCL_ATTR_WRITER(Montage, tile) DCL_ATTR_WRITER(Montage, title) /*-----------------------------------------------------------------------*/ /* Class Magick::Image::Info */ /*-----------------------------------------------------------------------*/ Class_Info = rb_define_class_under(Class_Image, "Info", rb_cObject); rb_define_alloc_func(Class_Info, Info_alloc); rb_define_method(Class_Info, "initialize", Info_initialize, 0); rb_define_method(Class_Info, "channel", Info_channel, -1); rb_define_method(Class_Info, "freeze", rm_no_freeze, 0); rb_define_method(Class_Info, "define", Info_define, -1); rb_define_method(Class_Info, "[]=", Info_aset, -1); rb_define_method(Class_Info, "[]", Info_aref, -1); rb_define_method(Class_Info, "undefine", Info_undefine, 2); DCL_ATTR_ACCESSOR(Info, antialias) DCL_ATTR_ACCESSOR(Info, attenuate) DCL_ATTR_ACCESSOR(Info, authenticate) DCL_ATTR_ACCESSOR(Info, background_color) DCL_ATTR_ACCESSOR(Info, border_color) DCL_ATTR_ACCESSOR(Info, caption) DCL_ATTR_ACCESSOR(Info, colorspace) DCL_ATTR_ACCESSOR(Info, comment) DCL_ATTR_ACCESSOR(Info, compression) DCL_ATTR_ACCESSOR(Info, delay) DCL_ATTR_ACCESSOR(Info, density) DCL_ATTR_ACCESSOR(Info, depth) DCL_ATTR_ACCESSOR(Info, dispose) DCL_ATTR_ACCESSOR(Info, dither) DCL_ATTR_ACCESSOR(Info, endian) DCL_ATTR_ACCESSOR(Info, extract) DCL_ATTR_ACCESSOR(Info, filename) DCL_ATTR_ACCESSOR(Info, fill) DCL_ATTR_ACCESSOR(Info, font) DCL_ATTR_ACCESSOR(Info, format) DCL_ATTR_ACCESSOR(Info, fuzz) DCL_ATTR_ACCESSOR(Info, gravity) DCL_ATTR_ACCESSOR(Info, group) DCL_ATTR_ACCESSOR(Info, image_type) DCL_ATTR_ACCESSOR(Info, interlace) DCL_ATTR_ACCESSOR(Info, label) DCL_ATTR_ACCESSOR(Info, matte_color) DCL_ATTR_WRITER(Info, monitor) DCL_ATTR_ACCESSOR(Info, monochrome) DCL_ATTR_ACCESSOR(Info, number_scenes) DCL_ATTR_ACCESSOR(Info, orientation) DCL_ATTR_ACCESSOR(Info, origin) // new in 6.3.1 DCL_ATTR_ACCESSOR(Info, page) DCL_ATTR_ACCESSOR(Info, pointsize) DCL_ATTR_ACCESSOR(Info, quality) DCL_ATTR_ACCESSOR(Info, sampling_factor) DCL_ATTR_ACCESSOR(Info, scene) DCL_ATTR_ACCESSOR(Info, server_name) DCL_ATTR_ACCESSOR(Info, size) DCL_ATTR_ACCESSOR(Info, stroke) DCL_ATTR_ACCESSOR(Info, stroke_width) DCL_ATTR_WRITER(Info, texture) DCL_ATTR_ACCESSOR(Info, tile_offset) DCL_ATTR_ACCESSOR(Info, transparent_color) DCL_ATTR_ACCESSOR(Info, undercolor) DCL_ATTR_ACCESSOR(Info, units) DCL_ATTR_ACCESSOR(Info, view) /*-----------------------------------------------------------------------*/ /* Class Magick::Image::PolaroidOptions */ /*-----------------------------------------------------------------------*/ Class_PolaroidOptions = rb_define_class_under(Class_Image, "PolaroidOptions", rb_cObject); rb_define_alloc_func(Class_PolaroidOptions, PolaroidOptions_alloc); rb_define_method(Class_PolaroidOptions, "initialize", PolaroidOptions_initialize, 0); DCL_ATTR_WRITER(PolaroidOptions, shadow_color) DCL_ATTR_WRITER(PolaroidOptions, border_color) // The other attribute writer methods are implemented by Draw's functions SHARE_ATTR_WRITER(PolaroidOptions, Draw, align) SHARE_ATTR_WRITER(PolaroidOptions, Draw, decorate) SHARE_ATTR_WRITER(PolaroidOptions, Draw, density) SHARE_ATTR_WRITER(PolaroidOptions, Draw, encoding) SHARE_ATTR_WRITER(PolaroidOptions, Draw, fill) SHARE_ATTR_WRITER(PolaroidOptions, Draw, fill_pattern) SHARE_ATTR_WRITER(PolaroidOptions, Draw, font) SHARE_ATTR_WRITER(PolaroidOptions, Draw, font_family) SHARE_ATTR_WRITER(PolaroidOptions, Draw, font_stretch) SHARE_ATTR_WRITER(PolaroidOptions, Draw, font_style) SHARE_ATTR_WRITER(PolaroidOptions, Draw, font_weight) SHARE_ATTR_WRITER(PolaroidOptions, Draw, gravity) SHARE_ATTR_WRITER(PolaroidOptions, Draw, pointsize) SHARE_ATTR_WRITER(PolaroidOptions, Draw, stroke) SHARE_ATTR_WRITER(PolaroidOptions, Draw, stroke_pattern) SHARE_ATTR_WRITER(PolaroidOptions, Draw, stroke_width) SHARE_ATTR_WRITER(PolaroidOptions, Draw, text_antialias) SHARE_ATTR_WRITER(PolaroidOptions, Draw, undercolor) /*-----------------------------------------------------------------------*/ /* Magick::******Fill classes and methods */ /*-----------------------------------------------------------------------*/ // class Magick::GradientFill Class_GradientFill = rb_define_class_under(Module_Magick, "GradientFill", rb_cObject); rb_define_alloc_func(Class_GradientFill, GradientFill_alloc); rb_define_method(Class_GradientFill, "initialize", GradientFill_initialize, 6); rb_define_method(Class_GradientFill, "fill", GradientFill_fill, 1); // class Magick::TextureFill Class_TextureFill = rb_define_class_under(Module_Magick, "TextureFill", rb_cObject); rb_define_alloc_func(Class_TextureFill, TextureFill_alloc); rb_define_method(Class_TextureFill, "initialize", TextureFill_initialize, 1); rb_define_method(Class_TextureFill, "fill", TextureFill_fill, 1); /*-----------------------------------------------------------------------*/ /* Class Magick::ImageMagickError < StandardError */ /* Class Magick::FatalImageMagickError < StandardError */ /*-----------------------------------------------------------------------*/ Class_ImageMagickError = rb_define_class_under(Module_Magick, "ImageMagickError", rb_eStandardError); rb_define_method(Class_ImageMagickError, "initialize", ImageMagickError_initialize, -1); rb_define_attr(Class_ImageMagickError, MAGICK_LOC, True, False); Class_FatalImageMagickError = rb_define_class_under(Module_Magick, "FatalImageMagickError", rb_eStandardError); /*-----------------------------------------------------------------------*/ /* Class Magick::DestroyedImageError < StandardError */ /*-----------------------------------------------------------------------*/ Class_DestroyedImageError = rb_define_class_under(Module_Magick, "DestroyedImageError", rb_eStandardError); // Miscellaneous fixed-point constants DEF_CONST(MaxRGB); DEF_CONST(QuantumRange); DEF_CONST(QuantumDepth); DEF_CONST(OpaqueOpacity); DEF_CONST(TransparentOpacity); version_constants(); /*-----------------------------------------------------------------------*/ /* Class Magick::Enum */ /*-----------------------------------------------------------------------*/ // includes Comparable Class_Enum = rb_define_class_under(Module_Magick, "Enum", rb_cObject); rb_include_module(Class_Enum, rb_mComparable); rb_define_alloc_func(Class_Enum, Enum_alloc); rb_define_method(Class_Enum, "initialize", Enum_initialize, 2); rb_define_method(Class_Enum, "to_s", Enum_to_s, 0); rb_define_method(Class_Enum, "to_i", Enum_to_i, 0); rb_define_method(Class_Enum, "<=>", Enum_spaceship, 1); rb_define_method(Class_Enum, "===", Enum_case_eq, 1); // AlignType constants DEF_ENUM(AlignType) ENUMERATOR(UndefinedAlign) ENUMERATOR(LeftAlign) ENUMERATOR(CenterAlign) ENUMERATOR(RightAlign) END_ENUM // AlphaChannelType constants DEF_ENUM(AlphaChannelType) ENUMERATOR(UndefinedAlphaChannel) ENUMERATOR(ActivateAlphaChannel) ENUMERATOR(DeactivateAlphaChannel) ENUMERATOR(ResetAlphaChannel) /* deprecated */ ENUMERATOR(SetAlphaChannel) #if defined(HAVE_ENUM_COPYALPHACHANNEL) ENUMERATOR(CopyAlphaChannel) ENUMERATOR(ExtractAlphaChannel) ENUMERATOR(OpaqueAlphaChannel) ENUMERATOR(ShapeAlphaChannel) ENUMERATOR(TransparentAlphaChannel) #endif #if defined(HAVE_ENUM_BACKGROUNDALPHACHANNEL) ENUMERATOR(BackgroundAlphaChannel) #endif END_ENUM // AnchorType constants (for Draw#text_anchor - these are not defined by ImageMagick) DEF_ENUM(AnchorType) ENUMERATOR(StartAnchor) ENUMERATOR(MiddleAnchor) ENUMERATOR(EndAnchor) END_ENUM // ChannelType constants DEF_ENUM(ChannelType) ENUMERATOR(UndefinedChannel) ENUMERATOR(RedChannel) ENUMERATOR(CyanChannel) ENUMERATOR(GreenChannel) ENUMERATOR(MagentaChannel) ENUMERATOR(BlueChannel) ENUMERATOR(YellowChannel) ENUMERATOR(OpacityChannel) ENUMERATOR(BlackChannel) ENUMERATOR(MatteChannel) ENUMERATOR(IndexChannel) ENUMERATOR(GrayChannel) ENUMERATOR(AllChannels) // Define alternate names for ChannelType enums for Image::Info#channel= // AlphaChannel == OpacityChannel _enum = rm_enum_new(Class_ChannelType, ID2SYM(rb_intern("AlphaChannel")), INT2FIX(OpacityChannel)); rb_define_const(Module_Magick, "AlphaChannel", _enum); // DefaultChannels _enum = rm_enum_new(Class_ChannelType, ID2SYM(rb_intern("DefaultChannels")), INT2FIX(0xff & ~OpacityChannel)); rb_define_const(Module_Magick, "DefaultChannels", _enum); // HueChannel == RedChannel _enum = rm_enum_new(Class_ChannelType, ID2SYM(rb_intern("HueChannel")), INT2FIX(RedChannel)); rb_define_const(Module_Magick, "HueChannel", _enum); // LuminosityChannel = BlueChannel _enum = rm_enum_new(Class_ChannelType, ID2SYM(rb_intern("LuminosityChannel")), INT2FIX(BlueChannel)); rb_define_const(Module_Magick, "LuminosityChannel", _enum); // SaturationChannel = GreenChannel _enum = rm_enum_new(Class_ChannelType, ID2SYM(rb_intern("SaturationChannel")), INT2FIX(GreenChannel)); rb_define_const(Module_Magick, "SaturationChannel", _enum); END_ENUM // ClassType constants DEF_ENUM(ClassType) ENUMERATOR(UndefinedClass) ENUMERATOR(PseudoClass) ENUMERATOR(DirectClass) END_ENUM // ColorspaceType constants DEF_ENUM(ColorspaceType) ENUMERATOR(UndefinedColorspace) ENUMERATOR(RGBColorspace) ENUMERATOR(GRAYColorspace) ENUMERATOR(TransparentColorspace) ENUMERATOR(OHTAColorspace) ENUMERATOR(XYZColorspace) ENUMERATOR(YCbCrColorspace) ENUMERATOR(YCCColorspace) ENUMERATOR(YIQColorspace) ENUMERATOR(YPbPrColorspace) ENUMERATOR(YUVColorspace) ENUMERATOR(CMYKColorspace) rb_define_const(Module_Magick, "SRGBColorspace" , rm_enum_new(Class_ColorspaceType , ID2SYM(rb_intern("SRGBColorspace")) , INT2FIX(sRGBColorspace))); ENUMERATOR(HSLColorspace) ENUMERATOR(HWBColorspace) ENUMERATOR(HSBColorspace) ENUMERATOR(LABColorspace) ENUMERATOR(Rec601LumaColorspace) ENUMERATOR(Rec601YCbCrColorspace) ENUMERATOR(Rec709LumaColorspace) ENUMERATOR(Rec709YCbCrColorspace) ENUMERATOR(LogColorspace) ENUMERATOR(CMYColorspace) END_ENUM // ComplianceType constants are defined as enums but used as bit flags DEF_ENUM(ComplianceType) ENUMERATOR(UndefinedCompliance) // AllCompliance is 0xffff, not too useful for us! rb_define_const(Module_Magick, "AllCompliance" , rm_enum_new(Class_ComplianceType , ID2SYM(rb_intern("AllCompliance")) , INT2FIX(SVGCompliance|X11Compliance|XPMCompliance))); ENUMERATOR(NoCompliance) ENUMERATOR(SVGCompliance) ENUMERATOR(X11Compliance) ENUMERATOR(XPMCompliance) END_ENUM // CompositeOperator constants DEF_ENUM(CompositeOperator) ENUMERATOR(UndefinedCompositeOp) ENUMERATOR(NoCompositeOp) ENUMERATOR(AddCompositeOp) ENUMERATOR(AtopCompositeOp) ENUMERATOR(BlendCompositeOp) #if defined(HAVE_ENUM_BLURCOMPOSITEOP) ENUMERATOR(BlurCompositeOp) #endif ENUMERATOR(BumpmapCompositeOp) ENUMERATOR(ChangeMaskCompositeOp) ENUMERATOR(ClearCompositeOp) ENUMERATOR(ColorBurnCompositeOp) ENUMERATOR(ColorDodgeCompositeOp) ENUMERATOR(ColorizeCompositeOp) ENUMERATOR(CopyBlackCompositeOp) ENUMERATOR(CopyBlueCompositeOp) ENUMERATOR(CopyCompositeOp) ENUMERATOR(CopyCyanCompositeOp) ENUMERATOR(CopyGreenCompositeOp) ENUMERATOR(CopyMagentaCompositeOp) ENUMERATOR(CopyOpacityCompositeOp) ENUMERATOR(CopyRedCompositeOp) ENUMERATOR(CopyYellowCompositeOp) ENUMERATOR(DarkenCompositeOp) #if defined(HAVE_ENUM_DISTORTCOMPOSITEOP) ENUMERATOR(DistortCompositeOp) #endif ENUMERATOR(DivideCompositeOp) ENUMERATOR(DstAtopCompositeOp) ENUMERATOR(DstCompositeOp) ENUMERATOR(DstInCompositeOp) ENUMERATOR(DstOutCompositeOp) ENUMERATOR(DstOverCompositeOp) ENUMERATOR(DifferenceCompositeOp) ENUMERATOR(DisplaceCompositeOp) ENUMERATOR(DissolveCompositeOp) ENUMERATOR(ExclusionCompositeOp) ENUMERATOR(HardLightCompositeOp) ENUMERATOR(HueCompositeOp) ENUMERATOR(InCompositeOp) ENUMERATOR(LightenCompositeOp) #if defined(HAVE_ENUM_LINEARBURNCOMPOSITEOP) ENUMERATOR(LinearBurnCompositeOp) #endif #if defined(HAVE_ENUM_LINEARDODGECOMPOSITEOP) ENUMERATOR(LinearDodgeCompositeOp) #endif ENUMERATOR(LinearLightCompositeOp) ENUMERATOR(LuminizeCompositeOp) ENUMERATOR(MinusCompositeOp) ENUMERATOR(ModulateCompositeOp) ENUMERATOR(MultiplyCompositeOp) ENUMERATOR(OutCompositeOp) ENUMERATOR(OverCompositeOp) ENUMERATOR(OverlayCompositeOp) #if defined(HAVE_ENUM_PEGTOPLIGHTCOMPOSITEOP) ENUMERATOR(PegtopLightCompositeOp) #endif #if defined(HAVE_ENUM_PINLIGHTCOMPOSITEOP) ENUMERATOR(PinLightCompositeOp) #endif ENUMERATOR(PlusCompositeOp) ENUMERATOR(ReplaceCompositeOp) // synonym for CopyCompositeOp ENUMERATOR(SaturateCompositeOp) ENUMERATOR(ScreenCompositeOp) ENUMERATOR(SoftLightCompositeOp) ENUMERATOR(SrcAtopCompositeOp) ENUMERATOR(SrcCompositeOp) ENUMERATOR(SrcInCompositeOp) ENUMERATOR(SrcOutCompositeOp) ENUMERATOR(SrcOverCompositeOp) ENUMERATOR(SubtractCompositeOp) ENUMERATOR(ThresholdCompositeOp) #if defined(HAVE_ENUM_VIVIDLIGHTCOMPOSITEOP) ENUMERATOR(VividLightCompositeOp) #endif ENUMERATOR(XorCompositeOp) END_ENUM // CompressionType constants DEF_ENUM(CompressionType) ENUMERATOR(UndefinedCompression) ENUMERATOR(NoCompression) #if defined(HAVE_ENUM_B44COMPRESSION) ENUMERATOR(B44Compression) #endif #if defined(HAVE_ENUM_B44ACOMPRESSION) ENUMERATOR(B44ACompression) #endif ENUMERATOR(BZipCompression) #if defined(HAVE_ENUM_DXT1COMPRESSION) ENUMERATOR(DXT1Compression) #endif #if defined(HAVE_ENUM_DXT3COMPRESSION) ENUMERATOR(DXT3Compression) #endif #if defined(HAVE_ENUM_DXT5COMPRESSION) ENUMERATOR(DXT5Compression) #endif ENUMERATOR(FaxCompression) ENUMERATOR(Group4Compression) ENUMERATOR(JPEGCompression) ENUMERATOR(JPEG2000Compression) ENUMERATOR(LosslessJPEGCompression) ENUMERATOR(LZWCompression) #if defined(HAVE_ENUM_PIZCOMPRESSION) ENUMERATOR(PizCompression) #endif #if defined(HAVE_ENUM_PXR24COMPRESSION) ENUMERATOR(Pxr24Compression) #endif ENUMERATOR(RLECompression) ENUMERATOR(ZipCompression) #if defined(HAVE_ENUM_ZIPSCOMPRESSION) ENUMERATOR(ZipSCompression) #endif END_ENUM // DecorationType constants DEF_ENUM(DecorationType) ENUMERATOR(NoDecoration) ENUMERATOR(UnderlineDecoration) ENUMERATOR(OverlineDecoration) ENUMERATOR(LineThroughDecoration) END_ENUM // DisposeType constants DEF_ENUM(DisposeType) ENUMERATOR(UndefinedDispose) ENUMERATOR(BackgroundDispose) ENUMERATOR(NoneDispose) ENUMERATOR(PreviousDispose) END_ENUM // DistortImage "method" argument values DEF_ENUM(DistortImageMethod) ENUMERATOR(UndefinedDistortion) ENUMERATOR(AffineDistortion) ENUMERATOR(AffineProjectionDistortion) ENUMERATOR(ArcDistortion) #if defined(HAVE_ENUM_POLARDISTORTION) ENUMERATOR(PolarDistortion) #endif #if defined(HAVE_ENUM_DEPOLARDISTORTION) ENUMERATOR(DePolarDistortion) #endif #if defined(HAVE_ENUM_BARRELDISTORTION) ENUMERATOR(BarrelDistortion) #endif ENUMERATOR(BilinearDistortion) #if defined(HAVE_ENUM_BILINEARFORWARDDISTORTION) ENUMERATOR(BilinearForwardDistortion) #endif #if defined(HAVE_ENUM_BILINEARREVERSEDISTORTION) ENUMERATOR(BilinearReverseDistortion) #endif ENUMERATOR(PerspectiveDistortion) ENUMERATOR(PerspectiveProjectionDistortion) #if defined(HAVE_ENUM_POLYNOMIALDISTORTION) ENUMERATOR(PolynomialDistortion) #endif ENUMERATOR(ScaleRotateTranslateDistortion) #if defined(HAVE_ENUM_SHEPARDSDISTORTION) ENUMERATOR(ShepardsDistortion) #endif #if defined(HAVE_ENUM_BARRELINVERSEDISTORTION) ENUMERATOR(BarrelInverseDistortion) #endif END_ENUM #if defined(HAVE_TYPE_DITHERMETHOD) DEF_ENUM(DitherMethod) ENUMERATOR(UndefinedDitherMethod) #if defined(HAVE_ENUM_NODITHERMETHOD) ENUMERATOR(NoDitherMethod) #endif ENUMERATOR(RiemersmaDitherMethod) ENUMERATOR(FloydSteinbergDitherMethod) END_ENUM #endif DEF_ENUM(EndianType) ENUMERATOR(UndefinedEndian) ENUMERATOR(LSBEndian) ENUMERATOR(MSBEndian) END_ENUM // FilterTypes constants DEF_ENUM(FilterTypes) ENUMERATOR(UndefinedFilter) ENUMERATOR(PointFilter) ENUMERATOR(BoxFilter) ENUMERATOR(TriangleFilter) ENUMERATOR(HermiteFilter) ENUMERATOR(HanningFilter) ENUMERATOR(HammingFilter) ENUMERATOR(BlackmanFilter) ENUMERATOR(GaussianFilter) ENUMERATOR(QuadraticFilter) ENUMERATOR(CubicFilter) ENUMERATOR(CatromFilter) ENUMERATOR(MitchellFilter) ENUMERATOR(LanczosFilter) ENUMERATOR(BesselFilter) ENUMERATOR(SincFilter) #if defined(HAVE_ENUM_KAISERFILTER) ENUMERATOR(KaiserFilter) #endif #if defined(HAVE_ENUM_WELSHFILTER) ENUMERATOR(WelshFilter) #endif #if defined(HAVE_ENUM_PARZENFILTER) ENUMERATOR(ParzenFilter) #endif #if defined(HAVE_ENUM_LAGRANGEFILTER) ENUMERATOR(LagrangeFilter) #endif #if defined(HAVE_ENUM_BOHMANFILTER) ENUMERATOR(BohmanFilter) #endif #if defined(HAVE_ENUM_BARTLETTFILTER) ENUMERATOR(BartlettFilter) #endif END_ENUM // GravityType constants DEF_ENUM(GravityType) ENUMERATOR(UndefinedGravity) ENUMERATOR(ForgetGravity) ENUMERATOR(NorthWestGravity) ENUMERATOR(NorthGravity) ENUMERATOR(NorthEastGravity) ENUMERATOR(WestGravity) ENUMERATOR(CenterGravity) ENUMERATOR(EastGravity) ENUMERATOR(SouthWestGravity) ENUMERATOR(SouthGravity) ENUMERATOR(SouthEastGravity) ENUMERATOR(StaticGravity) END_ENUM // ImageType constants DEF_ENUM(ImageType) ENUMERATOR(UndefinedType) ENUMERATOR(BilevelType) ENUMERATOR(GrayscaleType) ENUMERATOR(GrayscaleMatteType) ENUMERATOR(PaletteType) ENUMERATOR(PaletteMatteType) ENUMERATOR(TrueColorType) ENUMERATOR(TrueColorMatteType) ENUMERATOR(ColorSeparationType) ENUMERATOR(ColorSeparationMatteType) ENUMERATOR(OptimizeType) ENUMERATOR(PaletteBilevelMatteType) END_ENUM // InterlaceType constants DEF_ENUM(InterlaceType) ENUMERATOR(UndefinedInterlace) ENUMERATOR(NoInterlace) ENUMERATOR(LineInterlace) ENUMERATOR(PlaneInterlace) ENUMERATOR(PartitionInterlace) ENUMERATOR(GIFInterlace) ENUMERATOR(JPEGInterlace) ENUMERATOR(PNGInterlace) END_ENUM DEF_ENUM(InterpolatePixelMethod) ENUMERATOR(UndefinedInterpolatePixel) ENUMERATOR(AverageInterpolatePixel) ENUMERATOR(BicubicInterpolatePixel) ENUMERATOR(BilinearInterpolatePixel) ENUMERATOR(FilterInterpolatePixel) ENUMERATOR(IntegerInterpolatePixel) ENUMERATOR(MeshInterpolatePixel) ENUMERATOR(NearestNeighborInterpolatePixel) #if defined(HAVE_SPLINEINTERPOLATEPIXEL) ENUMERATOR(SplineInterpolatePixel) #endif END_ENUM #if defined(HAVE_TYPE_MAGICKFUNCTION) DEF_ENUM(MagickFunction) ENUMERATOR(UndefinedFunction) ENUMERATOR(PolynomialFunction) ENUMERATOR(SinusoidFunction) #if defined(HAVE_ENUM_ARCSINFUNCTION) ENUMERATOR(ArcsinFunction) #endif #if defined(HAVE_ENUM_ARCTANFUNCTION) ENUMERATOR(ArctanFunction) #endif END_ENUM #endif #if defined(HAVE_TYPE_IMAGELAYERMETHOD) DEF_ENUM(ImageLayerMethod) #else DEF_ENUM(MagickLayerMethod) #endif ENUMERATOR(UndefinedLayer) ENUMERATOR(CompareAnyLayer) ENUMERATOR(CompareClearLayer) ENUMERATOR(CompareOverlayLayer) ENUMERATOR(OptimizeLayer) ENUMERATOR(OptimizePlusLayer) ENUMERATOR(CoalesceLayer) ENUMERATOR(DisposeLayer) ENUMERATOR(OptimizeTransLayer) #if defined(HAVE_ENUM_OPTIMIZEIMAGELAYER) ENUMERATOR(OptimizeImageLayer) #endif ENUMERATOR(RemoveDupsLayer) ENUMERATOR(RemoveZeroLayer) ENUMERATOR(CompositeLayer) #if defined(HAVE_ENUM_MERGELAYER) ENUMERATOR(MergeLayer) #endif #if defined(HAVE_ENUM_MOSAICLAYER) ENUMERATOR(MosaicLayer) #endif #if defined(HAVE_ENUM_FLATTENLAYER) ENUMERATOR(FlattenLayer) #endif #if defined(HAVE_ENUM_TRIMBOUNDSLAYER) ENUMERATOR(TrimBoundsLayer) #endif END_ENUM DEF_ENUM(MetricType) ENUMERATOR(UndefinedMetric) ENUMERATOR(AbsoluteErrorMetric) ENUMERATOR(MeanAbsoluteErrorMetric) ENUMERATOR(MeanErrorPerPixelMetric) ENUMERATOR(MeanSquaredErrorMetric) ENUMERATOR(PeakAbsoluteErrorMetric) ENUMERATOR(PeakSignalToNoiseRatioMetric) ENUMERATOR(RootMeanSquaredErrorMetric) END_ENUM // NoiseType constants DEF_ENUM(NoiseType) ENUMERATOR(UniformNoise) ENUMERATOR(GaussianNoise) ENUMERATOR(MultiplicativeGaussianNoise) ENUMERATOR(ImpulseNoise) ENUMERATOR(LaplacianNoise) ENUMERATOR(PoissonNoise) ENUMERATOR(RandomNoise) END_ENUM // Orientation constants DEF_ENUM(OrientationType) ENUMERATOR(UndefinedOrientation) ENUMERATOR(TopLeftOrientation) ENUMERATOR(TopRightOrientation) ENUMERATOR(BottomRightOrientation) ENUMERATOR(BottomLeftOrientation) ENUMERATOR(LeftTopOrientation) ENUMERATOR(RightTopOrientation) ENUMERATOR(RightBottomOrientation) ENUMERATOR(LeftBottomOrientation) END_ENUM // Paint method constants DEF_ENUM(PaintMethod) ENUMERATOR(PointMethod) ENUMERATOR(ReplaceMethod) ENUMERATOR(FloodfillMethod) ENUMERATOR(FillToBorderMethod) ENUMERATOR(ResetMethod) END_ENUM // PreviewType DEF_ENUM(PreviewType) ENUMERATOR(UndefinedPreview) ENUMERATOR(RotatePreview) ENUMERATOR(ShearPreview) ENUMERATOR(RollPreview) ENUMERATOR(HuePreview) ENUMERATOR(SaturationPreview) ENUMERATOR(BrightnessPreview) ENUMERATOR(GammaPreview) ENUMERATOR(SpiffPreview) ENUMERATOR(DullPreview) ENUMERATOR(GrayscalePreview) ENUMERATOR(QuantizePreview) ENUMERATOR(DespecklePreview) ENUMERATOR(ReduceNoisePreview) ENUMERATOR(AddNoisePreview) ENUMERATOR(SharpenPreview) ENUMERATOR(BlurPreview) ENUMERATOR(ThresholdPreview) ENUMERATOR(EdgeDetectPreview) ENUMERATOR(SpreadPreview) ENUMERATOR(SolarizePreview) ENUMERATOR(ShadePreview) ENUMERATOR(RaisePreview) ENUMERATOR(SegmentPreview) ENUMERATOR(SwirlPreview) ENUMERATOR(ImplodePreview) ENUMERATOR(WavePreview) ENUMERATOR(OilPaintPreview) ENUMERATOR(CharcoalDrawingPreview) ENUMERATOR(JPEGPreview) END_ENUM DEF_ENUM(QuantumExpressionOperator) ENUMERATOR(UndefinedQuantumOperator) ENUMERATOR(AddQuantumOperator) ENUMERATOR(AndQuantumOperator) ENUMERATOR(DivideQuantumOperator) ENUMERATOR(LShiftQuantumOperator) ENUMERATOR(MaxQuantumOperator) ENUMERATOR(MinQuantumOperator) ENUMERATOR(MultiplyQuantumOperator) ENUMERATOR(OrQuantumOperator) ENUMERATOR(RShiftQuantumOperator) ENUMERATOR(SubtractQuantumOperator) ENUMERATOR(XorQuantumOperator) #if defined(HAVE_ENUM_POWEVALUATEOPERATOR) ENUMERATOR(PowQuantumOperator) #endif #if defined(HAVE_ENUM_LOGEVALUATEOPERATOR) ENUMERATOR(LogQuantumOperator) #endif #if defined(HAVE_ENUM_THRESHOLDEVALUATEOPERATOR) ENUMERATOR(ThresholdQuantumOperator) #endif #if defined(HAVE_ENUM_THRESHOLDBLACKEVALUATEOPERATOR) ENUMERATOR(ThresholdBlackQuantumOperator) #endif #if defined(HAVE_ENUM_THRESHOLDWHITEEVALUATEOPERATOR) ENUMERATOR(ThresholdWhiteQuantumOperator) #endif #if defined(HAVE_ENUM_GAUSSIANNOISEEVALUATEOPERATOR) ENUMERATOR(GaussianNoiseQuantumOperator) #endif #if defined(HAVE_ENUM_IMPULSENOISEEVALUATEOPERATOR) ENUMERATOR(ImpulseNoiseQuantumOperator) #endif #if defined(HAVE_ENUM_LAPLACIANNOISEEVALUATEOPERATOR) ENUMERATOR(LaplacianNoiseQuantumOperator) #endif #if defined(HAVE_ENUM_MULTIPLICATIVENOISEEVALUATEOPERATOR) ENUMERATOR(MultiplicativeNoiseQuantumOperator) #endif #if defined(HAVE_ENUM_POISSONNOISEEVALUATEOPERATOR) ENUMERATOR(PoissonNoiseQuantumOperator) #endif #if defined(HAVE_ENUM_UNIFORMNOISEEVALUATEOPERATOR) ENUMERATOR(UniformNoiseQuantumOperator) #endif #if defined(HAVE_ENUM_COSINEEVALUATEOPERATOR) ENUMERATOR(CosineQuantumOperator) #endif #if defined(HAVE_ENUM_SINEEVALUATEOPERATOR) ENUMERATOR(SineQuantumOperator) #endif #if defined(HAVE_ENUM_ADDMODULUSEVALUATEOPERATOR) ENUMERATOR(AddModulusQuantumOperator) #endif END_ENUM // RenderingIntent DEF_ENUM(RenderingIntent) ENUMERATOR(UndefinedIntent) ENUMERATOR(SaturationIntent) ENUMERATOR(PerceptualIntent) ENUMERATOR(AbsoluteIntent) ENUMERATOR(RelativeIntent) END_ENUM // ResolutionType constants DEF_ENUM(ResolutionType) ENUMERATOR(UndefinedResolution) ENUMERATOR(PixelsPerInchResolution) ENUMERATOR(PixelsPerCentimeterResolution) END_ENUM #if defined(HAVE_SPARSECOLORIMAGE) DEF_ENUM(SparseColorMethod) ENUMERATOR(UndefinedColorInterpolate) ENUMERATOR(BarycentricColorInterpolate) ENUMERATOR(BilinearColorInterpolate) //ENUMERATOR(PolynomialColorInterpolate) ENUMERATOR(ShepardsColorInterpolate) ENUMERATOR(VoronoiColorInterpolate) END_ENUM #endif // SpreadMethod DEF_ENUM(SpreadMethod) ENUMERATOR(UndefinedSpread) ENUMERATOR(PadSpread) ENUMERATOR(ReflectSpread) ENUMERATOR(RepeatSpread) END_ENUM // StorageType DEF_ENUM(StorageType) ENUMERATOR(UndefinedPixel) ENUMERATOR(CharPixel) ENUMERATOR(DoublePixel) ENUMERATOR(FloatPixel) ENUMERATOR(IntegerPixel) ENUMERATOR(LongPixel) ENUMERATOR(QuantumPixel) ENUMERATOR(ShortPixel) END_ENUM // StretchType constants DEF_ENUM(StretchType) ENUMERATOR(NormalStretch) ENUMERATOR(UltraCondensedStretch) ENUMERATOR(ExtraCondensedStretch) ENUMERATOR(CondensedStretch) ENUMERATOR(SemiCondensedStretch) ENUMERATOR(SemiExpandedStretch) ENUMERATOR(ExpandedStretch) ENUMERATOR(ExtraExpandedStretch) ENUMERATOR(UltraExpandedStretch) ENUMERATOR(AnyStretch) END_ENUM // StyleType constants DEF_ENUM(StyleType) ENUMERATOR(NormalStyle) ENUMERATOR(ItalicStyle) ENUMERATOR(ObliqueStyle) ENUMERATOR(AnyStyle) END_ENUM // VirtualPixelMethod DEF_ENUM(VirtualPixelMethod) ENUMERATOR(UndefinedVirtualPixelMethod) ENUMERATOR(EdgeVirtualPixelMethod) ENUMERATOR(MirrorVirtualPixelMethod) ENUMERATOR(TileVirtualPixelMethod) ENUMERATOR(TransparentVirtualPixelMethod) ENUMERATOR(BackgroundVirtualPixelMethod) ENUMERATOR(DitherVirtualPixelMethod) ENUMERATOR(RandomVirtualPixelMethod) ENUMERATOR(ConstantVirtualPixelMethod) ENUMERATOR(MaskVirtualPixelMethod) ENUMERATOR(BlackVirtualPixelMethod) ENUMERATOR(GrayVirtualPixelMethod) ENUMERATOR(WhiteVirtualPixelMethod) #if defined(HAVE_ENUM_HORIZONTALTILEVIRTUALPIXELMETHOD) ENUMERATOR(HorizontalTileVirtualPixelMethod) #endif #if defined(HAVE_ENUM_VERTICALTILEVIRTUALPIXELMETHOD) ENUMERATOR(VerticalTileVirtualPixelMethod) #endif #if defined(HAVE_ENUM_HORIZONTALTILEEDGEVIRTUALPIXELMETHOD) ENUMERATOR(HorizontalTileEdgeVirtualPixelMethod) #endif #if defined(HAVE_ENUM_VERTICALTILEEDGEVIRTUALPIXELMETHOD) ENUMERATOR(VerticalTileEdgeVirtualPixelMethod) #endif #if defined(HAVE_ENUM_CHECKERTILEVIRTUALPIXELMETHOD) ENUMERATOR(CheckerTileVirtualPixelMethod) #endif END_ENUM // WeightType constants DEF_ENUM(WeightType) ENUMERATOR(AnyWeight) ENUMERATOR(NormalWeight) ENUMERATOR(BoldWeight) ENUMERATOR(BolderWeight) ENUMERATOR(LighterWeight) END_ENUM /*-----------------------------------------------------------------------*/ /* Struct classes */ /*-----------------------------------------------------------------------*/ // Pass NULL as the structure name to keep them from polluting the Struct // namespace. The only way to use these classes is via the Magick:: namespace. // Magick::AffineMatrix Class_AffineMatrix = rb_struct_define(NULL, "sx", "rx", "ry", "sy", "tx", "ty", NULL); rb_define_const(Module_Magick, "AffineMatrix", Class_AffineMatrix); // Magick::Primary Class_Primary = rb_struct_define(NULL, "x", "y", "z", NULL); rb_define_method(Class_Primary, "to_s", PrimaryInfo_to_s, 0); rb_define_const(Module_Magick, "Primary", Class_Primary); // Magick::Chromaticity Class_Chromaticity = rb_struct_define(NULL , "red_primary" , "green_primary" , "blue_primary" , "white_point" , NULL); rb_define_method(Class_Chromaticity, "to_s", ChromaticityInfo_to_s, 0); rb_define_const(Module_Magick, "Chromaticity", Class_Chromaticity); // Magick::Color Class_Color = rb_struct_define(NULL, "name", "compliance", "color", NULL); rb_define_method(Class_Color, "to_s", Color_to_s, 0); rb_define_const(Module_Magick, "Color", Class_Color); // Magick::Point Class_Point = rb_struct_define(NULL, "x", "y", NULL); rb_define_const(Module_Magick, "Point", Class_Point); // Magick::Rectangle Class_Rectangle = rb_struct_define(NULL, "width", "height", "x", "y", NULL); rb_define_method(Class_Rectangle, "to_s", RectangleInfo_to_s, 0); rb_define_const(Module_Magick, "Rectangle", Class_Rectangle); // Magick::Segment Class_Segment = rb_struct_define(NULL, "x1", "y1", "x2", "y2", NULL); rb_define_method(Class_Segment, "to_s", SegmentInfo_to_s, 0); rb_define_const(Module_Magick, "Segment", Class_Segment); // Magick::Font Class_Font = rb_struct_define(NULL, "name", "description", "family", "style", "stretch", "weight", "encoding", "foundry", "format", NULL); rb_define_method(Class_Font, "to_s", Font_to_s, 0); rb_define_const(Module_Magick, "Font", Class_Font); // Magick::TypeMetric Class_TypeMetric = rb_struct_define(NULL, "pixels_per_em", "ascent", "descent", "width", "height", "max_advance", "bounds", "underline_position", "underline_thickness", NULL); rb_define_method(Class_TypeMetric, "to_s", TypeMetric_to_s, 0); rb_define_const(Module_Magick, "TypeMetric", Class_TypeMetric); /*-----------------------------------------------------------------------*/ /* Error handlers */ /*-----------------------------------------------------------------------*/ SetFatalErrorHandler(rm_fatal_error_handler); SetErrorHandler(rm_error_handler); SetWarningHandler(rm_warning_handler); } /** * Ensure the version of ImageMagick we're running with matches the version we * were compiled with. * * No Ruby usage (internal function) * * Notes: * - Bypass the test by defining the constant RMAGICK_BYPASS_VERSION_TEST to * 'true' at the top level, before requiring 'RMagick' */ static void test_Magick_version(void) { unsigned long version_number; const char *version_str; int x, n; ID bypass = rb_intern("RMAGICK_BYPASS_VERSION_TEST"); if (RTEST(rb_const_defined(rb_cObject, bypass)) && RTEST(rb_const_get(rb_cObject, bypass))) { return; } version_str = GetMagickVersion(&version_number); if (version_number != MagickLibVersion) { // Extract the string "ImageMagick X.Y.Z" n = 0; for (x = 0; version_str[x] != '\0'; x++) { if (version_str[x] == ' ' && ++n == 2) { break; } } rb_raise(rb_eRuntimeError, "This installation of RMagick was configured with %s %s but %.*s is in use.\n" , MagickPackageName, MagickLibVersionText, x, version_str); } } /** * Create Version, Magick_version, and Version_long constants. * * No Ruby usage (internal function) */ static void version_constants(void) { const char *mgk_version; volatile VALUE str; char long_version[1000]; mgk_version = GetMagickVersion(NULL); str = rb_str_new2(mgk_version); rb_obj_freeze(str); rb_define_const(Module_Magick, "Magick_version", str); str = rb_str_new2(Q(RMAGICK_VERSION_STRING)); rb_obj_freeze(str); rb_define_const(Module_Magick, "Version", str); sprintf(long_version, "This is %s ($Date: 2009/12/20 02:33:33 $) Copyright (C) 2009 by Timothy P. Hunter\n" "Built with %s\n" "Built for %s\n" "Web page: http://rmagick.rubyforge.org\n" "Email: rmagick@rubyforge.org\n", Q(RMAGICK_VERSION_STRING), mgk_version, Q(RUBY_VERSION_STRING)); str = rb_str_new2(long_version); rb_obj_freeze(str); rb_define_const(Module_Magick, "Long_version", str); } rmagick-2.13.2/ext/RMagick/rmenum.c0000644000004100000410000007145012147515547017052 0ustar www-datawww-data/**************************************************************************//** * Enumeration methods. * * Copyright © 2002 - 2009 by Timothy P. Hunter * * Changes since Nov. 2009 copyright © by Benjamin Thomas and Omer Bar-or * * @file rmenum.c * @version $Id: rmenum.c,v 1.9 2009/12/20 02:33:33 baror Exp $ * @author Tim Hunter ******************************************************************************/ #include "rmagick.h" #define ENUMERATORS_CLASS_VAR "@@enumerators" static VALUE Enum_type_values(VALUE); static VALUE Enum_type_inspect(VALUE); /** * Set up a subclass of Enum. * * No Ruby usage (internal function) * * @param tag the name of the subclass * @return the subclass */ VALUE rm_define_enum_type(const char *tag) { VALUE class; class = rb_define_class_under(Module_Magick, tag, Class_Enum);\ rb_define_singleton_method(class, "values", Enum_type_values, 0); rb_define_method(class, "initialize", Enum_type_initialize, 2); rb_define_method(class, "inspect", Enum_type_inspect, 0); return class; } /** * Construct a new Enum subclass instance. * * No Ruby usage (internal function) * * @param class the subclass * @param sym the symbol * @param val the value for the symbol * @return a new instance of class */ VALUE rm_enum_new(VALUE class, VALUE sym, VALUE val) { VALUE argv[2]; argv[0] = sym; argv[1] = val; return rb_obj_freeze(rb_class_new_instance(2, argv, class)); } /** * Enum class alloc function. * * No Ruby usage (internal function) * * @param class the Ruby class to use * @return a new enumerator */ VALUE Enum_alloc(VALUE class) { MagickEnum *magick_enum; volatile VALUE enumr; enumr = Data_Make_Struct(class, MagickEnum, NULL, NULL, magick_enum); rb_obj_freeze(enumr); return enumr; } /** * "Case equal" operator for Enum. * * Ruby usage: * - @verbatim Enum#=== @endverbatim * * Notes: * - Yes, I know "case equal" is a misnomer. * * @param self this object * @param other the other object * @return true or false */ VALUE Enum_case_eq(VALUE self, VALUE other) { MagickEnum *this, *that; if (CLASS_OF(self) == CLASS_OF(other)) { Data_Get_Struct(self, MagickEnum, this); Data_Get_Struct(other, MagickEnum, that); return this->val == that->val ? Qtrue : Qfalse; } return Qfalse; } /** * Initialize a new Enum instance. * * Ruby usage: * - @verbatim Enum#initialize(sym,val) @endverbatim * * @param self this object * @param sym the symbol * @param val the value for the symbol * @return self */ VALUE Enum_initialize(VALUE self, VALUE sym, VALUE val) { MagickEnum *magick_enum; Data_Get_Struct(self, MagickEnum, magick_enum); magick_enum->id = rb_to_id(sym); /* convert symbol to ID */ magick_enum->val = NUM2INT(val); return self; } /** * Return the value of an enum. * * Ruby usage: * - @verbatim Enum#to_i @endverbatim * * @param self this object * @return this object's value */ VALUE Enum_to_i(VALUE self) { MagickEnum *magick_enum; Data_Get_Struct(self, MagickEnum, magick_enum); return INT2NUM(magick_enum->val); } /** * Support Comparable module in Enum. * * Ruby usage: * - @verbatim Enum#<=> @endverbatim * * Notes: * - Enums must be instances of the same class to be equal. * * @param self this object * @param other the other object * @return -1, 0, 1, or nil */ VALUE Enum_spaceship(VALUE self, VALUE other) { MagickEnum *this, *that; Data_Get_Struct(self, MagickEnum, this); Data_Get_Struct(other, MagickEnum, that); if (this->val > that->val) { return INT2FIX(1); } else if (this->val < that->val) { return INT2FIX(-1); } // Values are equal, check class. return rb_funcall(CLASS_OF(self), rm_ID_spaceship, 1, CLASS_OF(other)); } /** * Return the name of an enum. * * Ruby usage: * - @verbatim Enum#to_s @endverbatim * * @param self this object * @return the name */ VALUE Enum_to_s(VALUE self) { MagickEnum *magick_enum; Data_Get_Struct(self, MagickEnum, magick_enum); return rb_str_new2(rb_id2name(magick_enum->id)); } /** * Initialize method for all Enum subclasses. * * Ruby usage: * - @verbatim xxx#initialize(sym,val) @endverbatim * * @param self this object * @param sym the symbol * @param val the value of the symbol * @return self */ VALUE Enum_type_initialize(VALUE self, VALUE sym, VALUE val) { VALUE super_argv[2]; volatile VALUE enumerators; super_argv[0] = sym; super_argv[1] = val; (void) rb_call_super(2, (const VALUE *)super_argv); if (rb_cvar_defined(CLASS_OF(self), rb_intern(ENUMERATORS_CLASS_VAR)) != Qtrue) { rb_cv_set(CLASS_OF(self), ENUMERATORS_CLASS_VAR, rb_ary_new()); } enumerators = rb_cv_get(CLASS_OF(self), ENUMERATORS_CLASS_VAR); (void) rb_ary_push(enumerators, self); return self; } /** * Enum subclass #inspect. * * Ruby usage: * - @verbatim xxx#inspect @endverbatim * * @param self this object * @return string representation of self */ static VALUE Enum_type_inspect(VALUE self) { char str[100]; MagickEnum *magick_enum; Data_Get_Struct(self, MagickEnum, magick_enum); sprintf(str, "%.48s=%d", rb_id2name(magick_enum->id), magick_enum->val); return rb_str_new2(str); } /** * Behaves like #each if a block is present, otherwise like #to_a. * * Ruby usage: * - @verbatim xxx.values @endverbatim * - @verbatim xxx.values {|v| } @endverbatim * * Notes: * - Defined for each Enum subclass * * @param class the subclass * @return iterator over values if given block, a copy of the values otherwise */ static VALUE Enum_type_values(VALUE class) { volatile VALUE enumerators, copy; volatile VALUE rv; int x; enumerators = rb_cv_get(class, ENUMERATORS_CLASS_VAR); if (rb_block_given_p()) { for (x = 0; x < RARRAY_LEN(enumerators); x++) { (void) rb_yield(rb_ary_entry(enumerators, x)); } rv = class; } else { copy = rb_ary_new2(RARRAY_LEN(enumerators)); for (x = 0; x < RARRAY_LEN(enumerators); x++) { (void) rb_ary_push(copy, rb_ary_entry(enumerators, x)); } rb_obj_freeze(copy); rv = copy; } return rv; } /** * Construct a ClassType enum object for the specified value. * * No Ruby usage (internal function) * * @param cls the class type * @return a new enumerator */ VALUE ClassType_new(ClassType cls) { const char *name; switch(cls) { default: case UndefinedClass: name = "UndefineClass"; break; case DirectClass: name = "DirectClass"; break; case PseudoClass: name = "PseudoClass"; break; } return rm_enum_new(Class_ClassType, ID2SYM(rb_intern(name)), INT2FIX(cls)); } /** * Construct a ColorspaceType enum object for the specified value. * * No Ruby usage (internal function) * * @param cs the ColorspaceType * @return a new ColorspaceType enumerator */ VALUE ColorspaceType_new(ColorspaceType cs) { const char *name; switch(cs) { default: case UndefinedColorspace: name = "UndefinedColorspace"; break; case RGBColorspace: name = "RGBColorspace"; break; case GRAYColorspace: name = "GRAYColorspace"; break; case TransparentColorspace: name = "TransparentColorspace"; break; case OHTAColorspace: name = "OHTAColorspace"; break; case XYZColorspace: name = "XYZColorspace"; break; case YCbCrColorspace: name = "YCbCrColorspace"; break; case YCCColorspace: name = "YCCColorspace"; break; case YIQColorspace: name = "YIQColorspace"; break; case YPbPrColorspace: name = "YPbPrColorspace"; break; case YUVColorspace: name = "YUVColorspace"; break; case CMYKColorspace: name = "CMYKColorspace"; break; case sRGBColorspace: name = "sRGBColorspace"; break; case HSLColorspace: name = "HSLColorspace"; break; case HWBColorspace: name = "HWBColorspace"; break; case HSBColorspace: name = "HSBColorspace"; break; case LABColorspace: name = "LABColorspace"; break; case Rec601YCbCrColorspace: name = "Rec601YCbCrColorspace"; break; case Rec601LumaColorspace: name = "Rec601LumaColorspace"; break; case Rec709LumaColorspace: name = "Rec709LumaColorspace"; break; case Rec709YCbCrColorspace: name = "Rec709YCbCrColorspace"; break; case LogColorspace: name = "LogColorspace"; break; case CMYColorspace: name = "CMYColorspace"; break; } return rm_enum_new(Class_ColorspaceType, ID2SYM(rb_intern(name)), INT2FIX(cs)); } /** * Return the name of a CompositeOperator enum as a string. * * No Ruby usage (internal function) * * @param op the CompositeOperator * @return the name */ static const char * CompositeOperator_name(CompositeOperator op) { switch (op) { ENUM_TO_NAME(UndefinedCompositeOp) ENUM_TO_NAME(NoCompositeOp) ENUM_TO_NAME(AddCompositeOp) ENUM_TO_NAME(AtopCompositeOp) #if defined(HAVE_ENUM_BLURCOMPOSITEOP) ENUM_TO_NAME(BlurCompositeOp) #endif ENUM_TO_NAME(BumpmapCompositeOp) ENUM_TO_NAME(ChangeMaskCompositeOp) ENUM_TO_NAME(ClearCompositeOp) ENUM_TO_NAME(ColorBurnCompositeOp) ENUM_TO_NAME(BlendCompositeOp) ENUM_TO_NAME(ColorDodgeCompositeOp) ENUM_TO_NAME(ExclusionCompositeOp) ENUM_TO_NAME(HardLightCompositeOp) ENUM_TO_NAME(SoftLightCompositeOp) ENUM_TO_NAME(ColorizeCompositeOp) ENUM_TO_NAME(CopyBlueCompositeOp) ENUM_TO_NAME(CopyCompositeOp) ENUM_TO_NAME(CopyCyanCompositeOp) ENUM_TO_NAME(CopyMagentaCompositeOp) ENUM_TO_NAME(CopyYellowCompositeOp) ENUM_TO_NAME(CopyBlackCompositeOp) ENUM_TO_NAME(CopyGreenCompositeOp) ENUM_TO_NAME(CopyOpacityCompositeOp) ENUM_TO_NAME(CopyRedCompositeOp) ENUM_TO_NAME(DarkenCompositeOp) #if defined(HAVE_ENUM_DISTORTCOMPOSITEOP) ENUM_TO_NAME(DistortCompositeOp) #endif ENUM_TO_NAME(DivideCompositeOp) ENUM_TO_NAME(DstAtopCompositeOp) ENUM_TO_NAME(DstCompositeOp) ENUM_TO_NAME(DstInCompositeOp) ENUM_TO_NAME(DstOutCompositeOp) ENUM_TO_NAME(DstOverCompositeOp) ENUM_TO_NAME(DifferenceCompositeOp) ENUM_TO_NAME(DisplaceCompositeOp) ENUM_TO_NAME(DissolveCompositeOp) ENUM_TO_NAME(HueCompositeOp) ENUM_TO_NAME(InCompositeOp) ENUM_TO_NAME(LightenCompositeOp) #if defined(HAVE_ENUM_LINEARBURNCOMPOSITEOP) ENUM_TO_NAME(LinearBurnCompositeOp) #endif #if defined(HAVE_ENUM_LINEARDODGECOMPOSITEOP) ENUM_TO_NAME(LinearDodgeCompositeOp) #endif ENUM_TO_NAME(LinearLightCompositeOp) ENUM_TO_NAME(LuminizeCompositeOp) #if defined(HAVE_ENUM_MATHEMATICSCOMPOSITEOP) ENUM_TO_NAME(MathematicsCompositeOp) #endif ENUM_TO_NAME(MinusCompositeOp) ENUM_TO_NAME(ModulateCompositeOp) ENUM_TO_NAME(MultiplyCompositeOp) ENUM_TO_NAME(OutCompositeOp) ENUM_TO_NAME(OverCompositeOp) ENUM_TO_NAME(OverlayCompositeOp) #if defined(HAVE_ENUM_PEGTOPLIGHTCOMPOSITEOP) ENUM_TO_NAME(PegtopLightCompositeOp) #endif #if defined(HAVE_ENUM_PINLIGHTCOMPOSITEOP) ENUM_TO_NAME(PinLightCompositeOp) #endif ENUM_TO_NAME(PlusCompositeOp) ENUM_TO_NAME(ReplaceCompositeOp) ENUM_TO_NAME(SaturateCompositeOp) ENUM_TO_NAME(ScreenCompositeOp) ENUM_TO_NAME(SrcAtopCompositeOp) ENUM_TO_NAME(SrcCompositeOp) ENUM_TO_NAME(SrcInCompositeOp) ENUM_TO_NAME(SrcOutCompositeOp) ENUM_TO_NAME(SrcOverCompositeOp) ENUM_TO_NAME(SubtractCompositeOp) ENUM_TO_NAME(ThresholdCompositeOp) #if defined(HAVE_ENUM_VIVIDLIGHTCOMPOSITEOP) ENUM_TO_NAME(VividLightCompositeOp) #endif ENUM_TO_NAME(XorCompositeOp) } return "UndefinedCompositeOp"; } /** * Construct a CompositeOperator enum object for the specified value. * * No Ruby usage (internal function) * * @param op the CompositeOperator * @return a new CompositeOperator enumerator */ VALUE CompositeOperator_new(CompositeOperator op) { const char *name = CompositeOperator_name(op); return rm_enum_new(Class_CompositeOperator, ID2SYM(rb_intern(name)), INT2FIX(op)); } /** * Return the name of a CompressionType enum as a string. * * No Ruby usage (internal function) * * @param ct the CompressionType * @return the name */ static const char * CompressionType_name(CompressionType ct) { switch (ct) { ENUM_TO_NAME(UndefinedCompression) ENUM_TO_NAME(NoCompression) #if defined(HAVE_ENUM_B44COMPRESSION) ENUM_TO_NAME(B44Compression) #endif #if defined(HAVE_ENUM_B44ACOMPRESSION) ENUM_TO_NAME(B44ACompression) #endif ENUM_TO_NAME(BZipCompression) #if defined(HAVE_ENUM_DXT1COMPRESSION) ENUM_TO_NAME(DXT1Compression) #endif #if defined(HAVE_ENUM_DXT3COMPRESSION) ENUM_TO_NAME(DXT3Compression) #endif #if defined(HAVE_ENUM_DXT5COMPRESSION) ENUM_TO_NAME(DXT5Compression) #endif ENUM_TO_NAME(FaxCompression) ENUM_TO_NAME(Group4Compression) ENUM_TO_NAME(JPEGCompression) ENUM_TO_NAME(JPEG2000Compression) ENUM_TO_NAME(LosslessJPEGCompression) ENUM_TO_NAME(LZWCompression) #if defined(HAVE_ENUM_PIZCOMPRESSION) ENUM_TO_NAME(PizCompression) #endif #if defined(HAVE_ENUM_PXR24COMPRESSION) ENUM_TO_NAME(Pxr24Compression) #endif ENUM_TO_NAME(RLECompression) ENUM_TO_NAME(ZipCompression) #if defined(HAVE_ENUM_ZIPSCOMPRESSION) ENUM_TO_NAME(ZipSCompression) #endif } return "UndefinedCompression"; } /** * Construct a CompressionType enum object for the specified value. * * No Ruby usage (internal function) * * @param ct the CompressionType * @return a new CompressionType enumerator */ VALUE CompressionType_new(CompressionType ct) { const char *name = CompressionType_name(ct); return rm_enum_new(Class_CompressionType, ID2SYM(rb_intern(name)), INT2FIX(ct)); } /** * Return the name of a DisposeType enum as a string. * * No Ruby usage (internal function) * * @param type the DisposeType * @return the name */ static const char * DisposeType_name(DisposeType type) { switch(type) { ENUM_TO_NAME(UndefinedDispose) ENUM_TO_NAME(BackgroundDispose) ENUM_TO_NAME(NoneDispose) ENUM_TO_NAME(PreviousDispose) } return "UndefinedDispose"; } /** * Construct a DisposeType enum object for the specified value..new. * * No Ruby usage (internal function) * * @param type the DisposeType * @return a new DisposeType enumerator */ VALUE DisposeType_new(DisposeType type) { const char *name = DisposeType_name(type); return rm_enum_new(Class_DisposeType, ID2SYM(rb_intern(name)), INT2FIX(type)); } /** * Return the name of a FilterTypes enum as a string. * * No Ruby usage (internal function) * * @param type the FilterTypes * @return the name */ static const char * FilterTypes_name(FilterTypes type) { switch(type) { ENUM_TO_NAME(UndefinedFilter) ENUM_TO_NAME(PointFilter) ENUM_TO_NAME(BoxFilter) ENUM_TO_NAME(TriangleFilter) ENUM_TO_NAME(HermiteFilter) ENUM_TO_NAME(HanningFilter) ENUM_TO_NAME(HammingFilter) ENUM_TO_NAME(BlackmanFilter) ENUM_TO_NAME(GaussianFilter) ENUM_TO_NAME(QuadraticFilter) ENUM_TO_NAME(CubicFilter) ENUM_TO_NAME(CatromFilter) ENUM_TO_NAME(MitchellFilter) ENUM_TO_NAME(LanczosFilter) ENUM_TO_NAME(BesselFilter) ENUM_TO_NAME(SincFilter) #if defined(HAVE_ENUM_KAISERFILTER) ENUM_TO_NAME(KaiserFilter) #endif #if defined(HAVE_ENUM_WELSHFILTER) ENUM_TO_NAME(WelshFilter) #endif #if defined(HAVE_ENUM_PARZENFILTER) ENUM_TO_NAME(ParzenFilter) #endif #if defined(HAVE_ENUM_LAGRANGEFILTER) ENUM_TO_NAME(LagrangeFilter) #endif #if defined(HAVE_ENUM_BOHMANFILTER) ENUM_TO_NAME(BohmanFilter) #endif #if defined(HAVE_ENUM_BARTLETTFILTER) ENUM_TO_NAME(BartlettFilter) #endif #if defined(HAVE_ENUM_SENTINELFILTER) // not a real filter name - defeat gcc warning message case SentinelFilter: break; #endif } return "UndefinedFilter"; } /** * Construct an FilterTypes enum object for the specified value. * * No Ruby usage (internal function) * * @param type the FilterTypes * @return a new FilterTypes enumerator */ VALUE FilterTypes_new(FilterTypes type) { const char *name = FilterTypes_name(type); return rm_enum_new(Class_FilterTypes, ID2SYM(rb_intern(name)), INT2FIX(type)); } /** * Return the name of a EndianType enum as a string. * * No Ruby usage (internal function) * * @param type the EndianType * @return the name */ static const char * EndianType_name(EndianType type) { switch(type) { ENUM_TO_NAME(UndefinedEndian) ENUM_TO_NAME(LSBEndian) ENUM_TO_NAME(MSBEndian) } return "UndefinedEndian"; } /** * Construct an EndianType enum object. * * No Ruby usage (internal function) * * @param type the EndianType * @return a new EndianType enumerator */ VALUE EndianType_new(EndianType type) { const char *name = EndianType_name(type); return rm_enum_new(Class_EndianType, ID2SYM(rb_intern(name)), INT2FIX(type)); } /** * Return the name of a GravityType enum as a string. * * No Ruby usage (internal function) * * @param type the GravityType * @return the name */ static const char * GravityType_name(GravityType type) { switch(type) { ENUM_TO_NAME(ForgetGravity) ENUM_TO_NAME(NorthWestGravity) ENUM_TO_NAME(NorthGravity) ENUM_TO_NAME(NorthEastGravity) ENUM_TO_NAME(WestGravity) ENUM_TO_NAME(CenterGravity) ENUM_TO_NAME(EastGravity) ENUM_TO_NAME(SouthWestGravity) ENUM_TO_NAME(SouthGravity) ENUM_TO_NAME(SouthEastGravity) ENUM_TO_NAME(StaticGravity) } // Defeat "duplicate case value" error. return "UndefinedGravity"; } /** * Construct an GravityType enum object for the specified value. * * No Ruby usage (internal function) * * @param type the GravityType * @return a new GravityType enumerator */ VALUE GravityType_new(GravityType type) { const char *name = GravityType_name(type); return rm_enum_new(Class_GravityType, ID2SYM(rb_intern(name)), INT2FIX(type)); } /** * Return the name of a ImageType enum as a string. * * No Ruby usage (internal function) * * @param type the ImageType * @return the name */ static const char * ImageType_name(ImageType type) { switch(type) { ENUM_TO_NAME(UndefinedType) ENUM_TO_NAME(BilevelType) ENUM_TO_NAME(GrayscaleType) ENUM_TO_NAME(GrayscaleMatteType) ENUM_TO_NAME(PaletteType) ENUM_TO_NAME(PaletteMatteType) ENUM_TO_NAME(TrueColorType) ENUM_TO_NAME(TrueColorMatteType) ENUM_TO_NAME(ColorSeparationType) ENUM_TO_NAME(ColorSeparationMatteType) ENUM_TO_NAME(OptimizeType) ENUM_TO_NAME(PaletteBilevelMatteType) } return "UndefinedType"; } /** * Construct an ImageType enum object for the specified value. * * No Ruby usage (internal function) * * @param type the ImageType * @return a new ImageType enumerator */ VALUE ImageType_new(ImageType type) { const char *name = ImageType_name(type); return rm_enum_new(Class_ImageType, ID2SYM(rb_intern(name)), INT2FIX(type)); } /** * Return the name of a InterlaceType enum as a string. * * No Ruby usage (internal function) * * @param interlace the InterlaceType * @return the name */ static const char * InterlaceType_name(InterlaceType interlace) { switch(interlace) { ENUM_TO_NAME(UndefinedInterlace) ENUM_TO_NAME(GIFInterlace) ENUM_TO_NAME(JPEGInterlace) ENUM_TO_NAME(PNGInterlace) ENUM_TO_NAME(NoInterlace) ENUM_TO_NAME(LineInterlace) ENUM_TO_NAME(PlaneInterlace) ENUM_TO_NAME(PartitionInterlace) } return "UndefinedInterlace"; } /** * Construct an InterlaceType enum object for the specified value. * * No Ruby usage (internal function) * * @param interlace the InterlaceType * @return a new InterlaceType enumerator */ VALUE InterlaceType_new(InterlaceType interlace) { const char *name = InterlaceType_name(interlace); return rm_enum_new(Class_InterlaceType, ID2SYM(rb_intern(name)), INT2FIX(interlace)); } /** * Return the name of a InterpolatePixelMethod enum as a string. * * No Ruby usage (internal function) * * @param interpolate the InterpolatePixelMethod * @return the name */ static const char * InterpolatePixelMethod_name(InterpolatePixelMethod interpolate) { switch(interpolate) { ENUM_TO_NAME(UndefinedInterpolatePixel) ENUM_TO_NAME(AverageInterpolatePixel) ENUM_TO_NAME(BicubicInterpolatePixel) ENUM_TO_NAME(BilinearInterpolatePixel) ENUM_TO_NAME(FilterInterpolatePixel) ENUM_TO_NAME(IntegerInterpolatePixel) ENUM_TO_NAME(MeshInterpolatePixel) ENUM_TO_NAME(NearestNeighborInterpolatePixel) ENUM_TO_NAME(SplineInterpolatePixel) } return "UndefinedInterpolatePixel"; } /** * Construct an InterpolatePixelMethod enum object for the specified value. * * No Ruby usage (internal function) * * @param interpolate the InterpolatePixelMethod * @return a new InterpolatePixelMethod enumerator */ VALUE InterpolatePixelMethod_new(InterpolatePixelMethod interpolate) { const char *name = InterpolatePixelMethod_name(interpolate); return rm_enum_new(Class_InterpolatePixelMethod, ID2SYM(rb_intern(name)), INT2FIX(interpolate)); } /** * Return the name of a MagickLayerMethod enum as a string. * * No Ruby usage (internal function) * * @param method the MagickLayerMethod * @return the name */ static const char * LAYERMETHODTYPE_NAME(LAYERMETHODTYPE method) { switch(method) { ENUM_TO_NAME(UndefinedLayer) ENUM_TO_NAME(CompareAnyLayer) ENUM_TO_NAME(CompareClearLayer) ENUM_TO_NAME(CompareOverlayLayer) ENUM_TO_NAME(OptimizeLayer) ENUM_TO_NAME(OptimizePlusLayer) ENUM_TO_NAME(CoalesceLayer) ENUM_TO_NAME(DisposeLayer) ENUM_TO_NAME(OptimizeTransLayer) ENUM_TO_NAME(OptimizeImageLayer) ENUM_TO_NAME(RemoveDupsLayer) ENUM_TO_NAME(RemoveZeroLayer) ENUM_TO_NAME(CompositeLayer) #if defined(HAVE_ENUM_MERGELAYER) ENUM_TO_NAME(MergeLayer) #endif #if defined(HAVE_ENUM_MOSAICLAYER) ENUM_TO_NAME(MosaicLayer) #endif #if defined(HAVE_ENUM_FLATTENLAYER) ENUM_TO_NAME(FlattenLayer) #endif #if defined(HAVE_ENUM_TRIMBOUNDSLAYER) ENUM_TO_NAME(TrimBoundsLayer) #endif } return "UndefinedLayer"; } /** * Construct an MagickLayerMethod enum object for the specified value. * * No Ruby usage (internal function) * * @param method the MagickLayerMethod * @return a new MagickLayerMethod enumerator */ VALUE LAYERMETHODTYPE_NEW(LAYERMETHODTYPE method) { const char *name = LAYERMETHODTYPE_NAME(method); return rm_enum_new(CLASS_LAYERMETHODTYPE, ID2SYM(rb_intern(name)), INT2FIX(method)); } /** * Return the name of a OrientationType enum as a string. * * No Ruby usage (internal function) * * @param type the OreintationType * @return the name */ static const char * OrientationType_name(OrientationType type) { switch(type) { ENUM_TO_NAME(UndefinedOrientation) ENUM_TO_NAME(TopLeftOrientation) ENUM_TO_NAME(TopRightOrientation) ENUM_TO_NAME(BottomRightOrientation) ENUM_TO_NAME(BottomLeftOrientation) ENUM_TO_NAME(LeftTopOrientation) ENUM_TO_NAME(RightTopOrientation) ENUM_TO_NAME(RightBottomOrientation) ENUM_TO_NAME(LeftBottomOrientation) } return "UndefinedOrientation"; } /** * Construct an OrientationType enum object for the specified value. * * No Ruby usage (internal function) * * @param type the OrientationType * @return a new OrientationType enumerator */ VALUE OrientationType_new(OrientationType type) { const char *name = OrientationType_name(type); return rm_enum_new(Class_OrientationType, ID2SYM(rb_intern(name)), INT2FIX(type)); } /** * Return the name of a RenderingIntent enum as a string. * * No Ruby usage (internal function) * * @param intent the RenderingIntent * @return the name */ static const char * RenderingIntent_name(RenderingIntent intent) { switch(intent) { ENUM_TO_NAME(UndefinedIntent) ENUM_TO_NAME(SaturationIntent) ENUM_TO_NAME(PerceptualIntent) ENUM_TO_NAME(AbsoluteIntent) ENUM_TO_NAME(RelativeIntent) } return "UndefinedIntent"; } /** * Construct an RenderingIntent enum object for the specified value. * * No Ruby usage (internal function) * * @param intent the RenderingIntent * @return a new RenderingIntent enumerator */ VALUE RenderingIntent_new(RenderingIntent intent) { const char *name = RenderingIntent_name(intent); return rm_enum_new(Class_RenderingIntent, ID2SYM(rb_intern(name)), INT2FIX(intent)); } /** * Return the name of a ResolutionType enum as a string. * * No Ruby usage (internal function) * * @param type the ResolutionType * @return the name */ static const char * ResolutionType_name(ResolutionType type) { switch(type) { ENUM_TO_NAME(UndefinedResolution) ENUM_TO_NAME(PixelsPerInchResolution) ENUM_TO_NAME(PixelsPerCentimeterResolution) } return "UndefinedResolution"; } /** * Construct an ResolutionType enum object for the specified value. * * No Ruby usage (internal function) * * @param type the ResolutionType * @return a new ResolutionType enumerator */ VALUE ResolutionType_new(ResolutionType type) { const char *name = ResolutionType_name(type); return rm_enum_new(Class_ResolutionType, ID2SYM(rb_intern(name)), INT2FIX(type)); } /** * Return the string representation of a StorageType value. * * No Ruby usage (internal function) * * @param type the StorageType * @return the name */ const char * StorageType_name(StorageType type) { switch (type) { ENUM_TO_NAME(UndefinedPixel) ENUM_TO_NAME(CharPixel) ENUM_TO_NAME(DoublePixel) ENUM_TO_NAME(FloatPixel) ENUM_TO_NAME(IntegerPixel) ENUM_TO_NAME(LongPixel) ENUM_TO_NAME(QuantumPixel) ENUM_TO_NAME(ShortPixel) } return "UndefinedPixel"; } /** * Return the string representation of a VirtualPixelMethod value. * * No Ruby usage (internal function) * * @param method the VirtualPixelMethod * @return the name */ static const char * VirtualPixelMethod_name(VirtualPixelMethod method) { switch (method) { ENUM_TO_NAME(UndefinedVirtualPixelMethod) ENUM_TO_NAME(EdgeVirtualPixelMethod) ENUM_TO_NAME(MirrorVirtualPixelMethod) ENUM_TO_NAME(TileVirtualPixelMethod) ENUM_TO_NAME(TransparentVirtualPixelMethod) ENUM_TO_NAME(BackgroundVirtualPixelMethod) ENUM_TO_NAME(DitherVirtualPixelMethod) ENUM_TO_NAME(RandomVirtualPixelMethod) ENUM_TO_NAME(ConstantVirtualPixelMethod) ENUM_TO_NAME(MaskVirtualPixelMethod) ENUM_TO_NAME(BlackVirtualPixelMethod) ENUM_TO_NAME(GrayVirtualPixelMethod) ENUM_TO_NAME(WhiteVirtualPixelMethod) #if defined(HAVE_ENUM_HORIZONTALTILEVIRTUALPIXELMETHOD) ENUM_TO_NAME(HorizontalTileVirtualPixelMethod) #endif #if defined(HAVE_ENUM_VERTICALTILEVIRTUALPIXELMETHOD) ENUM_TO_NAME(VerticalTileVirtualPixelMethod) #endif #if defined(HAVE_ENUM_HORIZONTALTILEEDGEVIRTUALPIXELMETHOD) ENUM_TO_NAME(HorizontalTileEdgeVirtualPixelMethod) #endif #if defined(HAVE_ENUM_VERTICALTILEEDGEVIRTUALPIXELMETHOD) ENUM_TO_NAME(VerticalTileEdgeVirtualPixelMethod) #endif #if defined(HAVE_ENUM_CHECKERTILEVIRTUALPIXELMETHOD) ENUM_TO_NAME(CheckerTileVirtualPixelMethod) #endif } return "UndefinedVirtualPixelMethod"; } /** * Construct a VirtualPixelMethod enum for a specified VirtualPixelMethod value. * * No Ruby usage (internal function) * * @param style theVirtualPixelMethod * @return a new VirtualPixelMethod enumerator */ VALUE VirtualPixelMethod_new(VirtualPixelMethod style) { const char *name = VirtualPixelMethod_name(style); return rm_enum_new(Class_VirtualPixelMethod, ID2SYM(rb_intern(name)), INT2FIX(style)); } rmagick-2.13.2/ext/RMagick/rmpixel.c0000644000004100000410000006255112147515547017231 0ustar www-datawww-data/**************************************************************************//** * Contains Pixel class methods. * * Copyright © 2002 - 2009 by Timothy P. Hunter * * Changes since Nov. 2009 copyright © by Benjamin Thomas and Omer Bar-or * * @file rmpixel.c * @version $Id: rmpixel.c,v 1.7 2009/12/21 10:34:58 baror Exp $ * @author Tim Hunter ******************************************************************************/ #include "rmagick.h" static void Color_Name_to_PixelPacket(PixelPacket *, VALUE); /** * Free the storage associated with a Pixel object. * * No Ruby usage (internal function) * * @param pixel the Pixel object to destroy */ void destroy_Pixel(Pixel *pixel) { xfree(pixel); } /** * Get Pixel red attribute. * * Ruby usage: * - @verbatim Pixel#red @endverbatim * * @param self this object * @return the red value */ DEF_ATTR_READER(Pixel, red, int) /** * Get Pixel green attribute. * * Ruby usage: * - @verbatim Pixel#green @endverbatim * * @param self this object * @return the green value */ DEF_ATTR_READER(Pixel, green, int) /** * Get Pixel blue attribute. * * Ruby usage: * - @verbatim Pixel#blue @endverbatim * * @param self this object * @return the blue value */ DEF_ATTR_READER(Pixel, blue, int) /** * Get Pixel opacity attribute. * * Ruby usage: * - @verbatim Pixel#opacity @endverbatim * * @param self this object * @return the opacity value */ DEF_ATTR_READER(Pixel, opacity, int) /** * Set Pixel red attribute. * * Ruby usage: * - @verbatim Pixel#red= @endverbatim * * Notes: * - Pixel is Observable. Setters call changed, notify_observers * - Setters return their argument values for backward compatibility to when * Pixel was a Struct class. * * @param self this object * @param v the red value * @return self */ DEF_PIXEL_CHANNEL_WRITER(red) /** * Set Pixel green attribute. * * Ruby usage: * - @verbatim Pixel#green= @endverbatim * * Notes: * - Pixel is Observable. Setters call changed, notify_observers * - Setters return their argument values for backward compatibility to when * Pixel was a Struct class. * * @param self this object * @param v the green value * @return self */ DEF_PIXEL_CHANNEL_WRITER(green) /** * Set Pixel blue attribute. * * Ruby usage: * - @verbatim Pixel#blue= @endverbatim * * Notes: * - Pixel is Observable. Setters call changed, notify_observers * - Setters return their argument values for backward compatibility to when * Pixel was a Struct class. * * @param self this object * @param v the blue value * @return self */ DEF_PIXEL_CHANNEL_WRITER(blue) /** * Set Pixel opacity attribute. * * Ruby usage: * - @verbatim Pixel#opacity= @endverbatim * * Notes: * - Pixel is Observable. Setters call changed, notify_observers * - Setters return their argument values for backward compatibility to when * Pixel was a Struct class. * * @param self this object * @param v the opacity value * @return self */ DEF_PIXEL_CHANNEL_WRITER(opacity) /* * Get/set Pixel CMYK attributes. */ DEF_PIXEL_CMYK_CHANNEL_ACCESSOR(cyan, red) DEF_PIXEL_CMYK_CHANNEL_ACCESSOR(magenta, green) DEF_PIXEL_CMYK_CHANNEL_ACCESSOR(yellow, blue) DEF_PIXEL_CMYK_CHANNEL_ACCESSOR(black, opacity) /** * Raise ArgumentError if the color name cannot be converted to a string via * rb_str_to_str. * * No Ruby usage (internal function) * * @param arg the argument to convert * @return 0 * @throw ArgumentError */ static VALUE color_arg_rescue(VALUE arg) { rb_raise(rb_eTypeError, "argument must be color name or pixel (%s given)", rb_class2name(CLASS_OF(arg))); return (VALUE)0; } /** * Convert either a String color name or a Magick::Pixel to a PixelPacket. * * No Ruby usage (internal function) * * @param pp the PixelPacket to modify * @param color the color name or Magick::Pixel */ void Color_to_PixelPacket(PixelPacket *pp, VALUE color) { Pixel *pixel; // Allow color name or Pixel if (CLASS_OF(color) == Class_Pixel) { Data_Get_Struct(color, Pixel, pixel); *pp = *pixel; } else { // require 'to_str' here instead of just 'to_s'. color = rb_rescue(rb_str_to_str, color, color_arg_rescue, color); Color_Name_to_PixelPacket(pp, color); } } /** * Convert a color name to a PixelPacket * * No Ruby usage (internal function) * * @param color the PixelPacket to modify * @param name_arg the coor name * @throw ArgumentError */ static void Color_Name_to_PixelPacket(PixelPacket *color, VALUE name_arg) { MagickBooleanType okay; char *name; ExceptionInfo exception; GetExceptionInfo(&exception); name = StringValuePtr(name_arg); okay = QueryColorDatabase(name, color, &exception); (void) DestroyExceptionInfo(&exception); if (!okay) { rb_raise(rb_eArgError, "invalid color name %s", name); } } /** * Allocate a Pixel object. * * No Ruby usage (internal function) * * @param class the Ruby class to use * @return a new Magick::Pixel object */ VALUE Pixel_alloc(VALUE class) { Pixel *pixel; pixel = ALLOC(Pixel); memset(pixel, '\0', sizeof(Pixel)); return Data_Wrap_Struct(class, NULL, destroy_Pixel, pixel); } /** * "Case equal" operator for Pixel. * * Ruby usage: * - @verbatim Pixel#=== @endverbatim * * @param self this object * @param other the other object * @return true or false */ VALUE Pixel_case_eq(VALUE self, VALUE other) { Pixel *this, *that; if (CLASS_OF(self) == CLASS_OF(other)) { Data_Get_Struct(self, Pixel, this); Data_Get_Struct(other, Pixel, that); return (this->red == that->red && this->blue == that->blue && this->green == that->green && this->opacity == that->opacity) ? Qtrue : Qfalse; } return Qfalse; } /** * Clone a Pixel. * * Ruby usage: * - @verbatim Pixel#clone @endverbatim * * @param self this object * @return a clone * @see Pixel_dup * @see Pixel_init_copy */ VALUE Pixel_clone(VALUE self) { volatile VALUE clone; clone = Pixel_dup(self); if (OBJ_FROZEN(self)) { OBJ_FREEZE(clone); } return clone; } /** * Duplicate a Pixel. * * Ruby usage: * - @verbatim Pixel#dup @endverbatim * * @param self this object * @return a clone * @see Pixel_clone * @see Pixel_init_copy */ VALUE Pixel_dup(VALUE self) { Pixel *pixel; volatile VALUE dup; pixel = ALLOC(Pixel); memset(pixel, '\0', sizeof(Pixel)); dup = Data_Wrap_Struct(CLASS_OF(self), NULL, destroy_Pixel, pixel); if (rb_obj_tainted(self)) { (void) rb_obj_taint(dup); } return rb_funcall(dup, rm_ID_initialize_copy, 1, self); } /** * For use with Hash. * * Ruby usage: * - @verbatim Pixel#eql? @endverbatim * * @param self this object * @param other the other object * @return true if hash to the same value, otherwise false */ VALUE Pixel_eql_q(VALUE self, VALUE other) { return NUM2INT(Pixel_spaceship(self, other)) == 0 ? Qtrue : Qfalse; } /** * Compare pixel values for equality. * * Ruby usage: * - @verbatim Pixel#fcmp(other, fuzz, colorspace) @endverbatim * * Notes: * - Default fuzz is 0.0 * - Default colorspace is RGBColorspace * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return true if equal, otherwise false */ VALUE Pixel_fcmp(int argc, VALUE *argv, VALUE self) { Image *image; Info *info; Pixel *this, *that; ColorspaceType colorspace = RGBColorspace; double fuzz = 0.0; unsigned int equal; switch (argc) { case 3: VALUE_TO_ENUM(argv[2], colorspace, ColorspaceType); case 2: fuzz = NUM2DBL(argv[1]); case 1: // Allow 1 argument break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 to 3)", argc); break; } Data_Get_Struct(self, Pixel, this); Data_Get_Struct(argv[0], Pixel, that); // The IsColorSimilar function expects to get the // colorspace and fuzz parameters from an Image structure. info = CloneImageInfo(NULL); if (!info) { rb_raise(rb_eNoMemError, "not enough memory to continue"); } image = AcquireImage(info); // Delete Info now in case we have to raise an exception (void) DestroyImageInfo(info); if (!image) { rb_raise(rb_eNoMemError, "not enough memory to continue"); } image->colorspace = colorspace; image->fuzz = fuzz; equal = IsColorSimilar(image, this, that); (void) DestroyImage(image); return equal ? Qtrue : Qfalse; } /** * Construct an Magick::Pixel corresponding to the given color name. * * Ruby usage: * - @verbatim Magick::Pixel.from_color(string) @endverbatim * * Notes: * - The "inverse" is Image_to_color, b/c the conversion of a pixel to a * color name requires both a color depth and if the opacity value has * meaning (i.e. whether image->matte == True or not). * * @param class the Ruby class to use * @param name the color name * @return a new Magic::Pixel object * @see Image_to_color * @see Pixel_to_color */ VALUE Pixel_from_color(VALUE class, VALUE name) { PixelPacket pp; ExceptionInfo exception; MagickBooleanType okay; class = class; // defeat "never referenced" message from icc GetExceptionInfo(&exception); okay = QueryColorDatabase(StringValuePtr(name), &pp, &exception); CHECK_EXCEPTION() (void) DestroyExceptionInfo(&exception); if (!okay) { rb_raise(rb_eArgError, "invalid color name: %s", StringValuePtr(name)); } return Pixel_from_PixelPacket(&pp); } /** * Construct an RGB pixel. * * Ruby usage: * - @verbatim Pixel#from_hsla(hue, saturation, lightness) @endverbatim * - @verbatim Pixel#from_hsla(hue, saturation, lightness, alpha) @endverbatim * * Notes: * - Default alpha is 1.0 * - 0 <= hue < 360 OR "0%" <= hue < "100%" * - 0 <= saturation <= 255 OR "0%" <= saturation <= "100%" * - 0 <= lightness <= 255 OR "0%" <= lightness <= "100%" * - 0 <= alpha <= 1 (0 is transparent, 1 is opaque) OR "0%" <= alpha <= "100%" * - Replaces brain-dead Pixel_from_HSL. * * @param argc number of input arguments * @param argv array of input arguments * @param class the Ruby class to use * @return a new Magick::Pixel object */ VALUE Pixel_from_hsla(int argc, VALUE *argv, VALUE class) { double h, s, l, a = 1.0; MagickPixelPacket pp; ExceptionInfo exception; char name[50]; MagickBooleanType alpha = MagickFalse; class = class; // defeat "unused parameter" message. switch (argc) { case 4: a = rm_percentage(argv[3],1.0); alpha = MagickTrue; case 3: // saturation and lightness are out of 255 in new ImageMagicks and // out of 100 in old ImageMagicks. Compromise: always use %. l = rm_percentage(argv[2],255.0); s = rm_percentage(argv[1],255.0); h = rm_percentage(argv[0],360.0); break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 3 or 4)", argc); break; } if (alpha && (a < 0.0 || a > 1.0)) { rb_raise(rb_eRangeError, "alpha %g out of range [0.0, 1.0]", a); } if (l < 0.0 || l > 255.0) { rb_raise(rb_eRangeError, "lightness %g out of range [0.0, 255.0]", l); } if (s < 0.0 || s > 255.0) { rb_raise(rb_eRangeError, "saturation %g out of range [0.0, 255.0]", s); } if (h < 0.0 || h >= 360.0) { rb_raise(rb_eRangeError, "hue %g out of range [0.0, 360.0)", h); } // Ugly way of checking for change in ImageMagick 6.5.6-5 to see whether // saturation/lightness should be out of 255 or out of 100. if(MagickLibVersion < 0x656 || (MagickLibVersion == 0x656 && strcmp(MagickLibSubversion,"-5") <= 0) ) { s = s/2.55; l = l/2.55; } memset(name, 0, sizeof(name)); if (alpha) { sprintf(name, "hsla(%-2.1f,%-2.1f,%-2.1f,%-2.1f)", h, s, l, a); } else { sprintf(name, "hsl(%-2.1f,%-2.1f,%-2.1f)", h, s, l); } GetExceptionInfo(&exception); (void) QueryMagickColor(name, &pp, &exception); CHECK_EXCEPTION() (void) DestroyExceptionInfo(&exception); return Pixel_from_MagickPixelPacket(&pp); } /** * Construct an RGB pixel from the array [hue, saturation, luminosity]. * * Ruby usage: * - @verbatim Pixel.from_HSL @endverbatim * * @param class the Ruby class to use * @param hsl the array * @return a new Magick::Pixel object * @deprecated This method has been deprecated. Please use Pixel_from_hsla. */ VALUE Pixel_from_HSL(VALUE class, VALUE hsl) { PixelPacket rgb; double hue, saturation, luminosity; class = class; // defeat "never referenced" message from icc memset(&rgb, 0, sizeof(rgb)); hsl = rb_Array(hsl); // Ensure array if (RARRAY_LEN(hsl) < 3) { rb_raise(rb_eArgError, "array argument must have at least 3 elements"); } hue = NUM2DBL(rb_ary_entry(hsl, 0)); saturation = NUM2DBL(rb_ary_entry(hsl, 1)); luminosity = NUM2DBL(rb_ary_entry(hsl, 2)); rb_warning("Pixel#from_HSL is deprecated; use from_hsla"); ConvertHSLToRGB(hue, saturation, luminosity, &rgb.red, &rgb.green, &rgb.blue); return Pixel_from_PixelPacket(&rgb); } /** * Create a Magick::Pixel object from a MagickPixelPacket structure. * * No Ruby usage (internal function) * * Notes: * - Bypasses normal Pixel.new, Pixel#initialize methods * * @param pp the MagickPixelPacket * @return a new Magick::Pixel object */ VALUE Pixel_from_MagickPixelPacket(const MagickPixelPacket *pp) { Pixel *pixel; pixel = ALLOC(Pixel); pixel->red = ROUND_TO_QUANTUM(pp->red); pixel->green = ROUND_TO_QUANTUM(pp->green); pixel->blue = ROUND_TO_QUANTUM(pp->blue); pixel->opacity = ROUND_TO_QUANTUM(pp->opacity); return Data_Wrap_Struct(Class_Pixel, NULL, destroy_Pixel, pixel); } /** * Create a Magick::Pixel object from a PixelPacket structure. * * No Ruby usage (internal function) * * Notes: * - Bypasses normal Pixel.new, Pixel#initialize methods * * @param pp the PixelPacket * @return a new Magick::Pixel object */ VALUE Pixel_from_PixelPacket(const PixelPacket *pp) { Pixel *pixel; pixel = ALLOC(Pixel); *pixel = *pp; return Data_Wrap_Struct(Class_Pixel, NULL, destroy_Pixel, pixel); } /** * Ruby usage: * - @verbatim Pixel#hash @endverbatim * * Notes: * - INT2FIX left-shifts 1 bit. Sacrifice 1 bit from the opacity attribute to * the FIXNUM_FLAG. * * @param self this object * @return the hash of self */ VALUE Pixel_hash(VALUE self) { Pixel *pixel; unsigned int hash; Data_Get_Struct(self, Pixel, pixel); hash = ScaleQuantumToChar(pixel->red) << 24; hash += ScaleQuantumToChar(pixel->green) << 16; hash += ScaleQuantumToChar(pixel->blue) << 8; hash += ScaleQuantumToChar(pixel->opacity); hash >>= 1; return INT2FIX(hash); } /** * Initialize clone, dup methods. * * Ruby usage: * - @verbatim Pixel#initialize_copy @endverbatim * * @param self this object * @param orig the original Pixel * @return self * @see Pixel_clone * @see Pixel_dup */ VALUE Pixel_init_copy(VALUE self, VALUE orig) { Pixel *copy, *original; Data_Get_Struct(orig, Pixel, original); Data_Get_Struct(self, Pixel, copy); *copy = *original; return self; } /** * Ruby usage: * - @verbatim Pixel#initialize @endverbatim * - @verbatim Pixel#initialize(red) @endverbatim * - @verbatim Pixel#initialize(red,green) @endverbatim * - @verbatim Pixel#initialize(red,green,blue) @endverbatim * - @verbatim Pixel#initialize(red,green,blue,opacity) @endverbatim * * Notes: * - Default red is 0.0 * - Default green is 0.0 * - Default blue is 0.0 * - Default opacity is 0.0 * - For backward compatibility, arguments may be nil. * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self */ VALUE Pixel_initialize(int argc, VALUE *argv, VALUE self) { Pixel *pixel; Data_Get_Struct(self, Pixel, pixel); switch(argc) { case 4: if (argv[3] != Qnil) { pixel->opacity = APP2QUANTUM(argv[3]); } case 3: if (argv[2] != Qnil) { pixel->blue = APP2QUANTUM(argv[2]); } case 2: if (argv[1] != Qnil) { pixel->green = APP2QUANTUM(argv[1]); } case 1: if (argv[0] != Qnil) { pixel->red = APP2QUANTUM(argv[0]); } case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 to 4)", argc); } return self; } /** * Return the "intensity" of a pixel. * * Ruby usage: * - @verbatim Pixel#intensity @endverbatim * * @param self this object * @return the intensity */ VALUE Pixel_intensity(VALUE self) { Pixel *pixel; Quantum intensity; Data_Get_Struct(self, Pixel, pixel); intensity = ROUND_TO_QUANTUM((0.299*pixel->red) + (0.587*pixel->green) + (0.114*pixel->blue)); return QUANTUM2NUM((unsigned long) intensity); } /** * Support Marshal.dump. * * Ruby usage: * - @verbatim Pixel#marshal_dump @endverbatim * * @param self this object * @return a string representing the dumped pixel */ VALUE Pixel_marshal_dump(VALUE self) { Pixel *pixel; volatile VALUE dpixel; Data_Get_Struct(self, Pixel, pixel); dpixel = rb_hash_new(); rb_hash_aset(dpixel, CSTR2SYM("red"), QUANTUM2NUM(pixel->red)); rb_hash_aset(dpixel, CSTR2SYM("green"), QUANTUM2NUM(pixel->green)); rb_hash_aset(dpixel, CSTR2SYM("blue"), QUANTUM2NUM(pixel->blue)); rb_hash_aset(dpixel, CSTR2SYM("opacity"), QUANTUM2NUM(pixel->opacity)); return dpixel; } /** * Support Marshal.load. * * Ruby usage: * - @verbatim Pixel#marshal_load @endverbatim * * @param self this object * @param dpixel the dumped pixel * @return self */ VALUE Pixel_marshal_load(VALUE self, VALUE dpixel) { Pixel *pixel; Data_Get_Struct(self, Pixel, pixel); pixel->red = NUM2QUANTUM(rb_hash_aref(dpixel, CSTR2SYM("red"))); pixel->green = NUM2QUANTUM(rb_hash_aref(dpixel, CSTR2SYM("green"))); pixel->blue = NUM2QUANTUM(rb_hash_aref(dpixel, CSTR2SYM("blue"))); pixel->opacity = NUM2QUANTUM(rb_hash_aref(dpixel, CSTR2SYM("opacity"))); return self; } /** * Support Comparable mixin. * * Ruby usage: * - @verbatim Pixel#<=> @endverbatim * * @param self this object * @param other the other Pixel * @return -1, 0, 1 */ VALUE Pixel_spaceship(VALUE self, VALUE other) { Pixel *this, *that; Data_Get_Struct(self, Pixel, this); Data_Get_Struct(other, Pixel, that); if (this->red != that->red) { return INT2NUM((this->red - that->red)/abs(this->red - that->red)); } else if(this->green != that->green) { return INT2NUM((this->green - that->green)/abs(this->green - that->green)); } else if(this->blue != that->blue) { return INT2NUM((this->blue - that->blue)/abs(this->blue - that->blue)); } else if(this->opacity != that->opacity) { return INT2NUM((this->opacity - that->opacity)/abs(this->opacity - that->opacity)); } // Values are equal, check class. return rb_funcall(CLASS_OF(self), rb_intern("<=>"), 1, CLASS_OF(other)); } /** * Return [hue, saturation, lightness, alpha] in the same ranges as * Pixel_from_hsla. * * * Ruby usage: * - @verbatim Pixel#to_hsla @endverbatim * * Notes: * - Replace brain-dead Pixel_to_HSL. * * @param self this object * @return an array with hsla data * @see Pixel_from_hsla */ VALUE Pixel_to_hsla(VALUE self) { double hue, sat, lum, alpha; Pixel *pixel; volatile VALUE hsla; Data_Get_Struct(self, Pixel, pixel); ConvertRGBToHSL(pixel->red, pixel->green, pixel->blue, &hue, &sat, &lum); hue *= 360.0; sat *= 255.0; lum *= 255.0; if (pixel->opacity == OpaqueOpacity) { alpha = 1.0; } else if (pixel->opacity == TransparentOpacity) { alpha = 0.0; } else { alpha = ROUND_TO_QUANTUM(QuantumRange - (pixel->opacity / QuantumRange)); } hsla = rb_ary_new3(4, rb_float_new(hue), rb_float_new(sat), rb_float_new(lum), rb_float_new(alpha)); return hsla; } /** * Convert an RGB pixel to the array [hue, saturation, luminosity]. * * Ruby usage: * - @verbatim Pixel#to_HSL @endverbatim * * @param self this object * @return an array with hsl data * @deprecated This method has been deprecated. Please use Pixel_to_hsla. */ VALUE Pixel_to_HSL(VALUE self) { Pixel *pixel; double hue, saturation, luminosity; volatile VALUE hsl; Data_Get_Struct(self, Pixel, pixel); rb_warning("Pixel#to_HSL is deprecated; use to_hsla"); ConvertRGBToHSL(pixel->red, pixel->green, pixel->blue, &hue, &saturation, &luminosity); hsl = rb_ary_new3(3, rb_float_new(hue), rb_float_new(saturation), rb_float_new(luminosity)); return hsl; } /** * Return the color name corresponding to the pixel values. * * Ruby usage: * - @verbatim Magick::Pixel#to_color @endverbatim * - @verbatim Magick::Pixel#to_color(compliance) @endverbatim * - @verbatim Magick::Pixel#to_color(compliance, matte) @endverbatim * - @verbatim Magick::Pixel#to_color(compliance, matte, depth) @endverbatim * - @verbatim Magick::Pixel#to_color(compliance, matte, depth, hex) @endverbatim * * Notes: * - Default compliance is AllCompliance * - Default matte is false * - Default depth is QuantumDepth * - Default hex is false * - The conversion respects the value of the 'opacity' field in the Pixel * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return the color name as a String */ VALUE Pixel_to_color(int argc, VALUE *argv, VALUE self) { Info *info; Image *image; Pixel *pixel; MagickPixelPacket mpp; MagickBooleanType hex = MagickFalse; char name[MaxTextExtent]; ExceptionInfo exception; ComplianceType compliance = AllCompliance; unsigned int matte = MagickFalse; unsigned int depth = QuantumDepth; switch (argc) { case 4: hex = RTEST(argv[3]); case 3: depth = NUM2UINT(argv[2]); // Ensure depth is appropriate for the way xMagick was compiled. switch (depth) { case 8: #if QuantumDepth == 16 || QuantumDepth == 32 case 16: #endif #if QuantumDepth == 32 case 32: #endif break; default: rb_raise(rb_eArgError, "invalid depth (%d)", depth); break; } case 2: matte = RTEST(argv[1]); case 1: VALUE_TO_ENUM(argv[0], compliance, ComplianceType); case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 to 2)", argc); } Data_Get_Struct(self, Pixel, pixel); info = CloneImageInfo(NULL); image = AcquireImage(info); image->depth = depth; image->matte = matte; (void) DestroyImageInfo(info); GetMagickPixelPacket(image, &mpp); rm_set_magick_pixel_packet(pixel, &mpp); GetExceptionInfo(&exception); #if defined(HAVE_NEW_QUERYMAGICKCOLORNAME) // Support for hex-format color names moved out of QueryMagickColorname // in 6.4.1-9. The 'hex' argument was removed as well. if (hex) { if (compliance == XPMCompliance) { mpp.matte = MagickFalse; mpp.depth = (unsigned long) min(1.0 * image->depth, 16.0); } (void) GetColorTuple(&mpp, MagickTrue, name); } else { (void) QueryMagickColorname(image, &mpp, compliance, name, &exception); } #else (void) QueryMagickColorname(image, &mpp, compliance, hex, name, &exception); #endif (void) DestroyImage(image); CHECK_EXCEPTION() (void) DestroyExceptionInfo(&exception); // Always return a string, even if it's "" return rb_str_new2(name); } /** * Create a string representation of a Magick::Pixel. * * Ruby usage: * - @verbatim Magick::Pixel#to_s @endverbatim * * @param self this object * @return the string */ VALUE Pixel_to_s(VALUE self) { Pixel *pixel; char buff[100]; Data_Get_Struct(self, Pixel, pixel); sprintf(buff, "red=" QuantumFormat ", green=" QuantumFormat ", blue=" QuantumFormat ", opacity=" QuantumFormat , pixel->red, pixel->green, pixel->blue, pixel->opacity); return rb_str_new2(buff); } /** * Convert a PixelPacket to a MagickPixelPacket. * * No Ruby usage (internal function) * * Notes: * - Same code as the private function SetMagickPixelPacket in ImageMagick. * * @param pixel the pixel * @param pp the MagickPixelPacket to be modified */ void rm_set_magick_pixel_packet(Pixel *pixel, MagickPixelPacket *pp) { pp->red = (MagickRealType) pixel->red; pp->green = (MagickRealType) pixel->green; pp->blue = (MagickRealType) pixel->blue; pp->opacity = (MagickRealType) pixel->opacity; pp->index = (MagickRealType) 0.0; } rmagick-2.13.2/ext/RMagick/rminfo.c0000644000004100000410000014506012147515547017040 0ustar www-datawww-data/**************************************************************************//** * Info class method definitions for RMagick. * * Copyright © 2002 - 2009 by Timothy P. Hunter * * Changes since Nov. 2009 copyright © by Benjamin Thomas and Omer Bar-or * * @file rminfo.c * @version $Id: rminfo.c,v 1.79 2009/12/20 02:33:33 baror Exp $ * @author Tim Hunter ******************************************************************************/ #include "rmagick.h" /** * Return the value of the specified option. * * Ruby usage: * - @verbatim Info#get_option(key) @endverbatim * * @param self this object * @param key the option key * @return the value of key */ static VALUE get_option(VALUE self, const char *key) { Info *info; const char *value; Data_Get_Struct(self, Info, info); value = GetImageOption(info, key); if (value) { return rb_str_new2(value); } return Qnil; } /** * Set the specified option to this value. If the value is nil just unset any * current value. * * Ruby usage: * - @verbatim Info#set_option(key,string) @endverbatim * * @param self this object * @param key the option key * @param string the value * @return self */ static VALUE set_option(VALUE self, const char *key, VALUE string) { Info *info; char *value; Data_Get_Struct(self, Info, info); if (NIL_P(string)) { (void) RemoveImageOption(info, key); } else { value = StringValuePtr(string); (void) SetImageOption(info, key, value); } return self; } /** * Set a color name as the value of the specified option * * No Ruby usage (internal function) * * Notes: * - Call QueryColorDatabase to validate color name. * * @param self this object * @param option the option * @param color the color name * @return self */ static VALUE set_color_option(VALUE self, const char *option, VALUE color) { Info *info; char *name; PixelPacket pp; ExceptionInfo exception; MagickBooleanType okay; Data_Get_Struct(self, Info, info); if (NIL_P(color)) { (void) RemoveImageOption(info, option); } else { GetExceptionInfo(&exception); name = StringValuePtr(color); okay = QueryColorDatabase(name, &pp, &exception); (void) DestroyExceptionInfo(&exception); if (!okay) { rb_raise(rb_eArgError, "invalid color name `%s'", name); } (void) RemoveImageOption(info, option); (void) SetImageOption(info, option, name); } return self; } /** * Get an Image::Info option floating-point value. * * No Ruby usage (internal function) * * Notes: * - Convert the string value to a float * * @param self this object * @param option the option name * @return the Image::Info option */ static VALUE get_dbl_option(VALUE self, const char *option) { Info *info; const char *value; double d; long n; Data_Get_Struct(self, Info, info); value = GetImageOption(info, option); if (!value) { return Qnil; } d = atof(value); n = (long) floor(d); return d == (double)n ? LONG2NUM(n) : rb_float_new(d); } /** * Set an Image::Info option to a floating-point value. * * No Ruby usage (internal function) * * Notes: * - SetImageOption expects the value to be a string. * * @param self this object * @param option the option name * @param value the value * @return self */ static VALUE set_dbl_option(VALUE self, const char *option, VALUE value) { Info *info; char buff[50]; double d; long n; int len; Data_Get_Struct(self, Info, info); if (NIL_P(value)) { (void) RemoveImageOption(info, option); } else { d = NUM2DBL(value); n = floor(d); if (d == n) { len = sprintf(buff, "%-10ld", n); } else { len = sprintf(buff, "%-10.2f", d); } memset(buff+len, '\0', sizeof(buff)-len); (void) RemoveImageOption(info, option); (void) SetImageOption(info, option, buff); } return self; } #if 0 /** * Convert a PixelPacket to a hex-format color name. * * No Ruby usage (internal function) * * @param pp the pixel packet * @param name pointer to the name * @return the name */ static char *pixel_packet_to_hexname(PixelPacket *pp, char *name) { MagickPixelPacket mpp; GetMagickPixelPacket(NULL, &mpp); rm_set_magick_pixel_packet(pp, &mpp); (void) GetColorTuple(&mpp, MagickTrue, name); return name; } #endif DEF_ATTR_ACCESSOR(Info, antialias, bool) /** Maximum length of a format (@see Info_aref) */ #define MAX_FORMAT_LEN 60 /** * Get the value of an option set by Info[]= * * Ruby usage: * - @verbatim Info[format, key] @endverbatim * - @verbatim Info[key] @endverbatim * * Notes: * - The 2 argument form is the original form. Added support for a single * argument after ImageMagick started using Set/GetImageOption for options * that aren't represented by fields in the ImageInfo structure. * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return the option value * @see Info_aset */ VALUE Info_aref(int argc, VALUE *argv, VALUE self) { Info *info; char *format_p, *key_p; long format_l, key_l; const char *value; char fkey[MaxTextExtent]; switch (argc) { case 2: format_p = rm_str2cstr(argv[0], &format_l); key_p = rm_str2cstr(argv[1], &key_l); if (format_l > MAX_FORMAT_LEN || format_l + key_l > MaxTextExtent-1) { rb_raise(rb_eArgError, "can't reference %.60s:%.1024s - too long", format_p, key_p); } sprintf(fkey, "%.60s:%.*s", format_p, (int)(MaxTextExtent-61), key_p); break; case 1: strncpy(fkey, StringValuePtr(argv[0]), sizeof(fkey)-1); fkey[sizeof(fkey)-1] = '\0'; break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc); break; } Data_Get_Struct(self, Info, info); value = GetImageOption(info, fkey); if (!value) { return Qnil; } return rb_str_new2(value); } /** * Call SetImageOption * * Ruby usage: * - @verbatim Info[format, key]= @endverbatim * - @verbatim Info[key]= @endverbatim * * Notes: * - Essentially the same function as Info_define but paired with Info_aref * - If the value is nil it is equivalent to Info_undefine. * - The 2 argument form is the original form. Added support for a single * argument after ImageMagick started using Set/GetImageOption for options * that aren't represented by fields in the ImageInfo structure. * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self * @see Info_aref * @see Info_define * @see Info_undefine */ VALUE Info_aset(int argc, VALUE *argv, VALUE self) { Info *info; volatile VALUE value; char *format_p, *key_p, *value_p = NULL; long format_l, key_l; char ckey[MaxTextExtent]; unsigned int okay; Data_Get_Struct(self, Info, info); switch (argc) { case 3: format_p = rm_str2cstr(argv[0], &format_l); key_p = rm_str2cstr(argv[1], &key_l); if (format_l > MAX_FORMAT_LEN || format_l+key_l > MaxTextExtent-1) { rb_raise(rb_eArgError, "%.60s:%.1024s not defined - too long", format_p, key_p); } (void) sprintf(ckey, "%.60s:%.*s", format_p, (int)(sizeof(ckey)-MAX_FORMAT_LEN), key_p); value = argv[2]; break; case 2: strncpy(ckey, StringValuePtr(argv[0]), sizeof(ckey)-1); ckey[sizeof(ckey)-1] = '\0'; value = argv[1]; break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc); break; } if (NIL_P(value)) { (void) RemoveImageOption(info, ckey); } else { /* Allow any argument that supports to_s */ value = rm_to_s(value); value_p = StringValuePtr(value); (void) RemoveImageOption(info, ckey); okay = SetImageOption(info, ckey, value_p); if (!okay) { rb_warn("`%s' not defined - SetImageOption failed.", ckey); return Qnil; } } return self; } /** * Get the attenuate attribute. * * Ruby usage: * - @verbatim Info#attenuate @endverbatim * * @param self this object * @return the attenuate */ VALUE Info_attenuate(VALUE self) { return get_dbl_option(self, "attenuate"); } /** * Set the attenuate attribute. * * Ruby usage: * - @verbatim Info#attenuate= @endverbatim * * @param self this object * @param value the attenuate * @return self */ VALUE Info_attenuate_eq(VALUE self, VALUE value) { return set_dbl_option(self, "attenuate", value); } /** * Get the authenticate attribute. * * Ruby usage: * - @verbatim Info#authenticate @endverbatim * * @param self this object * @return the authenticate */ VALUE Info_authenticate(VALUE self) { Info *info; Data_Get_Struct(self, Info, info); if (info->authenticate) { return rb_str_new2(info->authenticate); } else { return Qnil; } } /** * Set the authenticate attribute. * * Ruby usage: * - @verbatim Info#authenticate= @endverbatim * * @param self this object * @param passwd the authenticating password * @return self */ VALUE Info_authenticate_eq(VALUE self, VALUE passwd) { Info *info; char *passwd_p = NULL; long passwd_l = 0; Data_Get_Struct(self, Info, info); if (!NIL_P(passwd)) { passwd_p = rm_str2cstr(passwd, &passwd_l); } if (info->authenticate) { magick_free(info->authenticate); info->authenticate = NULL; } if (passwd_l > 0) { magick_clone_string(&info->authenticate, passwd_p); } return self; } /** * Return the name of the background color as a String * * Ruby usage: * - @verbatim Info#background_color @endverbatim * * @param self this object * @return the name of the background color * @see Image_background_color */ VALUE Info_background_color(VALUE self) { Info *info; Data_Get_Struct(self, Info, info); return rm_pixelpacket_to_color_name_info(info, &info->background_color); } /** * Set the background color. * * Ruby usage: * - @verbatim Info#background_color= @endverbatim * * Notes: * - Color should be a string * * @param self this object * @param bc_arg the background color * @return self * @throw ArgumentError */ VALUE Info_background_color_eq(VALUE self, VALUE bc_arg) { Info *info; //char colorname[MaxTextExtent]; Data_Get_Struct(self, Info, info); Color_to_PixelPacket(&info->background_color, bc_arg); //SetImageOption(info, "background", pixel_packet_to_hexname(&info->background_color, colorname)); return self; } /** * Return the name of the border color as a String. * * Ruby usage: * - @verbatim Info#border_color @endverbatim * * @param self this object * @return the border color * @see Image_border_color */ VALUE Info_border_color(VALUE self) { Info *info; Data_Get_Struct(self, Info, info); return rm_pixelpacket_to_color_name_info(info, &info->border_color); } /** * set the border color * * Ruby usage: * - @verbatim Info#border_color= @endverbatim * * Notes: * - Color should be a string * * @param self this object * @param bc_arg the border color * @return self * @throw ArgumentError */ VALUE Info_border_color_eq(VALUE self, VALUE bc_arg) { Info *info; //char colorname[MaxTextExtent]; Data_Get_Struct(self, Info, info); Color_to_PixelPacket(&info->border_color, bc_arg); //SetImageOption(info, "bordercolor", pixel_packet_to_hexname(&info->border_color, colorname)); return self; } /** * Emulate the -caption option. * * Ruby usage: * - @verbatim Info#caption @endverbatim * * @param self this object * @return the caption */ VALUE Info_caption(VALUE self) { return get_option(self, "caption"); } /** * Emulate the -caption option. * * Ruby usage: * - @verbatim Info#caption= @endverbatim * * @param self this object * @param caption the caption * @return self */ VALUE Info_caption_eq(VALUE self, VALUE caption) { return set_option(self, "caption", caption); } /** * Set the channels * * Ruby usage: * - @verbatim Info#channel @endverbatim * - @verbatim Info#channel(channel) @endverbatim * - @verbatim Info#channel(channel, ...) @endverbatim * * Notes: * - Default channel is AllChannels * - Thanks to Douglas Sellers. * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self */ VALUE Info_channel(int argc, VALUE *argv, VALUE self) { Info *info; ChannelType channels; channels = extract_channels(&argc, argv); // Ensure all arguments consumed. if (argc > 0) { raise_ChannelType_error(argv[argc-1]); } Data_Get_Struct(self, Info, info); info->channel = channels; return self; } /** * Get the colorspace type. * * Ruby usage: * - @verbatim Info#colorspace @endverbatim * * @param self this object * @return the colorspace type */ VALUE Info_colorspace(VALUE self) { Info *info; Data_Get_Struct(self, Info, info); return ColorspaceType_new(info->colorspace); } /** * Set the colorspace type * * Ruby usage: * - @verbatim Info#colorspace= @endverbatim * * @param self this object * @param colorspace the colorspace type * @return self * @throw ArgumentError */ VALUE Info_colorspace_eq(VALUE self, VALUE colorspace) { Info *info; Data_Get_Struct(self, Info, info); VALUE_TO_ENUM(colorspace, info->colorspace, ColorspaceType); return self; } OPTION_ATTR_ACCESSOR(comment, Comment) /** * Get the compression type. * * Ruby usage: * - @verbatim Info#compression @endverbatim * * @param self this object * @return the compression type */ VALUE Info_compression(VALUE self) { Info *info; Data_Get_Struct(self, Info, info); return CompressionType_new(info->compression); } /** * Set the compression type * * Ruby usage: * - @verbatim Info#compression= @endverbatim * * @param self this object * @param type the compression type * @return self * @throw ArgumentError */ VALUE Info_compression_eq(VALUE self, VALUE type) { Info *info; Data_Get_Struct(self, Info, info); VALUE_TO_ENUM(type, info->compression, CompressionType); return self; } /** * Call SetImageOption * * Ruby usage: * - @verbatim Info#define(format, key) @endverbatim * - @verbatim Info#define(format, key, value) @endverbatim * * Notes: * - Default value is the empty string * - This is the only method in Info that is not an attribute accessor. * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self */ VALUE Info_define(int argc, VALUE *argv, VALUE self) { Info *info; char *format, *key; const char *value = ""; long format_l, key_l; char ckey[100]; unsigned int okay; volatile VALUE fmt_arg; Data_Get_Struct(self, Info, info); switch (argc) { case 3: /* Allow any argument that supports to_s */ fmt_arg = rb_String(argv[2]); value = (const char *)StringValuePtr(fmt_arg); case 2: key = rm_str2cstr(argv[1], &key_l); format = rm_str2cstr(argv[0], &format_l); break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc); } if (2 + format_l + key_l > (long)sizeof(ckey)) { rb_raise(rb_eArgError, "%.20s:%.20s not defined - format or key too long", format, key); } (void) sprintf(ckey, "%s:%s", format, key); (void) RemoveImageOption(info, ckey); okay = SetImageOption(info, ckey, value); if (!okay) { rb_warn("%.20s=\"%.78s\" not defined - SetImageOption failed.", ckey, value); return Qnil; } return self; } /** * Get the delay attribute. * * Ruby usage: * - @verbatim Info#delay @endverbatim * * Notes: * - Convert from string to numeric * * @param self this object * @return the delay */ VALUE Info_delay(VALUE self) { Info *info; const char *delay; char *p; long d; Data_Get_Struct(self, Info, info); delay = GetImageOption(info, "delay"); if (delay) { d = strtol(delay, &p, 10); if (*p != '\0') { rb_raise(rb_eRangeError, "failed to convert %s to Numeric", delay); } return LONG2NUM(d); } return Qnil; } /** * Will raise an exception if `arg' can't be converted to an int. * * No Ruby usage (internal function) * * @param arg the argument * @return arg */ static VALUE arg_is_integer(VALUE arg) { int d = NUM2INT(arg); d = d; // satisfy icc return arg; } /** * Set the delay attribute. * * Ruby usage: * - @verbatim Info#delay= @endverbatim * * Notes: * - Convert from numeric value to string. * * @param self this object * @param string the delay * @return self */ VALUE Info_delay_eq(VALUE self, VALUE string) { Info *info; int delay; int not_num; char dstr[20]; Data_Get_Struct(self, Info, info); if (NIL_P(string)) { (void) RemoveImageOption(info, "delay"); } else { not_num = 0; (void) rb_protect(arg_is_integer, string, ¬_num); if (not_num) { rb_raise(rb_eTypeError, "failed to convert %s into Integer", rb_class2name(CLASS_OF(string))); } delay = NUM2INT(string); sprintf(dstr, "%d", delay); (void) RemoveImageOption(info, "delay"); (void) SetImageOption(info, "delay", dstr); } return self; } /** * Get the density attribute * * Ruby usage: * - @verbatim Info#density @endverbatim * * @param self this object * @return the density */ DEF_ATTR_READER(Info, density, str) /** * Set the text rendering density * * Ruby usage: * - @verbatim Info#density= @endverbatim * * Notes: * - density should be a string, e.g., "72x72" * * @param self this object * @param density_arg the density * @return self * @throw ArgumentError */ VALUE Info_density_eq(VALUE self, VALUE density_arg) { Info *info; volatile VALUE density; char *dens; Data_Get_Struct(self, Info, info); if (NIL_P(density_arg)) { magick_free(info->density); info->density = NULL; return self; } density = rm_to_s(density_arg); dens = StringValuePtr(density); if (!IsGeometry(dens)) { rb_raise(rb_eArgError, "invalid density geometry: %s", dens); } magick_clone_string(&info->density, dens); return self; } /** * Get the depth attribute * * Ruby usage: * - @verbatim Info#depth @endverbatim * * @param self this object * @return the depth */ DEF_ATTR_READER(Info, depth, int) /** * Set the depth (8, 16, 32). * * Ruby usage: * - @verbatim Info#depth= @endverbatim * * @param self this object * @param depth the depth * @return self * @throw ArgumentError */ VALUE Info_depth_eq(VALUE self, VALUE depth) { Info *info; unsigned long d; Data_Get_Struct(self, Info, info); d = NUM2ULONG(depth); switch (d) { case 8: // always okay #if QuantumDepth == 16 || QuantumDepth == 32 || QuantumDepth == 64 case 16: #if QuantumDepth == 32 || QuantumDepth == 64 case 32: #if QuantumDepth == 64 case 64: #endif #endif #endif break; default: rb_raise(rb_eArgError, "invalid depth (%lu)", d); break; } info->depth = d; return self; } /** A dispose option */ static struct { const char *string; /**< the argument given by the user */ const char *enum_name; /**< the enumerator name */ DisposeType enumerator; /**< the enumerator itself */ } Dispose_Option[] = { { "Background", "BackgroundDispose", BackgroundDispose}, { "None", "NoneDispose", NoneDispose}, { "Previous", "PreviousDispose", PreviousDispose}, { "Undefined", "UndefinedDispose", UndefinedDispose}, { "0", "UndefinedDispose", UndefinedDispose}, { "1", "NoneDispose", NoneDispose}, { "2", "BackgroundDispose", BackgroundDispose}, { "3", "PreviousDispose", PreviousDispose}, }; /** Number of dispose options */ #define N_DISPOSE_OPTIONS (int)(sizeof(Dispose_Option)/sizeof(Dispose_Option[0])) /** * Retrieve a dispose option string and convert it to a DisposeType enumerator. * * No Ruby usage (internal function) * * @param name the dispose string * @return the DisposeType enumerator */ DisposeType rm_dispose_to_enum(const char *name) { DisposeType dispose = UndefinedDispose; int x; for (x = 0; x < N_DISPOSE_OPTIONS; x++) { if (strcmp(Dispose_Option[x].string, name) == 0) { dispose = Dispose_Option[x].enumerator; break; } } return dispose; } /** * Retrieve the dispose option string and convert it to a DisposeType * enumerator. * * Ruby usage: * - @verbatim Info#dispose @endverbatim * * @param self this object * @return a DisposeType enumerator */ VALUE Info_dispose(VALUE self) { Info *info; int x; ID dispose_id; const char *dispose; Data_Get_Struct(self, Info, info); dispose_id = rb_intern("UndefinedDispose"); // Map the dispose option string to a DisposeType enumerator. dispose=GetImageOption(info, "dispose"); if (dispose) { for (x = 0; x < N_DISPOSE_OPTIONS; x++) { if (strcmp(dispose, Dispose_Option[x].string) == 0) { dispose_id = rb_intern(Dispose_Option[x].enum_name); break; } } } return rb_const_get(Module_Magick, dispose_id); } /** * Convert a DisposeType enumerator into the equivalent dispose option string. * * Ruby usage: * - @verbatim Info#dispose= @endverbatim * * @param self this object * @param disp the DisposeType enumerator * @return self */ VALUE Info_dispose_eq(VALUE self, VALUE disp) { Info *info; DisposeType dispose; const char *option; int x; Data_Get_Struct(self, Info, info); if (NIL_P(disp)) { (void) RemoveImageOption(info, "dispose"); return self; } VALUE_TO_ENUM(disp, dispose, DisposeType); option = "Undefined"; for (x = 0; x < N_DISPOSE_OPTIONS; x++) { if (dispose == Dispose_Option[x].enumerator) { option = Dispose_Option[x].string; break; } } (void) SetImageOption(info, "dispose", option); return self; } DEF_ATTR_ACCESSOR(Info, dither, bool) /** * Get the endian attribute. * * Ruby usage: * - @verbatim Info#endian @endverbatim * * @param self this object * @return the endian (Magick::MSBEndian or Magick::LSBEndian) */ VALUE Info_endian(VALUE self) { Info *info; Data_Get_Struct(self, Info, info); return EndianType_new(info->endian); } /** * Set the endian attribute. * * Ruby usage: * - @verbatim Info#endian= @endverbatim * * @param self this object * @param endian the endian (Magick::MSBEndian or Magick::LSBEndian) * @return self */ VALUE Info_endian_eq(VALUE self, VALUE endian) { Info *info; EndianType type = UndefinedEndian; if (endian != Qnil) { VALUE_TO_ENUM(endian, type, EndianType); } Data_Get_Struct(self, Info, info); info->endian = type; return self; } /** * Get the extract string, e.g. "200x200+100+100" * * Ruby usage: * - @verbatim Info#extract @endverbatim * * Notes: * - Defined for ImageMagick 5.5.6 and later * * @param self this object * @return the extract string */ DEF_ATTR_READER(Info, extract, str) /** * Set the extract string, e.g. "200x200+100+100" * * Ruby usage: * - @verbatim Info#extract= @endverbatim * * Notes: * - Defined for ImageMagick 5.5.6 and later * * @param self this object * @param extract_arg the extract string * @return self * @throw ArgumentError */ VALUE Info_extract_eq(VALUE self, VALUE extract_arg) { Info *info; char *extr; volatile VALUE extract; Data_Get_Struct(self, Info, info); if (NIL_P(extract_arg)) { magick_free(info->extract); info->extract = NULL; return self; } extract = rm_to_s(extract_arg); extr = StringValuePtr(extract); if (!IsGeometry(extr)) { rb_raise(rb_eArgError, "invalid extract geometry: %s", extr); } magick_clone_string(&info->extract, extr); return self; } /** * Get the "filename". * * Ruby usage: * - @verbatim Info#filename @endverbatim * * Notes: * - Only used for Image_capture * * @param self this object * @return the filename ("" if filename not set) * @see Image_capture */ VALUE Info_filename(VALUE self) { Info *info; Data_Get_Struct(self, Info, info); return rb_str_new2(info->filename); } /** * Set the "filename". * * Ruby usage: * - @verbatim Info#filename= @endverbatim * * Notes: * - Only used for Image_capture * * @param self this object * @param filename the filename * @return self * @see Image_capture */ VALUE Info_filename_eq(VALUE self, VALUE filename) { Info *info; char *fname; Data_Get_Struct(self, Info, info); // Allow "nil" - remove current filename if (NIL_P(filename) || StringValuePtr(filename) == NULL) { info->filename[0] = '\0'; } else { // Otherwise copy in filename fname = StringValuePtr(filename); strncpy(info->filename, fname, MaxTextExtent); } return self; } /** * Return the fill color as a String. * * Ruby usage: * - @verbatim Info#fill @endverbatim * * @param self this object * @return the fill color */ VALUE Info_fill(VALUE self) { return get_option(self, "fill"); } /** * Set the fill color * * Ruby usage: * - @verbatim Info#fill= @endverbatim * * @param self this object * @param color the fill color (as a String) * @return self * @throw ArgumentError */ VALUE Info_fill_eq(VALUE self, VALUE color) { return set_color_option(self, "fill", color); } /** * Get the text font. * * Ruby usage: * - @verbatim Info#font @endverbatim * * @param self this object * @return the font */ DEF_ATTR_READER(Info, font, str) /** * Set the text font. * * Ruby usage: * - @verbatim Info#font= @endverbatim * * @param self this object * @param font_arg the font (as a String) * @return self */ VALUE Info_font_eq(VALUE self, VALUE font_arg) { Info *info; char *font; Data_Get_Struct(self, Info, info); if (NIL_P(font_arg) || StringValuePtr(font_arg) == NULL) { magick_free(info->font); info->font = NULL; } else { font = StringValuePtr(font_arg); magick_clone_string(&info->font, font); } return self; } /** * Return the image encoding format. * * Ruby usage: * - @verbatim Info#format @endverbatim * * @param self this object * @return the encoding format */ VALUE Info_format(VALUE self) { Info *info; const MagickInfo *magick_info ; ExceptionInfo exception; Data_Get_Struct(self, Info, info); if (*info->magick) { GetExceptionInfo(&exception); magick_info = GetMagickInfo(info->magick, &exception); (void) DestroyExceptionInfo(&exception); return magick_info ? rb_str_new2(magick_info->name) : Qnil; } return Qnil; } /** * Set the image encoding format. * * Ruby usage: * - @verbatim Info#format= @endverbatim * * @param self this object * @param magick the encoding format * @return self */ VALUE Info_format_eq(VALUE self, VALUE magick) { Info *info; const MagickInfo *m; char *mgk; ExceptionInfo exception; Data_Get_Struct(self, Info, info); GetExceptionInfo(&exception); mgk = StringValuePtr(magick); m = GetMagickInfo(mgk, &exception); CHECK_EXCEPTION() (void) DestroyExceptionInfo(&exception); if (!m) { rb_raise(rb_eArgError, "unknown format: %s", mgk); } strncpy(info->magick, m->name, MaxTextExtent-1); return self; } /** * Get the fuzz. * * Ruby usage: * - @verbatim Info#fuzz @endverbatim * * @param self this object * @return the fuzz * @see Image_fuzz */ DEF_ATTR_READER(Info, fuzz, dbl) /** * Set the fuzz. * * Ruby usage: * - @verbatim Info#fuzz=number @endverbatim * - @verbatim Info#fuzz=NN% @endverbatim * * @param self this object * @param fuzz the fuzz * @return self * @see Image_fuzz_eq */ VALUE Info_fuzz_eq(VALUE self, VALUE fuzz) { Info *info; Data_Get_Struct(self, Info, info); info->fuzz = rm_fuzz_to_dbl(fuzz); return self; } /** A gravity option */ static struct { const char *string; /**< the argument given by the user */ const char *enum_name; /**< the enumerator name */ GravityType enumerator; /**< the enumerator itself */ } Gravity_Option[] = { { "Undefined", "UndefinedGravity", UndefinedGravity}, { "None", "UndefinedGravity", UndefinedGravity}, { "Center", "CenterGravity", CenterGravity}, { "East", "EastGravity", EastGravity}, { "Forget", "ForgetGravity", ForgetGravity}, { "NorthEast", "NorthEastGravity", NorthEastGravity}, { "North", "NorthGravity", NorthGravity}, { "NorthWest", "NorthWestGravity", NorthWestGravity}, { "SouthEast", "SouthEastGravity", SouthEastGravity}, { "South", "SouthGravity", SouthGravity}, { "SouthWest", "SouthWestGravity", SouthWestGravity}, { "West", "WestGravity", WestGravity}, { "Static", "StaticGravity", StaticGravity} }; /** Number of gravity options */ #define N_GRAVITY_OPTIONS (int)(sizeof(Gravity_Option)/sizeof(Gravity_Option[0])) /** * Return the value of the gravity option as a GravityType enumerator. * * No Ruby usage (internal function) * * @param name the name of the gravity option * @return the enumerator for name */ GravityType rm_gravity_to_enum(const char *name) { GravityType gravity = UndefinedGravity; int x; for (x = 0; x < N_GRAVITY_OPTIONS; x++) { if (strcmp(name, Gravity_Option[x].string) == 0) { gravity = Gravity_Option[x].enumerator; break; } } return gravity; } /** * Return the value of the gravity option as a GravityType enumerator. * * Ruby usage: * - @verbatim Info#gravity @endverbatim * * @param self this object * @return the gravity enumerator */ VALUE Info_gravity(VALUE self) { Info *info; const char *gravity; int x; ID gravity_id; Data_Get_Struct(self, Info, info); gravity_id = rb_intern("UndefinedGravity"); // Map the gravity option string to a GravityType enumerator. gravity=GetImageOption(info, "gravity"); if (gravity) { for (x = 0; x < N_GRAVITY_OPTIONS; x++) { if (strcmp(gravity, Gravity_Option[x].string) == 0) { gravity_id = rb_intern(Gravity_Option[x].enum_name); break; } } } return rb_const_get(Module_Magick, gravity_id); } /** * Convert a GravityType enum to a gravity option name and store in the Info * structure. * * Ruby usage: * - @verbatim Info#gravity= @endverbatim * * @param self this object * @param grav the gravity enumerator * @return self */ VALUE Info_gravity_eq(VALUE self, VALUE grav) { Info *info; GravityType gravity; const char *option; int x; Data_Get_Struct(self, Info, info); if (NIL_P(grav)) { (void) RemoveImageOption(info, "gravity"); return self; } VALUE_TO_ENUM(grav, gravity, GravityType); option = "Undefined"; for (x = 0; x < N_GRAVITY_OPTIONS; x++) { if (gravity == Gravity_Option[x].enumerator) { option = Gravity_Option[x].string; break; } } (void) SetImageOption(info, "gravity", option); return self; } DEF_ATTR_ACCESSOR(Info, group, long) /** * Get the classification type. * * Ruby usage: * - @verbatim Info#image_type @endverbatim * * @param self this object * @return the classification type */ VALUE Info_image_type(VALUE self) { Info *info; Data_Get_Struct(self, Info, info); return ImageType_new(info->type); } /** * Set the classification type. * * Ruby usage: * - @verbatim Info#image_type= @endverbatim * * @param self this object * @param type the classification type * @return self * @throw ArgumentError */ VALUE Info_image_type_eq(VALUE self, VALUE type) { Info *info; Data_Get_Struct(self, Info, info); VALUE_TO_ENUM(type, info->type, ImageType); return self; } /** * Get the interlace type. * * Ruby usage: * - @verbatim Info#interlace @endverbatim * * @param self this object * @return the interlace type */ VALUE Info_interlace(VALUE self) { Info *info; Data_Get_Struct(self, Info, info); return InterlaceType_new(info->interlace); } /** * Set the interlace type * * Ruby usage: * - @verbatim Info#interlace= @endverbatim * * @param self this object * @param inter the interlace type * @return self * @throw ArgumentError */ VALUE Info_interlace_eq(VALUE self, VALUE inter) { Info *info; Data_Get_Struct(self, Info, info); VALUE_TO_ENUM(inter, info->interlace, InterlaceType); return self; } OPTION_ATTR_ACCESSOR(label, Label) /** * Return the name of the matte color as a String. * * Ruby usage: * - @verbatim Info#matte_color @endverbatim * * @param self this object * @return the name of the matte color * @see Image_matte_color */ VALUE Info_matte_color(VALUE self) { Info *info; Data_Get_Struct(self, Info, info); return rm_pixelpacket_to_color_name_info(info, &info->matte_color); } /** * Set the matte color. * * Ruby usage: * - @verbatim Info#matte_color= @endverbatim * * @param self this object * @param matte_arg the name of the matte as a String * @return self * @throw ArgumentError */ VALUE Info_matte_color_eq(VALUE self, VALUE matte_arg) { Info *info; //char colorname[MaxTextExtent]; Data_Get_Struct(self, Info, info); Color_to_PixelPacket(&info->matte_color, matte_arg); //SetImageOption(info, "mattecolor", pixel_packet_to_hexname(&info->matte_color, colorname)); return self; } /** * Establish a progress monitor. * * Ruby usage: * - @verbatim Info#monitor= @endverbatim * * @param self this object * @param monitor the monitor * @return self * @see Image_monitor_eq */ VALUE Info_monitor_eq(VALUE self, VALUE monitor) { Info *info; Data_Get_Struct(self, Info, info); if (NIL_P(monitor)) { info->progress_monitor = NULL; } else { (void) SetImageInfoProgressMonitor(info, rm_progress_monitor, (void *)monitor); } return self; } DEF_ATTR_ACCESSOR(Info, monochrome, bool) DEF_ATTR_ACCESSOR(Info, number_scenes, ulong) /** * Return the orientation attribute as an OrientationType enum value. * * Ruby usage: * - @verbatim Info#orientation @endverbatim * * @param self this object * @return the orientation */ VALUE Info_orientation(VALUE self) { Info *info; Data_Get_Struct(self, Info, info); return OrientationType_new(info->orientation); } /** * Set the Orientation type. * * Ruby usage: * - @verbatim Info#Orientation= @endverbatim * * @param self this object * @param inter the orientation type as an OrientationType enum value * @return self * @throw ArgumentError */ VALUE Info_orientation_eq(VALUE self, VALUE inter) { Info *info; Data_Get_Struct(self, Info, info); VALUE_TO_ENUM(inter, info->orientation, OrientationType); return self; } /** * Return origin geometry. * * Ruby usage: * - @verbatim Info#origin @endverbatim * * @param self this object * @return the origin geometry */ VALUE Info_origin(VALUE self) { Info *info; const char *origin; Data_Get_Struct(self, Info, info); origin = GetImageOption(info, "origin"); return origin ? rb_str_new2(origin) : Qnil; } /** * Set origin geometry. Argument may be a Geometry object as well as a geometry * string. * * Ruby usage: * - @verbatim Info#origin=+-x+-y @endverbatim * * @param self this object * @param origin_arg the origin geometry * @return self */ VALUE Info_origin_eq(VALUE self, VALUE origin_arg) { Info *info; volatile VALUE origin_str; char *origin; Data_Get_Struct(self, Info, info); if (NIL_P(origin_arg)) { (void) RemoveImageOption(info, "origin"); return self; } origin_str = rm_to_s(origin_arg); origin = GetPageGeometry(StringValuePtr(origin_str)); if (IsGeometry(origin) == MagickFalse) { rb_raise(rb_eArgError, "invalid origin geometry: %s", origin); } (void) SetImageOption(info, "origin", origin); return self; } /** * Get the Postscript page geometry. * * Ruby usage: * - @verbatim Info_page @endverbatim * * @param self this object * @return the page geometry */ VALUE Info_page(VALUE self) { Info *info; Data_Get_Struct(self, Info, info); return info->page ? rb_str_new2(info->page) : Qnil; } /** * Store the Postscript page geometry. Argument may be a Geometry object as well * as a geometry string. * * Ruby usage: * - @verbatim Info#page= @endverbatim * * @param self this object * @param page_arg the geometry * @return self */ VALUE Info_page_eq(VALUE self, VALUE page_arg) { Info *info; volatile VALUE geom_str; char *geometry; Data_Get_Struct(self, Info, info); if (NIL_P(page_arg)) { magick_free(info->page); info->page = NULL; return self; } geom_str = rm_to_s(page_arg); geometry=GetPageGeometry(StringValuePtr(geom_str)); if (*geometry == '\0') { magick_free(info->page); info->page = NULL; return self; } magick_clone_string(&info->page, geometry); return self; } DEF_ATTR_ACCESSOR(Info, pointsize, dbl) DEF_ATTR_ACCESSOR(Info, quality, ulong) /** * Get sampling factors used by JPEG or MPEG-2 encoder and YUV decoder/encoder. * * Ruby usage: * - @verbatim Info#sampling_factor @endverbatim * * @param self this object * @return the sampling factors */ VALUE Info_sampling_factor(VALUE self) { Info *info; Data_Get_Struct(self, Info, info); if (info->sampling_factor) { return rb_str_new2(info->sampling_factor); } else { return Qnil; } } /** * Set sampling factors used by JPEG or MPEG-2 encoder and YUV decoder/encoder. * * Ruby usage: * - @verbatim Info#sampling_factor= @endverbatim * * @param self this object * @param sampling_factor the sampling factors * @return self */ VALUE Info_sampling_factor_eq(VALUE self, VALUE sampling_factor) { Info *info; char *sampling_factor_p = NULL; long sampling_factor_len = 0; Data_Get_Struct(self, Info, info); if (!NIL_P(sampling_factor)) { sampling_factor_p = rm_str2cstr(sampling_factor, &sampling_factor_len); } if (info->sampling_factor) { magick_free(info->sampling_factor); info->sampling_factor = NULL; } if (sampling_factor_len > 0) { magick_clone_string(&info->sampling_factor, sampling_factor_p); } return self; } /** * Get the scene number. * * Ruby usage: * - @verbatim Info#scene @endverbatim * * @param self this object * @return the scene number */ VALUE Info_scene(VALUE self) { Info *info; Data_Get_Struct(self, Info, info); return ULONG2NUM(info->scene); } /** * Set the scene number. * * Ruby usage: * - @verbatim Info#scene= @endverbatim * * @param self this object * @param scene the scene number * @return self */ VALUE Info_scene_eq(VALUE self, VALUE scene) { Info *info; char buf[25]; Data_Get_Struct(self, Info, info); info->scene = NUM2ULONG(scene); #if defined(HAVE_SNPRINTF) (void) snprintf(buf, sizeof(buf), "%-ld", info->scene); #else (void) sprintf(buf, "%-l", info->scene); #endif (void) SetImageOption(info, "scene", buf); return self; } /** * Get the server name. * * Ruby usage: * - @verbatim Info#server_name @endverbatim * * @param self this object * @return the server name */ DEF_ATTR_READER(Info, server_name, str) /** * Set the server name. * * Ruby usage: * - @verbatim Info#server_name= @endverbatim * * @param self this object * @param server_arg the server name as a String * @return self */ VALUE Info_server_name_eq(VALUE self, VALUE server_arg) { Info *info; char *server; Data_Get_Struct(self, Info, info); if (NIL_P(server_arg) || StringValuePtr(server_arg) == NULL) { magick_free(info->server_name); info->server_name = NULL; } else { server = StringValuePtr(server_arg); magick_clone_string(&info->server_name, server); } return self; } /** * Get ths size * * Ruby usage: * - @verbatim Info#size @endverbatim * * @param self this object * @return the size as a Geometry object */ DEF_ATTR_READER(Info, size, str) /** * Set the size (either as a Geometry object or a Geometry string, i.e. * WxH{+-}x{+-}y) * * Ruby usage: * - @verbatim Info#size= @endverbatim * * @param self this object * @param size_arg the size * @return self * @throw ArgumentError */ VALUE Info_size_eq(VALUE self, VALUE size_arg) { Info *info; volatile VALUE size; char *sz; Data_Get_Struct(self, Info, info); if (NIL_P(size_arg)) { magick_free(info->size); info->size = NULL; return self; } size = rm_to_s(size_arg); sz = StringValuePtr(size); if (!IsGeometry(sz)) { rb_raise(rb_eArgError, "invalid size geometry: %s", sz); } magick_clone_string(&info->size, sz); return self; } /** * Return the stroke color as a String. * * Ruby usage: * - @verbatim Info#stroke @endverbatim * * @param self this object * @return the stroke color */ VALUE Info_stroke(VALUE self) { return get_option(self, "stroke"); } /** * Set the stroke color * * Ruby usage: * - @verbatim Info#stroke= @endverbatim * * @param self this object * @param color the stroke color as a String * @return self * @throw ArgumentError */ VALUE Info_stroke_eq(VALUE self, VALUE color) { return set_color_option(self, "stroke", color); } /** * Support for caption: format. * * Ruby usage: * - @verbatim Info#stroke_width @endverbatim * * Notes: * - Supported in ImageMagick >= 6.3.2-6 * * @param self this object * @return the stroke width */ VALUE Info_stroke_width(VALUE self) { return get_dbl_option(self, "strokewidth"); } /** * Support for caption: format. * * Ruby usage: * - @verbatim Info#stroke_width= @endverbatim * * Notes: * - Supported in ImageMagick >= 6.3.2-6 * * @param self this object * @param stroke_width the stroke width * @return self */ VALUE Info_stroke_width_eq(VALUE self, VALUE stroke_width) { return set_dbl_option(self, "strokewidth", stroke_width); } /** * Set name of texture to tile onto the image background. * * Ruby usage: * - @verbatim Image::Info#texture= @endverbatim * * @param self this object * @param texture the name of the texture image * @return self */ VALUE Info_texture_eq(VALUE self, VALUE texture) { Info *info; Image *image; char name[MaxTextExtent]; Data_Get_Struct(self, Info, info); // Delete any existing texture file if (info->texture) { rm_delete_temp_image(info->texture); magick_free(info->texture); info->texture = NULL; } // If argument is nil we're done if (texture == Qnil) { return self; } // Create a temp copy of the texture and store its name in the texture field image = rm_check_destroyed(texture); rm_write_temp_image(image, name); magick_clone_string(&info->texture, name); return self; } /** * info.tile_offset = [+/-]x[+/-]y. * * Ruby usage: * - @verbatim Image::Info#tile_offset= @endverbatim * * @param self this object * @param offset the offset * @return self */ VALUE Info_tile_offset_eq(VALUE self, VALUE offset) { Info *info; volatile VALUE offset_str; char *tile_offset; offset_str = rm_to_s(offset); tile_offset = StringValuePtr(offset_str); if (!IsGeometry(tile_offset)) { rb_raise(rb_eArgError, "invalid tile offset geometry: %s", tile_offset); } Data_Get_Struct(self, Info, info); (void) DeleteImageOption(info, "tile-offset"); (void) SetImageOption(info, "tile-offset", tile_offset); return self; } /** * Return the name of the transparent color as a String. * * Ruby usage: * - @verbatim Info#transparent_color @endverbatim * * @param self this object * @return the name of the transparent color * @see Image_transparent_color */ VALUE Info_transparent_color(VALUE self) { Info *info; Data_Get_Struct(self, Info, info); return rm_pixelpacket_to_color_name_info(info, &info->transparent_color); } /** * Set the transparent color. * * Ruby usage: * - @verbatim Info#transparent_color= @endverbatim * * @param self this object * @param tc_arg the transparent color as a String * @return self * @throw ArgumentError */ VALUE Info_transparent_color_eq(VALUE self, VALUE tc_arg) { Info *info; //char colorname[MaxTextExtent]; Data_Get_Struct(self, Info, info); Color_to_PixelPacket(&info->transparent_color, tc_arg); //SetImageOption(info, "transparent", pixel_packet_to_hexname(&info->transparent_color, colorname)); return self; } /** * Return tile_offset attribute values. * * Ruby usage: * - @verbatim Image::Info#tile_offset @endverbatim * * @param self this object * @return the tile offset */ VALUE Info_tile_offset(VALUE self) { Info *info; const char *tile_offset; Data_Get_Struct(self, Info, info); tile_offset = GetImageOption(info, "tile-offset"); if (!tile_offset) { return Qnil; } return rb_str_new2(tile_offset); } /** * Undefine image option. * * Ruby usage: * - @verbatim Info#undefine(format,key) @endverbatim * * @param self this object * @param format the format * @param key the key * @return self */ VALUE Info_undefine(VALUE self, VALUE format, VALUE key) { Info *info; char *format_p, *key_p; long format_l, key_l; char fkey[MaxTextExtent]; format_p = rm_str2cstr(format, &format_l); key_p = rm_str2cstr(key, &key_l); if (format_l > MAX_FORMAT_LEN || format_l + key_l > MaxTextExtent) { rb_raise(rb_eArgError, "can't undefine %.60s:%.1024s - too long", format_p, key_p); } sprintf(fkey, "%.60s:%.*s", format_p, (int)(MaxTextExtent-61), key_p); Data_Get_Struct(self, Info, info); /* Depending on the IM version, RemoveImageOption returns either */ /* char * or MagickBooleanType. Ignore the return value. */ (void) RemoveImageOption(info, fkey); return self; } /** * Return the undercolor color as a String. * * Ruby usage: * - @verbatim Info#undercolor @endverbatim * * @param self this object * @return the undercolor */ VALUE Info_undercolor(VALUE self) { return get_option(self, "undercolor"); } /** * Set the undercolor color. * * Ruby usage: * - @verbatim Info#undercolor= @endverbatim * * @param self this object * @param color the undercolor color as a String * @return self * @throw ArgumentError */ VALUE Info_undercolor_eq(VALUE self, VALUE color) { return set_color_option(self, "undercolor", color); } /** * Get the resolution type. * * Ruby usage: * - @verbatim Info#units @endverbatim * * @param self this object * @return the resolution type */ VALUE Info_units(VALUE self) { Info *info; Data_Get_Struct(self, Info, info); return ResolutionType_new(info->units); } /** * Set the resolution type * * Ruby usage: * - @verbatim Info#units= @endverbatim * * @param self this object * @param units the resolution type * @return self * @throw ArgumentError */ VALUE Info_units_eq(VALUE self, VALUE units) { Info *info; Data_Get_Struct(self, Info, info); VALUE_TO_ENUM(units, info->units, ResolutionType); return self; } /** * Get FlashPix viewing parameters. * * Ruby usage: * - @verbatim Info#view @endverbatim * * @param self this object. * @return the viewing parameters */ DEF_ATTR_READER(Info, view, str) /** * Set FlashPix viewing parameters. * * Ruby usage: * - @verbatim Info#view= @endverbatim * * @param self this object * @param view_arg the viewing parameters * @return self */ VALUE Info_view_eq(VALUE self, VALUE view_arg) { Info *info; char *view; Data_Get_Struct(self, Info, info); if (NIL_P(view_arg) || StringValuePtr(view_arg) == NULL) { magick_free(info->view); info->view = NULL; } else { view = StringValuePtr(view_arg); magick_clone_string(&info->view, view); } return self; } /** * If there is a texture image, delete it before destroying the ImageInfo * structure. * * No Ruby usage (internal function) * * @param infoptr pointer to the Info object */ static void destroy_Info(void *infoptr) { Info *info = (Info *)infoptr; if (info->texture) { rm_delete_temp_image(info->texture); magick_free(info->texture); info->texture = NULL; } (void) DestroyImageInfo(info); } /** * Create an ImageInfo object. * * No Ruby usage (internal function) * * @param class the Ruby class to use * @return a new ImageInfo object */ VALUE Info_alloc(VALUE class) { Info *info; volatile VALUE info_obj; info = CloneImageInfo(NULL); if (!info) { rb_raise(rb_eNoMemError, "not enough memory to initialize Info object"); } info_obj = Data_Wrap_Struct(class, NULL, destroy_Info, info); return info_obj; } /** * Provide a Info.new method for internal use. * * No Ruby usage (internal function) * * Notes: * - Takes no parameters, but runs the parm block if present * * @return a new ImageInfo object */ VALUE rm_info_new(void) { volatile VALUE info_obj; info_obj = Info_alloc(Class_Info); return Info_initialize(info_obj); } /** * If an initializer block is present, run it. * * Ruby usage: * - @verbatim Info#initialize @endverbatim * * @param self this object * @return self */ VALUE Info_initialize(VALUE self) { if (rb_block_given_p()) { // Run the block in self's context (void) rb_obj_instance_eval(0, NULL, self); } return self; } rmagick-2.13.2/ext/RMagick/rmmontage.c0000644000004100000410000002420712147515547017536 0ustar www-datawww-data/**************************************************************************//** * Contains Montage class methods. * * Copyright © 2002 - 2009 by Timothy P. Hunter * * Changes since Nov. 2009 copyright © by Benjamin Thomas and Omer Bar-or * * @file rmmontage.c * @version $Id: rmmontage.c,v 1.5 2009/12/20 02:33:33 baror Exp $ * @author Tim Hunter ******************************************************************************/ #include "rmagick.h" /** * Destory the MontageInfo struct and free the Montage struct. * * No Ruby usage (internal function) * * Notes: * - If the Magick::Montage#texture method wrote a texture file, the file is * deleted here. * * @param obj the montage object */ static void destroy_Montage(void *obj) { Montage *montage = obj; // If we saved a temporary texture image, delete it now. if (montage->info && montage->info->texture != NULL) { rm_delete_temp_image(montage->info->texture); magick_free(montage->info->texture); montage->info->texture = NULL; } if (montage->info) { (void) DestroyMontageInfo(montage->info); montage->info = NULL; } xfree(montage); } /** * Create a new Montage object. * * Ruby usage: * - @verbatim Montage.new @endverbatim * * @param class the Ruby class to use * @return a new Montage object */ VALUE Montage_alloc(VALUE class) { MontageInfo *montage_info; Montage *montage; Info *image_info; volatile VALUE montage_obj; // DO NOT call rm_info_new - we don't want to support an Info parm block. image_info = CloneImageInfo(NULL); if (!image_info) { rb_raise(rb_eNoMemError, "not enough memory to initialize Info object"); } montage_info = CloneMontageInfo(image_info, NULL); (void) (void) DestroyImageInfo(image_info); if (!montage_info) { rb_raise(rb_eNoMemError, "not enough memory to initialize Magick::Montage object"); } montage = ALLOC(Montage); montage->info = montage_info; montage->compose = OverCompositeOp; montage_obj = Data_Wrap_Struct(class, NULL, destroy_Montage, montage); return montage_obj; } /** * Set background_color value. * * Ruby usage: * - @verbatim Magick::Montage#background_color(color-name) @endverbatim * * @param self this object * @param color the color name * @return self */ VALUE Montage_background_color_eq(VALUE self, VALUE color) { Montage *montage; Data_Get_Struct(self, Montage, montage); Color_to_PixelPacket(&montage->info->background_color, color); return self; } /** * Set border_color value. * * Ruby usage: * - @verbatim Magick::Montage#border_color(color-name) @endverbatim * * @param self this object * @param color the color name * @return self */ VALUE Montage_border_color_eq(VALUE self, VALUE color) { Montage *montage; Data_Get_Struct(self, Montage, montage); Color_to_PixelPacket(&montage->info->border_color, color); return self; } /** * Set border_width value. * * Ruby usage: * - @verbatim Magick::Montage#border_width(width) @endverbatim * * @param self this object * @param width the width * @return self */ VALUE Montage_border_width_eq(VALUE self, VALUE width) { Montage *montage; Data_Get_Struct(self, Montage, montage); montage->info->border_width = NUM2ULONG(width); return self; } /** * Set a composition operator. * * Ruby usage: * - @verbatim Magick::Montage#compose(width) @endverbatim * * @param self this object * @param compose the composition operator * @return self */ VALUE Montage_compose_eq(VALUE self, VALUE compose) { Montage *montage; Data_Get_Struct(self, Montage, montage); VALUE_TO_ENUM(compose, montage->compose, CompositeOperator); return self; } /** * Set filename value. * * Ruby usage: * - @verbatim Magick::Montage#filename(name) @endverbatim * * @param self this object * @param filename the filename * @return self */ VALUE Montage_filename_eq(VALUE self, VALUE filename) { Montage *montage; Data_Get_Struct(self, Montage, montage); strncpy(montage->info->filename, StringValuePtr(filename), MaxTextExtent-1); return self; } /** * Set fill value. * * Ruby usage: * - @verbatim Magick::Montage#fill(color-name) @endverbatim * * @param self this object * @param color the color name * @return self */ VALUE Montage_fill_eq(VALUE self, VALUE color) { Montage *montage; Data_Get_Struct(self, Montage, montage); Color_to_PixelPacket(&montage->info->fill, color); return self; } /** * Set font value. * * Ruby usage: * - @verbatim Magick::Montage#font(font-name) @endverbatim * * @param self this object * @param font the font name * @return self */ VALUE Montage_font_eq(VALUE self, VALUE font) { Montage *montage; Data_Get_Struct(self, Montage, montage); magick_clone_string(&montage->info->font, StringValuePtr(font)); return self; } /** * Set frame value. * * Ruby usage: * - @verbatim Magick::Montage#frame(frame-geometry) @endverbatim * * Notes: * - The geometry is a string in the form: * @verbatim x++ @endverbatim * or a Geometry object * * @param self this object * @param frame_arg the frame geometry * @return self */ VALUE Montage_frame_eq(VALUE self, VALUE frame_arg) { Montage *montage; volatile VALUE frame; Data_Get_Struct(self, Montage, montage); frame = rm_to_s(frame_arg); magick_clone_string(&montage->info->frame, StringValuePtr(frame)); return self; } /** * Set geometry value. * * Ruby usage: * - @verbatim Magick::Montage#geometry(geometry) @endverbatim * * @param self this object * @param geometry_arg the geometry * @return self */ VALUE Montage_geometry_eq(VALUE self, VALUE geometry_arg) { Montage *montage; volatile VALUE geometry; Data_Get_Struct(self, Montage, montage); geometry = rm_to_s(geometry_arg); magick_clone_string(&montage->info->geometry, StringValuePtr(geometry)); return self; } /** * Set gravity value. * * Ruby usage: * - @verbatim Magick::Montage#gravity(gravity-type) @endverbatim * * @param self this object * @param gravity the gravity type * @return self */ VALUE Montage_gravity_eq(VALUE self, VALUE gravity) { Montage *montage; Data_Get_Struct(self, Montage, montage); VALUE_TO_ENUM(gravity, montage->info->gravity, GravityType); return self; } /** * Initialize a Montage object. Does nothing currently. * * Ruby usage: * - @verbatim Magick::Montage#initialize @endverbatim * * @param self this object * @return self */ VALUE Montage_initialize(VALUE self) { // Nothing to do! return self; } /** * Set matte_color value. * * Ruby usage: * - @verbatim Magick::Montage#matte_color(color-name) @endverbatim * * @param self this object * @param color the color name * @return self */ VALUE Montage_matte_color_eq(VALUE self, VALUE color) { Montage *montage; Data_Get_Struct(self, Montage, montage); Color_to_PixelPacket(&montage->info->matte_color, color); return self; } /** * Set pointsize value. * * Ruby usage: * - @verbatim Magick::Montage#pointsize= @endverbatim * * @param self this object * @param size the point size * @return self */ VALUE Montage_pointsize_eq(VALUE self, VALUE size) { Montage *montage; Data_Get_Struct(self, Montage, montage); montage->info->pointsize = NUM2DBL(size); return self; } /** * Set shadow value. * * Ruby usage: * - @verbatim Magick::Montage#shadow= @endverbatim * * @param self this object * @param shadow the shadow * @return self */ VALUE Montage_shadow_eq(VALUE self, VALUE shadow) { Montage *montage; Data_Get_Struct(self, Montage, montage); montage->info->shadow = (MagickBooleanType) RTEST(shadow); return self; } /** * Set stroke value. * * Ruby usage: * - @verbatim Magick::Montage#stroke(color-name) @endverbatim * * @param self this object * @param color the color name * @return self */ VALUE Montage_stroke_eq(VALUE self, VALUE color) { Montage *montage; Data_Get_Struct(self, Montage, montage); Color_to_PixelPacket(&montage->info->stroke, color); return self; } /** * Set texture value. * * Ruby usage: * - @verbatim Montage#texture(texture-image) @endverbatim * * @param self this object * @param texture the texture image * @return self */ VALUE Montage_texture_eq(VALUE self, VALUE texture) { Montage *montage; Image *texture_image; char temp_name[MaxTextExtent]; Data_Get_Struct(self, Montage, montage); // If we had a previously defined temp texture image, // remove it now in preparation for this new one. if (montage->info->texture) { rm_delete_temp_image(montage->info->texture); magick_free(montage->info->texture); montage->info->texture = NULL; } texture = rm_cur_image(texture); texture_image = rm_check_destroyed(texture); // Write a temp copy of the image & save its name. rm_write_temp_image(texture_image, temp_name); magick_clone_string(&montage->info->texture, temp_name); return self; } /** * Set tile value. * * Ruby usage: * - @verbatim Magick::Montage#tile(tile) @endverbatim * * @param self this object * @param tile_arg the tile * @return self */ VALUE Montage_tile_eq(VALUE self, VALUE tile_arg) { Montage *montage; volatile VALUE tile; Data_Get_Struct(self, Montage, montage); tile = rm_to_s(tile_arg); magick_clone_string(&montage->info->tile, StringValuePtr(tile)); return self; } /** * Set title value. * * Ruby usage: * - @verbatim Magick::Montage#title(title) @endverbatim * * @param self this object * @param title the title * @return self */ VALUE Montage_title_eq(VALUE self, VALUE title) { Montage *montage; Data_Get_Struct(self, Montage, montage); magick_clone_string(&montage->info->title, StringValuePtr(title)); return self; } /** * Return a new Magick::Montage object. * * No Ruby usage (internal function) * * @return a new Magick::Montage object */ VALUE rm_montage_new(void) { return Montage_initialize(Montage_alloc(Class_Montage)); } rmagick-2.13.2/ext/RMagick/rmfill.c0000644000004100000410000005156312147515547017037 0ustar www-datawww-data/**************************************************************************//** * GradientFill, TextureFill class definitions for RMagick. * * Copyright © 2002 - 2009 by Timothy P. Hunter * * Changes since Nov. 2009 copyright © by Benjamin Thomas and Omer Bar-or * * @file rmfill.c * @version $Id: rmfill.c,v 1.33 2009/12/20 02:33:33 baror Exp $ * @author Tim Hunter ******************************************************************************/ #include "rmagick.h" /** Data associated with a GradientFill */ typedef struct { double x1; /**< x position of first point */ double y1; /**< y position of first point */ double x2; /**< x position of second point */ double y2; /**< y position of second point */ PixelPacket start_color; /**< the start color */ PixelPacket stop_color; /**< the stop color */ } rm_GradientFill; /** Data associated with a TextureFill */ typedef struct { Image *texture; /**< the texture */ } rm_TextureFill; /** * Free Fill or Fill subclass object (except for TextureFill). * * No Ruby usage (internal function) * * @param fill the fill */ static void free_Fill(void *fill) { xfree(fill); } /** * Create new GradientFill object. * * No Ruby usage (internal function) * * @param class the Ruby class to use * @return a new GradientFill object */ VALUE GradientFill_alloc(VALUE class) { rm_GradientFill *fill; return Data_Make_Struct(class, rm_GradientFill, NULL, free_Fill, fill); } /** * Store the vector points and the start and stop colors. * * Ruby usage: * - @verbatim GradientFill#initialize(x1,y1,x2,y2,start_color,stop_color) @endverbatim * * @param self this object * @param x1 x position of first point * @param y1 y position of first point * @param x2 x position of second point * @param y2 y position of second point * @param start_color the start color * @param stop_color the stop color * @return self */ VALUE GradientFill_initialize( VALUE self, VALUE x1, VALUE y1, VALUE x2, VALUE y2, VALUE start_color, VALUE stop_color) { rm_GradientFill *fill; Data_Get_Struct(self, rm_GradientFill, fill); fill->x1 = NUM2DBL(x1); fill->y1 = NUM2DBL(y1); fill->x2 = NUM2DBL(x2); fill->y2 = NUM2DBL(y2); Color_to_PixelPacket(&fill->start_color, start_color); Color_to_PixelPacket(&fill->stop_color, stop_color); return self; } /** * Do a gradient that radiates from a point. * * No Ruby usage (internal function) * * @param image the image on which to do the gradient * @param x0 x position of the point * @param y0 y position of the point * @param start_color the start color * @param stop_color the stop color */ static void point_fill( Image *image, double x0, double y0, PixelPacket *start_color, PixelPacket *stop_color) { double steps, distance; unsigned long x, y; MagickRealType red_step, green_step, blue_step; #if defined(HAVE_SYNCAUTHENTICPIXELS) || defined(HAVE_QUEUEAUTHENTICPIXELS) ExceptionInfo exception; GetExceptionInfo(&exception); #endif steps = sqrt((double)((image->columns-x0)*(image->columns-x0) + (image->rows-y0)*(image->rows-y0))); red_step = ((MagickRealType)stop_color->red - (MagickRealType)start_color->red) / steps; green_step = ((MagickRealType)stop_color->green - (MagickRealType)start_color->green) / steps; blue_step = ((MagickRealType)stop_color->blue - (MagickRealType)start_color->blue) / steps; for (y = 0; y < image->rows; y++) { PixelPacket *row_pixels; #if defined(HAVE_QUEUEAUTHENTICPIXELS) row_pixels = QueueAuthenticPixels(image, 0, (long int)y, image->columns, 1, &exception); CHECK_EXCEPTION() #else row_pixels = SetImagePixels(image, 0, (long int)y, image->columns, 1); rm_check_image_exception(image, RetainOnError); #endif for (x = 0; x < image->columns; x++) { distance = sqrt((double)((x-x0)*(x-x0)+(y-y0)*(y-y0))); row_pixels[x].red = ROUND_TO_QUANTUM(start_color->red + (distance * red_step)); row_pixels[x].green = ROUND_TO_QUANTUM(start_color->green + (distance * green_step)); row_pixels[x].blue = ROUND_TO_QUANTUM(start_color->blue + (distance * blue_step)); row_pixels[x].opacity = OpaqueOpacity; } #if defined(HAVE_SYNCAUTHENTICPIXELS) SyncAuthenticPixels(image, &exception); CHECK_EXCEPTION() #else SyncImagePixels(image); rm_check_image_exception(image, RetainOnError); #endif } #if defined(HAVE_SYNCAUTHENTICPIXELS) || defined(HAVE_QUEUEAUTHENTICPIXELS) DestroyExceptionInfo(&exception); #endif } /** * Do a gradient fill that proceeds from a vertical line to the right and left * sides of the image. * * No Ruby usage (internal function) * * @param image the image on which to do the gradient * @param x1 x position of the vertical line * @param start_color the start color * @param stop_color the stop color */ static void vertical_fill( Image *image, double x1, PixelPacket *start_color, PixelPacket *stop_color) { double steps; unsigned long x, y; PixelPacket *master; MagickRealType red_step, green_step, blue_step; #if defined(HAVE_SYNCAUTHENTICPIXELS) || defined(HAVE_QUEUEAUTHENTICPIXELS) ExceptionInfo exception; GetExceptionInfo(&exception); #endif steps = FMAX(x1, ((long)image->columns)-x1); // If x is to the left of the x-axis, add that many steps so that // the color at the right side will be that many steps away from // the stop color. if (x1 < 0) { steps -= x1; } red_step = ((MagickRealType)stop_color->red - (MagickRealType)start_color->red) / steps; green_step = ((MagickRealType)stop_color->green - (MagickRealType)start_color->green) / steps; blue_step = ((MagickRealType)stop_color->blue - (MagickRealType)start_color->blue) / steps; // All the rows are the same. Make a "master row" and simply copy // it to each actual row. master = ALLOC_N(PixelPacket, image->columns); for (x = 0; x < image->columns; x++) { double distance = fabs(x1 - x); master[x].red = ROUND_TO_QUANTUM(start_color->red + (red_step * distance)); master[x].green = ROUND_TO_QUANTUM(start_color->green + (green_step * distance)); master[x].blue = ROUND_TO_QUANTUM(start_color->blue + (blue_step * distance)); master[x].opacity = OpaqueOpacity; } // Now copy the master row to each actual row. for (y = 0; y < image->rows; y++) { PixelPacket *row_pixels; #if defined(HAVE_QUEUEAUTHENTICPIXELS) row_pixels = QueueAuthenticPixels(image, 0, (long int)y, image->columns, 1, &exception); CHECK_EXCEPTION() #else row_pixels = SetImagePixels(image, 0, (long int)y, image->columns, 1); rm_check_image_exception(image, RetainOnError); #endif memcpy(row_pixels, master, image->columns * sizeof(PixelPacket)); #if defined(HAVE_SYNCAUTHENTICPIXELS) SyncAuthenticPixels(image, &exception); CHECK_EXCEPTION() #else SyncImagePixels(image); rm_check_image_exception(image, RetainOnError); #endif } #if defined(HAVE_SYNCAUTHENTICPIXELS) || defined(HAVE_QUEUEAUTHENTICPIXELS) DestroyExceptionInfo(&exception); #endif xfree((void *)master); } /** * Do a gradient fill that starts from a horizontal line. * * No Ruby usage (internal function) * * @param image the image on which to do the gradient * @param y1 y position of the horizontal line * @param start_color the start color * @param stop_color the stop color */ static void horizontal_fill( Image *image, double y1, PixelPacket *start_color, PixelPacket *stop_color) { double steps; unsigned long x, y; PixelPacket *master; MagickRealType red_step, green_step, blue_step; #if defined(HAVE_SYNCAUTHENTICPIXELS) || defined(HAVE_QUEUEAUTHENTICPIXELS) ExceptionInfo exception; GetExceptionInfo(&exception); #endif steps = FMAX(y1, ((long)image->rows)-y1); // If the line is below the y-axis, add that many steps so the color // at the bottom of the image is that many steps away from the stop color if (y1 < 0) { steps -= y1; } red_step = ((MagickRealType)stop_color->red - (MagickRealType)start_color->red) / steps; green_step = ((MagickRealType)stop_color->green - (MagickRealType)start_color->green) / steps; blue_step = ((MagickRealType)stop_color->blue - (MagickRealType)start_color->blue) / steps; // All the columns are the same, so make a master column and copy it to // each of the "real" columns. master = ALLOC_N(PixelPacket, image->rows); for (y = 0; y < image->rows; y++) { double distance = fabs(y1 - y); master[y].red = ROUND_TO_QUANTUM(start_color->red + (distance * red_step)); master[y].green = ROUND_TO_QUANTUM(start_color->green + (distance * green_step)); master[y].blue = ROUND_TO_QUANTUM(start_color->blue + (distance * blue_step)); master[y].opacity = OpaqueOpacity; } for (x = 0; x < image->columns; x++) { PixelPacket *col_pixels; #if defined(HAVE_QUEUEAUTHENTICPIXELS) col_pixels = QueueAuthenticPixels(image, (long int)x, 0, 1, image->rows, &exception); #else col_pixels = SetImagePixels(image, (long int)x, 0, 1, image->rows); rm_check_image_exception(image, RetainOnError); #endif memcpy(col_pixels, master, image->rows * sizeof(PixelPacket)); #if defined(HAVE_SYNCAUTHENTICPIXELS) SyncAuthenticPixels(image, &exception); CHECK_EXCEPTION() #else SyncImagePixels(image); rm_check_image_exception(image, RetainOnError); #endif } #if defined(HAVE_SYNCAUTHENTICPIXELS) || defined(HAVE_QUEUEAUTHENTICPIXELS) DestroyExceptionInfo(&exception); #endif xfree((PixelPacket *)master); } /** * Do a gradient fill that starts from a diagonal line and ends at the top and * bottom of the image. * * No Ruby usage (internal function) * * @param image the image on which to do the gradient * @param x1 x position of the start of the diagonal line * @param y1 y position of the start of the diagonal line * @param x2 x position of the end of the diagonal line * @param y2 y position of the end of the diagonal line * @param start_color the start color * @param stop_color the stop color */ static void v_diagonal_fill( Image *image, double x1, double y1, double x2, double y2, PixelPacket *start_color, PixelPacket *stop_color) { unsigned long x, y; MagickRealType red_step, green_step, blue_step; double m, b, steps = 0.0; double d1, d2; #if defined(HAVE_SYNCAUTHENTICPIXELS) || defined(HAVE_QUEUEAUTHENTICPIXELS) ExceptionInfo exception; GetExceptionInfo(&exception); #endif // Compute the equation of the line: y=mx+b m = ((double)(y2 - y1))/((double)(x2 - x1)); b = y1 - (m * x1); // The number of steps is the greatest distance between the line and // the top or bottom of the image between x=0 and x=image->columns // When x=0, y=b. When x=image->columns, y = m*image->columns+b d1 = b; d2 = m * image->columns + b; if (d1 < 0 && d2 < 0) { steps += FMAX(fabs(d1),fabs(d2)); } else if (d1 > (double)image->rows && d2 > (double)image->rows) { steps += FMAX(d1-image->rows, d2-image->rows); } d1 = FMAX(b, image->rows-b); d2 = FMAX(d2, image->rows-d2); steps += FMAX(d1, d2); // If the line is entirely > image->rows, swap the start & end color if (steps < 0) { PixelPacket t = *stop_color; *stop_color = *start_color; *start_color = t; steps = -steps; } red_step = ((MagickRealType)stop_color->red - (MagickRealType)start_color->red) / steps; green_step = ((MagickRealType)stop_color->green - (MagickRealType)start_color->green) / steps; blue_step = ((MagickRealType)stop_color->blue - (MagickRealType)start_color->blue) / steps; for (y = 0; y < image->rows; y++) { PixelPacket *row_pixels; #if defined(HAVE_QUEUEAUTHENTICPIXELS) row_pixels = QueueAuthenticPixels(image, 0, (long int)y, image->columns, 1, &exception); CHECK_EXCEPTION() #else row_pixels = SetImagePixels(image, 0, (long int)y, image->columns, 1); rm_check_image_exception(image, RetainOnError); #endif for (x = 0; x < image->columns; x++) { double distance = (double) abs((int)(y-(m * x + b))); row_pixels[x].red = ROUND_TO_QUANTUM(start_color->red + (distance * red_step)); row_pixels[x].green = ROUND_TO_QUANTUM(start_color->green + (distance * green_step)); row_pixels[x].blue = ROUND_TO_QUANTUM(start_color->blue + (distance * blue_step)); row_pixels[x].opacity = OpaqueOpacity; } #if defined(HAVE_SYNCAUTHENTICPIXELS) SyncAuthenticPixels(image, &exception); CHECK_EXCEPTION() #else SyncImagePixels(image); rm_check_image_exception(image, RetainOnError); #endif } #if defined(HAVE_SYNCAUTHENTICPIXELS) || defined(HAVE_QUEUEAUTHENTICPIXELS) DestroyExceptionInfo(&exception); #endif } /** * Do a gradient fill that starts from a diagonal line and ends at the sides of * the image. * * No Ruby usage (internal function) * * @param image the image on which to do the gradient * @param x1 x position of the start of the diagonal line * @param y1 y position of the start of the diagonal line * @param x2 x position of the end of the diagonal line * @param y2 y position of the end of the diagonal line * @param start_color the start color * @param stop_color the stop color */ static void h_diagonal_fill( Image *image, double x1, double y1, double x2, double y2, PixelPacket *start_color, PixelPacket *stop_color) { unsigned long x, y; double m, b, steps = 0.0; MagickRealType red_step, green_step, blue_step; double d1, d2; #if defined(HAVE_SYNCAUTHENTICPIXELS) || defined(HAVE_QUEUEAUTHENTICPIXELS) ExceptionInfo exception; GetExceptionInfo(&exception); #endif // Compute the equation of the line: y=mx+b m = ((double)(y2 - y1))/((double)(x2 - x1)); b = y1 - (m * x1); // The number of steps is the greatest distance between the line and // the left or right side of the image between y=0 and y=image->rows. // When y=0, x=-b/m. When y=image->rows, x = (image->rows-b)/m. d1 = -b/m; d2 = (double) ((image->rows-b) / m); // If the line is entirely to the right or left of the image, increase // the number of steps. if (d1 < 0 && d2 < 0) { steps += FMAX(fabs(d1),fabs(d2)); } else if (d1 > (double)image->columns && d2 > (double)image->columns) { steps += FMAX(abs((int)(image->columns-d1)),abs((int)(image->columns-d2))); } d1 = FMAX(d1, image->columns-d1); d2 = FMAX(d2, image->columns-d2); steps += FMAX(d1, d2); // If the line is entirely > image->columns, swap the start & end color if (steps < 0) { PixelPacket t = *stop_color; *stop_color = *start_color; *start_color = t; steps = -steps; } red_step = ((MagickRealType)stop_color->red - (MagickRealType)start_color->red) / steps; green_step = ((MagickRealType)stop_color->green - (MagickRealType)start_color->green) / steps; blue_step = ((MagickRealType)stop_color->blue - (MagickRealType)start_color->blue) / steps; for (y = 0; y < image->rows; y++) { PixelPacket *row_pixels; #if defined(HAVE_QUEUEAUTHENTICPIXELS) row_pixels = QueueAuthenticPixels(image, 0, (long int)y, image->columns, 1, &exception); CHECK_EXCEPTION() #else row_pixels = SetImagePixels(image, 0, (long int)y, image->columns, 1); rm_check_image_exception(image, RetainOnError); #endif for (x = 0; x < image->columns; x++) { double distance = (double) abs((int)(x-((y-b)/m))); row_pixels[x].red = ROUND_TO_QUANTUM(start_color->red + (distance * red_step)); row_pixels[x].green = ROUND_TO_QUANTUM(start_color->green + (distance * green_step)); row_pixels[x].blue = ROUND_TO_QUANTUM(start_color->blue + (distance * blue_step)); row_pixels[x].opacity = OpaqueOpacity; } #if defined(HAVE_SYNCAUTHENTICPIXELS) SyncAuthenticPixels(image, &exception); CHECK_EXCEPTION() #else SyncImagePixels(image); rm_check_image_exception(image, RetainOnError); #endif } #if defined(HAVE_SYNCAUTHENTICPIXELS) || defined(HAVE_QUEUEAUTHENTICPIXELS) DestroyExceptionInfo(&exception); #endif } /** * Call GradientFill with the start and stop colors specified when this fill * object was created. * * Ruby usage: * - @verbatim GradientFill#fill(image) @endverbatim * * @param self this object * @param image_obj the image * @return self */ VALUE GradientFill_fill(VALUE self, VALUE image_obj) { rm_GradientFill *fill; Image *image; PixelPacket start_color, stop_color; double x1, y1, x2, y2; // points on the line Data_Get_Struct(self, rm_GradientFill, fill); image = rm_check_destroyed(image_obj); x1 = fill->x1; y1 = fill->y1; x2 = fill->x2; y2 = fill->y2; start_color = fill->start_color; stop_color = fill->stop_color; if (fabs(x2-x1) < 0.5) // vertical? { // If the x1,y1 and x2,y2 points are essentially the same if (fabs(y2-y1) < 0.5) { point_fill(image, x1, y1, &start_color, &stop_color); } // A vertical line is a special case. else { vertical_fill(image, x1, &start_color, &stop_color); } } // A horizontal line is a special case. else if (fabs(y2-y1) < 0.5) { horizontal_fill(image, y1, &start_color, &stop_color); } // This is the general case - a diagonal line. If the line is more horizontal // than vertical, use the top and bottom of the image as the ends of the // gradient, otherwise use the sides of the image. else { double m = ((double)(y2 - y1))/((double)(x2 - x1)); double diagonal = ((double)image->rows)/image->columns; if (fabs(m) <= diagonal) { v_diagonal_fill(image, x1, y1, x2, y2, &start_color, &stop_color); } else { h_diagonal_fill(image, x1, y1, x2, y2, &start_color, &stop_color); } } return self; } /** * Free the TextureFill struct and the texture image it points to. * * No Ruby usage (internal function) * * Notes: * - Called from GC * * @param fill_obj the TextureFill */ static void free_TextureFill(void *fill_obj) { rm_TextureFill *fill = (rm_TextureFill *)fill_obj; // Do not trace destruction (void) DestroyImage(fill->texture); xfree(fill); } /** * Create new TextureFill object. * * No Ruby usage (internal function) * * Notes: * - The texture is an Image or Image *object * * @param class the Ruby class to use * @return a new TextureFill object */ VALUE TextureFill_alloc(VALUE class) { rm_TextureFill *fill; return Data_Make_Struct(class , rm_TextureFill , NULL , free_TextureFill , fill); } /** * Store the texture image. * * Ruby usage: * - @verbatim TextureFill#initialize(texture) @endverbatim * * Notes: * - The texture is an Image or Image *object * * @param self this object * @param texture_arg the texture * @return self */ VALUE TextureFill_initialize(VALUE self, VALUE texture_arg) { rm_TextureFill *fill; Image *texture; volatile VALUE texture_image; Data_Get_Struct(self, rm_TextureFill, fill); texture_image = rm_cur_image(texture_arg); // Bump the reference count on the texture image. texture = rm_check_destroyed(texture_image); (void) ReferenceImage(texture); fill->texture = texture; return self; } /** * Call TextureFill with the texture specified when this fill object was * created. * * Ruby usage: * - @verbatim TextureFill#fill(image) @endverbatim * * @param self this object * @param image_obj the image * @return self */ VALUE TextureFill_fill(VALUE self, VALUE image_obj) { rm_TextureFill *fill; Image *image; image = rm_check_destroyed(image_obj); Data_Get_Struct(self, rm_TextureFill, fill); (void) TextureImage(image, fill->texture); rm_check_image_exception(image, RetainOnError); return self; } rmagick-2.13.2/ext/RMagick/rmstruct.c0000644000004100000410000006645512147515547017443 0ustar www-datawww-data/**************************************************************************//** * Contains various Struct class methods. * * Copyright © 2002 - 2009 by Timothy P. Hunter * * Changes since Nov. 2009 copyright © by Benjamin Thomas and Omer Bar-or * * @file rmstruct.c * @version $Id: rmstruct.c,v 1.5 2009/12/20 02:33:34 baror Exp $ * @author Tim Hunter ******************************************************************************/ #include "rmagick.h" static const char *ComplianceType_name(ComplianceType *); static VALUE ComplianceType_new(ComplianceType); static const char *StretchType_name(StretchType); static VALUE StretchType_new(StretchType); static const char *StyleType_name(StyleType); static VALUE StyleType_new(StyleType); /** * Given a C AffineMatrix, create the equivalent AffineMatrix object. * * No Ruby usage (internal function) * * Notes: * - am = Magick::AffineMatrix.new(sx, rx, ry, sy, tx, ty) * * @param affine the C AffineMatrix * @return a Ruby AffineMatrix object */ VALUE Import_AffineMatrix(AffineMatrix *affine) { VALUE argv[6]; argv[0] = rb_float_new(affine->sx); argv[1] = rb_float_new(affine->rx); argv[2] = rb_float_new(affine->ry); argv[3] = rb_float_new(affine->sy); argv[4] = rb_float_new(affine->tx); argv[5] = rb_float_new(affine->ty); return rb_class_new_instance(6, argv, Class_AffineMatrix); } /** * Convert a Magick::AffineMatrix object to a AffineMatrix structure. * * No Ruby usage (internal function) * * Notes: * - If not initialized, the defaults are [sx,rx,ry,sy,tx,ty] = [1,0,0,1,0,0] * * @param am The C AffineMatrix to modify * @param st the Ruby AffineMatrix object */ void Export_AffineMatrix(AffineMatrix *am, VALUE st) { volatile VALUE values, v; if (CLASS_OF(st) != Class_AffineMatrix) { rb_raise(rb_eTypeError, "type mismatch: %s given", rb_class2name(CLASS_OF(st))); } values = rb_funcall(st, rm_ID_values, 0); v = rb_ary_entry(values, 0); am->sx = v == Qnil ? 1.0 : NUM2DBL(v); v = rb_ary_entry(values, 1); am->rx = v == Qnil ? 0.0 : NUM2DBL(v); v = rb_ary_entry(values, 2); am->ry = v == Qnil ? 0.0 : NUM2DBL(v); v = rb_ary_entry(values, 3); am->sy = v == Qnil ? 1.0 : NUM2DBL(v); v = rb_ary_entry(values, 4); am->tx = v == Qnil ? 0.0 : NUM2DBL(v); v = rb_ary_entry(values, 5); am->ty = v == Qnil ? 0.0 : NUM2DBL(v); } /** * Create a Magick::ChromaticityInfo object from a ChromaticityInfo structure. * * No Ruby usage (internal function) * * @param ci the C ChromaticityInfo * @return a Ruby Magick::ChromaticityInfo object */ VALUE ChromaticityInfo_new(ChromaticityInfo *ci) { volatile VALUE red_primary; volatile VALUE green_primary; volatile VALUE blue_primary; volatile VALUE white_point; red_primary = Import_PrimaryInfo(&ci->red_primary); green_primary = Import_PrimaryInfo(&ci->green_primary); blue_primary = Import_PrimaryInfo(&ci->blue_primary); white_point = Import_PrimaryInfo(&ci->white_point); return rb_funcall(Class_Chromaticity, rm_ID_new, 4 , red_primary, green_primary, blue_primary, white_point); } /** * Extract the elements from a Magick::ChromaticityInfo and store in a * ChromaticityInfo structure. * * No Ruby usage (internal function) * * @param ci the C ChromaticityInfo structure to modify * @param chrom the Ruby Magick::ChromaticityInfo object */ void Export_ChromaticityInfo(ChromaticityInfo *ci, VALUE chrom) { volatile VALUE chrom_members; volatile VALUE red_primary, green_primary, blue_primary, white_point; volatile VALUE entry_members, x, y; ID values_id; if (CLASS_OF(chrom) != Class_Chromaticity) { rb_raise(rb_eTypeError, "type mismatch: %s given", rb_class2name(CLASS_OF(chrom))); } values_id = rm_ID_values; // Get the struct members in an array chrom_members = rb_funcall(chrom, values_id, 0); red_primary = rb_ary_entry(chrom_members, 0); green_primary = rb_ary_entry(chrom_members, 1); blue_primary = rb_ary_entry(chrom_members, 2); white_point = rb_ary_entry(chrom_members, 3); // Get the red_primary PrimaryInfo members in an array entry_members = rb_funcall(red_primary, values_id, 0); x = rb_ary_entry(entry_members, 0); // red_primary.x ci->red_primary.x = x == Qnil ? 0.0 : NUM2DBL(x); y = rb_ary_entry(entry_members, 1); // red_primary.y ci->red_primary.y = y == Qnil ? 0.0 : NUM2DBL(y); ci->red_primary.z = 0.0; // Get the green_primary PrimaryInfo members in an array entry_members = rb_funcall(green_primary, values_id, 0); x = rb_ary_entry(entry_members, 0); // green_primary.x ci->green_primary.x = x == Qnil ? 0.0 : NUM2DBL(x); y = rb_ary_entry(entry_members, 1); // green_primary.y ci->green_primary.y = y == Qnil ? 0.0 : NUM2DBL(y); ci->green_primary.z = 0.0; // Get the blue_primary PrimaryInfo members in an array entry_members = rb_funcall(blue_primary, values_id, 0); x = rb_ary_entry(entry_members, 0); // blue_primary.x ci->blue_primary.x = x == Qnil ? 0.0 : NUM2DBL(x); y = rb_ary_entry(entry_members, 1); // blue_primary.y ci->blue_primary.y = y == Qnil ? 0.0 : NUM2DBL(y); ci->blue_primary.z = 0.0; // Get the white_point PrimaryInfo members in an array entry_members = rb_funcall(white_point, values_id, 0); x = rb_ary_entry(entry_members, 0); // white_point.x ci->white_point.x = x == Qnil ? 0.0 : NUM2DBL(x); y = rb_ary_entry(entry_members, 1); // white_point.y ci->white_point.y = y == Qnil ? 0.0 : NUM2DBL(y); ci->white_point.z = 0.0; } /** * Create a string representation of a Magick::Chromaticity. * * Ruby usage: * - @verbatim Magick::Chromaticity#to_s @endverbatim * * @param self this object * @return the string */ VALUE ChromaticityInfo_to_s(VALUE self) { ChromaticityInfo ci; char buff[200]; Export_ChromaticityInfo(&ci, self); sprintf(buff, "red_primary=(x=%g,y=%g) " "green_primary=(x=%g,y=%g) " "blue_primary=(x=%g,y=%g) " "white_point=(x=%g,y=%g) ", ci.red_primary.x, ci.red_primary.y, ci.green_primary.x, ci.green_primary.y, ci.blue_primary.x, ci.blue_primary.y, ci.white_point.x, ci.white_point.y); return rb_str_new2(buff); } /** * Convert a ColorInfo structure to a Magick::Color. * * No Ruby usage (internal function) * * @param ci the C ColorInfo structure * @return a Ruby Magick::Color object */ VALUE Import_ColorInfo(const ColorInfo *ci) { ComplianceType compliance_type; volatile VALUE name; volatile VALUE compliance; volatile VALUE color; name = rb_str_new2(ci->name); compliance_type = ci->compliance; compliance = ComplianceType_new(compliance_type); color = Pixel_from_MagickPixelPacket(&(ci->color)); return rb_funcall(Class_Color, rm_ID_new, 3 , name, compliance, color); } /** * Convert a Magick::Color to a ColorInfo structure. * * No Ruby usage (internal function) * * @param ci the C ColorInfo structure to modify * @param st the Ruby Magick::Color object */ void Export_ColorInfo(ColorInfo *ci, VALUE st) { Pixel *pixel; volatile VALUE members, m; if (CLASS_OF(st) != Class_Color) { rb_raise(rb_eTypeError, "type mismatch: %s given", rb_class2name(CLASS_OF(st))); } memset(ci, '\0', sizeof(ColorInfo)); members = rb_funcall(st, rm_ID_values, 0); m = rb_ary_entry(members, 0); if (m != Qnil) { (void) CloneString((char **)&(ci->name), StringValuePtr(m)); } m = rb_ary_entry(members, 1); if (m != Qnil) { VALUE_TO_ENUM(m, ci->compliance, ComplianceType); } m = rb_ary_entry(members, 2); if (m != Qnil) { Data_Get_Struct(m, Pixel, pixel); // For >= 6.3.0, ColorInfo.color is a MagickPixelPacket so we have to // convert the PixelPacket. GetMagickPixelPacket(NULL, &ci->color); ci->color.red = (MagickRealType) pixel->red; ci->color.green = (MagickRealType) pixel->green; ci->color.blue = (MagickRealType) pixel->blue; ci->color.opacity = (MagickRealType) OpaqueOpacity; ci->color.index = (MagickRealType) 0; } } /** * Convert either a String color name or a Magick::Pixel to a MagickPixelPacket. * * No Ruby usage (internal function) * * Notes: * - The channel values in a MagickPixelPacket are doubles. * * @param image the Image * @param mpp The MagickPixelPacket to modify * @param color the name of the color */ void Color_to_MagickPixelPacket(Image *image, MagickPixelPacket *mpp, VALUE color) { PixelPacket pp; // image can be NULL GetMagickPixelPacket(image, mpp); memset(&pp, '\0', sizeof(pp)); Color_to_PixelPacket(&pp, color); mpp->red = (MagickRealType) pp.red; mpp->green = (MagickRealType) pp.green; mpp->blue = (MagickRealType) pp.blue; mpp->opacity = (MagickRealType) pp.opacity; } /** * Free the storage allocated by Export_ColorInfo. * * No Ruby usage (internal function) * * @param ci the ColorInfo object * @see Export_ColorInfo */ static void destroy_ColorInfo(ColorInfo *ci) { magick_free((void*)ci->name); ci->name = NULL; } /** * Return a string representation of a Magick::Color object. * * Ruby usage: * - @verbatim Color#to_s @endverbatim * * @param self this object * @return the string */ VALUE Color_to_s(VALUE self) { ColorInfo ci; char buff[1024]; Export_ColorInfo(&ci, self); sprintf(buff, "name=%s, compliance=%s, " #if (QuantumDepth == 32 || QuantumDepth == 64) && defined(HAVE_TYPE_LONG_DOUBLE) "color.red=%Lg, color.green=%Lg, color.blue=%Lg, color.opacity=%Lg ", #else "color.red=%g, color.green=%g, color.blue=%g, color.opacity=%g ", #endif ci.name, ComplianceType_name(&ci.compliance), ci.color.red, ci.color.green, ci.color.blue, ci.color.opacity); destroy_ColorInfo(&ci); return rb_str_new2(buff); } /** * Return the string representation of a ComplianceType value. * * No Ruby usage (internal function) * * Notes: * - xMagick will OR multiple compliance types so we have to arbitrarily pick * one name. * - Set the compliance argument to the selected value. * * @param c the ComplianceType value * @return the string */ static const char * ComplianceType_name(ComplianceType *c) { if ((*c & (SVGCompliance|X11Compliance|XPMCompliance)) == (SVGCompliance|X11Compliance|XPMCompliance)) { return "AllCompliance"; } else if (*c & SVGCompliance) { *c = SVGCompliance; return "SVGCompliance"; } else if (*c & X11Compliance) { *c = X11Compliance; return "X11Compliance"; } else if (*c & XPMCompliance) { *c = XPMCompliance; return "XPMCompliance"; } else if (*c == NoCompliance) { *c = NoCompliance; return "NoCompliance"; } else { *c = UndefinedCompliance; return "UndefinedCompliance"; } } /** * Construct a ComplianceType enum object for the specified value. * * No Ruby usage (internal function) * * @param compliance the C ComplianceType value * @return the Ruby ComplianceType enum object */ static VALUE ComplianceType_new(ComplianceType compliance) { const char *name; // Turn off undefined bits compliance &= (SVGCompliance|X11Compliance|XPMCompliance); name = ComplianceType_name(&compliance); return rm_enum_new(Class_ComplianceType, ID2SYM(rb_intern(name)), INT2FIX(compliance)); } /** * Convert a TypeInfo structure to a Magick::Font. * * No Ruby usage (internal function) * * @param ti the C TypeInfo structure * @return a Ruby Magick::Font object */ VALUE Import_TypeInfo(const TypeInfo *ti) { volatile VALUE name, description, family; volatile VALUE style, stretch, weight; volatile VALUE encoding, foundry, format; name = rb_str_new2(ti->name); family = rb_str_new2(ti->family); style = StyleType_new(ti->style); stretch = StretchType_new(ti->stretch); weight = ULONG2NUM(ti->weight); description = ti->description ? rb_str_new2(ti->description) : Qnil; encoding = ti->encoding ? rb_str_new2(ti->encoding) : Qnil; foundry = ti->foundry ? rb_str_new2(ti->foundry) : Qnil; format = ti->format ? rb_str_new2(ti->format) : Qnil; return rb_funcall(Class_Font, rm_ID_new, 9 , name, description, family, style , stretch, weight, encoding, foundry, format); } /** * Convert a Magick::Font to a TypeInfo structure. * * No Ruby usage (internal function) * * @param ti the C TypeInfo structure to modify * @param st the Ruby Magick::Font object */ void Export_TypeInfo(TypeInfo *ti, VALUE st) { volatile VALUE members, m; if (CLASS_OF(st) != Class_Font) { rb_raise(rb_eTypeError, "type mismatch: %s given", rb_class2name(CLASS_OF(st))); } memset(ti, '\0', sizeof(TypeInfo)); members = rb_funcall(st, rm_ID_values, 0); m = rb_ary_entry(members, 0); if (m != Qnil) { (void) CloneString((char **)&(ti->name), StringValuePtr(m)); } m = rb_ary_entry(members, 1); if (m != Qnil) { (void) CloneString((char **)&(ti->description), StringValuePtr(m)); } m = rb_ary_entry(members, 2); if (m != Qnil) { (void) CloneString((char **)&(ti->family), StringValuePtr(m)); } m = rb_ary_entry(members, 3); ti->style = m == Qnil ? 0 : FIX2INT(m); m = rb_ary_entry(members, 4); ti->stretch = m == Qnil ? 0 : FIX2INT(m); m = rb_ary_entry(members, 5); ti->weight = m == Qnil ? 0 : FIX2INT(m); m = rb_ary_entry(members, 6); if (m != Qnil) (void) CloneString((char **)&(ti->encoding), StringValuePtr(m)); m = rb_ary_entry(members, 7); if (m != Qnil) (void) CloneString((char **)&(ti->foundry), StringValuePtr(m)); m = rb_ary_entry(members, 8); if (m != Qnil) (void) CloneString((char **)&(ti->format), StringValuePtr(m)); } /** * Free the storage allocated by Export_TypeInfo. * * No Ruby usage (internal function) * * @param ti the TypeInfo object * @see Export_TypeInfo */ static void destroy_TypeInfo(TypeInfo *ti) { magick_free((void*)ti->name); ti->name = NULL; magick_free((void*)ti->description); ti->description = NULL; magick_free((void*)ti->family); ti->family = NULL; magick_free((void*)ti->encoding); ti->encoding = NULL; magick_free((void*)ti->foundry); ti->foundry = NULL; magick_free((void*)ti->format); ti->format = NULL; } /** * Implement the Font#to_s method. * * No Ruby usage (internal function) * * @param self this object * @return the string */ VALUE Font_to_s(VALUE self) { TypeInfo ti; char weight[20]; char buff[1024]; Export_TypeInfo(&ti, self); switch (ti.weight) { case 400: strcpy(weight, "NormalWeight"); break; case 700: strcpy(weight, "BoldWeight"); break; default: sprintf(weight, "%lu", ti.weight); break; } sprintf(buff, "name=%s, description=%s, " "family=%s, style=%s, stretch=%s, weight=%s, " "encoding=%s, foundry=%s, format=%s", ti.name, ti.description, ti.family, StyleType_name(ti.style), StretchType_name(ti.stretch), weight, ti.encoding ? ti.encoding : "", ti.foundry ? ti.foundry : "", ti.format ? ti.format : ""); destroy_TypeInfo(&ti); return rb_str_new2(buff); } /** * Create a Magick::Point object from a PointInfo structure. * * No Ruby usage (internal function) * * @param p the C PointInfo structure * @return a Ruby Magick::Point object */ VALUE Import_PointInfo(PointInfo *p) { return rb_funcall(Class_Point, rm_ID_new, 2 , INT2FIX(p->x), INT2FIX(p->y)); } /** * Convert a Magick::Point object to a PointInfo structure. * * No Ruby usage (internal function) * * @param pi the C PointInfo structure to modify * @param sp the Ruby Magick::Point object */ void Export_PointInfo(PointInfo *pi, VALUE sp) { volatile VALUE members, m; if (CLASS_OF(sp) != Class_Point) { rb_raise(rb_eTypeError, "type mismatch: %s given", rb_class2name(CLASS_OF(sp))); } members = rb_funcall(sp, rm_ID_values, 0); m = rb_ary_entry(members, 0); pi->x = m == Qnil ? 0.0 : NUM2DBL(m); m = rb_ary_entry(members, 1); pi->y = m == Qnil ? 0.0 : NUM2DBL(m); } /** * Create a Magick::PrimaryInfo object from a PrimaryInfo structure. * * No Ruby usage (internal function) * * @param p the C PrimaryInfo structure * @return a Ruby Magick::PrimaryInfo object */ VALUE Import_PrimaryInfo(PrimaryInfo *p) { return rb_funcall(Class_Primary, rm_ID_new, 3 , INT2FIX(p->x), INT2FIX(p->y), INT2FIX(p->z)); } /** * Convert a Magick::PrimaryInfo object to a PrimaryInfo structure. * * No Ruby usage (internal function) * * @param pi the C PrimaryInfo structure to modify * @param sp the Ruby Magick::PrimaryInfo object */ void Export_PrimaryInfo(PrimaryInfo *pi, VALUE sp) { volatile VALUE members, m; if (CLASS_OF(sp) != Class_Primary) { rb_raise(rb_eTypeError, "type mismatch: %s given", rb_class2name(CLASS_OF(sp))); } members = rb_funcall(sp, rm_ID_values, 0); m = rb_ary_entry(members, 0); pi->x = m == Qnil ? 0.0 : NUM2DBL(m); m = rb_ary_entry(members, 1); pi->y = m == Qnil ? 0.0 : NUM2DBL(m); m = rb_ary_entry(members, 2); pi->z = m == Qnil ? 0.0 : NUM2DBL(m); } /** * Create a string representation of a Magick::PrimaryInfo. * * Ruby usage: * - @verbatim Magick::PrimaryInfo#to_s @endverbatim * * @param self this object * @return the string */ VALUE PrimaryInfo_to_s(VALUE self) { PrimaryInfo pi; char buff[100]; Export_PrimaryInfo(&pi, self); sprintf(buff, "x=%g, y=%g, z=%g", pi.x, pi.y, pi.z); return rb_str_new2(buff); } /** * Convert a RectangleInfo structure to a Magick::Rectangle. * * No Ruby usage (internal function) * * @param rect the C RectangleInfo structure * @return a Ruby Magick::Rectangle object */ VALUE Import_RectangleInfo(RectangleInfo *rect) { volatile VALUE width; volatile VALUE height; volatile VALUE x, y; width = UINT2NUM(rect->width); height = UINT2NUM(rect->height); x = INT2NUM(rect->x); y = INT2NUM(rect->y); return rb_funcall(Class_Rectangle, rm_ID_new, 4 , width, height, x, y); } /** * Convert a Magick::Rectangle to a RectangleInfo structure. * * No Ruby usage (internal function) * * @param rect the C RectangleInfo structure to modify * @param sr the Ruby Magick::Rectangle object */ void Export_RectangleInfo(RectangleInfo *rect, VALUE sr) { volatile VALUE members, m; if (CLASS_OF(sr) != Class_Rectangle) { rb_raise(rb_eTypeError, "type mismatch: %s given", rb_class2name(CLASS_OF(sr))); } members = rb_funcall(sr, rm_ID_values, 0); m = rb_ary_entry(members, 0); rect->width = m == Qnil ? 0 : NUM2ULONG(m); m = rb_ary_entry(members, 1); rect->height = m == Qnil ? 0 : NUM2ULONG(m); m = rb_ary_entry(members, 2); rect->x = m == Qnil ? 0 : NUM2LONG (m); m = rb_ary_entry(members, 3); rect->y = m == Qnil ? 0 : NUM2LONG (m); } /** * Create a string representation of a Magick::Rectangle. * * Ruby usage: * - @verbatim Magick::Rectangle#to_s @endverbatim * * @param self this object * @return the string */ VALUE RectangleInfo_to_s(VALUE self) { RectangleInfo rect; char buff[100]; Export_RectangleInfo(&rect, self); sprintf(buff, "width=%lu, height=%lu, x=%ld, y=%ld" , rect.width, rect.height, rect.x, rect.y); return rb_str_new2(buff); } /** * Convert a SegmentInfo structure to a Magick::Segment. * * No Ruby usage (internal function) * * @param segment the C SegmentInfo structure * @return a Ruby Magick::Segment object */ VALUE Import_SegmentInfo(SegmentInfo *segment) { volatile VALUE x1, y1, x2, y2; x1 = rb_float_new(segment->x1); y1 = rb_float_new(segment->y1); x2 = rb_float_new(segment->x2); y2 = rb_float_new(segment->y2); return rb_funcall(Class_Segment, rm_ID_new, 4, x1, y1, x2, y2); } /** * Convert a Magick::Segment to a SegmentInfo structure. * * No Ruby usage (internal function) * * @param segment the C SegmentInfo structure to modify * @param s the Ruby Magick::Segment object */ void Export_SegmentInfo(SegmentInfo *segment, VALUE s) { volatile VALUE members, m; if (CLASS_OF(s) != Class_Segment) { rb_raise(rb_eTypeError, "type mismatch: %s given", rb_class2name(CLASS_OF(s))); } members = rb_funcall(s, rm_ID_values, 0); m = rb_ary_entry(members, 0); segment->x1 = m == Qnil ? 0.0 : NUM2DBL(m); m = rb_ary_entry(members, 1); segment->y1 = m == Qnil ? 0.0 : NUM2DBL(m); m = rb_ary_entry(members, 2); segment->x2 = m == Qnil ? 0.0 : NUM2DBL(m); m = rb_ary_entry(members, 3); segment->y2 = m == Qnil ? 0.0 : NUM2DBL(m); } /** * Create a string representation of a Magick::Segment. * * Ruby usage: * - @verbatim Magick::SegmentInfo#to_s @endverbatim * * @param self this object * @return the string */ VALUE SegmentInfo_to_s(VALUE self) { SegmentInfo segment; char buff[100]; Export_SegmentInfo(&segment, self); sprintf(buff, "x1=%g, y1=%g, x2=%g, y2=%g" , segment.x1, segment.y1, segment.x2, segment.y2); return rb_str_new2(buff); } /** * Return the string representation of a StretchType value. * * No Ruby usage (internal function) * * @param stretch the StretchType value * @return the string */ static const char * StretchType_name(StretchType stretch) { switch (stretch) { ENUM_TO_NAME(UndefinedStretch) ENUM_TO_NAME(NormalStretch) ENUM_TO_NAME(UltraCondensedStretch) ENUM_TO_NAME(ExtraCondensedStretch) ENUM_TO_NAME(CondensedStretch) ENUM_TO_NAME(SemiCondensedStretch) ENUM_TO_NAME(SemiExpandedStretch) ENUM_TO_NAME(ExpandedStretch) ENUM_TO_NAME(ExtraExpandedStretch) ENUM_TO_NAME(UltraExpandedStretch) ENUM_TO_NAME(AnyStretch) } return "UndefinedStretch"; } /** * Construct a StretchType enum for a specified StretchType value. * * No Ruby usage (internal function) * * @param stretch the C StretchType value * @return a Ruby StretchType enum */ static VALUE StretchType_new(StretchType stretch) { const char *name = StretchType_name(stretch); return rm_enum_new(Class_StretchType, ID2SYM(rb_intern(name)), INT2FIX(stretch)); } /** * Return the string representation of a StyleType value. * * No Ruby usage (internal function) * * @param style the StyleType value * @return the string */ static const char * StyleType_name(StyleType style) { switch (style) { ENUM_TO_NAME(UndefinedStyle) ENUM_TO_NAME(NormalStyle) ENUM_TO_NAME(ItalicStyle) ENUM_TO_NAME(ObliqueStyle) ENUM_TO_NAME(AnyStyle) } return "UndefinedStyle"; } /** * Construct a StyleType enum for a specified StyleType value. * * No Ruby usage (internal function) * * @param style the C StyleType value * @return a Ruby StyleType enum */ static VALUE StyleType_new(StyleType style) { const char *name = StyleType_name(style); return rm_enum_new(Class_StyleType, ID2SYM(rb_intern(name)), INT2FIX(style)); } /** * Convert a TypeMetric structure to a Magick::TypeMetric. * * No Ruby usage (internal function) * * @param tm the C TypeMetric structure * @return a Ruby Magick::TypeMetric object */ VALUE Import_TypeMetric(TypeMetric *tm) { volatile VALUE pixels_per_em; volatile VALUE ascent, descent; volatile VALUE width, height, max_advance; volatile VALUE bounds, underline_position, underline_thickness; pixels_per_em = Import_PointInfo(&tm->pixels_per_em); ascent = rb_float_new(tm->ascent); descent = rb_float_new(tm->descent); width = rb_float_new(tm->width); height = rb_float_new(tm->height); max_advance = rb_float_new(tm->max_advance); bounds = Import_SegmentInfo(&tm->bounds); underline_position = rb_float_new(tm->underline_position); underline_thickness = rb_float_new(tm->underline_position); return rb_funcall(Class_TypeMetric, rm_ID_new, 9 , pixels_per_em, ascent, descent, width , height, max_advance, bounds , underline_position, underline_thickness); } /** * Convert a Magick::TypeMetric to a TypeMetric structure. * * No Ruby usage (internal function) * * @param tm the C TypeMetric structure to modify * @param st the Ruby Magick::TypeMetric object */ void Export_TypeMetric(TypeMetric *tm, VALUE st) { volatile VALUE members, m; volatile VALUE pixels_per_em; if (CLASS_OF(st) != Class_TypeMetric) { rb_raise(rb_eTypeError, "type mismatch: %s given", rb_class2name(CLASS_OF(st))); } members = rb_funcall(st, rm_ID_values, 0); pixels_per_em = rb_ary_entry(members, 0); Export_PointInfo(&tm->pixels_per_em, pixels_per_em); m = rb_ary_entry(members, 1); tm->ascent = m == Qnil ? 0.0 : NUM2DBL(m); m = rb_ary_entry(members, 2); tm->descent = m == Qnil ? 0.0 : NUM2DBL(m); m = rb_ary_entry(members, 3); tm->width = m == Qnil ? 0.0 : NUM2DBL(m); m = rb_ary_entry(members, 4); tm->height = m == Qnil ? 0.0 : NUM2DBL(m); m = rb_ary_entry(members, 5); tm->max_advance = m == Qnil ? 0.0 : NUM2DBL(m); m = rb_ary_entry(members, 6); Export_SegmentInfo(&tm->bounds, m); m = rb_ary_entry(members, 7); tm->underline_position = m == Qnil ? 0.0 : NUM2DBL(m); m = rb_ary_entry(members, 8); tm->underline_thickness = m == Qnil ? 0.0 : NUM2DBL(m); } /** * Create a string representation of a Magick::TypeMetric. * * Ruby usage: * - @verbatim Magick::TypeMetric#to_s @endverbatim * * @param self this object * @return the string */ VALUE TypeMetric_to_s(VALUE self) { volatile VALUE str; TypeMetric tm; char temp[200]; int len; Export_TypeMetric(&tm, self); len = sprintf(temp, "pixels_per_em=(x=%g,y=%g) ", tm.pixels_per_em.x, tm.pixels_per_em.y); str = rb_str_new(temp, len); len = sprintf(temp, "ascent=%g descent=%g ",tm.ascent, tm.descent); rb_str_cat(str, temp, len); len = sprintf(temp, "width=%g height=%g max_advance=%g ", tm.width, tm.height, tm.max_advance); rb_str_cat(str, temp, len); len = sprintf(temp, "bounds.x1=%g bounds.y1=%g ", tm.bounds.x1, tm.bounds.y1); rb_str_cat(str, temp, len); len = sprintf(temp, "bounds.x2=%g bounds.y2=%g ", tm.bounds.x2, tm.bounds.y2); rb_str_cat(str, temp, len); len = sprintf(temp, "underline_position=%g underline_thickness=%g", tm.underline_position, tm.underline_thickness); rb_str_cat(str, temp, len); return str; } rmagick-2.13.2/ext/RMagick/rmimage.c0000644000004100000410000136623312147515547017177 0ustar www-datawww-data/**************************************************************************//** * Image class method definitions for RMagick. * * Copyright © 2002 - 2009 by Timothy P. Hunter * * Changes since Nov. 2009 copyright © by Benjamin Thomas and Omer Bar-or * * @file rmimage.c * @version $Id: rmimage.c,v 1.361 2010/05/03 03:34:48 baror Exp $ * @author Tim Hunter ******************************************************************************/ #include "rmagick.h" #include "magick/xwindow.h" // XImageInfo /** Method that effects an image */ typedef Image *(effector_t)(const Image *, const double, const double, ExceptionInfo *); /** Method that flips an image */ typedef Image *(flipper_t)(const Image *, ExceptionInfo *); /** Method that magnifies an image */ typedef Image *(magnifier_t)(const Image *, ExceptionInfo *); /** Method that reads an image */ typedef Image *(reader_t)(const Info *, ExceptionInfo *); /** Method that scales an image */ typedef Image *(scaler_t)(const Image *, const unsigned long, const unsigned long, ExceptionInfo *); /** Method that computes threshold on an image */ typedef MagickBooleanType (thresholder_t)(Image *, const char *); /** Method that transforms an image */ typedef Image *(xformer_t)(const Image *, const RectangleInfo *, ExceptionInfo *); static VALUE cropper(int, int, VALUE *, VALUE); static VALUE effect_image(VALUE, int, VALUE *, effector_t); static VALUE flipflop(int, VALUE, flipper_t); static VALUE rd_image(VALUE, VALUE, reader_t); static VALUE rotate(int, int, VALUE *, VALUE); static VALUE scale(int, int, VALUE *, VALUE, scaler_t); static VALUE threshold_image(int, VALUE *, VALUE, thresholder_t); static VALUE xform_image(int, VALUE, VALUE, VALUE, VALUE, VALUE, xformer_t); static VALUE array_from_images(Image *); static void call_trace_proc(Image *, const char *); static const char *BlackPointCompensationKey = "PROFILE:black-point-compensation"; /** * Call Adaptive(Blur|Sharpen)Image. * * No Ruby usage (internal function) * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @param fp pointer to the function to call * @return a new image */ static VALUE adaptive_method(int argc, VALUE *argv, VALUE self , Image *fp(const Image *, const double, const double, ExceptionInfo *)) { Image *image, *new_image; double radius = 0.0; double sigma = 1.0; ExceptionInfo exception; image = rm_check_destroyed(self); switch (argc) { case 2: sigma = NUM2DBL(argv[1]); case 1: radius = NUM2DBL(argv[0]); case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 to 2)", argc); break; } GetExceptionInfo(&exception); new_image = (fp)(image, radius, sigma, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Call Adaptive(Blur|Sharpen)ImageChannel. * * No Ruby usage (internal function) * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @param fp pointer to the function to call * @return a new image */ static VALUE adaptive_channel_method(int argc, VALUE *argv, VALUE self , Image *fp(const Image *, const ChannelType, const double, const double, ExceptionInfo *)) { Image *image, *new_image; double radius = 0.0; double sigma = 1.0; ExceptionInfo exception; ChannelType channels; image = rm_check_destroyed(self); channels = extract_channels(&argc, argv); switch (argc) { case 2: sigma = NUM2DBL(argv[1]); case 1: radius = NUM2DBL(argv[0]); case 0: break; default: raise_ChannelType_error(argv[argc-1]); break; } GetExceptionInfo(&exception); new_image = (fp)(image, channels, radius, sigma, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Call AdaptiveBlurImage. * * Ruby usage: * - @verbatim Image#adaptive_blur @endverbatim * - @verbatim Image#adaptive_blur(radius) @endverbatim * - @verbatim Image#adaptive_blur(radius, sigma) @endverbatim * * Notes: * - Default radius is 0.0 * - Default sigma is 1.0 * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_adaptive_blur(int argc, VALUE *argv, VALUE self) { return adaptive_method(argc, argv, self, AdaptiveBlurImage); } /** * Call AdaptiveBlurImageChannel. * * Ruby usage: * - @verbatim Image#adaptive_blur_channel @endverbatim * - @verbatim Image#adaptive_blur_channel(radius) @endverbatim * - @verbatim Image#adaptive_blur_channel(radius, sigma) @endverbatim * - @verbatim Image#adaptive_blur_channel(radius, sigma, channel) @endverbatim * - @verbatim Image#adaptive_blur_channel(radius, sigma, channel, ...) @endverbatim * * Notes: * - Default radius is 0.0 * - Default sigma is 1.0 * - Default channel is AllChannels * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_adaptive_blur_channel(int argc, VALUE *argv, VALUE self) { return adaptive_channel_method(argc, argv, self, AdaptiveBlurImageChannel); } /** * Call AdaptiveResizeImage. * * Ruby usage: * - @verbatim Image#adaptive_resize(scale_val) @endverbatim * - @verbatim Image#adaptive_resize(cols, rows) @endverbatim * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_adaptive_resize(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; unsigned long rows, columns; double scale_val, drows, dcols; ExceptionInfo exception; image = rm_check_destroyed(self); switch (argc) { case 2: rows = NUM2ULONG(argv[1]); columns = NUM2ULONG(argv[0]); break; case 1: scale_val = NUM2DBL(argv[0]); if (scale_val < 0.0) { rb_raise(rb_eArgError, "invalid scale_val value (%g given)", scale_val); } drows = scale_val * image->rows + 0.5; dcols = scale_val * image->columns + 0.5; if (drows > (double)ULONG_MAX || dcols > (double)ULONG_MAX) { rb_raise(rb_eRangeError, "resized image too big"); } rows = (unsigned long) drows; columns = (unsigned long) dcols; break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc); break; } GetExceptionInfo(&exception); new_image = AdaptiveResizeImage(image, columns, rows, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Call AdaptiveSharpenImage. * * Ruby usage: * - @verbatim Image#adaptive_sharpen @endverbatim * - @verbatim Image#adaptive_sharpen(radius) @endverbatim * - @verbatim Image#adaptive_sharpen(radius, sigma) @endverbatim * * Notes: * - Default radius is 0.0 * - Default sigma is 1.0 * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_adaptive_sharpen(int argc, VALUE *argv, VALUE self) { return adaptive_method(argc, argv, self, AdaptiveSharpenImage); } /** * Call AdaptiveSharpenImageChannel. * * Ruby usage: * - @verbatim Image#adaptive_sharpen_channel(radius=0.0, sigma=1.0[, channel...]) @endverbatim * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_adaptive_sharpen_channel(int argc, VALUE *argv, VALUE self) { return adaptive_channel_method(argc, argv, self, AdaptiveSharpenImageChannel); } /** * Selects an individual threshold for each pixel based on the range of * intensity values in its local neighborhood. This allows for thresholding of * an image whose global intensity histogram doesn't contain distinctive peaks. * * Ruby usage: * - @verbatim Image#adaptive_threshold @endverbatim * - @verbatim Image#adaptive_threshold(width) @endverbatim * - @verbatim Image#adaptive_threshold(width, height) @endverbatim * - @verbatim Image#adaptive_threshold(width, height, offset) @endverbatim * * Notes: * - Default width is 3 * - Default height is 3 * - Default offset is 0 * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_adaptive_threshold(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; unsigned long width = 3, height = 3; long offset = 0; ExceptionInfo exception; image = rm_check_destroyed(self); switch (argc) { case 3: offset = NUM2LONG(argv[2]); case 2: height = NUM2ULONG(argv[1]); case 1: width = NUM2ULONG(argv[0]); case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 to 3)", argc); } GetExceptionInfo(&exception); new_image = AdaptiveThresholdImage(image, width, height, offset, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Set the image composite mask. * * Ruby usage: * - @verbatim Image#add_compose_mask(mask) @endverbatim * * @param self this object * @param mask the composite mask * @return self * @see Image_mask * @see Image_delete_compose_mask * @see SetImageMask in ImageMagick */ VALUE Image_add_compose_mask(VALUE self, VALUE mask) { Image *image; Image *mask_image = NULL; image = rm_check_frozen(self); mask_image = rm_check_destroyed(mask); if (image->columns != mask_image->columns || image->rows != mask_image->rows) { rb_raise(rb_eArgError, "mask must be the same size as image"); } // Delete any previously-existing mask image. // Store a clone of the new mask image. (void) SetImageMask(image, mask_image); (void) NegateImage(image->mask, MagickFalse); // Since both Set and GetImageMask clone the mask image I don't see any // way to negate the mask without referencing it directly. Sigh. return self; } /** * Add random noise to a copy of the image. * * Ruby usage: * - @verbatim Image#add_noise(noise_type) @endverbatim * * @param self this object * @param noise the noise * @return a new image */ VALUE Image_add_noise(VALUE self, VALUE noise) { Image *image, *new_image; NoiseType noise_type; ExceptionInfo exception; image = rm_check_destroyed(self); VALUE_TO_ENUM(noise, noise_type, NoiseType); GetExceptionInfo(&exception); new_image = AddNoiseImage(image, noise_type, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Add random noise to a copy of the image. * * Ruby usage: * - @verbatim Image#add_noise_channel(noise_type) @endverbatim * - @verbatim Image#add_noise_channel(noise_type,channel) @endverbatim * - @verbatim Image#add_noise_channel(noise_type,channel,channel,...) @endverbatim * * Notes: * - Default channel is AllChannels * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_add_noise_channel(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; NoiseType noise_type; ExceptionInfo exception; ChannelType channels; image = rm_check_destroyed(self); channels = extract_channels(&argc, argv); // There must be 1 remaining argument. if (argc == 0) { rb_raise(rb_eArgError, "missing noise type argument"); } else if (argc > 1) { raise_ChannelType_error(argv[argc-1]); } VALUE_TO_ENUM(argv[0], noise_type, NoiseType); channels &= ~OpacityChannel; GetExceptionInfo(&exception); new_image = AddNoiseImageChannel(image, channels, noise_type, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Add all the profiles in the specified file. * * Ruby usage: * - @verbatim Image#add_profile(name) @endverbatim * * @param self this object * @param name the profile filename * @return self */ VALUE Image_add_profile(VALUE self, VALUE name) { // ImageMagick code based on the code for the "-profile" option in mogrify.c Image *image, *profile_image; ImageInfo *info; ExceptionInfo exception; char *profile_name; char *profile_filename = NULL; long profile_filename_l = 0; const StringInfo *profile; image = rm_check_frozen(self); // ProfileImage issues a warning if something goes wrong. profile_filename = rm_str2cstr(name, &profile_filename_l); info = CloneImageInfo(NULL); if (!info) { rb_raise(rb_eNoMemError, "not enough memory to continue"); } profile = GetImageProfile(image, "iptc"); if (profile) { info->profile = (void *)CloneStringInfo(profile); } strncpy(info->filename, profile_filename, min((size_t)profile_filename_l, sizeof(info->filename))); info->filename[MaxTextExtent-1] = '\0'; GetExceptionInfo(&exception); profile_image = ReadImage(info, &exception); (void) DestroyImageInfo(info); rm_check_exception(&exception, profile_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(profile_image); ResetImageProfileIterator(profile_image); profile_name = GetNextImageProfile(profile_image); while (profile_name) { profile = GetImageProfile(profile_image, profile_name); if (profile) { (void)ProfileImage(image, profile_name, GetStringInfoDatum(profile) , GetStringInfoLength(profile), MagickFalse); if (image->exception.severity >= ErrorException) { break; } } profile_name = GetNextImageProfile(profile_image); } (void) DestroyImage(profile_image); rm_check_image_exception(image, RetainOnError); return self; } /** * Calls SetImageAlphaChannel. * * Ruby usage: * - @verbatim Image#alpha(type) @endverbatim * * Notes: * - Replaces matte=, alpha= * - Originally there was an alpha attribute getter and setter. These are * replaced with alpha? and alpha(type). We still define (but don't * document) alpha=. For backward compatibility, if this method is called * without an argument, make it act like the old alpha getter and return * true if the matte channel is active, false otherwise. * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return the type (or true/false if called without an argument, see above) */ VALUE Image_alpha(int argc, VALUE *argv, VALUE self) { Image *image; AlphaChannelType alpha; // For backward compatibility, make alpha() act like alpha? if (argc == 0) { return Image_alpha_q(self); } else if (argc > 1) { rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc); } image = rm_check_frozen(self); VALUE_TO_ENUM(argv[0], alpha, AlphaChannelType); #if defined(HAVE_SETIMAGEALPHACHANNEL) // Added in 6.3.6-9 (void) SetImageAlphaChannel(image, alpha); rm_check_image_exception(image, RetainOnError); #else switch (alpha) { case ActivateAlphaChannel: image->matte = MagickTrue; break; case DeactivateAlphaChannel: image->matte = MagickFalse; break; case ResetAlphaChannel: if (image->matte == MagickFalse) { (void) SetImageOpacity(image, OpaqueOpacity); rm_check_image_exception(image, RetainOnError); } break; case SetAlphaChannel: (void) CompositeImage(image, CopyOpacityCompositeOp, image, 0, 0); rm_check_image_exception(image, RetainOnError); break; default: rb_raise(rb_eArgError, "unknown AlphaChannelType value"); break; } #endif return argv[0]; } /** * Determine whether the image's alpha channel is activated. * * Ruby usage: * - @verbatim Image#alpha? @endverbatim * * Notes: * - Replaces Image#matte * * @param self this object * @return true if the image's alpha channel is activated */ VALUE Image_alpha_q(VALUE self) { Image *image = rm_check_destroyed(self); #if defined(HAVE_GETIMAGEALPHACHANNEL) return GetImageAlphaChannel(image) ? Qtrue : Qfalse; #else return image->matte ? Qtrue : Qfalse; #endif } /** * Equivalent to -alpha option. * * Ruby usage: * - @verbatim Image#alpha=(alpha) @endverbatim * * @param self this object * @param type the alpha type * @return alpha * @deprecated This method has been deprecated. Please use Image_alpha. * @see Image_alpha * @see mogrify.c (in ImageMagick) */ VALUE Image_alpha_eq(VALUE self, VALUE type) { VALUE argv[1]; argv[0] = type; Image_alpha(1, argv, self); return type; } /** * Transform an image as dictated by the affine matrix argument. * * Ruby usage: * - @verbatim Image#affine_transform(affine_matrix) @endverbatim * * @param self this object * @param affine the affine matrix * @return a new image */ VALUE Image_affine_transform(VALUE self, VALUE affine) { Image *image, *new_image; ExceptionInfo exception; AffineMatrix matrix; image = rm_check_destroyed(self); // Convert Magick::AffineMatrix to AffineMatrix structure. Export_AffineMatrix(&matrix, affine); GetExceptionInfo(&exception); new_image = AffineTransformImage(image, &matrix, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Return the image property associated with "key". * * Ruby usage: * - @verbatim Image#["key"] @endverbatim * - @verbatim Image#[:key] @endverbatim * * Notes: * - Use Image#[]= (aset) to establish more properties or change the value of * an existing property. * * @param self this object * @param key_arg the key to get * @return property value or nil if key doesn't exist */ VALUE Image_aref(VALUE self, VALUE key_arg) { Image *image; const char *key; const char *attr; image = rm_check_destroyed(self); switch (TYPE(key_arg)) { case T_NIL: return Qnil; case T_SYMBOL: key = rb_id2name((ID)SYM2ID(key_arg)); break; default: key = StringValuePtr(key_arg); if (*key == '\0') { return Qnil; } break; } if (rm_strcasecmp(key, "EXIF:*") == 0) { return rm_exif_by_entry(image); } else if (rm_strcasecmp(key, "EXIF:!") == 0) { return rm_exif_by_number(image); } attr = rm_get_property(image, key); return attr ? rb_str_new2(attr) : Qnil; } /** * Update or add image attribute "key". * * Ruby usage: * - @verbatim Image#["key"] = attr @endverbatim * - @verbatim Image#[:key] = attr @endverbatim * * Notes: * - Specify attr=nil to remove the key from the list. * - SetImageProperty normally APPENDS the new value to any existing value. * Since this usage is tremendously counter-intuitive, this function always * deletes the existing value before setting the new value. * - There's no use checking the return value since SetImageProperty returns * "False" for many reasons, some legitimate. * * @param self this object * @param key_arg the key to set * @param attr_arg the value to which to set it * @return self */ VALUE Image_aset(VALUE self, VALUE key_arg, VALUE attr_arg) { Image *image; const char *key; char *attr; unsigned int okay; image = rm_check_frozen(self); attr = attr_arg == Qnil ? NULL : StringValuePtr(attr_arg); switch (TYPE(key_arg)) { case T_NIL: return self; case T_SYMBOL: key = rb_id2name((ID)SYM2ID(key_arg)); break; default: key = StringValuePtr(key_arg); if (*key == '\0') { return self; } break; } // Delete existing value. SetImageProperty returns False if // the attribute doesn't exist - we don't care. (void) rm_set_property(image, key, NULL); // Set new value if (attr) { okay = rm_set_property(image, key, attr); if (!okay) { rb_warning("SetImageProperty failed (probably out of memory)"); } } return self; } /** * Handle #transverse, #transform methods. * * No Ruby usage (internal function) * * @param bang whether the bang (!) version of the method was called * @param self this object * @param fp the transverse/transform method to call * @return self if bang, otherwise a new image */ static VALUE crisscross(int bang, VALUE self, Image *fp(const Image *, ExceptionInfo *)) { Image *image, *new_image; ExceptionInfo exception; Data_Get_Struct(self, Image, image); GetExceptionInfo(&exception); new_image = (fp)(image, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); if (bang) { UPDATE_DATA_PTR(self, new_image); (void) rm_image_destroy(image); return self; } return rm_image_new(new_image); } /** * Handle #auto_gamma_channel, #auto_level_channel methods. * * No Ruby usage (internal function) * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @param fp the channel method to call * @return a new image */ static VALUE auto_channel(int argc, VALUE *argv, VALUE self, MagickBooleanType (*fp)(Image *, const ChannelType)) { Image *image, *new_image; ChannelType channels; image = rm_check_destroyed(self); channels = extract_channels(&argc, argv); if (argc > 0) { raise_ChannelType_error(argv[argc-1]); } new_image = rm_clone_image(image); (void) (fp)(new_image, channels); rm_check_image_exception(new_image, DestroyOnError); return rm_image_new(new_image); } /** * Get/set the auto Gamma channel * * Ruby usage: * - @verbatim Image#auto_gamma_channel @endverbatim * - @verbatim Image#auto_gamma_channel channel @endverbatim * - @verbatim Image#auto_gamma_channel channel, ... @endverbatim * * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_auto_gamma_channel(int argc, VALUE *argv, VALUE self) { #if defined(HAVE_AUTOGAMMAIMAGECHANNEL) return auto_channel(argc, argv, self, AutoGammaImageChannel); #else rm_not_implemented(); return (VALUE) 0; argc = argc; argv = argv; self = self; #endif } /** * Get/set the auto level channel * * Ruby usage: * - @verbatim Image#auto_level_channel @endverbatim * - @verbatim Image#auto_level_channel channel @endverbatim * - @verbatim Image#auto_level_channel channel, ... @endverbatim * * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_auto_level_channel(int argc, VALUE *argv, VALUE self) { #if defined(HAVE_AUTOLEVELIMAGECHANNEL) return auto_channel(argc, argv, self, AutoLevelImageChannel); #else rm_not_implemented(); return (VALUE)0; argc = argc; argv = argv; self = self; #endif } /** * Implement mogrify's -auto_orient option automatically orient image based on * EXIF orientation value. * * No Ruby usage (internal function) * * @param bang whether the bang (!) version of the method was called * @param self this object * @return self if bang, otherwise a new image * @see mogrify.c (in ImageMagick 6.2.8) */ static VALUE auto_orient(int bang, VALUE self) { Image *image; volatile VALUE new_image; VALUE degrees[1]; Data_Get_Struct(self, Image, image); switch (image->orientation) { case TopRightOrientation: new_image = flipflop(bang, self, FlopImage); break; case BottomRightOrientation: degrees[0] = rb_float_new(180.0); new_image = rotate(bang, 1, degrees, self); break; case BottomLeftOrientation: new_image = flipflop(bang, self, FlipImage); break; case LeftTopOrientation: new_image = crisscross(bang, self, TransposeImage); break; case RightTopOrientation: degrees[0] = rb_float_new(90.0); new_image = rotate(bang, 1, degrees, self); break; case RightBottomOrientation: new_image = crisscross(bang, self, TransverseImage); break; case LeftBottomOrientation: degrees[0] = rb_float_new(270.0); new_image = rotate(bang, 1, degrees, self); break; default: // Return IMMEDIATELY return bang ? Qnil : Image_copy(self); break; } Data_Get_Struct(new_image, Image, image); image->orientation = TopLeftOrientation; return new_image; } /** * Implement mogrify's -auto_orient option automatically orient image based on * EXIF orientation value. * * Ruby usage: * - @verbatim Image#auto_orient @endverbatim * * @param self this object * @return a new image * @see mogrify.c (in ImageMagick 6.2.8) */ VALUE Image_auto_orient(VALUE self) { (void) rm_check_destroyed(self); return auto_orient(False, self); } /** * Implement mogrify's -auto_orient option automatically orient image based on * EXIF orientation value. * * Ruby usage: * - @verbatim Image#auto_orient! @endverbatim * * @param self this object * @return nil if the image is already properly oriented, otherwise self */ VALUE Image_auto_orient_bang(VALUE self) { (void) rm_check_frozen(self); return auto_orient(True, self); } /** * Return the name of the background color as a String. * * Ruby usage: * - @verbatim Image#background_color @endverbatim * * @param self this object * @return the background color */ VALUE Image_background_color(VALUE self) { Image *image = rm_check_destroyed(self); return rm_pixelpacket_to_color_name(image, &image->background_color); } /** * Set the the background color to the specified color spec. * * Ruby usage: * - @verbatim Image#background_color= @endverbatim * * @param self this object * @param color the color * @return self */ VALUE Image_background_color_eq(VALUE self, VALUE color) { Image *image = rm_check_frozen(self); Color_to_PixelPacket(&image->background_color, color); return self; } /** * Return the number of rows (before transformations). * * Ruby usage: * - @verbatim Image#base_columns @endverbatim * * @param self this object * @return the number of rows */ VALUE Image_base_columns(VALUE self) { Image *image = rm_check_destroyed(self); return INT2FIX(image->magick_columns); } /** * Return the image filename (before transformations). * * Ruby usage: * - @verbatim Image#base_filename @endverbatim * * @param self this object * @return the base image filename (or the current filename if there is no base) */ VALUE Image_base_filename(VALUE self) { Image *image = rm_check_destroyed(self); if (*image->magick_filename) { return rb_str_new2(image->magick_filename); } else { return rb_str_new2(image->filename); } } /** * Return the number of rows (before transformations). * * Ruby usage: * - @verbatim Image#base_rows @endverbatim * * @param self this object * @return the number of rows */ VALUE Image_base_rows(VALUE self) { Image *image = rm_check_destroyed(self); return INT2FIX(image->magick_rows); } /** * Get image bias (used when convolving an image). * * Ruby usage: * - @verbatim Image#bias @endverbatim * * @param self this object * @return the image bias */ VALUE Image_bias(VALUE self) { Image *image = rm_check_destroyed(self); return rb_float_new(image->bias); } /** * Set image bias (used when convolving an image). * * Ruby usage: * - @verbatim Image#bias = a number between 0.0 and 1.0 or "NN%" @endverbatim * * @param self this object * @param pct the bias * @return self */ VALUE Image_bias_eq(VALUE self, VALUE pct) { Image *image; double bias; image = rm_check_frozen(self); bias = rm_percentage(pct,1.0); image->bias = bias * QuantumRange; return self; } /** * Create a bilevel image. * * Ruby usage: * - @verbatim Image#bilevel_channel(threshold) @endverbatim * - @verbatim Image#bilevel_channel(threshold, channel) @endverbatim * * Notes: * - If no channel is specified AllChannels is used * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_bilevel_channel(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; ChannelType channels; image = rm_check_destroyed(self); channels = extract_channels(&argc, argv); if (argc > 1) { raise_ChannelType_error(argv[argc-1]); } if (argc == 0) { rb_raise(rb_eArgError, "no threshold specified"); } new_image = rm_clone_image(image); (void)BilevelImageChannel(new_image, channels, NUM2DBL(argv[0])); rm_check_image_exception(new_image, DestroyOnError); return rm_image_new(new_image); } /** * Return current black point compensation attribute. * * Ruby usage: * - @verbatim Image#black_point_compensation @endverbatim * * @param self this object * @return the black point compensation */ VALUE Image_black_point_compensation(VALUE self) { Image *image; const char *attr; volatile VALUE value; image = rm_check_destroyed(self); attr = rm_get_property(image, BlackPointCompensationKey); if (attr && rm_strcasecmp(attr, "true") == 0) { value = Qtrue; } else { value = Qfalse; } return value; } /** * Set black point compensation attribute. * * Ruby usage: * - @verbatim Image#black_point_compensation=true or false @endverbatim * * @param self this object * @param arg the compensation * @return self */ VALUE Image_black_point_compensation_eq(VALUE self, VALUE arg) { Image *image; const char *value; image = rm_check_frozen(self); (void) rm_set_property(image, BlackPointCompensationKey, NULL); value = RTEST(arg) ? "true" : "false"; (void) rm_set_property(image, BlackPointCompensationKey, value); return self; } /** * Call BlackThresholdImage. * * Ruby usage: * - @verbatim Image#black_threshold(red_channel) @endverbatim * - @verbatim Image#black_threshold(red_channel, green_channel) @endverbatim * - @verbatim Image#black_threshold(red_channel, green_channel, blue_channel) @endverbatim * - @verbatim Image#black_threshold(red_channel, green_channel, blue_channel, opacity_channel) @endverbatim * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image * @see threshold_image * @see Image_white_threshold */ VALUE Image_black_threshold(int argc, VALUE *argv, VALUE self) { return threshold_image(argc, argv, self, BlackThresholdImage); } /** * Compute offsets using the gravity to determine what the offsets are relative * to. * * No Ruby usage (internal function) * * Notes: * - No return value: modifies x_offset and y_offset directly. * * @param grav the gravity * @param image the destination image * @param mark the source image * @param x_offset pointer to x offset * @param y_offset pointer to y offset */ static void get_relative_offsets(VALUE grav, Image *image, Image *mark, long *x_offset, long *y_offset) { GravityType gravity; VALUE_TO_ENUM(grav, gravity, GravityType); switch (gravity) { case NorthEastGravity: case EastGravity: case SouthEastGravity: *x_offset = (long)(image->columns) - (long)(mark->columns) - *x_offset; break; case NorthGravity: case SouthGravity: case CenterGravity: case StaticGravity: *x_offset += (long)(image->columns/2) - (long)(mark->columns/2); break; default: break; } switch (gravity) { case SouthWestGravity: case SouthGravity: case SouthEastGravity: *y_offset = (long)(image->rows) - (long)(mark->rows) - *y_offset; break; case EastGravity: case WestGravity: case CenterGravity: case StaticGravity: *y_offset += (long)(image->rows/2) - (long)(mark->rows/2); break; case NorthEastGravity: case NorthGravity: default: break; } } /** * Compute watermark offsets from gravity type. * * No Ruby usage (internal function) * * Notes: * - No return value: modifies x_offset and y_offset directly. * * @param grav the gravity * @param image the destination image * @param mark the source image * @param x_offset pointer to x offset * @param y_offset pointer to y offset */ static void get_offsets_from_gravity(GravityType gravity, Image *image, Image *mark , long *x_offset, long *y_offset) { switch (gravity) { case ForgetGravity: case NorthWestGravity: *x_offset = 0; *y_offset = 0; break; case NorthGravity: *x_offset = ((long)(image->columns) - (long)(mark->columns)) / 2; *y_offset = 0; break; case NorthEastGravity: *x_offset = (long)(image->columns) - (long)(mark->columns); *y_offset = 0; break; case WestGravity: *x_offset = 0; *y_offset = ((long)(image->rows) - (long)(mark->rows)) / 2; break; case StaticGravity: case CenterGravity: default: *x_offset = ((long)(image->columns) - (long)(mark->columns)) / 2; *y_offset = ((long)(image->rows) - (long)(mark->rows)) / 2; break; case EastGravity: *x_offset = (long)(image->columns) - (long)(mark->columns); *y_offset = ((long)(image->rows) - (long)(mark->rows)) / 2; break; case SouthWestGravity: *x_offset = 0; *y_offset = (long)(image->rows) - (long)(mark->rows); break; case SouthGravity: *x_offset = ((long)(image->columns) - (long)(mark->columns)) / 2; *y_offset = (long)(image->rows) - (long)(mark->rows); break; case SouthEastGravity: *x_offset = (long)(image->columns) - (long)(mark->columns); *y_offset = (long)(image->rows) - (long)(mark->rows); break; } } /** * Called from rb_protect, returns the number if obj is really a numeric value. * * No Ruby usage (internal function) * * @param obj the value * @return numeric value of obj * @todo Make sure that we are really returning the obj here */ static VALUE check_for_long_value(VALUE obj) { long t; t = NUM2LONG(obj); t = t; // placate gcc return(VALUE)0; } /** * Compute x- and y-offset of source image for a compositing method. * * No Ruby usage (internal function) * * Notes: * - No return value: modifies x_offset and y_offset directly. * * @param argc number of input arguments * @param argv array of input arguments * @param dest the destination image * @param src the source image * @param x_offset pointer to x offset * @param y_offset pointer to y offset */ static void get_composite_offsets(int argc, VALUE *argv, Image *dest, Image *src , long *x_offset, long *y_offset) { GravityType gravity; int exc = 0; if (CLASS_OF(argv[0]) == Class_GravityType) { VALUE_TO_ENUM(argv[0], gravity, GravityType); switch (argc) { // Gravity + offset(s). Offsets are relative to the image edges // as specified by the gravity. case 3: *y_offset = NUM2LONG(argv[2]); case 2: *x_offset = NUM2LONG(argv[1]); get_relative_offsets(argv[0], dest, src, x_offset, y_offset); break; case 1: // No offsets specified. Compute offset based on the gravity alone. get_offsets_from_gravity(gravity, dest, src, x_offset, y_offset); break; } } // Gravity not specified at all. Offsets are measured from the // NorthWest corner. The arguments must be numbers. else { (void)rb_protect(check_for_long_value, argv[0], &exc); if (exc) { rb_raise(rb_eTypeError, "expected GravityType, got %s" , rb_class2name(CLASS_OF(argv[0]))); } *x_offset = NUM2LONG(argv[0]); if (argc > 1) { *y_offset = NUM2LONG(argv[1]); } } } /** * Convert 2 doubles to a blend or dissolve geometry string. * * No Ruby usage (internal function) * * Notes: * - the geometry buffer needs to be at least 16 characters long. * - For safety's sake this function asserts that it is at least 20 characters * long. * - The percentages must be in the range -1000 < n < 1000. This is far in * excess of what xMagick will allow. * * @param geometry the geometry * @param geometry_l length of geometry * @param src_percent source percentage * @param dst_percent destination percentage */ static void blend_geometry(char *geometry, size_t geometry_l, double src_percent, double dst_percent) { size_t sz = 0; int fw, prec; if (fabs(src_percent) >= 1000.0 || fabs(dst_percent) >= 1000.0) { if (fabs(src_percent) < 1000.0) { src_percent = dst_percent; } rb_raise(rb_eArgError, "%g is out of range +/-999.99", src_percent); } assert(geometry_l >= 20); memset(geometry, 0xdf, geometry_l); fw = 4; prec = 0; if (src_percent != floor(src_percent)) { prec = 2; fw += 3; } sz = (size_t)sprintf(geometry, "%*.*f", -fw, prec, src_percent); assert(sz < geometry_l); sz = strcspn(geometry, " "); // if dst_percent was nil don't add to the geometry if (dst_percent != -1.0) { fw = 4; prec = 0; if (dst_percent != floor(dst_percent)) { prec = 2; fw += 3; } sz += (size_t)sprintf(geometry+sz, "x%*.*f", -fw, prec, dst_percent); assert(sz < geometry_l); sz = strcspn(geometry, " "); } if (sz < geometry_l) { memset(geometry+sz, 0x00, geometry_l-sz); } } /** * Create a composite of an image and an overlay (for blending, dissolving, etc.). * * No Ruby usage (internal function) * * @param image the original image * @param overlay the overlay * @param image_pct image percentage * @param overlay_pct overlay percentage * @param x_off the x offset * @param y_off the y offset * @param op the composite operator to use * @return a new image */ static VALUE special_composite(Image *image, Image *overlay, double image_pct, double overlay_pct , long x_off, long y_off, CompositeOperator op) { Image *new_image; char geometry[20]; blend_geometry(geometry, sizeof(geometry), image_pct, overlay_pct); (void) CloneString(&overlay->geometry, geometry); #if defined(HAVE_SETIMAGEARTIFACT) (void) SetImageArtifact(overlay,"compose:args", geometry); #endif new_image = rm_clone_image(image); (void) CompositeImage(new_image, op, overlay, x_off, y_off); rm_check_image_exception(new_image, DestroyOnError); return rm_image_new(new_image); } /** * Corresponds to the composite -blend operation. * * Ruby usage: * - @verbatim Image#blend(overlay, src_percent, dst_percent) @endverbatim * - @verbatim Image#blend(overlay, src_percent, dst_percent, x_offset) @endverbatim * - @verbatim Image#blend(overlay, src_percent, dst_percent, x_offset, y_offset) @endverbatim * - @verbatim Image#dissolve(overlay, src_percent, dst_percent, gravity) @endverbatim * - @verbatim Image#dissolve(overlay, src_percent, dst_percent, gravity, x_offset) @endverbatim * - @verbatim Image#dissolve(overlay, src_percent, dst_percent, gravity, x_offset, y_offset) @endverbatim * * Notes: * - Default x_offset is 0 * - Default y_offset is 0 * - Percent can be a number or a string in the form "NN%" * - The default value for dst_percent is 100%-src_percent * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_blend(int argc, VALUE *argv, VALUE self) { volatile VALUE ovly; Image *image, *overlay; double src_percent, dst_percent; long x_offset = 0L, y_offset = 0L; image = rm_check_destroyed(self); if (argc < 1) { rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 to 6)", argc); } ovly = rm_cur_image(argv[0]); overlay = rm_check_destroyed(ovly); if (argc > 3) { get_composite_offsets(argc-3, &argv[3], image, overlay, &x_offset, &y_offset); // There must be 3 arguments left argc = 3; } switch (argc) { case 3: dst_percent = rm_percentage(argv[2],1.0) * 100.0; src_percent = rm_percentage(argv[1],1.0) * 100.0; break; case 2: src_percent = rm_percentage(argv[1],1.0) * 100.0; dst_percent = FMAX(100.0 - src_percent, 0); break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 to 6)", argc); break; } return special_composite(image, overlay, src_percent, dst_percent , x_offset, y_offset, BlendCompositeOp); } /** * Call BlueShiftImage. * * Ruby usage: * - @verbatim Image#blue_shift @endverbatim * - @verbatim Image#blue_shift(factor) @endverbatim * * Notes: * - Default factor is 1.5 * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_blue_shift(int argc, VALUE *argv, VALUE self) { #if defined(HAVE_BLUESHIFTIMAGE) Image *image, *new_image; double factor = 1.5; ExceptionInfo exception; image = rm_check_destroyed(self); switch (argc) { case 1: factor = NUM2DBL(argv[0]); case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 or 1)", argc); break; } GetExceptionInfo(&exception); new_image = BlueShiftImage(image, factor, &exception); CHECK_EXCEPTION(); DestroyExceptionInfo(&exception); return rm_image_new(new_image); #else rm_not_implemented(); return (VALUE)0; argc = argc; argv = argv; self = self; #endif } DEF_ATTR_ACCESSOR(Image, blur, dbl) /** * Call BlurImageChannel. * * Ruby usage: * - @verbatim Image#blur_channel @endverbatim * - @verbatim Image#blur_channel(radius) @endverbatim * - @verbatim Image#blur_channel(radius, sigma) @endverbatim * - @verbatim Image#blur_channel(radius, sigma, channel) @endverbatim * * Notes: * - Default radius is 0.0 * - Default sigma is 1.0 * - Default channel is AllChannels * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_blur_channel(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; ExceptionInfo exception; ChannelType channels; double radius = 0.0, sigma = 1.0; image = rm_check_destroyed(self); channels = extract_channels(&argc, argv); // There can be 0, 1, or 2 remaining arguments. switch (argc) { case 2: sigma = NUM2DBL(argv[1]); case 1: radius = NUM2DBL(argv[0]); case 0: break; default: raise_ChannelType_error(argv[argc-1]); } GetExceptionInfo(&exception); new_image = BlurImageChannel(image, channels, radius, sigma, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Blur the image. * * Ruby usage: * - @verbatim Image#blur_image @endverbatim * - @verbatim Image#blur_image(radius) @endverbatim * - @verbatim Image#blur_image(radius, sigma) @endverbatim * * Notes: * - Default radius is 0.0 * - Default sigma is 1.0 * - The "blur" name is used for the attribute * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_blur_image(int argc, VALUE *argv, VALUE self) { return effect_image(self, argc, argv, BlurImage); } /** * Surrounds the image with a border of the specified width, height, and named * color. * * No Ruby usage (internal function) * * @param bang whether the bang (!) version of the method was called * @param self this object * @param width the width of the border * @param height the height of the border * @param color the color of the border * @return self if bang, otherwise a new image * @see Image_border * @see Image_border_bang */ static VALUE border(int bang, VALUE self, VALUE width, VALUE height, VALUE color) { Image *image, *new_image; PixelPacket old_border; ExceptionInfo exception; RectangleInfo rect; Data_Get_Struct(self, Image, image); memset(&rect, 0, sizeof(rect)); rect.width = NUM2UINT(width); rect.height = NUM2UINT(height); // Save current border color - we'll want to restore it afterwards. old_border = image->border_color; Color_to_PixelPacket(&image->border_color, color); GetExceptionInfo(&exception); new_image = BorderImage(image, &rect, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); if (bang) { new_image->border_color = old_border; UPDATE_DATA_PTR(self, new_image); (void) rm_image_destroy(image); return self; } image->border_color = old_border; return rm_image_new(new_image); } /** * Surrounds the image with a border of the specified width, height, and named * color. * * Ruby usage: * - @verbatim Image#border!(width, height, color) @endverbatim * * @param self this object * @param width the width of the border * @param height the height of the border * @param color the color of the border * @return self * @see border * @see Image_border */ VALUE Image_border_bang(VALUE self, VALUE width, VALUE height, VALUE color) { (void) rm_check_frozen(self); return border(True, self, width, height, color); } /** * Surrounds the image with a border of the specified width, height, and named * color. * * Ruby usage: * - @verbatim Image#border(width, height, color) @endverbatim * * @param self this object * @param width the width of the border * @param height the height of the border * @param color the color of the border * @return a new image * @see border * @see Image_border_bang */ VALUE Image_border(VALUE self, VALUE width, VALUE height, VALUE color) { (void) rm_check_destroyed(self); return border(False, self, width, height, color); } /** * Return the name of the border color as a String. * * Ruby usage: * - @verbatim Image#border_color @endverbatim * * @param self this object * @return the name of the border color */ VALUE Image_border_color(VALUE self) { Image *image = rm_check_destroyed(self); return rm_pixelpacket_to_color_name(image, &image->border_color); } /** * Set the the border color. * * Ruby usage: * - @verbatim Image#border_color= @endverbatim * * @param self this object * @param color the color * @return self */ VALUE Image_border_color_eq(VALUE self, VALUE color) { Image *image = rm_check_frozen(self); Color_to_PixelPacket(&image->border_color, color); return self; } /** * returns the bounding box of an image canvas. * * Ruby usage: * - @verbatim Image#bounding_box @endverbatim * * @param self this object * @return the bounding box */ VALUE Image_bounding_box(VALUE self) { Image *image; RectangleInfo box; ExceptionInfo exception; image = rm_check_destroyed(self); GetExceptionInfo(&exception); box = GetImageBoundingBox(image, &exception); CHECK_EXCEPTION() (void) DestroyExceptionInfo(&exception); return Import_RectangleInfo(&box); } /** * do a screen capture. * * Ruby usage: * - @verbatim Image.capture @endverbatim * - @verbatim Image.capture(silent) { optional parms } @endverbatim * - @verbatim Image.capture(silent,frame) { optional parms } @endverbatim * - @verbatim Image.capture(silent,frame,descend) { optional parms } @endverbatim * - @verbatim Image.capture(silent,frame,descend,screen) { optional parms } @endverbatim * - @verbatim Image.capture(silent,frame,descend,screen,borders) { optional parms } @endverbatim * * Notes: * - Default silent is false * - Default frame is false * - Default descent is false * - Default screen is false * - Default borders if false * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_capture(int argc, VALUE *argv, VALUE self) { Image *image; ImageInfo *image_info; volatile VALUE info_obj; XImportInfo ximage_info; self = self; // Suppress "never referenced" message from icc XGetImportInfo(&ximage_info); switch (argc) { case 5: ximage_info.borders = (MagickBooleanType)RTEST(argv[4]); case 4: ximage_info.screen = (MagickBooleanType)RTEST(argv[3]); case 3: ximage_info.descend = (MagickBooleanType)RTEST(argv[2]); case 2: ximage_info.frame = (MagickBooleanType)RTEST(argv[1]); case 1: ximage_info.silent = (MagickBooleanType)RTEST(argv[0]); case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 to 5)", argc); break; } // Get optional parms. // Set info->filename = "root", window ID number or window name, // or nothing to do an interactive capture // Set info->server_name to the server name // Also info->colorspace, depth, dither, interlace, type info_obj = rm_info_new(); Data_Get_Struct(info_obj, Info, image_info); // If an error occurs, IM will call our error handler and we raise an exception. image = XImportImage(image_info, &ximage_info); rm_check_image_exception(image, DestroyOnError); rm_ensure_result(image); rm_set_user_artifact(image, image_info); return rm_image_new(image); } /** * parse geometry string, compute new image geometry. * * Ruby usage: * - @verbatim Image#change_geometry(geometry_string) { |cols, rows, image| } @endverbatim * * @param self this object * @param geom_arg the geometry string * @return new image geometry */ VALUE Image_change_geometry(VALUE self, VALUE geom_arg) { Image *image; RectangleInfo rect; volatile VALUE geom_str; char *geometry; unsigned int flags; volatile VALUE ary; image = rm_check_destroyed(self); geom_str = rm_to_s(geom_arg); geometry = StringValuePtr(geom_str); memset(&rect, 0, sizeof(rect)); SetGeometry(image, &rect); rm_check_image_exception(image, RetainOnError); flags = ParseMetaGeometry(geometry, &rect.x,&rect.y, &rect.width,&rect.height); if (flags == NoValue) { rb_raise(rb_eArgError, "invalid geometry string `%s'", geometry); } ary = rb_ary_new2(3); rb_ary_store(ary, 0, ULONG2NUM(rect.width)); rb_ary_store(ary, 1, ULONG2NUM(rect.height)); rb_ary_store(ary, 2, self); return rb_yield(ary); } /** * Return true if any pixel in the image has been altered since the image was * constituted. * * Ruby usage: * - @verbatim Image#changed? @endverbatim * * @param self this object * @return true if altered, false otherwise */ VALUE Image_changed_q(VALUE self) { Image *image = rm_check_destroyed(self); VALUE okay = IsTaintImage(image) ? Qtrue : Qfalse; rm_check_image_exception(image, RetainOnError); return okay; } /** * Extract a channel from the image. A channel is a particular color component * of each pixel in the image. * * Ruby usage: * - @verbatim Image#channel @endverbatim * * @param self this object * @param channel_arg the type of the channel to extract * @return the channel of the specified type */ VALUE Image_channel(VALUE self, VALUE channel_arg) { Image *image, *new_image; ChannelType channel; image = rm_check_destroyed(self); VALUE_TO_ENUM(channel_arg, channel, ChannelType); new_image = rm_clone_image(image); (void) SeparateImageChannel(new_image, channel); rm_check_image_exception(new_image, DestroyOnError); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * GetImageChannelDepth. * * Ruby usage: * - @verbatim Image#channel_depth @endverbatim * - @verbatim Image#channel_depth(channel_depth) @endverbatim * * Notes: * - Default channel_depth is AllChannels * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return the channel depth */ VALUE Image_channel_depth(int argc, VALUE *argv, VALUE self) { Image *image; ChannelType channels; unsigned long channel_depth; ExceptionInfo exception; image = rm_check_destroyed(self); channels = extract_channels(&argc, argv); // Ensure all arguments consumed. if (argc > 0) { raise_ChannelType_error(argv[argc-1]); } GetExceptionInfo(&exception); channel_depth = GetImageChannelDepth(image, channels, &exception); CHECK_EXCEPTION() (void) DestroyExceptionInfo(&exception); return ULONG2NUM(channel_depth); } /** * Return an array [min, max] where 'min' and 'max' are the minimum and maximum * values of all channels. * * Ruby usage: * - @verbatim Image#channel_extrema @endverbatim * - @verbatim Image#channel_extrema(channel) @endverbatim * * Notes: * - Default channel is AllChannels * - GM's implementation is very different from ImageMagick. This method * follows the IM API very closely and then shoehorn's the GM API to * more-or-less fit. Note that IM allows you to specify more than one * channel argument. GM does not. * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return [min,max] of the channel */ VALUE Image_channel_extrema(int argc, VALUE *argv, VALUE self) { Image *image; ChannelType channels; ExceptionInfo exception; unsigned long min, max; volatile VALUE ary; image = rm_check_destroyed(self); channels = extract_channels(&argc, argv); // Ensure all arguments consumed. if (argc > 0) { raise_ChannelType_error(argv[argc-1]); } GetExceptionInfo(&exception); (void) GetImageChannelExtrema(image, channels, &min, &max, &exception); CHECK_EXCEPTION() (void) DestroyExceptionInfo(&exception); ary = rb_ary_new2(2); rb_ary_store(ary, 0, ULONG2NUM(min)); rb_ary_store(ary, 1, ULONG2NUM(max)); return ary; } /** * Return an array of the mean and standard deviation for the channel. * * Ruby usage: * - @verbatim Image#channel_mean @endverbatim * - @verbatim Image#channel_mean(channel) @endverbatim * * Notes: * - Default channel is AllChannels * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return an array [mean, std. deviation] */ VALUE Image_channel_mean(int argc, VALUE *argv, VALUE self) { Image *image; ChannelType channels; ExceptionInfo exception; double mean, stddev; volatile VALUE ary; image = rm_check_destroyed(self); channels = extract_channels(&argc, argv); // Ensure all arguments consumed. if (argc > 0) { raise_ChannelType_error(argv[argc-1]); } GetExceptionInfo(&exception); (void) GetImageChannelMean(image, channels, &mean, &stddev, &exception); CHECK_EXCEPTION() (void) DestroyExceptionInfo(&exception); ary = rb_ary_new2(2); rb_ary_store(ary, 0, rb_float_new(mean)); rb_ary_store(ary, 1, rb_float_new(stddev)); return ary; } /** * Return a new image that is a copy of the input image with the edges * highlighted. * * Ruby usage: * - @verbatim Image#charcoal @endverbatim * - @verbatim Image#charcoal(radius) @endverbatim * - @verbatim Image#charcoal(radius, sigma) @endverbatim * * Notes: * - Default radius is 0.0 * - Default sigma is 1.0 * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_charcoal(int argc, VALUE *argv, VALUE self) { return effect_image(self, argc, argv, CharcoalImage); } /** * If the target image has been destroyed, raise Magick::DestroyedImageError. * * Ruby usage: * - @verbatim Image#check_destroyed @endverbatim * * @param self this object * @return nil * @throw Magick::DestroyedImageError */ VALUE Image_check_destroyed(VALUE self) { (void) rm_check_destroyed(self); return Qnil; } /** * Remove a region of an image and collapses the image to occupy the removed * portion. * * Ruby usage: * - @verbatim Image#chop @endverbatim * * @param self this object * @param x x position of start of region * @param y y position of start of region * @param width width of region * @param height height of region * @return a new image */ VALUE Image_chop(VALUE self, VALUE x, VALUE y, VALUE width, VALUE height) { (void) rm_check_destroyed(self); return xform_image(False, self, x, y, width, height, ChopImage); } /** * Return the red, green, blue, and white-point chromaticity values as a * Magick::ChromaticityInfo. * * Ruby usage: * - @verbatim Image#chromaticity @endverbatim * * @param self this object * @return the chromaticity values */ VALUE Image_chromaticity(VALUE self) { Image *image = rm_check_destroyed(self); return ChromaticityInfo_new(&image->chromaticity); } /** * Set the red, green, blue, and white-point chromaticity values from a * Magick::ChromaticityInfo. * * Ruby usage: * - @verbatim Image#chromaticity= @endverbatim * * @param self this object * @param chroma the chromaticity * @return self */ VALUE Image_chromaticity_eq(VALUE self, VALUE chroma) { Image *image = rm_check_frozen(self); Export_ChromaticityInfo(&image->chromaticity, chroma); return self; } /** * Copy an image, along with its frozen and tainted state. * * Ruby usage: * - @verbatim Image#clone @endverbatim * * @param self this object * @return a clone of this object */ VALUE Image_clone(VALUE self) { volatile VALUE clone; clone = Image_dup(self); if (OBJ_FROZEN(self)) { OBJ_FREEZE(clone); } return clone; } /** * Equivalent to -clut option. * * Ruby usage: * - @verbatim Image#clut_channel @endverbatim * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self */ VALUE Image_clut_channel(int argc, VALUE *argv, VALUE self) { Image *image, *clut; ChannelType channels; MagickBooleanType okay; image = rm_check_frozen(self); // check_destroyed before confirming the arguments if (argc >= 1) { (void) rm_check_destroyed(argv[0]); channels = extract_channels(&argc, argv); if (argc != 1) { rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or more)", argc); } } else { rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or more)", argc); } Data_Get_Struct(argv[0], Image, clut); okay = ClutImageChannel(image, channels, clut); rm_check_image_exception(image, RetainOnError); rm_check_image_exception(clut, RetainOnError); if (!okay) { rb_raise(rb_eRuntimeError, "ClutImageChannel failed."); } return self; } /** * Call GetImageHistogram. * * Ruby usage: * - @verbatim Image_color_histogram(VALUE self); @endverbatim * * Notes: * - returns hash @verbatim {aPixel=>count} @endverbatim * * @param self this object * @return a histogram */ VALUE Image_color_histogram(VALUE self) { Image *image, *dc_copy = NULL; volatile VALUE hash, pixel; unsigned long x, colors; ColorPacket *histogram; ExceptionInfo exception; image = rm_check_destroyed(self); // If image not DirectClass make a DirectClass copy. if (image->storage_class != DirectClass) { dc_copy = rm_clone_image(image); (void) SyncImage(dc_copy); magick_free(dc_copy->colormap); dc_copy->colormap = NULL; dc_copy->storage_class = DirectClass; image = dc_copy; } GetExceptionInfo(&exception); histogram = GetImageHistogram(image, &colors, &exception); if (histogram == NULL) { if (dc_copy) { (void) DestroyImage(dc_copy); } rb_raise(rb_eNoMemError, "not enough memory to continue"); } if (exception.severity != UndefinedException) { (void) RelinquishMagickMemory(histogram); rm_check_exception(&exception, dc_copy, DestroyOnError); } (void) DestroyExceptionInfo(&exception); hash = rb_hash_new(); for (x = 0; x < colors; x++) { pixel = Pixel_from_PixelPacket(&histogram[x].pixel); (void) rb_hash_aset(hash, pixel, ULONG2NUM((unsigned long)histogram[x].count)); } /* Christy evidently didn't agree with Bob's memory management. */ (void) RelinquishMagickMemory(histogram); if (dc_copy) { // Do not trace destruction (void) DestroyImage(dc_copy); } return hash; } /** * Store all the profiles in the profile in the target image. Called from * Image_color_profile_eq and Image_iptc_profile_eq. * * No Ruby usage (internal function) * * @param self this object * @param name profile name * @param profile an IPTC or ICC profile * @return self */ static VALUE set_profile(VALUE self, const char *name, VALUE profile) { Image *image, *profile_image; ImageInfo *info; const MagickInfo *m; ExceptionInfo exception; char *profile_name; char *profile_blob; long profile_length; const StringInfo *profile_data; image = rm_check_frozen(self); profile_blob = rm_str2cstr(profile, &profile_length); GetExceptionInfo(&exception); m = GetMagickInfo(name, &exception); CHECK_EXCEPTION() info = CloneImageInfo(NULL); if (!info) { rb_raise(rb_eNoMemError, "not enough memory to continue"); } strncpy(info->magick, m->name, MaxTextExtent); info->magick[MaxTextExtent-1] = '\0'; profile_image = BlobToImage(info, profile_blob, (size_t)profile_length, &exception); (void) DestroyImageInfo(info); CHECK_EXCEPTION() (void) DestroyExceptionInfo(&exception); ResetImageProfileIterator(profile_image); profile_name = GetNextImageProfile(profile_image); while (profile_name) { if (rm_strcasecmp(profile_name, name) == 0) { profile_data = GetImageProfile(profile_image, profile_name); if (profile) { (void)ProfileImage(image, profile_name, profile_data->datum , (unsigned long)profile_data->length , (MagickBooleanType)MagickFalse); if (image->exception.severity >= ErrorException) { break; } } } profile_name = GetNextImageProfile(profile_image); } (void) DestroyImage(profile_image); rm_check_image_exception(image, RetainOnError); return self; } /** * Return the ICC color profile as a String. * * Ruby usage: * - @verbatim Image#color_profile @endverbatim * * Notes: * - If there is no profile, returns "" * - This method has no real use but is retained for compatibility with * earlier releases of RMagick, where it had no real use either. * * @param self this object * @return the ICC color profile */ VALUE Image_color_profile(VALUE self) { Image *image; const StringInfo *profile; image = rm_check_destroyed(self); profile = GetImageProfile(image, "icc"); if (!profile) { return Qnil; } return rb_str_new((char *)profile->datum, (long)profile->length); } /** * Set the ICC color profile. * * Ruby usage: * - @verbatim Image#color_profile=(String) @endverbatim * * Notes: * - Pass nil to remove any existing profile. * - Removes any existing profile before adding the new one. * * @param self this object * @param profile the profile to set, as a Ruby string * @return self */ VALUE Image_color_profile_eq(VALUE self, VALUE profile) { (void) Image_delete_profile(self, rb_str_new2("ICC")); if (profile != Qnil) { (void) set_profile(self, "ICC", profile); } return self; } /** * Change the color value of any pixel that matches target_color and is an * immediate neighbor. * * Ruby usage: * - @verbatim Image#color_flood_fill(target_color, fill_color, x, y, method) @endverbatim * * Notes: * - Use fuzz= to specify the tolerance amount * - Accepts either the FloodfillMethod or the FillToBorderMethod * * @param self this object * @param target_color the color * @param fill_color the color to fill * @param xv the x position * @param yv the y position * @param method the method to call * @return a new image * @see Image_opaque */ VALUE Image_color_flood_fill( VALUE self, VALUE target_color, VALUE fill_color , VALUE xv, VALUE yv, VALUE method) { Image *image, *new_image; PixelPacket target; DrawInfo *draw_info; PixelPacket fill; long x, y; int fill_method; image = rm_check_destroyed(self); // The target and fill args can be either a color name or // a Magick::Pixel. Color_to_PixelPacket(&target, target_color); Color_to_PixelPacket(&fill, fill_color); x = NUM2LONG(xv); y = NUM2LONG(yv); if ((unsigned long)x > image->columns || (unsigned long)y > image->rows) { rb_raise(rb_eArgError, "target out of range. %lux%lu given, image is %lux%lu" , x, y, image->columns, image->rows); } VALUE_TO_ENUM(method, fill_method, PaintMethod); if (!(fill_method == FloodfillMethod || fill_method == FillToBorderMethod)) { rb_raise(rb_eArgError, "paint method must be FloodfillMethod or " "FillToBorderMethod (%d given)", fill_method); } draw_info = CloneDrawInfo(NULL, NULL); if (!draw_info) { rb_raise(rb_eNoMemError, "not enough memory to continue"); } draw_info->fill = fill; new_image = rm_clone_image(image); #if defined(HAVE_FLOODFILLPAINTIMAGE) { MagickPixelPacket target_mpp; MagickBooleanType invert; GetMagickPixelPacket(new_image, &target_mpp); if (fill_method == FillToBorderMethod) { invert = MagickTrue; target_mpp.red = (MagickRealType) image->border_color.red; target_mpp.green = (MagickRealType) image->border_color.green; target_mpp.blue = (MagickRealType) image->border_color.blue; } else { invert = MagickFalse; target_mpp.red = (MagickRealType) target.red; target_mpp.green = (MagickRealType) target.green; target_mpp.blue = (MagickRealType) target.blue; } (void) FloodfillPaintImage(new_image, DefaultChannels, draw_info, &target_mpp, x, y, invert); } #else (void) ColorFloodfillImage(new_image, draw_info, target, x, y, (PaintMethod)fill_method); #endif // No need to check for error (void) DestroyDrawInfo(draw_info); return rm_image_new(new_image); } /** * Blend the fill color specified by "target" with each pixel in the image. * Specify the percentage blend for each r, g, b component. * * Ruby usage: * - @verbatim Image#colorize(r, g, b, target) @endverbatim * - @verbatim Image#colorize(r, g, b, matte, target) @endverbatim * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_colorize(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; double red, green, blue, matte; char opacity[50]; PixelPacket target; ExceptionInfo exception; image = rm_check_destroyed(self); if (argc == 4) { red = floor(100*NUM2DBL(argv[0])+0.5); green = floor(100*NUM2DBL(argv[1])+0.5); blue = floor(100*NUM2DBL(argv[2])+0.5); Color_to_PixelPacket(&target, argv[3]); sprintf(opacity, "%f/%f/%f", red, green, blue); } else if (argc == 5) { red = floor(100*NUM2DBL(argv[0])+0.5); green = floor(100*NUM2DBL(argv[1])+0.5); blue = floor(100*NUM2DBL(argv[2])+0.5); matte = floor(100*NUM2DBL(argv[3])+0.5); Color_to_PixelPacket(&target, argv[4]); sprintf(opacity, "%f/%f/%f/%f", red, green, blue, matte); } else { rb_raise(rb_eArgError, "wrong number of arguments (%d for 4 or 5)", argc); } GetExceptionInfo(&exception); new_image = ColorizeImage(image, opacity, target, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Return the color in the colormap at the specified index. If a new color is * specified, replaces the color at the index with the new color. * * Ruby usage: * - @verbatim Image#colormap(index) @endverbatim * - @verbatim Image#colormap(index, new-color) @endverbatim * * Notes: * - The "new-color" argument can be either a color name or a Magick::Pixel. * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return the name of the color */ VALUE Image_colormap(int argc, VALUE *argv, VALUE self) { Image *image; unsigned long idx; PixelPacket color, new_color; image = rm_check_destroyed(self); // We can handle either 1 or 2 arguments. Nothing else. if (argc == 0 || argc > 2) { rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc); } idx = NUM2ULONG(argv[0]); if (idx > QuantumRange) { rb_raise(rb_eIndexError, "index out of range"); } // If this is a simple "get" operation, ensure the image has a colormap. if (argc == 1) { if (!image->colormap) { rb_raise(rb_eIndexError, "image does not contain a colormap"); } // Validate the index if (idx > image->colors-1) { rb_raise(rb_eIndexError, "index out of range"); } return rm_pixelpacket_to_color_name(image, &image->colormap[idx]); } // This is a "set" operation. Things are different. rb_check_frozen(self); // Replace with new color? The arg can be either a color name or // a Magick::Pixel. Color_to_PixelPacket(&new_color, argv[1]); // Handle no colormap or current colormap too small. if (!image->colormap || idx > image->colors-1) { PixelPacket black; unsigned long i; memset(&black, 0, sizeof(black)); if (!image->colormap) { image->colormap = (PixelPacket *)magick_safe_malloc((idx+1), sizeof(PixelPacket)); image->colors = 0; } else { image->colormap = (PixelPacket *)magick_safe_realloc(image->colormap, (idx+1), sizeof(PixelPacket)); } for (i = image->colors; i < idx; i++) { image->colormap[i] = black; } image->colors = idx+1; } // Save the current color so we can return it. Set the new color. color = image->colormap[idx]; image->colormap[idx] = new_color; return rm_pixelpacket_to_color_name(image, &color); } /** * Get image colors. * * Ruby usage: * - @verbatim Image#colors @endverbatim * * @param self this object * @return the colors */ DEF_ATTR_READER(Image, colors, ulong) /** * Return the Image pixel interpretation. If the colorspace is RGB the pixels * are red, green, blue. If matte is true, then red, green, blue, and index. If * it is CMYK, the pixels are cyan, yellow, magenta, black. Otherwise the * colorspace is ignored. * * Ruby usage: * - @verbatim Image#colorspace @endverbatim * * @param self this object * @return the colorspace */ VALUE Image_colorspace(VALUE self) { Image *image; image = rm_check_destroyed(self); return ColorspaceType_new(image->colorspace); } /** * Set the image's colorspace. * * Ruby usage: * - @verbatim Image#colorspace=Magick::ColorspaceType @endverbatim * * @param self this object * @param colorspace the colorspace * @return self * @see Magick::colorSpace in Magick++'s Magick::colorSpace */ VALUE Image_colorspace_eq(VALUE self, VALUE colorspace) { Image *image; ColorspaceType new_cs; image = rm_check_frozen(self); VALUE_TO_ENUM(colorspace, new_cs, ColorspaceType); #if defined(HAVE_TRANSFORMIMAGECOLORSPACE) (void) TransformImageColorspace(image, new_cs); #else (void) SetImageColorspace(image, new_cs); #endif return self; } /** * Get image columns. * * Ruby usage: * - @verbatim Image#columns @endverbatim * * @param self this object * @return the columns */ DEF_ATTR_READER(Image, columns, int) /** * Combine the Red channel of the first image with the Green channel of the * 2nd image and the Blue channel of the 3rd image. Any of the image arguments * may be omitted or replaced by nil. * * Ruby usage: * - @verbatim new_image = Image.combine(red) @endverbatim * - @verbatim new_image = Image.combine(red, green) @endverbatim * - @verbatim new_image = Image.combine(red, green, blue) @endverbatim * - @verbatim new_image = Image.combine(red, green, blue, opacity) @endverbatim * * Notes: * - Calls CombineImages. * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_combine(int argc, VALUE *argv, VALUE self) { ChannelType channel = 0; Image *image, *images = NULL, *new_image; ExceptionInfo exception; self = self; // defeat "unreferenced argument" message switch (argc) { case 4: if (argv[3] != Qnil) { channel |= OpacityChannel; image = rm_check_destroyed(argv[3]); AppendImageToList(&images, image); } case 3: if (argv[2] != Qnil) { channel |= BlueChannel; image = rm_check_destroyed(argv[2]); AppendImageToList(&images, image); } case 2: if (argv[1] != Qnil) { channel |= GreenChannel; image = rm_check_destroyed(argv[1]); AppendImageToList(&images, image); } case 1: if (argv[0] != Qnil) { channel |= RedChannel; image = rm_check_destroyed(argv[0]); AppendImageToList(&images, image); } break; default: rb_raise(rb_eArgError, "wrong number of arguments (1 to 4 expected, got %d)", argc); } if (channel == 0) { rb_raise(rb_eArgError, "no images to combine"); } GetExceptionInfo(&exception); ReverseImageList(&images); new_image = CombineImages(images, channel, &exception); rm_check_exception(&exception, images, RetainOnError); rm_split(images); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Compare one or more channels in two images and returns the specified * distortion metric and a comparison image. * * Ruby usage: * - @verbatim Image#compare_channel(ref_image, metric) { optional arguments } @endverbatim * - @verbatim Image#compare_channel(ref_image, metric, channel) { optional arguments } @endverbatim * - @verbatim Image#compare_channel(ref_image, metric, channel, ...) { optional arguments } @endverbatim * * Notes: * - If no channels are specified, the default is AllChannels. That case is * the equivalent of the CompareImages method in ImageMagick. * - Originally this method was called channel_compare, but that doesn't match * the general naming convention that methods which accept multiple optional * ChannelType arguments have names that end in _channel. So I renamed the * method to compare_channel but kept channel_compare as an alias. * - The optional arguments are specified thusly: * - self.highlight_color color * - self.lowlight-color color * where color is either a color name or a Pixel. * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return an array of [difference_image,distortion] */ VALUE Image_compare_channel(int argc, VALUE *argv, VALUE self) { Image *image, *r_image, *difference_image; double distortion; volatile VALUE ary, ref; MetricType metric_type; ChannelType channels; ExceptionInfo exception; image = rm_check_destroyed(self); channels = extract_channels(&argc, argv); if (argc > 2) { raise_ChannelType_error(argv[argc-1]); } if (argc != 2) { rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or more)", argc); } rm_get_optional_arguments(self); ref = rm_cur_image(argv[0]); r_image = rm_check_destroyed(ref); VALUE_TO_ENUM(argv[1], metric_type, MetricType); GetExceptionInfo(&exception); difference_image = CompareImageChannels(image , r_image , channels , metric_type , &distortion , &exception); rm_check_exception(&exception, difference_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(difference_image); ary = rb_ary_new2(2); rb_ary_store(ary, 0, rm_image_new(difference_image)); rb_ary_store(ary, 1, rb_float_new(distortion)); return ary; } /** * Return the composite operator attribute. * * Ruby usage: * - @verbatim Image#compose @endverbatim * * @param self this object * @return the composite operator */ VALUE Image_compose(VALUE self) { Image *image = rm_check_destroyed(self); return CompositeOperator_new(image->compose); } /** * Set the composite operator attribute. * * Ruby usage: * - @verbatim Image#compose=composite_op @endverbatim * * @param self this object * @param compose_arg the composite operator * @return self */ VALUE Image_compose_eq(VALUE self, VALUE compose_arg) { Image *image = rm_check_frozen(self); VALUE_TO_ENUM(compose_arg, image->compose, CompositeOperator); return self; } /** * Call CompositeImage. * * No Ruby usage (internal function) * * Notes: * - The other image can be either an Image or an Image. * - The use of the GravityType to position the composited image is based on * Magick++. * - The `gravity' argument has the same effect as the -gravity option does in * the `composite' utility. * * @param bang whether the bang (!) version of the method was called * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @param channels * @return self if bang, otherwise new composited image * @see Image_composite * @see Image_composite_bang */ static VALUE composite(int bang, int argc, VALUE *argv, VALUE self, ChannelType channels) { Image *image, *new_image; Image *comp_image; CompositeOperator operator = UndefinedCompositeOp; GravityType gravity; volatile VALUE comp; signed long x_offset = 0; signed long y_offset = 0; image = rm_check_destroyed(self); if (bang) { rb_check_frozen(self); } if (argc < 3 || argc > 5) { rb_raise(rb_eArgError, "wrong number of arguments (%d for 3, 4, or 5)", argc); } comp = rm_cur_image(argv[0]); comp_image = rm_check_destroyed(comp); switch (argc) { case 3: // argv[1] is gravity, argv[2] is composite_op VALUE_TO_ENUM(argv[1], gravity, GravityType); VALUE_TO_ENUM(argv[2], operator, CompositeOperator); // convert gravity to x, y offsets switch (gravity) { case ForgetGravity: case NorthWestGravity: x_offset = 0; y_offset = 0; break; case NorthGravity: x_offset = ((long)(image->columns) - (long)(comp_image->columns)) / 2; y_offset = 0; break; case NorthEastGravity: x_offset = (long)(image->columns) - (long)(comp_image->columns); y_offset = 0; break; case WestGravity: x_offset = 0; y_offset = ((long)(image->rows) - (long)(comp_image->rows)) / 2; break; case StaticGravity: case CenterGravity: default: x_offset = ((long)(image->columns) - (long)(comp_image->columns)) / 2; y_offset = ((long)(image->rows) - (long)(comp_image->rows)) / 2; break; case EastGravity: x_offset = (long)(image->columns) - (long)(comp_image->columns); y_offset = ((long)(image->rows) - (long)(comp_image->rows)) / 2; break; case SouthWestGravity: x_offset = 0; y_offset = (long)(image->rows) - (long)(comp_image->rows); break; case SouthGravity: x_offset = ((long)(image->columns) - (long)(comp_image->columns)) / 2; y_offset = (long)(image->rows) - (long)(comp_image->rows); break; case SouthEastGravity: x_offset = (long)(image->columns) - (long)(comp_image->columns); y_offset = (long)(image->rows) - (long)(comp_image->rows); break; } break; case 4: // argv[1], argv[2] is x_off, y_off, // argv[3] is composite_op x_offset = NUM2LONG(argv[1]); y_offset = NUM2LONG(argv[2]); VALUE_TO_ENUM(argv[3], operator, CompositeOperator); break; case 5: VALUE_TO_ENUM(argv[1], gravity, GravityType); x_offset = NUM2LONG(argv[2]); y_offset = NUM2LONG(argv[3]); VALUE_TO_ENUM(argv[4], operator, CompositeOperator); switch (gravity) { case NorthEastGravity: case EastGravity: case SouthEastGravity: x_offset = ((long)(image->columns) - (long)(comp_image->columns)) - x_offset; break; case NorthGravity: case SouthGravity: case CenterGravity: case StaticGravity: x_offset += (long)(image->columns/2) - (long)(comp_image->columns/2); break; default: break; } switch (gravity) { case SouthWestGravity: case SouthGravity: case SouthEastGravity: y_offset = ((long)(image->rows) - (long)(comp_image->rows)) - y_offset; break; case EastGravity: case WestGravity: case CenterGravity: case StaticGravity: y_offset += (long)(image->rows/2) - (long)(comp_image->rows/2); break; case NorthEastGravity: case NorthGravity: default: break; } break; } if (bang) { (void) CompositeImageChannel(image, channels, operator, comp_image, x_offset, y_offset); rm_check_image_exception(image, RetainOnError); return self; } else { new_image = rm_clone_image(image); (void) CompositeImageChannel(new_image, channels, operator, comp_image, x_offset, y_offset); rm_check_image_exception(new_image, DestroyOnError); return rm_image_new(new_image); } } /** * Call CompositeImage. * * Ruby usage: * - @verbatim Image#composite!(image, x_off, y_off, composite_op) @endverbatim * - @verbatim Image#composite!(image, gravity, composite_op) @endverbatim * - @verbatim Image#composite!(image, gravity, x_off, y_off, composite_op) @endverbatim * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self * @see composite * @see Image_composite */ VALUE Image_composite_bang(int argc, VALUE *argv, VALUE self) { return composite(True, argc, argv, self, DefaultChannels); } /** * Call CompositeImage. * * Ruby usage: * - @verbatim Image#composite(image, x_off, y_off, composite_op) @endverbatim * - @verbatim Image#composite(image, gravity, composite_op) @endverbatim * - @verbatim Image#composite(image, gravity, x_off, y_off, composite_op) @endverbatim * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image * @see composite * @see Image_composite_bang */ VALUE Image_composite(int argc, VALUE *argv, VALUE self) { return composite(False, argc, argv, self, DefaultChannels); } /** * Composite the source over the destination image as dictated by the affine * transform. * * Ruby usage: * - @verbatim Image#composite_affine(composite, affine_matrix) @endverbatim * * @param self this object * @param source the source image * @param affine_matrix affine transform matrix * @return a new image */ VALUE Image_composite_affine(VALUE self, VALUE source, VALUE affine_matrix) { Image *image, *composite_image, *new_image; AffineMatrix affine; image = rm_check_destroyed(self); composite_image = rm_check_destroyed(source); new_image = rm_clone_image(image); Export_AffineMatrix(&affine, affine_matrix); (void) DrawAffineImage(new_image, composite_image, &affine); rm_check_image_exception(new_image, DestroyOnError); return rm_image_new(new_image); } /** * Call CompositeImageChannel. * * No Ruby usage (internal function) * * Notes: * - Default channel is AllChannels * * @param bang whether the bang (!) version of the method was called * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self if bang, otherwise a new image * @see Image_composite_channel * @see Image_composite_channel_bang */ static VALUE composite_channel(int bang, int argc, VALUE *argv, VALUE self) { ChannelType channels; // Check destroyed before validating the arguments (void) rm_check_destroyed(self); channels = extract_channels(&argc, argv); // There must be 3, 4, or 5 remaining arguments. if (argc < 3) { rb_raise(rb_eArgError, "composite operator not specified"); } else if (argc > 5) { raise_ChannelType_error(argv[argc-1]); } return composite(bang, argc, argv, self, channels); } /** * Call CompositeImageChannel. * * Ruby usage: * - @verbatim Image#composite_channel(src_image, geometry, composite_operator) @endverbatim * - @verbatim Image#composite_channel(src_image, geometry, composite_operator, channel) @endverbatim * - @verbatim Image#composite_channel(src_image, geometry, composite_operator, channel, ...) @endverbatim * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image * @see composite_channel * @see Image_composite_channel_bang */ VALUE Image_composite_channel(int argc, VALUE *argv, VALUE self) { return composite_channel(False, argc, argv, self); } /** * Call CompositeImageChannel. * * Ruby usage: * - @verbatim Image#composite_channel!(src_image, geometry, composite_operator) @endverbatim * - @verbatim Image#composite_channel!(src_image, geometry, composite_operator, channel) @endverbatim * - @verbatim Image#composite_channel!(src_image, geometry, composite_operator, channel, ...) @endverbatim * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self * @see composite_channel * @see Image_composite_channel */ VALUE Image_composite_channel_bang(int argc, VALUE *argv, VALUE self) { return composite_channel(True, argc, argv, self); } /** * Composite using MathematicsCompositeOp. * * Ruby usage: * - @verbatim img.composite_mathematics(comp_img, A, B, C, D, gravity) @endverbatim * - @verbatim img.composite_mathematics(comp_img, A, B, C, D, x_off, y_off) @endverbatim * - @verbatim img.composite_mathematics(comp_img, A, B, C, D, gravity, x_off, y_off) @endverbatim * * Notes: * - Default x_off is 0 * - Default y_off is 0 * - New in ImageMagick 6.5.4-3. * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_composite_mathematics(int argc, VALUE *argv, VALUE self) { #if defined(HAVE_ENUM_MATHEMATICSCOMPOSITEOP) Image *composite_image; VALUE args[5]; signed long x_off = 0L; signed long y_off = 0L; GravityType gravity = NorthWestGravity; char compose_args[200]; rm_check_destroyed(self); if (argc > 0) { composite_image = rm_check_destroyed(rm_cur_image(argv[0])); } switch (argc) { case 8: VALUE_TO_ENUM(argv[5], gravity, GravityType); x_off = NUM2LONG(argv[6]); y_off = NUM2LONG(argv[7]); break; case 7: x_off = NUM2LONG(argv[5]); y_off = NUM2LONG(argv[6]); break; case 6: VALUE_TO_ENUM(argv[5], gravity, GravityType); break; default: rb_raise(rb_eArgError, "wrong number of arguments (got %d, expected 6 to 8)", argc); break; } (void) sprintf(compose_args, "%-.16g,%-.16g,%-.16g,%-.16g", NUM2DBL(argv[1]), NUM2DBL(argv[2]), NUM2DBL(argv[3]), NUM2DBL(argv[4])); SetImageArtifact(composite_image,"compose:args", compose_args); // Call composite(False, gravity, x_off, y_off, MathematicsCompositeOp, DefaultChannels) args[0] = argv[0]; args[1] = GravityType_new(gravity); args[2] = LONG2FIX(x_off); args[3] = LONG2FIX(y_off); args[4] = CompositeOperator_new(MathematicsCompositeOp); return composite(False, 5, args, self, DefaultChannels); #else rm_not_implemented(); argc = argc; argv = argv; self = self; return (VALUE)0; #endif } /** * Emulate the -tile option to the composite command. * * No Ruby usage (internal function) * * Notes: * - Default composite_op is Magick::OverCompositeOp * - Default channel is AllChannels * * @param bang whether the bang (!) version of the method was called * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self if bang, otherwise a new image * @see Image_composite_tiled * @see Image_composite_tiled_bang * @see wand/composite.c in ImageMagick (6.2.4) */ static VALUE composite_tiled(int bang, int argc, VALUE *argv, VALUE self) { Image *image; Image *comp_image; CompositeOperator operator = OverCompositeOp; long x, y; unsigned long columns; ChannelType channels; MagickStatusType status; // Ensure image and composite_image aren't destroyed. if (bang) { image = rm_check_frozen(self); } else { image = rm_check_destroyed(self); } if (argc > 0) { comp_image = rm_check_destroyed(rm_cur_image(argv[0])); } channels = extract_channels(&argc, argv); switch (argc) { case 2: VALUE_TO_ENUM(argv[1], operator, CompositeOperator); case 1: break; case 0: rb_raise(rb_eArgError, "wrong number of arguments (0 for 1 or more)"); break; default: raise_ChannelType_error(argv[argc-1]); break; } if (!bang) { image = rm_clone_image(image); } #if defined(HAVE_SETIMAGEARTIFACT) (void) SetImageArtifact(comp_image,"modify-outside-overlay", "false"); #else (void) SetImageAttribute(comp_image, "[modify-outside-overlay]", "false"); #endif status = MagickTrue; columns = comp_image->columns; // Tile for (y = 0; y < (long) image->rows; y += comp_image->rows) { for (x = 0; status == MagickTrue && x < (long) image->columns; x += columns) { status = CompositeImageChannel(image, channels, operator, comp_image, x, y); rm_check_image_exception(image, bang ? RetainOnError: DestroyOnError); } } return bang ? self : rm_image_new(image); } /** * Emulate the -tile option to the composite command. * * Ruby usage: * - @verbatim Image#composite_tiled(src) @endverbatim * - @verbatim Image#composite_tiled(src, composite_op) @endverbatim * - @verbatim Image#composite_tiled(src, composite_op, channel) @endverbatim * - @verbatim Image#composite_tiled(src, composite_op, channel, ...) @endverbatim * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image * @see composite_tiled * @see Image_composite_tiled_bang */ VALUE Image_composite_tiled(int argc, VALUE *argv, VALUE self) { return composite_tiled(False, argc, argv, self); } /** * Emulate the -tile option to the composite command. * * Ruby usage: * - @verbatim Image#composite_tiled!(src) @endverbatim * - @verbatim Image#composite_tiled!(src, composite_op) @endverbatim * - @verbatim Image#composite_tiled!(src, composite_op, channel) @endverbatim * - @verbatim Image#composite_tiled!(src, composite_op, channel, ...) @endverbatim * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self * @see composite_tiled * @see Image_composite_tiled_bang */ VALUE Image_composite_tiled_bang(int argc, VALUE *argv, VALUE self) { return composite_tiled(True, argc, argv, self); } /** * Get/set the compression attribute. * * Ruby usage: * - @verbatim Image#compression @endverbatim * * @param self this object * @return the compression */ VALUE Image_compression(VALUE self) { Image *image = rm_check_destroyed(self); return CompressionType_new(image->compression); } /** * Get/set the compression attribute. * * Ruby usage: * - @verbatim Image#compression= @endverbatim * * @param self this object * @param compression the compression * @return self */ VALUE Image_compression_eq(VALUE self, VALUE compression) { Image *image = rm_check_frozen(self); VALUE_TO_ENUM(compression, image->compression, CompressionType); return self; } /** * call CompressImageColormap. * * Ruby usage: * - @verbatim Image#compress_colormap! @endverbatim * * Notes: * - API was CompressColormap until 5.4.9 * * @param self this object * @return self */ VALUE Image_compress_colormap_bang(VALUE self) { Image *image = rm_check_frozen(self); (void) CompressImageColormap(image); rm_check_image_exception(image, RetainOnError); return self; } /** * Creates an Image from the supplied pixel data. The pixel data must be in * scanline order, top-to-bottom. The pixel data is an array of either all Fixed * or all Float elements. If Fixed, the elements must be in the range * [0..QuantumRange]. If Float, the elements must be normalized [0..1]. The * "map" argument reflects the expected ordering of the pixel array. It can be * any combination or order of R = red, G = green, B = blue, A = alpha, * C = cyan, Y = yellow, M = magenta, K = black, or I = intensity (for * grayscale). * * The pixel array must have width X height X strlen(map) elements. * * Ruby usage: * - @verbatim Image.constitute(width, height, map, pixels) @endverbatim * * @param class the Ruby class for an Image (unused) * @param width_arg the width of the array * @param height_arg the height of the array * @param map_arg the map (expected ordering of the pixel array) * @param pixels_arg the pixel array * @return a new image * @throw ArgumentError * @throw TypeError */ VALUE Image_constitute(VALUE class, VALUE width_arg, VALUE height_arg , VALUE map_arg, VALUE pixels_arg) { Image *image; ExceptionInfo exception; volatile VALUE pixel, pixel0; unsigned long width, height; long x, npixels; char *map; long map_l; volatile union { double *f; Quantum *i; void *v; } pixels; volatile VALUE pixel_class; StorageType stg_type; class = class; // Suppress "never referenced" message from icc // rb_Array converts objects that are not Arrays to Arrays if possible, // and raises TypeError if it can't. pixels_arg = rb_Array(pixels_arg); width = NUM2ULONG(width_arg); height = NUM2ULONG(height_arg); if (width == 0 || height == 0) { rb_raise(rb_eArgError, "width and height must be non-zero"); } map = rm_str2cstr(map_arg, &map_l); npixels = (long)(width * height * map_l); if (RARRAY_LEN(pixels_arg) != npixels) { rb_raise(rb_eArgError, "wrong number of array elements (%ld for %ld)" , RARRAY_LEN(pixels_arg), npixels); } // Inspect the first element in the pixels array to determine the expected // type of all the elements. Allocate the pixel buffer. pixel0 = rb_ary_entry(pixels_arg, 0); if (rb_obj_is_kind_of(pixel0, rb_cFloat) == Qtrue) { pixels.f = ALLOC_N(double, npixels); stg_type = DoublePixel; pixel_class = rb_cFloat; } else if (rb_obj_is_kind_of(pixel0, rb_cInteger) == Qtrue) { pixels.i = ALLOC_N(Quantum, npixels); stg_type = QuantumPixel; pixel_class = rb_cInteger; } else { rb_raise(rb_eTypeError, "element 0 in pixel array is %s, must be numeric" , rb_class2name(CLASS_OF(pixel0))); } // Convert the array elements to the appropriate C type, store in pixel // buffer. for (x = 0; x < npixels; x++) { pixel = rb_ary_entry(pixels_arg, x); if (rb_obj_is_kind_of(pixel, pixel_class) != Qtrue) { rb_raise(rb_eTypeError, "element %ld in pixel array is %s, expected %s" , x, rb_class2name(CLASS_OF(pixel)),rb_class2name(CLASS_OF(pixel0))); } if (pixel_class == rb_cFloat) { pixels.f[x] = (float) NUM2DBL(pixel); if (pixels.f[x] < 0.0 || pixels.f[x] > 1.0) { rb_raise(rb_eArgError, "element %ld is out of range [0..1]: %f", x, pixels.f[x]); } } else { pixels.i[x] = NUM2QUANTUM(pixel); } } GetExceptionInfo(&exception); // This is based on ConstituteImage in IM 5.5.7 image = AcquireImage(NULL); if (!image) { rb_raise(rb_eNoMemError, "not enough memory to continue."); } SetImageExtent(image, width, height); rm_check_image_exception(image, DestroyOnError); (void) SetImageBackgroundColor(image); rm_check_image_exception(image, DestroyOnError); (void) ImportImagePixels(image, 0, 0, width, height, map, stg_type, (const void *)pixels.v); xfree(pixels.v); rm_check_image_exception(image, DestroyOnError); (void) DestroyExceptionInfo(&exception); DestroyConstitute(); return rm_image_new(image); } /** * Enhance the intensity differences between the lighter and darker elements of * the image. Set sharpen to "true" to increase the image contrast otherwise the * contrast is reduced. * * Ruby usage: * - @verbatim Image#contrast @endverbatim * - @verbatim Image#contrast(sharpen) @endverbatim * * Notes: * - Default sharpen is 0 * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_contrast(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; unsigned int sharpen = 0; image = rm_check_destroyed(self); if (argc > 1) { rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 or 1)", argc); } else if (argc == 1) { sharpen = RTEST(argv[0]); } new_image = rm_clone_image(image); (void) ContrastImage(new_image, sharpen); rm_check_image_exception(new_image, DestroyOnError); return rm_image_new(new_image); } /** * Convert percentages to #pixels. If the white-point (2nd) argument is not * supplied set it to #pixels - black-point. * * No Ruby usage (internal function) * * Notes: * - No return value: modifies black_point and white_point directly. * * @param image the image * @param argc number of input arguments * @param argv array of input arguments * @param black_point pointer to the black point * @param white_point pointer to the white point */ static void get_black_white_point(Image *image, int argc, VALUE *argv, double *black_point, double *white_point) { double pixels; pixels = (double) (image->columns * image->rows); switch (argc) { case 2: if (rm_check_num2dbl(argv[0])) { *black_point = NUM2DBL(argv[0]); } else { *black_point = pixels * rm_str_to_pct(argv[0]); } if (rm_check_num2dbl(argv[1])) { *white_point = NUM2DBL(argv[1]); } else { *white_point = pixels * rm_str_to_pct(argv[1]); } break; case 1: if (rm_check_num2dbl(argv[0])) { *black_point = NUM2DBL(argv[0]); } else { *black_point = pixels * rm_str_to_pct(argv[0]); } *white_point = pixels - *black_point; break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc); break; } return; } /** * Call ContrastStretchImageChannel. * * Ruby usage: * - @verbatim Image#contrast_stretch_channel(black_point) @endverbatim * - @verbatim Image#contrast_stretch_channel(black_point, white_point) @endverbatim * - @verbatim Image#contrast_stretch_channel(black_point, white_point, channel) @endverbatim * - @verbatim Image#contrast_stretch_channel(black_point, white_point, channel, ...) @endverbatim * * Notes: * - Default white_point is pixels-black_point * - Default channel is AllChannels * - Both black_point and white_point can be specified as Floats or as * percentages, i.e. "10%" * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_contrast_stretch_channel(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; ChannelType channels; double black_point, white_point; image = rm_check_destroyed(self); channels = extract_channels(&argc, argv); if (argc > 2) { raise_ChannelType_error(argv[argc-1]); } get_black_white_point(image, argc, argv, &black_point, &white_point); new_image = rm_clone_image(image); (void) ContrastStretchImageChannel(new_image, channels, black_point, white_point); rm_check_image_exception(new_image, DestroyOnError); return rm_image_new(new_image); } /** * Apply a custom convolution kernel to the image. * * Ruby usage: * - @verbatim Image#convolve(order, kernel) @endverbatim * * @param self this object * @param order_arg the number of rows and columns in the kernel * @param kernel_arg an order**2 array of doubles * @return a new image */ VALUE Image_convolve(VALUE self, VALUE order_arg, VALUE kernel_arg) { Image *image, *new_image; double *kernel; unsigned int x, order; ExceptionInfo exception; image = rm_check_destroyed(self); order = NUM2UINT(order_arg); kernel_arg = rb_Array(kernel_arg); rm_check_ary_len(kernel_arg, (long)(order*order)); // Convert the kernel array argument to an array of doubles kernel = (double *)ALLOC_N(double, order*order); for (x = 0; x < order*order; x++) { kernel[x] = NUM2DBL(rb_ary_entry(kernel_arg, (long)x)); } GetExceptionInfo(&exception); new_image = ConvolveImage((const Image *)image, order, (double *)kernel, &exception); xfree((void *)kernel); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * call ConvolveImageChannel. * * Ruby usage: * - @verbatim Image#convolve_channel(order, kernel) @endverbatim * - @verbatim Image#convolve_channel(order, kernel, channel) @endverbatim * - @verbatim Image#convolve_channel(order, kernel, channel, ...) @endverbatim * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_convolve_channel(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; double *kernel; volatile VALUE ary; unsigned int x, order; ChannelType channels; ExceptionInfo exception; image = rm_check_destroyed(self); channels = extract_channels(&argc, argv); // There are 2 required arguments. if (argc > 2) { raise_ChannelType_error(argv[argc-1]); } if (argc != 2) { rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or more)", argc); } order = NUM2UINT(argv[0]); ary = argv[1]; rm_check_ary_len(ary, (long)(order*order)); kernel = ALLOC_N(double, (long)(order*order)); // Convert the kernel array argument to an array of doubles for (x = 0; x < order*order; x++) { kernel[x] = NUM2DBL(rb_ary_entry(ary, (long)x)); } GetExceptionInfo(&exception); new_image = ConvolveImageChannel(image, channels, order, kernel, &exception); xfree((void *)kernel); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Alias for dup. * * Ruby usage: * - @verbatim Image#copy @endverbatim * * @param self this object * @return a copy of self * @see Image_dup */ VALUE Image_copy(VALUE self) { return rb_funcall(self, rm_ID_dup, 0); } /** * Initialize copy, clone, dup. * * Ruby usage: * - @verbatim Image#initialize_copy @endverbatim * * @param copy the destination image * @param orig the source image * @return copy * @see Image_copy * @see Image_clone * @see Image_dup */ VALUE Image_init_copy(VALUE copy, VALUE orig) { Image *image, *new_image; image = rm_check_destroyed(orig); new_image = rm_clone_image(image); UPDATE_DATA_PTR(copy, new_image); return copy; } /** * Extract a region of the image defined by width, height, x, y. * * Ruby usage: * - @verbatim Image#crop(x, y, width, height) @endverbatim * - @verbatim Image#crop(gravity, width, height) @endverbatim * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image * @see cropper * @see Image_crop_bang */ VALUE Image_crop(int argc, VALUE *argv, VALUE self) { (void) rm_check_destroyed(self); return cropper(False, argc, argv, self); } /** * Extract a region of the image defined by width, height, x, y. * * Ruby usage: * - @verbatim Image#crop!(x, y, width, height) @endverbatim * - @verbatim Image#crop!(gravity, width, height) @endverbatim * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self * @see cropper * @see Image_crop */ VALUE Image_crop_bang(int argc, VALUE *argv, VALUE self) { (void) rm_check_frozen(self); return cropper(True, argc, argv, self); } /** * Call CycleColormapImage. * * Ruby usage: * - @verbatim Image#cycle_colormap @endverbatim * * @param self this object * @param amount amount to cycle the colormap * @return a new image */ VALUE Image_cycle_colormap(VALUE self, VALUE amount) { Image *image, *new_image; int amt; image = rm_check_destroyed(self); new_image = rm_clone_image(image); amt = NUM2INT(amount); (void) CycleColormapImage(new_image, amt); // No need to check for an error return rm_image_new(new_image); } /** * Get the x & y resolutions. * * Ruby usage: * - @verbatim Image#density @endverbatim * * @param self this object * @return a string in the form "XresxYres" */ VALUE Image_density(VALUE self) { Image *image; char density[128]; image = rm_check_destroyed(self); sprintf(density, "%gx%g", image->x_resolution, image->y_resolution); return rb_str_new2(density); } /** * Set the x & y resolutions in the image. * * Ruby usage: * - @verbatim Image#density="XxY" @endverbatim * - @verbatim Image#density=aGeometry @endverbatim * * Notes: * - The density is a string of the form "XresxYres" or simply "Xres". * - If the y resolution is not specified, set it equal to the x resolution. * - This is equivalent to PerlMagick's handling of density. * - The density can also be a Geometry object. The width attribute is used * for the x resolution. The height attribute is used for the y resolution. * If the height attribute is missing, the width attribute is used for both. * * @param self this object * @param density_arg The density String or Geometry * @return self */ VALUE Image_density_eq(VALUE self, VALUE density_arg) { Image *image; char *density; volatile VALUE x_val, y_val; int count; double x_res, y_res; image = rm_check_frozen(self); // Get the Class ID for the Geometry class. if (!Class_Geometry) { Class_Geometry = rb_const_get(Module_Magick, rm_ID_Geometry); } // Geometry object. Width and height attributes are always positive. if (CLASS_OF(density_arg) == Class_Geometry) { x_val = rb_funcall(density_arg, rm_ID_width, 0); x_res = NUM2DBL(x_val); y_val = rb_funcall(density_arg, rm_ID_height, 0); y_res = NUM2DBL(y_val); if (x_res == 0.0) { rb_raise(rb_eArgError, "invalid x resolution: %f", x_res); } image->y_resolution = y_res != 0.0 ? y_res : x_res; image->x_resolution = x_res; } // Convert the argument to a string else { density = StringValuePtr(density_arg); if (!IsGeometry(density)) { rb_raise(rb_eArgError, "invalid density geometry %s", density); } count = sscanf(density, "%lfx%lf", &image->x_resolution, &image->y_resolution); if (count < 2) { image->y_resolution = image->x_resolution; } } return self; } /** * call DecipherImage. * * Ruby usage: * - @verbatim Image#decipher(passphrase) @endverbatim * * @param self this object * @param passphrase the passphrase * @return a new deciphered image */ VALUE Image_decipher(VALUE self, VALUE passphrase) { #if defined(HAVE_ENCIPHERIMAGE) Image *image, *new_image; char *pf; ExceptionInfo exception; MagickBooleanType okay; image = rm_check_destroyed(self); pf = StringValuePtr(passphrase); // ensure passphrase is a string GetExceptionInfo(&exception); new_image = rm_clone_image(image); okay = DecipherImage(new_image, pf, &exception); rm_check_exception(&exception, new_image, DestroyOnError); if (!okay) { new_image = DestroyImage(new_image); rb_raise(rb_eRuntimeError, "DecipherImage failed for unknown reason."); } DestroyExceptionInfo(&exception); return rm_image_new(new_image); #else self = self; passphrase = passphrase; rm_not_implemented(); return(VALUE)0; #endif } /** * Call SetImageArtifact. * * Ruby usage: * - @verbatim value = Image#define(artifact, value) @endverbatim * * Notes: * - Normally a script should never call this method. Any calls to * SetImageArtifact will be part of the methods in which they're needed, or * be called via the OptionalMethodArguments class. * - If value is nil, the artifact will be removed * * @param self this object * @param artifact the artifact to set * @param value the value to which to set the artifact * @return the value */ VALUE Image_define(VALUE self, VALUE artifact, VALUE value) { #if defined(HAVE_SETIMAGEARTIFACT) Image *image; char *key, *val; MagickBooleanType status; image = rm_check_frozen(self); artifact = rb_String(artifact); key = StringValuePtr(artifact); if (value == Qnil) { (void) DeleteImageArtifact(image, key); } else { value = rb_String(value); val = StringValuePtr(value); status = SetImageArtifact(image, key, val); if (!status) { rb_raise(rb_eNoMemError, "not enough memory to continue"); } } return value; #else rm_not_implemented(); artifact = artifact; value = value; self = self; return(VALUE)0; #endif } DEF_ATTR_ACCESSOR(Image, delay, ulong) /** * Delete the image composite mask. * * Ruby usage: * - @verbatim Image#delete_compose_mask() @endverbatim * * @param self this object * @return self * @see Image_add_compose_mask * @see SetImageMask in ImageMagick */ VALUE Image_delete_compose_mask(VALUE self) { Image *image = rm_check_frozen(self); // Store a clone of the mask image (void) SetImageMask(image, NULL); rm_check_image_exception(image, RetainOnError); return self; } /** * Call ProfileImage. * * Ruby usage: * - @verbatim Image#delete_profile(name) @endverbatim * * @param self this object * @param name the name of the profile to be deleted * @return self */ VALUE Image_delete_profile(VALUE self, VALUE name) { Image *image = rm_check_frozen(self); (void) ProfileImage(image, StringValuePtr(name), NULL, 0, MagickTrue); rm_check_image_exception(image, RetainOnError); return self; } /** * Return the image depth (8 or 16). * * Ruby usage: * - @verbatim Image#depth @endverbatim * * Notes: * - If all pixels have lower-order bytes equal to higher-order bytes, the * depth will be reported as 8 even if the depth field in the Image * structure says 16. * * @param self this object * @return the depth */ VALUE Image_depth(VALUE self) { Image *image; unsigned long depth = 0; ExceptionInfo exception; image = rm_check_destroyed(self); GetExceptionInfo(&exception); depth = GetImageDepth(image, &exception); CHECK_EXCEPTION() (void) DestroyExceptionInfo(&exception); return INT2FIX(depth); } /** * Implement convert -deskew option. * * Ruby usage: * - @verbatim Image#deskew @endverbatim * - @verbatim Image#deskew(threshold) @endverbatim * - @verbatim Image#deskew(threshold, auto-crop-width) @endverbatim * * Notes: * - Default threshold is 0.40 * - Default auto-crop-width is the auto crop width of the image * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_deskew(int argc, VALUE *argv, VALUE self) { #if defined(HAVE_DESKEWIMAGE) Image *image, *new_image; double threshold = 40.0 * QuantumRange / 100.0; unsigned long width; char auto_crop_width[20]; ExceptionInfo exception; image = rm_check_destroyed(self); switch (argc) { case 2: width = NUM2ULONG(argv[1]); memset(auto_crop_width, 0, sizeof(auto_crop_width)); sprintf(auto_crop_width, "%ld", width); SetImageArtifact(image, "deskew:auto-crop", auto_crop_width); case 1: threshold = rm_percentage(argv[0],1.0) * QuantumRange; case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc); break; } GetExceptionInfo(&exception); new_image = DeskewImage(image, threshold, &exception); CHECK_EXCEPTION() rm_ensure_result(new_image); (void) DestroyExceptionInfo(&exception); return rm_image_new(new_image); #else self = self; // defeat "unused parameter" message argv = argv; argc = argc; rm_not_implemented(); return(VALUE)0; #endif } /** * Reduce the speckle noise in an image while preserving the edges of the * original image. * * Ruby usage: * - @verbatim Image#despeckle @endverbatim * * @param self this object * @return a new image */ VALUE Image_despeckle(VALUE self) { Image *image, *new_image; ExceptionInfo exception; image = rm_check_destroyed(self); GetExceptionInfo(&exception); new_image = DespeckleImage(image, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Free all the memory associated with an image. * * Ruby usage: * - @verbatim Image#destroy! @endverbatim * * @param self this object * @return self */ VALUE Image_destroy_bang(VALUE self) { Image *image; rb_check_frozen(self); Data_Get_Struct(self, Image, image); rm_image_destroy(image); DATA_PTR(self) = NULL; return self; } /** * Return true if the image has been destroyed, false otherwise. * * Ruby usage: * - @verbatim Image#destroyed? @endverbatim * * @param self this object * @return true if destroyed, false otherwise */ VALUE Image_destroyed_q(VALUE self) { Image *image; Data_Get_Struct(self, Image, image); return image ? Qfalse : Qtrue; } /** * Call the IsImagesEqual function. * * Ruby usage: * - @verbatim Image#difference @endverbatim * * Notes: * - "other" can be either an Image or an Image * * @param self this object * @param other another Image * @return An array with 3 values: [mean error per pixel, normalized mean error, * normalized maximum error] */ VALUE Image_difference(VALUE self, VALUE other) { Image *image; Image *image2; volatile VALUE mean, nmean, nmax; image = rm_check_destroyed(self); other = rm_cur_image(other); image2 = rm_check_destroyed(other); (void) IsImagesEqual(image, image2); // No need to check for error mean = rb_float_new(image->error.mean_error_per_pixel); nmean = rb_float_new(image->error.normalized_mean_error); nmax = rb_float_new(image->error.normalized_maximum_error); return rb_ary_new3(3, mean, nmean, nmax); } /** * Get image directory. * * Ruby usage: * - @verbatim Image#directory @endverbatim * * @param self this object * @return the directory */ DEF_ATTR_READER(Image, directory, str) /** * Implement the -displace option of xMagick's composite command. * * Ruby usage: * - @verbatim Image#displace(displacement_map, x_amp) @endverbatim * - @verbatim Image#displace(displacement_map, x_amp, y_amp) @endverbatim * - @verbatim Image#displace(displacement_map, x_amp, y_amp, x_offset) @endverbatim * - @verbatim Image#displace(displacement_map, x_amp, y_amp, x_offset, y_offset) @endverbatim * - @verbatim Image#displace(displacement_map, x_amp, y_amp, gravity) @endverbatim * - @verbatim Image#displace(displacement_map, x_amp, y_amp, gravity, x_offset) @endverbatim * - @verbatim Image#displace(displacement_map, x_amp, y_amp, gravity, x_offset, y_offset) @endverbatim * * Notes: * - If y_amp is omitted the default is x_amp. * - Default x_offset is 0 * - Default y_offset is 0 * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image * @see special_composite */ VALUE Image_displace(int argc, VALUE *argv, VALUE self) { Image *image, *displacement_map; volatile VALUE dmap; double x_amplitude = 0.0, y_amplitude = 0.0; long x_offset = 0L, y_offset = 0L; image = rm_check_destroyed(self); if (argc < 2) { rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 to 6)", argc); } dmap = rm_cur_image(argv[0]); displacement_map = rm_check_destroyed(dmap); if (argc > 3) { get_composite_offsets(argc-3, &argv[3], image, displacement_map, &x_offset, &y_offset); // There must be 3 arguments left argc = 3; } switch (argc) { case 3: y_amplitude = NUM2DBL(argv[2]); x_amplitude = NUM2DBL(argv[1]); break; case 2: x_amplitude = NUM2DBL(argv[1]); y_amplitude = x_amplitude; break; } return special_composite(image, displacement_map, x_amplitude, y_amplitude , x_offset, y_offset, DisplaceCompositeOp); } /** * Extract pixel data from the image and returns it as an array of pixels. The * "x", "y", "width" and "height" parameters specify the rectangle to be * extracted. The "map" parameter reflects the expected ordering of the pixel * array. It can be any combination or order of R = red, G = green, B = blue, * A = alpha, C = cyan, Y = yellow, M = magenta, K = black, or I = intensity * (for grayscale). If the "float" parameter is specified and true, the pixel * data is returned as floating-point numbers in the range [0..1]. By default * the pixel data is returned as integers in the range [0..QuantumRange]. * * Ruby usage: * - @verbatim Image#dispatch(x, y, columns, rows, map) @endverbatim * - @verbatim Image#dispatch(x, y, columns, rows, map, float) @endverbatim * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return an Array of pixel data * @throw ArgumentError */ VALUE Image_dispatch(int argc, VALUE *argv, VALUE self) { Image *image; long x, y; unsigned long columns, rows, n, npixels; volatile VALUE pixels_ary; StorageType stg_type = QuantumPixel; char *map; long mapL; MagickBooleanType okay; ExceptionInfo exception; volatile union { Quantum *i; double *f; void *v; } pixels; (void) rm_check_destroyed(self); if (argc < 5 || argc > 6) { rb_raise(rb_eArgError, "wrong number of arguments (%d for 5 or 6)", argc); } x = NUM2LONG(argv[0]); y = NUM2LONG(argv[1]); columns = NUM2ULONG(argv[2]); rows = NUM2ULONG(argv[3]); map = rm_str2cstr(argv[4], &mapL); if (argc == 6) { stg_type = RTEST(argv[5]) ? DoublePixel : QuantumPixel; } // Compute the size of the pixel array and allocate the memory. npixels = columns * rows * mapL; pixels.v = stg_type == QuantumPixel ? (void *) ALLOC_N(Quantum, npixels) : (void *) ALLOC_N(double, npixels); // Create the Ruby array for the pixels. Return this even if ExportImagePixels fails. pixels_ary = rb_ary_new(); Data_Get_Struct(self, Image, image); GetExceptionInfo(&exception); okay = ExportImagePixels(image, x, y, columns, rows, map, stg_type, (void *)pixels.v, &exception); if (!okay) { goto exit; } CHECK_EXCEPTION() (void) DestroyExceptionInfo(&exception); // Convert the pixel data to the appropriate Ruby type if (stg_type == QuantumPixel) { for (n = 0; n < npixels; n++) { (void) rb_ary_push(pixels_ary, QUANTUM2NUM(pixels.i[n])); } } else { for (n = 0; n < npixels; n++) { (void) rb_ary_push(pixels_ary, rb_float_new(pixels.f[n])); } } exit: xfree((void *)pixels.v); return pixels_ary; } /** * Display the image to an X window screen. * * Ruby usage: * - @verbatim Image#display @endverbatim * * @param self this object * @return self */ VALUE Image_display(VALUE self) { Image *image; Info *info; volatile VALUE info_obj; image = rm_check_destroyed(self); if (image->rows == 0 || image->columns == 0) { rb_raise(rb_eArgError, "invalid image geometry (%lux%lu)", image->rows, image->columns); } info_obj = rm_info_new(); Data_Get_Struct(info_obj, Info, info); (void) DisplayImages(info, image); rm_check_image_exception(image, RetainOnError); return self; } /** * Return the dispose attribute as a DisposeType enum. * * Ruby usage: * - @verbatim Image#dispose @endverbatim * * @param self this object * @return the dispose */ VALUE Image_dispose(VALUE self) { Image *image = rm_check_destroyed(self); return DisposeType_new(image->dispose); } /** * Set the dispose attribute. * * Ruby usage: * - @verbatim Image#dispose= @endverbatim * * @param self this object * @param dispose the dispose * @return self */ VALUE Image_dispose_eq(VALUE self, VALUE dispose) { Image *image = rm_check_frozen(self); VALUE_TO_ENUM(dispose, image->dispose, DisposeType); return self; } /** * Corresponds to the composite_image -dissolve operation. * * Ruby usage: * - @verbatim Image#dissolve(overlay, src_percent) @endverbatim * - @verbatim Image#dissolve(overlay, src_percent, dst_percent) @endverbatim * - @verbatim Image#dissolve(overlay, src_percent, dst_percent, x_offset) @endverbatim * - @verbatim Image#dissolve(overlay, src_percent, dst_percent, x_offset, y_offset) @endverbatim * - @verbatim Image#dissolve(overlay, src_percent, dst_percent, gravity) @endverbatim * - @verbatim Image#dissolve(overlay, src_percent, dst_percent, gravity, x_offset) @endverbatim * - @verbatim Image#dissolve(overlay, src_percent, dst_percent, gravity, x_offset, y_offset) @endverbatim * * Notes: * - `percent' can be a number or a string in the form "NN%" * - Default dst_percent is -1.0 (tells blend_geometry to leave it out of the * geometry string) * - Default x_offset is 0 * - Default y_offset is 0 * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image * @see special_composite */ VALUE Image_dissolve(int argc, VALUE *argv, VALUE self) { Image *image, *overlay; double src_percent, dst_percent = -1.0; long x_offset = 0L, y_offset = 0L; volatile VALUE composite_image, ovly; image = rm_check_destroyed(self); if (argc < 1) { rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 to 6)", argc); } ovly = rm_cur_image(argv[0]); overlay = rm_check_destroyed(ovly); if (argc > 3) { get_composite_offsets(argc-3, &argv[3], image, overlay, &x_offset, &y_offset); // There must be 3 arguments left argc = 3; } switch (argc) { case 3: dst_percent = rm_percentage(argv[2],1.0) * 100.0; case 2: src_percent = rm_percentage(argv[1],1.0) * 100.0; break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 to 6)", argc); break; } composite_image = special_composite(image, overlay, src_percent, dst_percent , x_offset, y_offset, DissolveCompositeOp); return composite_image; } /** * Call DistortImage. * * Ruby usage: * - @verbatim Image#distort(type, points) { optional arguments } @endverbatim * - @verbatim Image#distort(type, points, bestfit) { optional arguments } @endverbatim * * Notes: * - Default bestfit is false * - Points is an Array of Numeric values * - Optional arguments are: * - self.define "distort:viewport", WxH+X+Y * - self.define "distort:scale", N * - self.verbose true * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_distort(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; volatile VALUE pts; unsigned long n, npoints; DistortImageMethod distortion_method; double *points; MagickBooleanType bestfit = MagickFalse; ExceptionInfo exception; image = rm_check_destroyed(self); rm_get_optional_arguments(self); switch (argc) { case 3: bestfit = RTEST(argv[2]); case 2: // Ensure pts is an array pts = rb_Array(argv[1]); VALUE_TO_ENUM(argv[0], distortion_method, DistortImageMethod); break; default: rb_raise(rb_eArgError, "wrong number of arguments (expected 2 or 3, got %d)", argc); break; } npoints = RARRAY_LEN(pts); // Allocate points array from Ruby's memory. If an error occurs Ruby will // be able to clean it up. points = ALLOC_N(double, npoints); for (n = 0; n < npoints; n++) { points[n] = NUM2DBL(rb_ary_entry(pts, n)); } GetExceptionInfo(&exception); new_image = DistortImage(image, distortion_method, npoints, points, bestfit, &exception); xfree(points); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Call GetImageChannelDistortion. * * Ruby usage: * - @verbatim Image#distortion_channel(reconstructed_image, metric) @endverbatim * - @verbatim Image#distortion_channel(reconstructed_image, metric, channel) @endverbatim * - @verbatim Image#distortion_channel(reconstructed_image, metric, channel, ...) @endverbatim * * Notes: * - Default channel is AllChannels * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return the image channel distortion (Ruby float) */ VALUE Image_distortion_channel(int argc, VALUE *argv, VALUE self) { Image *image, *reconstruct; ChannelType channels; ExceptionInfo exception; MetricType metric; volatile VALUE rec; double distortion; image = rm_check_destroyed(self); channels = extract_channels(&argc, argv); if (argc > 2) { raise_ChannelType_error(argv[argc-1]); } if (argc < 2) { rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or more)", argc); } rec = rm_cur_image(argv[0]); reconstruct = rm_check_destroyed(rec); VALUE_TO_ENUM(argv[1], metric, MetricType); GetExceptionInfo(&exception); (void) GetImageChannelDistortion(image, reconstruct, channels , metric, &distortion, &exception); CHECK_EXCEPTION() (void) DestroyExceptionInfo(&exception); return rb_float_new(distortion); } /** * Implement marshalling. * * Ruby usage: * - @verbatim Image#_dump(aDepth) @endverbatim * * Notes: * - Uses ImageToBlob - use the MIFF format in the blob since it's the most * general * * @param self this object * @param depth the depth to which to dump (unused) * @return a string representing the dumped image */ VALUE Image__dump(VALUE self, VALUE depth) { Image *image; ImageInfo *info; void *blob; size_t length; DumpedImage mi; volatile VALUE str; ExceptionInfo exception; depth = depth; // Suppress "never referenced" message from icc image = rm_check_destroyed(self); info = CloneImageInfo(NULL); if (!info) { rb_raise(rb_eNoMemError, "not enough memory to continue"); } strcpy(info->magick, image->magick); GetExceptionInfo(&exception); blob = ImageToBlob(info, image, &length, &exception); // Free ImageInfo first - error handling may raise an exception (void) DestroyImageInfo(info); CHECK_EXCEPTION() (void) DestroyExceptionInfo(&exception); if (!blob) { rb_raise(rb_eNoMemError, "not enough memory to continue"); } // Create a header for the blob: ID and version // numbers, followed by the length of the magick // string stored as a byte, followed by the // magick string itself. mi.id = DUMPED_IMAGE_ID; mi.mj = DUMPED_IMAGE_MAJOR_VERS; mi.mi = DUMPED_IMAGE_MINOR_VERS; strcpy(mi.magick, image->magick); mi.len = (unsigned char) min((size_t)UCHAR_MAX, strlen(mi.magick)); // Concatenate the blob onto the header & return the result str = rb_str_new((char *)&mi, (long)(mi.len+offsetof(DumpedImage,magick))); str = rb_str_buf_cat(str, (char *)blob, (long)length); magick_free((void*)blob); return str; } /** * Construct a new image object and call initialize_copy. * * Ruby usage: * - @verbatim Image#dup @endverbatim * * @param self this object * @return a new image * @see Image_copy * @see Image_init_copy */ VALUE Image_dup(VALUE self) { volatile VALUE dup; (void) rm_check_destroyed(self); dup = Data_Wrap_Struct(CLASS_OF(self), NULL, rm_image_destroy, NULL); if (rb_obj_tainted(self)) { (void) rb_obj_taint(dup); } return rb_funcall(dup, rm_ID_initialize_copy, 1, self); } /** * Iterate over image profiles. * * Ruby usage: * - @verbatim Image#each_profile @endverbatim * * Notes: * - ImageMagick only * * @param self this object * @return iterator over image profiles */ VALUE Image_each_profile(VALUE self) { Image *image; volatile VALUE ary, val; char *name; const StringInfo *profile; image = rm_check_destroyed(self); ResetImageProfileIterator(image); ary = rb_ary_new2(2); name = GetNextImageProfile(image); while (name) { rb_ary_store(ary, 0, rb_str_new2(name)); profile = GetImageProfile(image, name); if (!profile) { rb_ary_store(ary, 1, Qnil); } else { rb_ary_store(ary, 1, rb_str_new((char *)profile->datum, (long)profile->length)); } val = rb_yield(ary); name = GetNextImageProfile(image); } return val; } /** * Find edges in an image. "radius" defines the radius of the convolution * filter. * * Ruby usage: * - @verbatim Image#edge @endverbatim * - @verbatim Image#edge(radius) @endverbatim * * Notes: * - Default radius is 0 (have edge select a suitable radius) * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_edge(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; double radius = 0.0; ExceptionInfo exception; image = rm_check_destroyed(self); switch (argc) { case 1: radius = NUM2DBL(argv[0]); case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 or 1)", argc); break; } GetExceptionInfo(&exception); new_image = EdgeImage(image, radius, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Call one of the effects methods. * * No Ruby usage (internal function) * * @param self this object * @param argc number of input arguments * @param argv array of input arguments * @param effector the effector to call * @return a new image */ static VALUE effect_image(VALUE self, int argc, VALUE *argv, effector_t effector) { Image *image, *new_image; ExceptionInfo exception; double radius = 0.0, sigma = 1.0; image = rm_check_destroyed(self); switch (argc) { case 2: sigma = NUM2DBL(argv[1]); case 1: radius = NUM2DBL(argv[0]); case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 to 2)", argc); break; } if (sigma == 0.0) { rb_raise(rb_eArgError, "sigma must be != 0.0"); } GetExceptionInfo(&exception); new_image = (effector)(image, radius, sigma, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Create a grayscale image with a three-dimensional effect. * * Ruby usage: * - @verbatim Image#emboss @endverbatim * - @verbatim Image#emboss(radius) @endverbatim * - @verbatim Image#emboss(radius, sigma) @endverbatim * * Notes: * - Default radius is 0.0 * - Default sigma is 1.0 * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image * @see effect_image */ VALUE Image_emboss(int argc, VALUE *argv, VALUE self) { return effect_image(self, argc, argv, EmbossImage); } /** * Call EncipherImage. * * Ruby usage: * - @verbatim Image#encipher(passphrase) @endverbatim * * @param self this object * @param passphrase the passphrase with which to encipher * @return a new image */ VALUE Image_encipher(VALUE self, VALUE passphrase) { #if defined(HAVE_ENCIPHERIMAGE) Image *image, *new_image; char *pf; ExceptionInfo exception; MagickBooleanType okay; image = rm_check_destroyed(self); pf = StringValuePtr(passphrase); // ensure passphrase is a string GetExceptionInfo(&exception); new_image = rm_clone_image(image); okay = EncipherImage(new_image, pf, &exception); rm_check_exception(&exception, new_image, DestroyOnError); if (!okay) { new_image = DestroyImage(new_image); rb_raise(rb_eRuntimeError, "EncipherImage failed for unknown reason."); } DestroyExceptionInfo(&exception); return rm_image_new(new_image); #else self = self; passphrase = passphrase; rm_not_implemented(); return(VALUE)0; #endif } /** * Return endian option for images that support it. * * Ruby usage: * - @verbatim Image#endian @endverbatim * * @param self this object * @return the endian option */ VALUE Image_endian(VALUE self) { Image *image = rm_check_destroyed(self); return EndianType_new(image->endian); } /** * Set endian option for images that support it. * * Ruby usage: * - @verbatim Image#endian= @endverbatim * * @param self this object * @param type the endian type * @return self */ VALUE Image_endian_eq(VALUE self, VALUE type) { Image *image = rm_check_frozen(self); VALUE_TO_ENUM(type, image->endian, EndianType); return self; } /** * Apply a digital filter that improves the quality of a noisy image. * * Ruby usage: * - @verbatim Image#enhance @endverbatim * * @param self this object * @return a new image */ VALUE Image_enhance(VALUE self) { Image *image, *new_image; ExceptionInfo exception; image = rm_check_destroyed(self); GetExceptionInfo(&exception); new_image = EnhanceImage(image, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Apply a histogram equalization to the image. * * Ruby usage: * - @verbatim Image#equalize @endverbatim * * @param self this object * @return a new image */ VALUE Image_equalize(VALUE self) { Image *image, *new_image; ExceptionInfo exception; image = rm_check_destroyed(self); GetExceptionInfo(&exception); new_image = rm_clone_image(image); (void) EqualizeImage(new_image); rm_check_image_exception(new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); return rm_image_new(new_image); } /** * Call EqualizeImageChannel. * * Ruby usage: * - @verbatim Image#equalize_channel @endverbatim * - @verbatim Image#equalize_channel(channel) @endverbatim * - @verbatim Image#equalize_channel(channel, ...) @endverbatim * * Notes: * - Default channel is AllChannels * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_equalize_channel(int argc, VALUE *argv, VALUE self) { #if defined(HAVE_EQUALIZEIMAGECHANNEL) Image *image, *new_image; ExceptionInfo exception; ChannelType channels; image = rm_check_destroyed(self); channels = extract_channels(&argc, argv); if (argc > 0) { raise_ChannelType_error(argv[argc-1]); } new_image = rm_clone_image(image); GetExceptionInfo(&exception); (void) EqualizeImageChannel(new_image, channels); rm_check_image_exception(new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); return rm_image_new(new_image); #else argc = argc; argv = argv; self = self; rm_not_implemented(); return(VALUE) 0; #endif } /** * Reset the image to the background color. * * Ruby usage: * - @verbatim Image#erase! @endverbatim * * Notes: * - One of the very few Image methods that do not return a new image. * * @param self this object * @return self */ VALUE Image_erase_bang(VALUE self) { Image *image = rm_check_frozen(self); (void) SetImageBackgroundColor(image); rm_check_image_exception(image, RetainOnError); return self; } /** * Lightweight crop. * * No Ruby usage (internal function) * * Notes: * - christy says "does not respect the virtual page offset (-page) and does * not update the page offset and its more efficient than cropping." * * @param bang whether the bang (!) version of the method was called * @param self this object * @param x the x position for the start of the rectangle * @param y the y position for the start of the rectangle * @param width the width of the rectancle * @param height the height of the rectangle * @return self if bang, otherwise a new image * @see Image_excerpt * @see Image_excerpt_bang * @see Image_crop * @see Image_crop_bang */ static VALUE excerpt(int bang, VALUE self, VALUE x, VALUE y, VALUE width, VALUE height) { Image *image, *new_image; RectangleInfo rect; ExceptionInfo exception; memset(&rect,'\0', sizeof(rect)); rect.x = NUM2LONG(x); rect.y = NUM2LONG(y); rect.width = NUM2ULONG(width); rect.height = NUM2ULONG(height); Data_Get_Struct(self, Image, image); GetExceptionInfo(&exception); new_image = ExcerptImage(image, &rect, &exception); rm_check_exception(&exception, new_image, DestroyOnError); DestroyExceptionInfo(&exception); rm_ensure_result(new_image); if (bang) { UPDATE_DATA_PTR(self, new_image); (void) rm_image_destroy(image); return self; } return rm_image_new(new_image); } /** * Lightweight crop. * * Ruby usage: * - @verbatim Image#excerpt(x, y, width, height) @endverbatim * * @param self this object * @param x the x position for the start of the rectangle * @param y the y position for the start of the rectangle * @param width the width of the rectancle * @param height the height of the rectangle * @return self if bang, otherwise a new image * @see excerpt * @see Image_excerpt_bang * @see Image_crop * @see Image_crop_bang */ VALUE Image_excerpt(VALUE self, VALUE x, VALUE y, VALUE width, VALUE height) { (void) rm_check_destroyed(self); return excerpt(False, self, x, y, width, height); } /** * Lightweight crop. * * Ruby usage: * - @verbatim Image#excerpt!(x, y, width, height) @endverbatim * * @param self this object * @param x the x position for the start of the rectangle * @param y the y position for the start of the rectangle * @param width the width of the rectancle * @param height the height of the rectangle * @return self * @see excerpt * @see Image_excerpt * @see Image_crop * @see Image_crop_bang */ VALUE Image_excerpt_bang(VALUE self, VALUE x, VALUE y, VALUE width, VALUE height) { (void) rm_check_frozen(self); return excerpt(True, self, x, y, width, height); } /** * Extract image pixels in the form of an array. * * Ruby usage: * - @verbatim Image#export_pixels @endverbatim * - @verbatim Image#export_pixels(x) @endverbatim * - @verbatim Image#export_pixels(x, y) @endverbatim * - @verbatim Image#export_pixels(x, y, cols) @endverbatim * - @verbatim Image#export_pixels(x, y, cols, rows) @endverbatim * - @verbatim Image#export_pixels(x, y, cols, rows, map) @endverbatim * * Notes: * - Default x is 0 * - Default y is 0 * - Default cols is self.columns * - Default rows is self.rows * - Default map is "RGB" * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return array of pixels */ VALUE Image_export_pixels(int argc, VALUE *argv, VALUE self) { Image *image; long x_off = 0L, y_off = 0L; unsigned long cols, rows; long n, npixels; unsigned int okay; const char *map = "RGB"; Quantum *pixels; volatile VALUE ary; ExceptionInfo exception; image = rm_check_destroyed(self); cols = image->columns; rows = image->rows; switch (argc) { case 5: map = StringValuePtr(argv[4]); case 4: rows = NUM2ULONG(argv[3]); case 3: cols = NUM2ULONG(argv[2]); case 2: y_off = NUM2LONG(argv[1]); case 1: x_off = NUM2LONG(argv[0]); case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 to 5)", argc); break; } if ( x_off < 0 || (unsigned long)x_off > image->columns || y_off < 0 || (unsigned long)y_off > image->rows || cols == 0 || rows == 0) { rb_raise(rb_eArgError, "invalid extract geometry"); } npixels = (long)(cols * rows * strlen(map)); pixels = ALLOC_N(Quantum, npixels); if (!pixels) // app recovered from exception { return rb_ary_new2(0L); } GetExceptionInfo(&exception); okay = ExportImagePixels(image, x_off, y_off, cols, rows, map, QuantumPixel, (void *)pixels, &exception); if (!okay) { xfree((void *)pixels); CHECK_EXCEPTION() // Should never get here... rm_magick_error("ExportImagePixels failed with no explanation.", NULL); } (void) DestroyExceptionInfo(&exception); ary = rb_ary_new2(npixels); for (n = 0; n < npixels; n++) { (void) rb_ary_push(ary, QUANTUM2NUM(pixels[n])); } xfree((void *)pixels); return ary; } /** * Call ExtentImage. * * Ruby usage: * - @verbatim Image#extent(width, height) @endverbatim * - @verbatim Image#extent(width, height, x) @endverbatim * - @verbatim Image#extent(width, height, x, y) @endverbatim * * Notes: * - Default x is 0 * - Default y is 0 * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_extent(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; RectangleInfo geometry; long height, width; ExceptionInfo exception; (void) rm_check_destroyed(self); if (argc < 2 || argc > 4) { rb_raise(rb_eArgError, "wrong number of arguments (expected 2 to 4, got %d)", argc); } geometry.y = geometry.x = 0L; switch (argc) { case 4: geometry.y = NUM2LONG(argv[3]); case 3: geometry.x = NUM2LONG(argv[2]); default: geometry.height = height = NUM2LONG(argv[1]); geometry.width = width = NUM2LONG(argv[0]); break; } // Use the signed versions of these two values to test for < 0 if (height <= 0L || width <= 0L) { if (geometry.x == 0 && geometry.y == 0) { rb_raise(rb_eArgError, "invalid extent geometry %ldx%ld", width, height); } else { rb_raise(rb_eArgError, "invalid extent geometry %ldx%ld+%ld+%ld" , width, height, geometry.x, geometry.y); } } Data_Get_Struct(self, Image, image); GetExceptionInfo(&exception); new_image = ExtentImage(image, &geometry, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Extract image pixels to a Ruby string. * * Ruby usage: * - @verbatim Image#export_pixels_to_str @endverbatim * - @verbatim Image#export_pixels_to_str(x) @endverbatim * - @verbatim Image#export_pixels_to_str(x, y) @endverbatim * - @verbatim Image#export_pixels_to_str(x, y, cols) @endverbatim * - @verbatim Image#export_pixels_to_str(x, y, cols, rows) @endverbatim * - @verbatim Image#export_pixels_to_str(x, y, cols, rows, map) @endverbatim * - @verbatim Image#export_pixels_to_str(x, y, cols, rows, map, type) @endverbatim * * Notes: * - Default x is 0 * - Default y is 0 * - Default cols is self.columns * - Default rows is self.rows * - Default map is "RGB" * - Default type is Magick::CharPixel * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return pixels as a string */ VALUE Image_export_pixels_to_str(int argc, VALUE *argv, VALUE self) { Image *image; long x_off = 0L, y_off = 0L; unsigned long cols, rows; unsigned long npixels; size_t sz; unsigned int okay; const char *map = "RGB"; StorageType type = CharPixel; volatile VALUE string; char *str; ExceptionInfo exception; image = rm_check_destroyed(self); cols = image->columns; rows = image->rows; switch (argc) { case 6: VALUE_TO_ENUM(argv[5], type, StorageType); case 5: map = StringValuePtr(argv[4]); case 4: rows = NUM2ULONG(argv[3]); case 3: cols = NUM2ULONG(argv[2]); case 2: y_off = NUM2LONG(argv[1]); case 1: x_off = NUM2LONG(argv[0]); case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 to 6)", argc); break; } if ( x_off < 0 || (unsigned long)x_off > image->columns || y_off < 0 || (unsigned long)y_off > image->rows || cols == 0 || rows == 0) { rb_raise(rb_eArgError, "invalid extract geometry"); } npixels = cols * rows * strlen(map); switch (type) { case CharPixel: sz = sizeof(unsigned char); break; case ShortPixel: sz = sizeof(unsigned short); break; case DoublePixel: sz = sizeof(double); break; case FloatPixel: sz = sizeof(float); break; case IntegerPixel: sz = sizeof(unsigned int); break; case LongPixel: sz = sizeof(unsigned long); break; case QuantumPixel: sz = sizeof(Quantum); break; case UndefinedPixel: default: rb_raise(rb_eArgError, "undefined storage type"); break; } // Allocate a string long enough to hold the exported pixel data. // Get a pointer to the buffer. string = rb_str_new2(""); (void) rb_str_resize(string, (long)(sz * npixels)); str = StringValuePtr(string); GetExceptionInfo(&exception); okay = ExportImagePixels(image, x_off, y_off, cols, rows, map, type, (void *)str, &exception); if (!okay) { // Let GC have the string buffer. (void) rb_str_resize(string, 0); CHECK_EXCEPTION() // Should never get here... rm_magick_error("ExportImagePixels failed with no explanation.", NULL); } (void) DestroyExceptionInfo(&exception); return string; } /** * The extract_info attribute reader. * * Ruby usage: * - @verbatim Image#extract_info @endverbatim * * @param self this object * @return extract_info */ VALUE Image_extract_info(VALUE self) { Image *image = rm_check_destroyed(self); return Import_RectangleInfo(&image->extract_info); } /** * The extract_info attribute reader. * * Ruby usage: * - @verbatim Image#extract_info= @endverbatim * * @param self this object * @param rect extract_info * @return self */ VALUE Image_extract_info_eq(VALUE self, VALUE rect) { Image *image = rm_check_frozen(self); Export_RectangleInfo(&image->extract_info, rect); return self; } /** * Get image filename. * * Ruby usage: * - @verbatim Image#filename @endverbatim * * @param self this object * @return the filename */ DEF_ATTR_READER(Image, filename, str) /** * Return the image filesize. * * Ruby usage: * - @verbatim Image#filesize @endverbatim * * @param self this object * @return the filesize */ VALUE Image_filesize(VALUE self) { Image *image = rm_check_destroyed(self); return INT2FIX(GetBlobSize(image)); } /** * Get filter type. * * Ruby usage: * - @verbatim Image#filter @endverbatim * * @param self this object * @return the filter */ VALUE Image_filter(VALUE self) { Image *image = rm_check_destroyed(self); return FilterTypes_new(image->filter); } /** * Set filter type. * * Ruby usage: * - @verbatim Image#filter= @endverbatim * * @param self this object * @param filter the filter * @return self */ VALUE Image_filter_eq(VALUE self, VALUE filter) { Image *image = rm_check_frozen(self); VALUE_TO_ENUM(filter, image->filter, FilterTypes); return self; } /** * Search for a region in the image that is "similar" to the target image. * * Ruby usage: * - @verbatim Image#find_similar_region(target) @endverbatim * - @verbatim Image#find_similar_region(target, x) @endverbatim * - @verbatim Image#find_similar_region(target, x, y) @endverbatim * * Notes: * - Default x is 0 * - Default y is 0 * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return the region */ VALUE Image_find_similar_region(int argc, VALUE *argv, VALUE self) { Image *image, *target; volatile VALUE region, targ; long x = 0L, y = 0L; ExceptionInfo exception; unsigned int okay; image = rm_check_destroyed(self); switch (argc) { case 3: y = NUM2LONG(argv[2]); case 2: x = NUM2LONG(argv[1]); case 1: targ = rm_cur_image(argv[0]); target = rm_check_destroyed(targ); break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 to 3)", argc); break; } GetExceptionInfo(&exception); okay = IsImageSimilar(image, target, &x, &y, &exception); CHECK_EXCEPTION(); (void) DestroyExceptionInfo(&exception); if (!okay) { return Qnil; } region = rb_ary_new2(2); rb_ary_store(region, 0L, LONG2NUM(x)); rb_ary_store(region, 1L, LONG2NUM(y)); return region; } /** * Call a flipflopper (a function that either flips or flops the image). * * No Ruby usage (internal function) * * @param bang whether the bang (!) version of the method was called * @param self this object * @param flipflopper the flip/flop method to call * @return self if bang, otherwise a new image * @see Image_flip * @see Image_flip_bang * @see Image_flop * @see Image_flop_bang */ static VALUE flipflop(int bang, VALUE self, flipper_t flipflopper) { Image *image, *new_image; ExceptionInfo exception; Data_Get_Struct(self, Image, image); GetExceptionInfo(&exception); new_image = (flipflopper)(image, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); if (bang) { UPDATE_DATA_PTR(self, new_image); (void) rm_image_destroy(image); return self; } return rm_image_new(new_image); } /** * Create a vertical mirror image by reflecting the pixels around the central * x-axis. * * Ruby usage: * - @verbatim Image#flip @endverbatim * * @param self this object * @return a new image * @see flipflop * @see Image_flip_bang * @see Image_flop * @see Image_flop_bang */ VALUE Image_flip(VALUE self) { (void) rm_check_destroyed(self); return flipflop(False, self, FlipImage); } /** * Create a vertical mirror image by reflecting the pixels around the central * x-axis. * * Ruby usage: * - @verbatim Image#flip! @endverbatim * * @param self this object * @return self * @see flipflop * @see Image_flip * @see Image_flop * @see Image_flop_bang */ VALUE Image_flip_bang(VALUE self) { (void) rm_check_frozen(self); return flipflop(True, self, FlipImage); } /** * Create a horizonal mirror image by reflecting the pixels around the central * y-axis. * * Ruby usage: * - @verbatim Image#flop @endverbatim * * @param self this object * @return a new image * @see flipflop * @see Image_flop_bang * @see Image_flip * @see Image_flip_bang */ VALUE Image_flop(VALUE self) { (void) rm_check_destroyed(self); return flipflop(False, self, FlopImage); } /** * Create a horizonal mirror image by reflecting the pixels around the central * y-axis. * * Ruby usage: * - @verbatim Image#flop! @endverbatim * * @param self this object * @return self * @see flipflop * @see Image_flop * @see Image_flip * @see Image_flip_bang */ VALUE Image_flop_bang(VALUE self) { (void) rm_check_frozen(self); return flipflop(True, self, FlopImage); } /** * Return the image encoding format. * * Ruby usage: * - @verbatim Image#format @endverbatim * * Notes: * - This is what PerlMagick does for "format". * * @param self this object * @return the encoding format */ VALUE Image_format(VALUE self) { Image *image; const MagickInfo *magick_info; ExceptionInfo exception; image = rm_check_destroyed(self); if (*image->magick) { // Deliberately ignore the exception info! GetExceptionInfo(&exception); magick_info = GetMagickInfo(image->magick, &exception); (void) DestroyExceptionInfo(&exception); return magick_info ? rb_str_new2(magick_info->name) : Qnil; } return Qnil; } /** * Set the image encoding format. * * Ruby usage: * - @verbatim Image#format= @endverbatim * * @param self this object * @param magick the encoding format * @return self */ VALUE Image_format_eq(VALUE self, VALUE magick) { Image *image; const MagickInfo *m; char *mgk; ExceptionInfo exception; image = rm_check_frozen(self); GetExceptionInfo(&exception); mgk = StringValuePtr(magick); m = GetMagickInfo(mgk, &exception); CHECK_EXCEPTION() (void) DestroyExceptionInfo(&exception); if (!m) { rb_raise(rb_eArgError, "unknown format: %s", mgk); } strncpy(image->magick, m->name, MaxTextExtent-1); return self; } /** * Add a simulated three-dimensional border around the image. "Width" and * "height" specify the width and height of the frame. The "x" and "y" arguments * position the image within the frame. If the image is supposed to be centered * in the frame, x and y should be 1/2 the width and height of the frame. (I.e., * if the frame is 50 pixels high and 50 pixels wide, x and y should both be * 25). "Inner_bevel" and "outer_bevel" indicate the width of the inner and * outer shadows of the frame. They should be much smaller than the frame and * cannot be > 1/2 the frame width or height of the image. * * Ruby usage: * - @verbatim Image#frame @endverbatim * - @verbatim Image#frame(width) @endverbatim * - @verbatim Image#frame(width, height) @endverbatim * - @verbatim Image#frame(width, height, x) @endverbatim * - @verbatim Image#frame(width, height, x, y) @endverbatim * - @verbatim Image#frame(width, height, x, y, inner_bevel) @endverbatim * - @verbatim Image#frame(width, height, x, y, inner_bevel, outer_bevel) @endverbatim * - @verbatim Image#frame(width, height, x, y, inner_bevel, outer_bevel, color) @endverbatim * * Notes: * - The defaults are the same as they are in Magick++ * - Default width is image-columns+25*2 * - Default height is image-rows+25*2 * - Default x is 25 * - Default y is 25 * - Default inner is 6 * - Default outer is 6 * - Default color is image matte_color (which defaults to "#bdbdbd", whatever * self.matte_color was set to when the image was created, or whatever * image.matte_color is currently set to) * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image. */ VALUE Image_frame(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; ExceptionInfo exception; FrameInfo frame_info; image = rm_check_destroyed(self); frame_info.width = image->columns + 50; frame_info.height = image->rows + 50; frame_info.x = 25; frame_info.y = 25; frame_info.inner_bevel = 6; frame_info.outer_bevel = 6; switch (argc) { case 7: Color_to_PixelPacket(&image->matte_color, argv[6]); case 6: frame_info.outer_bevel = NUM2LONG(argv[5]); case 5: frame_info.inner_bevel = NUM2LONG(argv[4]); case 4: frame_info.y = NUM2LONG(argv[3]); case 3: frame_info.x = NUM2LONG(argv[2]); case 2: frame_info.height = image->rows + 2*NUM2LONG(argv[1]); case 1: frame_info.width = image->columns + 2*NUM2LONG(argv[0]); case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 to 7)", argc); break; } GetExceptionInfo(&exception); new_image = FrameImage(image, &frame_info, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Call BlobToImage. * * Ruby usage: * - @verbatim Image.from_blob(blob) <{ parm block }> @endverbatim * * @param class the Ruby Image class (unused) * @param blob_arg the blog as a Ruby string * @return an array of new images */ VALUE Image_from_blob(VALUE class, VALUE blob_arg) { Image *images; Info *info; volatile VALUE info_obj; ExceptionInfo exception; void *blob; long length; class = class; // defeat gcc message blob_arg = blob_arg; // defeat gcc message blob = (void *) rm_str2cstr(blob_arg, &length); // Get a new Info object - run the parm block if supplied info_obj = rm_info_new(); Data_Get_Struct(info_obj, Info, info); GetExceptionInfo(&exception); images = BlobToImage(info, blob, (size_t)length, &exception); rm_check_exception(&exception, images, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(images); rm_set_user_artifact(images, info); return array_from_images(images); } /** * Set the function on a channel. * * Ruby usage: * - @verbatim Image#function_channel(function, args) @endverbatim * - @verbatim Image#function_channel(function, args, channel) @endverbatim * - @verbatim Image#function_channel(function, args, channel, ...) @endverbatim * * Notes: * - Default channel is AllChannels * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_function_channel(int argc, VALUE *argv, VALUE self) { #if defined(HAVE_FUNCTIONIMAGECHANNEL) Image *image, *new_image; MagickFunction function; unsigned long n, nparms; volatile double *parameters; double *parms; ChannelType channels; ExceptionInfo exception; image = rm_check_destroyed(self); channels = extract_channels(&argc, argv); // The number of parameters depends on the function. if (argc == 0) { rb_raise(rb_eArgError, "no function specified"); } VALUE_TO_ENUM(argv[0], function, MagickFunction); argc -= 1; argv += 1; switch (function) { #if defined(HAVE_ENUM_POLYNOMIALFUNCTION) case PolynomialFunction: if (argc == 0) { rb_raise(rb_eArgError, "PolynomialFunction requires at least one argument."); } break; #endif #if defined(HAVE_ENUM_SINUSOIDFUNCTION) case SinusoidFunction: #endif #if defined(HAVE_ENUM_ARCSINFUNCTION) case ArcsinFunction: #endif #if defined(HAVE_ENUM_ARCTANFUNCTION) case ArctanFunction: #endif if (argc < 1 || argc > 4) { rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 to 4)", argc); } break; default: rb_raise(rb_eArgError, "undefined function"); break; } nparms = argc; parameters = parms = ALLOC_N(double, nparms); for (n = 0; n < nparms; n++) { parms[n] = NUM2DBL(argv[n]); } GetExceptionInfo(&exception); new_image = rm_clone_image(image); (void) FunctionImageChannel(new_image, channels, function, nparms, parms, &exception); (void) xfree(parms); rm_check_exception(&exception, new_image, DestroyOnError); DestroyExceptionInfo(&exception); return rm_image_new(new_image); #else rm_not_implemented(); return (VALUE)0; argc = argc; argv = argv; self = self; #endif } /** * Get image fuzz. * * Ruby usage: * - @verbatim Image#fuzz @endverbatim * * @param self this object * @return the fuzz * @see Info_fuzz */ DEF_ATTR_READER(Image, fuzz, dbl) /** * Set image fuzz. * * Ruby usage: * - @verbatim Image#fuzz=number @endverbatim * - @verbatim Image#fuzz=NN% @endverbatim * * @param self this object * @param fuzz the fuzz * @return self * @see Info_fuzz_eq */ VALUE Image_fuzz_eq(VALUE self, VALUE fuzz) { Image *image = rm_check_frozen(self); image->fuzz = rm_fuzz_to_dbl(fuzz); return self; } DEF_ATTR_ACCESSOR(Image, gamma, dbl) /** * Apply gamma to a channel. * * Ruby usage: * - @verbatim Image#gamma_channel(gamma) @endverbatim * - @verbatim Image#gamma_channel(gamma, channel) @endverbatim * - @verbatim Image#gamma_channel(gamma, channel, ...) @endverbatim * * Notes: * - Default channel is AllChannels * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_gamma_channel(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; ChannelType channels; image = rm_check_destroyed(self); channels = extract_channels(&argc, argv); // There must be exactly one remaining argument. if (argc == 0) { rb_raise(rb_eArgError, "missing gamma argument"); } else if (argc > 1) { raise_ChannelType_error(argv[argc-1]); } new_image = rm_clone_image(image); (void)GammaImageChannel(new_image, channels, NUM2DBL(argv[0])); rm_check_image_exception(new_image, DestroyOnError); return rm_image_new(new_image); } /** * gamma-correct an image. * * Ruby usage: * - @verbatim Image#gamma_correct(red_gamma) @endverbatim * - @verbatim Image#gamma_correct(red_gamma, green_gamma) @endverbatim * - @verbatim Image#gamma_correct(red_gamma, green_gamma, blue_gamma) @endverbatim * * Notes: * - Default green_gamma is red_gamma * - Default blue_gamma is green_gamma * - For backward compatibility accept a 4th argument but ignore it. * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_gamma_correct(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; double red_gamma, green_gamma, blue_gamma; char gamma_arg[50]; image = rm_check_destroyed(self); switch (argc) { case 1: red_gamma = NUM2DBL(argv[0]); // Can't have all 4 gamma values == 1.0. Also, very small values // cause ImageMagick to segv. if (red_gamma == 1.0 || fabs(red_gamma) < 0.003) { rb_raise(rb_eArgError, "invalid gamma value (%f)", red_gamma); } green_gamma = blue_gamma = red_gamma; break; case 2: red_gamma = NUM2DBL(argv[0]); green_gamma = NUM2DBL(argv[1]); blue_gamma = green_gamma; break; case 3: case 4: red_gamma = NUM2DBL(argv[0]); green_gamma = NUM2DBL(argv[1]); blue_gamma = NUM2DBL(argv[2]); break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 to 3)", argc); break; } sprintf(gamma_arg, "%f,%f,%f", red_gamma, green_gamma, blue_gamma); new_image = rm_clone_image(image); (void) GammaImage(new_image, gamma_arg); rm_check_image_exception(new_image, DestroyOnError); return rm_image_new(new_image); } /** * Blur the image. * * Ruby usage: * - @verbatim Image#gaussian_blur @endverbatim * - @verbatim Image#gaussian_blur(radius) @endverbatim * - @verbatim Image#gaussian_blur(radius, sigma) @endverbatim * * Notes: * - Default radius is 0.0 * - Default sigma is 1.0 * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image * @see effect_image */ VALUE Image_gaussian_blur(int argc, VALUE *argv, VALUE self) { return effect_image(self, argc, argv, GaussianBlurImage); } /** * Blur the image on a channel. * Ruby usage: * - @verbatim Image#gaussian_blur_channel @endverbatim * - @verbatim Image#gaussian_blur_channel(radius) @endverbatim * - @verbatim Image#gaussian_blur_channel(radius, sigma) @endverbatim * - @verbatim Image#gaussian_blur_channel(radius, sigma, channel) @endverbatim * - @verbatim Image#gaussian_blur_channel(radius, sigma, channel, ...) @endverbatim * * Notes: * - Default radius is 0.0 * - Default sigma is 1.0 * - Default channel is AllChannels * - New in IM 6.0.0 * * */ VALUE Image_gaussian_blur_channel(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; ChannelType channels; ExceptionInfo exception; double radius = 0.0, sigma = 1.0; image = rm_check_destroyed(self); channels = extract_channels(&argc, argv); // There can be 0, 1, or 2 remaining arguments. switch (argc) { case 2: sigma = NUM2DBL(argv[1]); /* Fall thru */ case 1: radius = NUM2DBL(argv[0]); /* Fall thru */ case 0: break; default: raise_ChannelType_error(argv[argc-1]); } GetExceptionInfo(&exception); new_image = GaussianBlurImageChannel(image, channels, radius, sigma, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); return rm_image_new(new_image); } /** * Get the preferred size of the image when encoding. * * Ruby usage: * - @verbatim Image#geometry @endverbatim * * @param self this object * @return the geometry */ DEF_ATTR_READER(Image, geometry, str) /** * Set the preferred size of the image when encoding. * * Ruby usage: * - @verbatim Image#geometry= @endverbatim * * @param self this object * @param geometry the geometry * @return self */ VALUE Image_geometry_eq( VALUE self, VALUE geometry) { Image *image; volatile VALUE geom_str; char *geom; image = rm_check_frozen(self); if (geometry == Qnil) { magick_free(image->geometry); image->geometry = NULL; return self; } geom_str = rm_to_s(geometry); geom = StringValuePtr(geom_str); if (!IsGeometry(geom)) { rb_raise(rb_eTypeError, "invalid geometry: %s", geom); } magick_clone_string(&image->geometry, geom); return self; } /** * Call AcquireImagePixels. * * Ruby usage: * - @verbatim Image#get_pixels(x, y, columns. rows) @endverbatim * * Notes: * - This is the complement of store_pixels. Notice that the return value is * an array object even when only one pixel is returned. store_pixels calls * GetImagePixels, then SyncImage * * @param self this object * @param x_arg x position of start of region * @param y_arg y position of start of region * @param cols_arg width of region * @param rows_arg height of region * @return An array of Magick::Pixel objects corresponding to the pixels in the * rectangle defined by the geometry parameters. * @see Image_store_pixels */ VALUE Image_get_pixels(VALUE self, VALUE x_arg, VALUE y_arg, VALUE cols_arg, VALUE rows_arg) { Image *image; const PixelPacket *pixels; ExceptionInfo exception; long x, y; unsigned long columns, rows; long size, n; VALUE pixel_ary; image = rm_check_destroyed(self); x = NUM2LONG(x_arg); y = NUM2LONG(y_arg); columns = NUM2ULONG(cols_arg); rows = NUM2ULONG(rows_arg); if ((x+columns) > image->columns || (y+rows) > image->rows) { rb_raise(rb_eRangeError, "geometry (%lux%lu%+ld%+ld) exceeds image bounds" , columns, rows, x, y); } // Cast AcquireImagePixels to get rid of the const qualifier. We're not going // to change the pixels but I don't want to make "pixels" const. GetExceptionInfo(&exception); #if defined(HAVE_GETVIRTUALPIXELS) pixels = GetVirtualPixels(image, x, y, columns, rows, &exception); #else pixels = AcquireImagePixels(image, x, y, columns, rows, &exception); #endif CHECK_EXCEPTION() (void) DestroyExceptionInfo(&exception); // If the function failed, return a 0-length array. if (!pixels) { return rb_ary_new(); } // Allocate an array big enough to contain the PixelPackets. size = (long)(columns * rows); pixel_ary = rb_ary_new2(size); // Convert the PixelPackets to Magick::Pixel objects for (n = 0; n < size; n++) { rb_ary_store(pixel_ary, n, Pixel_from_PixelPacket(&pixels[n])); } return pixel_ary; } /** * Run a function testing whether this image has an attribute. * * No Ruby usage (internal function) * * @param self this object * @param attr_test the attribute testing function * @return the result of attr_test. */ static VALUE has_attribute(VALUE self, MagickBooleanType (attr_test)(const Image *, ExceptionInfo *)) { Image *image; ExceptionInfo exception; MagickBooleanType r; image = rm_check_destroyed(self); GetExceptionInfo(&exception); r = (attr_test)(image, &exception); CHECK_EXCEPTION() return r ? Qtrue : Qfalse; } /** * Return true if all the pixels in the image have the same red, green, and blue * intensities. * * Ruby usage: * - @verbatim Image#gray? @endverbatim * * @param self this object * @return true if image is gray, false otherwise * @see has_attribute */ VALUE Image_gray_q(VALUE self) { return has_attribute(self, (MagickBooleanType (*)(const Image *, ExceptionInfo *))IsGrayImage); } /** * Return true if has 1024 unique colors or less. * * Ruby usage: * - @verbatim Image#histogram? @endverbatim * * @param self this object * @return true if image has <=1024 unique colors * @see has_attribute */ VALUE Image_histogram_q(VALUE self) { return has_attribute(self, IsHistogramImage); } /** * Implode the image by the specified percentage. * * Ruby usage: * - @verbatim Image#implode @endverbatim * - @verbatim Image#implode(amount) @endverbatim * * Notes: * - Default amount is 0.50 * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_implode(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; double amount = 0.50; ExceptionInfo exception; switch (argc) { case 1: amount = NUM2DBL(argv[0]); case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 or 1)", argc); } image = rm_check_destroyed(self); GetExceptionInfo(&exception); new_image = ImplodeImage(image, amount, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Store image pixel data from an array. * * Ruby usage: * - @verbatim Image#import_pixels @endverbatim * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self * @see Image_export_pixels */ VALUE Image_import_pixels(int argc, VALUE *argv, VALUE self) { Image *image; long x_off, y_off; unsigned long cols, rows; unsigned long n, npixels; long buffer_l; char *map; volatile VALUE pixel_arg, pixel_ary; StorageType stg_type = CharPixel; size_t type_sz, map_l; Quantum *pixels = NULL; double *fpixels = NULL; void *buffer; unsigned int okay; image = rm_check_frozen(self); switch (argc) { case 7: VALUE_TO_ENUM(argv[6], stg_type, StorageType); case 6: x_off = NUM2LONG(argv[0]); y_off = NUM2LONG(argv[1]); cols = NUM2ULONG(argv[2]); rows = NUM2ULONG(argv[3]); map = StringValuePtr(argv[4]); pixel_arg = argv[5]; break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 6 or 7)", argc); break; } if (x_off < 0 || y_off < 0 || cols <= 0 || rows <= 0) { rb_raise(rb_eArgError, "invalid import geometry"); } map_l = strlen(map); npixels = cols * rows * map_l; // Assume that any object that responds to :to_str is a string buffer containing // binary pixel data. if (rb_respond_to(pixel_arg, rb_intern("to_str"))) { buffer = (void *)rm_str2cstr(pixel_arg, &buffer_l); switch (stg_type) { case CharPixel: type_sz = 1; break; case ShortPixel: type_sz = sizeof(unsigned short); break; case IntegerPixel: type_sz = sizeof(unsigned int); break; case LongPixel: type_sz = sizeof(unsigned long); break; case DoublePixel: type_sz = sizeof(double); break; case FloatPixel: type_sz = sizeof(float); break; case QuantumPixel: type_sz = sizeof(Quantum); break; default: rb_raise(rb_eArgError, "unsupported storage type %s", StorageType_name(stg_type)); break; } if (buffer_l % type_sz != 0) { rb_raise(rb_eArgError, "pixel buffer must be an exact multiple of the storage type size"); } if ((buffer_l / type_sz) % map_l != 0) { rb_raise(rb_eArgError, "pixel buffer must contain an exact multiple of the map length"); } if ((unsigned long)(buffer_l / type_sz) < npixels) { rb_raise(rb_eArgError, "pixel buffer too small (need %lu channel values, got %ld)" , npixels, buffer_l/type_sz); } } // Otherwise convert the argument to an array and convert the array elements // to binary pixel data. else { // rb_Array converts an object that is not an array to an array if possible, // and raises TypeError if it can't. It usually is possible. pixel_ary = rb_Array(pixel_arg); if (RARRAY_LEN(pixel_ary) % map_l != 0) { rb_raise(rb_eArgError, "pixel array must contain an exact multiple of the map length"); } if ((unsigned long)RARRAY_LEN(pixel_ary) < npixels) { rb_raise(rb_eArgError, "pixel array too small (need %lu elements, got %ld)" , npixels, RARRAY_LEN(pixel_ary)); } if (stg_type == DoublePixel || stg_type == FloatPixel) { // Get an array for double pixels. Use Ruby's memory so GC will clean up after // us in case of an exception. fpixels = ALLOC_N(double, npixels); for (n = 0; n < npixels; n++) { fpixels[n] = NUM2DBL(rb_ary_entry(pixel_ary, n)); } buffer = (void *) fpixels; stg_type = DoublePixel; } else { // Get array for Quantum pixels. Use Ruby's memory so GC will clean up after us // in case of an exception. pixels = ALLOC_N(Quantum, npixels); for (n = 0; n < npixels; n++) { volatile VALUE p = rb_ary_entry(pixel_ary, n); pixels[n] = NUM2QUANTUM(p); } buffer = (void *) pixels; stg_type = QuantumPixel; } } okay = ImportImagePixels(image, x_off, y_off, cols, rows, map, stg_type, buffer); // Free pixel array before checking for errors. if (pixels) { xfree((void *)pixels); } if (fpixels) { xfree((void *)fpixels); } if (!okay) { rm_check_image_exception(image, RetainOnError); // Shouldn't get here... rm_magick_error("ImportImagePixels failed with no explanation.", NULL); } return self; } /** * Override Object#inspect - return a string description of the image. * * No Ruby usage (internal function) * * Notes: * - This is essentially the IdentifyImage except the description is built in * a char buffer instead of being written to a file. * * @param image the image to inspect * @param buffer buffer for the output string * @param len length of buffer * @see Image_inspect */ static void build_inspect_string(Image *image, char *buffer, size_t len) { unsigned long quantum_depth; int x = 0; // # bytes used in buffer // Print magick filename if different from current filename. if (*image->magick_filename != '\0' && strcmp(image->magick_filename, image->filename) != 0) { x += sprintf(buffer+x, "%.1024s=>", image->magick_filename); } // Print current filename. x += sprintf(buffer+x, "%.1024s", image->filename); // Print scene number. if ((GetPreviousImageInList(image) != NULL) && (GetNextImageInList(image) != NULL) && image->scene > 0) { x += sprintf(buffer+x, "[%lu]", image->scene); } // Print format x += sprintf(buffer+x, " %s ", image->magick); // Print magick columnsXrows if different from current. if (image->magick_columns != 0 || image->magick_rows != 0) { if (image->magick_columns != image->columns || image->magick_rows != image->rows) { x += sprintf(buffer+x, "%lux%lu=>", image->magick_columns, image->magick_rows); } } x += sprintf(buffer+x, "%lux%lu ", image->columns, image->rows); // Print current columnsXrows if ( image->page.width != 0 || image->page.height != 0 || image->page.x != 0 || image->page.y != 0) { x += sprintf(buffer+x, "%lux%lu%+ld%+ld ", image->page.width, image->page.height , image->page.x, image->page.y); } if (image->storage_class == DirectClass) { x += sprintf(buffer+x, "DirectClass "); if (image->total_colors != 0) { if (image->total_colors >= (unsigned long)(1 << 24)) { x += sprintf(buffer+x, "%lumc ", image->total_colors/1024/1024); } else { if (image->total_colors >= (unsigned long)(1 << 16)) { x += sprintf(buffer+x, "%lukc ", image->total_colors/1024); } else { x += sprintf(buffer+x, "%luc ", image->total_colors); } } } } else { // Cast `image->colors' to long to suppress gcc warnings when // building with GM. GM defines that field as an unsigned int. if (image->total_colors <= image->colors) { x += sprintf(buffer+x, "PseudoClass %ldc ", (long) image->colors); } else { x += sprintf(buffer+x, "PseudoClass %lu=>%ldc ", image->total_colors , (long)image->colors); if (image->error.mean_error_per_pixel != 0.0) { x += sprintf(buffer+x, "%ld/%.6f/%.6fdb " , (long) (image->error.mean_error_per_pixel+0.5) , image->error.normalized_mean_error , image->error.normalized_maximum_error); } } } // Print bit depth quantum_depth = GetImageQuantumDepth(image, MagickTrue); x += sprintf(buffer+x, "%lu-bit", quantum_depth); // Print blob info if appropriate. if (GetBlobSize(image) != 0) { if (GetBlobSize(image) >= (1 << 24)) { x += sprintf(buffer+x, " %lumb", (unsigned long) (GetBlobSize(image)/1024/1024)); } else if (GetBlobSize(image) >= 1024) { x += sprintf(buffer+x, " %lukb", (unsigned long) (GetBlobSize(image)/1024)); } else { x += sprintf(buffer+x, " %lub", (unsigned long) GetBlobSize(image)); } } #if defined(HAVE_SETIMAGEARTIFACT) if (len-1-x > 6) { size_t value_l; const char *value = GetImageArtifact(image, "user"); if (value) { strcpy(buffer+x, " user:"); x += 6; value_l = len - x - 1; value_l = min(strlen(value), value_l); memcpy(buffer+x, value, value_l); x += value_l; } } #endif assert(x < (int)(len-1)); buffer[x] = '\0'; return; } /** * Override Object#inspect - return a string description of the image. * * Ruby usage: * - @verbatim Image#inspect @endverbatim * * Notes: * - This is essentially the IdentifyImage except the description is built in * a char buffer instead of being written to a file. * * @param self this object * @return the string * @see build_inspect_string */ VALUE Image_inspect(VALUE self) { Image *image; char buffer[MaxTextExtent]; // image description buffer Data_Get_Struct(self, Image, image); if (!image) { return rb_str_new2("#"); } build_inspect_string(image, buffer, sizeof(buffer)); return rb_str_new2(buffer); } /** * Get the interlace attribute. * * Ruby usage: * - @verbatim Image#interlace @endverbatim * * @param self this object * @return the interlace */ VALUE Image_interlace(VALUE self) { Image *image = rm_check_destroyed(self); return InterlaceType_new(image->interlace); } /** * Set the interlace attribute. * * Ruby usage: * - @verbatim Image#interlace= @endverbatim * * @param self this object * @param interlace the interlace * @return self */ VALUE Image_interlace_eq(VALUE self, VALUE interlace) { Image *image = rm_check_frozen(self); VALUE_TO_ENUM(interlace, image->interlace, InterlaceType); return self; } /** * Return the IPTC profile as a String. * * Ruby usage: * - @verbatim Image#iptc_profile @endverbatim * * @param self * @return the IPTC profile if it exists, otherwise nil */ VALUE Image_iptc_profile(VALUE self) { Image *image; const StringInfo *profile; image = rm_check_destroyed(self); profile = GetImageProfile(image, "iptc"); rm_check_image_exception(image, RetainOnError); if (!profile) { return Qnil; } return rb_str_new((char *)profile->datum, (long)profile->length); } /** * Set the IPTC profile. The argument is a string. * * Ruby usage: * - @verbatim Image#iptc_profile= @endverbatim * * Notes: * - Pass nil to remove any existing profile * * @param self * @param profile the IPTC profile (as a string) * @return self */ VALUE Image_iptc_profile_eq(VALUE self, VALUE profile) { (void) Image_delete_profile(self, rb_str_new2("IPTC")); if (profile != Qnil) { (void) set_profile(self, "IPTC", profile); } return self; } /* * These are undocumented methods. The writer is * called only by Image#iterations=. * The reader is only used by the unit tests! */ DEF_ATTR_ACCESSOR(Image, iterations, int) /** * Adjust the levels of an image given these points: black, mid, and white. * * Ruby usage: * - @verbatim Image#level @endverbatim * - @verbatim Image#level(black_point) @endverbatim * - @verbatim Image#level(black_point, white_point) @endverbatim * - @verbatim Image#level(black_point, white_point, gamma) @endverbatim * * Notes: * - Default black_point is 0.0 * - Default white_point is QuantumRange * - Default gamma is 1.0 * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_level2(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; double black_point = 0.0, gamma_val = 1.0, white_point = (double)QuantumRange; char level[50]; image = rm_check_destroyed(self); switch (argc) { case 0: // take all the defaults break; case 1: black_point = NUM2DBL(argv[0]); white_point = QuantumRange - black_point; break; case 2: black_point = NUM2DBL(argv[0]); white_point = NUM2DBL(argv[1]); break; case 3: black_point = NUM2DBL(argv[0]); white_point = NUM2DBL(argv[1]); gamma_val = NUM2DBL(argv[2]); break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 to 3)", argc); break; } new_image = rm_clone_image(image); sprintf(level, "%gx%g+%g", black_point, white_point, gamma_val); (void) LevelImage(new_image, level); rm_check_image_exception(new_image, DestroyOnError); return rm_image_new(new_image); } /** * Similar to Image#level but applies to a single channel only. * * Ruby usage: * - @verbatim Image#level_channel(aChannelType) @endverbatim * - @verbatim Image#level_channel(aChannelType, black) @endverbatim * - @verbatim Image#level_channel(aChannelType, black, white) @endverbatim * - @verbatim Image#level_channel(aChannelType, black, white, gamma) @endverbatim * * Notes: * - Default black is 0.0 * - Default white is QuantumRange * - Default gamma is 1.0 * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image * @see Image_level2 */ VALUE Image_level_channel(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; double black_point = 0.0, gamma_val = 1.0, white_point = (double)QuantumRange; ChannelType channel; image = rm_check_destroyed(self); switch (argc) { case 1: // take all the defaults break; case 2: black_point = NUM2DBL(argv[1]); white_point = QuantumRange - black_point; break; case 3: black_point = NUM2DBL(argv[1]); white_point = NUM2DBL(argv[2]); break; case 4: black_point = NUM2DBL(argv[1]); white_point = NUM2DBL(argv[2]); gamma_val = NUM2DBL(argv[3]); break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 to 4)", argc); break; } VALUE_TO_ENUM(argv[0], channel, ChannelType); new_image = rm_clone_image(image); (void) LevelImageChannel(new_image, channel, black_point, white_point, gamma_val); rm_check_image_exception(new_image, DestroyOnError); return rm_image_new(new_image); } /** * Implement +level_colors blank_color,white_color. * * Ruby usage: * - @verbatim Image#level_colors @endverbatim * - @verbatim Image#level_colors(black_color) @endverbatim * - @verbatim Image#level_colors(black_color, white_color) @endverbatim * - @verbatim Image#level_colors(black_color, white_color, invert) @endverbatim * - @verbatim Image#level_colors(black_color, white_color, invert, channel) @endverbatim * - @verbatim Image#level_colors(black_color, white_color, invert, channel, ...) @endverbatim * * Notes: * - Default black_color is "black" * - Default white_color is "white" * - Default invert is true * - Default channel is AllChannels * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_level_colors(int argc, VALUE *argv, VALUE self) { #if defined(HAVE_LEVELIMAGECOLORS) || defined(HAVE_LEVELCOLORSIMAGECHANNEL) Image *image, *new_image; MagickPixelPacket black_color, white_color; ChannelType channels; ExceptionInfo exception; MagickBooleanType invert = MagickTrue; MagickBooleanType status; image = rm_check_destroyed(self); channels = extract_channels(&argc, argv); switch (argc) { case 3: invert = RTEST(argv[2]); case 2: Color_to_MagickPixelPacket(image, &white_color, argv[1]); Color_to_MagickPixelPacket(image, &black_color, argv[0]); break; case 1: Color_to_MagickPixelPacket(image, &black_color, argv[0]); GetExceptionInfo(&exception); GetMagickPixelPacket(image, &white_color); (void) QueryMagickColor("white", &white_color, &exception); CHECK_EXCEPTION() DestroyExceptionInfo(&exception); case 0: GetExceptionInfo(&exception); GetMagickPixelPacket(image, &white_color); (void) QueryMagickColor("white", &white_color, &exception); CHECK_EXCEPTION() GetMagickPixelPacket(image, &black_color); (void) QueryMagickColor("black", &black_color, &exception); CHECK_EXCEPTION() DestroyExceptionInfo(&exception); break; default: raise_ChannelType_error(argv[argc-1]); break; } new_image = rm_clone_image(image); #if defined(HAVE_LEVELCOLORSIMAGECHANNEL) // new in 6.5.6-4 status = LevelColorsImageChannel(new_image, channels, &black_color, &white_color, invert); #else status = LevelImageColors(new_image, channels, &black_color, &white_color, invert); #endif rm_check_image_exception(new_image, DestroyOnError); if (!status) { rb_raise(rb_eRuntimeError, "LevelImageColors failed for unknown reason."); } return rm_image_new(new_image); #else rm_not_implemented(); self = self; argc = argc; argv = argv; return(VALUE)0; #endif } /** * Levelize on a channel. * * Ruby usage: * - @verbatim Image#levelize_channel(black_point) @endverbatim * - @verbatim Image#levelize_channel(black_point, white_point) @endverbatim * - @verbatim Image#levelize_channel(black_point, white_point, gamma) @endverbatim * - @verbatim Image#levelize_channel(black_point, white_point, gamma, channel) @endverbatim * - @verbatim Image#levelize_channel(black_point, white_point, gamma, channel, ...) @endverbatim * * Notes: * - Default white_point is QuantumRange * - Default gamma is 1.0 * - Default channel is AllChannels * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_levelize_channel(int argc, VALUE *argv, VALUE self) { #if defined(HAVE_LEVELIZEIMAGECHANNEL) Image *image, *new_image; ChannelType channels; double black_point, white_point; double gamma = 1.0; MagickBooleanType status; image = rm_check_destroyed(self); channels = extract_channels(&argc, argv); if (argc > 3) { raise_ChannelType_error(argv[argc-1]); } switch (argc) { case 3: gamma = NUM2DBL(argv[2]); case 2: white_point = NUM2DBL(argv[1]); black_point = NUM2DBL(argv[0]); break; case 1: black_point = NUM2DBL(argv[0]); white_point = QuantumRange - black_point; break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or more)", argc); break; } new_image = rm_clone_image(image); status = LevelizeImageChannel(new_image, channels, black_point, white_point, gamma); rm_check_image_exception(new_image, DestroyOnError); if (!status) { rb_raise(rb_eRuntimeError, "LevelizeImageChannel failed for unknown reason."); } return rm_image_new(new_image); #else rm_not_implemented(); self = self; argc = argc; argv = argv; return(VALUE)0; #endif } /** * Call LinearStretchImage. * * Ruby usage: * - @verbatim Image_linear_stretch(black_point) @endverbatim * - @verbatim Image_linear_stretch(black_point , white_point) @endverbatim * * Notes: * - Default white_point is pixels-black_point * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image * @see Image_contrast_stretch_channel. * @see get_black_white_point */ VALUE Image_linear_stretch(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; double black_point, white_point; image = rm_check_destroyed(self); get_black_white_point(image, argc, argv, &black_point, &white_point); new_image = rm_clone_image(image); (void) LinearStretchImage(new_image, black_point, white_point); rm_check_image_exception(new_image, DestroyOnError); return rm_image_new(new_image); } /** * Call the LiquidRescaleImage API. * * Ruby usage: * - @verbatim Image#liquid_rescale(columns, rows) @endverbatim * - @verbatim Image#liquid_rescale(columns, rows, delta_x) @endverbatim * - @verbatim Image#liquid_rescale(columns, rows, delta_x, rigidity) @endverbatim * * Notes: * - Default delta_x is 0.0 * - Default rigidity is 0.0 * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_liquid_rescale(int argc, VALUE *argv, VALUE self) { #if defined(HAVE_LIQUIDRESCALEIMAGE) Image *image, *new_image; unsigned long cols, rows; double delta_x = 0.0; double rigidity = 0.0; ExceptionInfo exception; image = rm_check_destroyed(self); switch (argc) { case 4: rigidity = NUM2DBL(argv[3]); case 3: delta_x = NUM2DBL(argv[2]); case 2: rows = NUM2ULONG(argv[1]); cols = NUM2ULONG(argv[0]); break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 to 4)", argc); break; } GetExceptionInfo(&exception); new_image = LiquidRescaleImage(image, cols, rows, delta_x, rigidity, &exception); rm_check_exception(&exception, new_image, DestroyOnError); DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); #else argc = argc; // defeat "unused parameter" messages argv = argv; self = self; rm_not_implemented(); return(VALUE)0; #endif } /** * Implement marshalling. * * Ruby usage: * - @verbatim Image._load @endverbatim * * Notes: * - calls BlobToImage * * @param class Ruby class for Image * @param str the marshalled string * @return a new image * @see Image__dump */ VALUE Image__load(VALUE class, VALUE str) { Image *image; ImageInfo *info; DumpedImage mi; ExceptionInfo exception; char *blob; long length; class = class; // Suppress "never referenced" message from icc info = CloneImageInfo(NULL); blob = rm_str2cstr(str, &length); // Must be as least as big as the 1st 4 fields in DumpedImage if (length <= (long)(sizeof(DumpedImage)-MaxTextExtent)) { rb_raise(rb_eTypeError, "image is invalid or corrupted (too short)"); } // Retrieve & validate the image format from the header portion mi.id = ((DumpedImage *)blob)->id; if (mi.id != DUMPED_IMAGE_ID) { rb_raise(rb_eTypeError, "image is invalid or corrupted (invalid header)"); } mi.mj = ((DumpedImage *)blob)->mj; mi.mi = ((DumpedImage *)blob)->mi; if ( mi.mj != DUMPED_IMAGE_MAJOR_VERS || mi.mi > DUMPED_IMAGE_MINOR_VERS) { rb_raise(rb_eTypeError, "incompatible image format (can't be read)\n" "\tformat version %d.%d required; %d.%d given" , DUMPED_IMAGE_MAJOR_VERS, DUMPED_IMAGE_MINOR_VERS , mi.mj, mi.mi); } mi.len = ((DumpedImage *)blob)->len; // Must be bigger than the header if (length <= (long)(mi.len+sizeof(DumpedImage)-MaxTextExtent)) { rb_raise(rb_eTypeError, "image is invalid or corrupted (too short)"); } memcpy(info->magick, ((DumpedImage *)blob)->magick, mi.len); info->magick[mi.len] = '\0'; GetExceptionInfo(&exception); blob += offsetof(DumpedImage,magick) + mi.len; length -= offsetof(DumpedImage,magick) + mi.len; image = BlobToImage(info, blob, (size_t) length, &exception); (void) DestroyImageInfo(info); rm_check_exception(&exception, image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(image); return rm_image_new(image); } /** * Scale an image proportionally to twice its size. * * No Ruby usage (internal function) * * @param bang whether the bang (!) version of the method was called * @param self this object * @param magnifier function to use for magnification * @return self if bang, otherwise a new image */ static VALUE magnify(int bang, VALUE self, magnifier_t magnifier) { Image *image; Image *new_image; ExceptionInfo exception; Data_Get_Struct(self, Image, image); GetExceptionInfo(&exception); new_image = (magnifier)(image, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); if (bang) { UPDATE_DATA_PTR(self, new_image); (void) rm_image_destroy(image); return self; } return rm_image_new(new_image); } /** * Scale an image proportionally to twice its size. * * Ruby usage: * - @verbatim Image#magnify @endverbatim * * @param self this object * @return a new image * @see magnify * @see Image_magnify_bang */ VALUE Image_magnify(VALUE self) { (void) rm_check_destroyed(self); return magnify(False, self, MagnifyImage); } /** * Scale an image proportionally to twice its size. * * Ruby usage: * - @verbatim Image#magnify! @endverbatim * * @param self this object * @return self * @see magnify * @see Image_magnify */ VALUE Image_magnify_bang(VALUE self) { (void) rm_check_frozen(self); return magnify(True, self, MagnifyImage); } /** * Call MapImage. * * Ruby usage: * - @verbatim Image#map(map_image) @endverbatim * - @verbatim Image#map(map_image, dither) @endverbatim * * Notes: * - Default dither is false * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_map(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; Image *map; volatile VALUE map_obj, map_arg; unsigned int dither = MagickFalse; image = rm_check_destroyed(self); #if defined(HAVE_REMAPIMAGE) rb_warning("Image#map is deprecated. Use Image#remap instead"); #endif switch (argc) { case 2: dither = RTEST(argv[1]); case 1: map_arg = argv[0]; break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc); break; } new_image = rm_clone_image(image); map_obj = rm_cur_image(map_arg); map = rm_check_destroyed(map_obj); (void) MapImage(new_image, map, dither); rm_check_image_exception(new_image, DestroyOnError); return rm_image_new(new_image); } /** * Support Marshal.dump >= 1.8. * * Ruby usage: * - @verbatim Image#marshal_dump @endverbatim * * @param self this object * @return [img.filename, img.to_blob] */ VALUE Image_marshal_dump(VALUE self) { Image *image; Info *info; unsigned char *blob; size_t length; VALUE ary; ExceptionInfo exception; image = rm_check_destroyed(self); info = CloneImageInfo(NULL); if (!info) { rb_raise(rb_eNoMemError, "not enough memory to initialize Info object"); } ary = rb_ary_new2(2); if (image->filename) { rb_ary_store(ary, 0, rb_str_new2(image->filename)); } else { rb_ary_store(ary, 0, Qnil); } GetExceptionInfo(&exception); blob = ImageToBlob(info, image, &length, &exception); // Destroy info before raising an exception DestroyImageInfo(info); CHECK_EXCEPTION() (void) DestroyExceptionInfo(&exception); rb_ary_store(ary, 1, rb_str_new((char *)blob, (long)length)); magick_free((void*)blob); return ary; } /** * Support Marshal.load >= 1.8. * * Ruby usage: * - @verbatim Image#marshal_load @endverbatim * * @param self this object * @param ary the array returned from marshal_dump * @return self */ VALUE Image_marshal_load(VALUE self, VALUE ary) { VALUE blob, filename; Info *info; Image *image; ExceptionInfo exception; info = CloneImageInfo(NULL); if (!info) { rb_raise(rb_eNoMemError, "not enough memory to initialize Info object"); } filename = rb_ary_shift(ary); blob = rb_ary_shift(ary); GetExceptionInfo(&exception); if (filename != Qnil) { strcpy(info->filename, RSTRING_PTR(filename)); } image = BlobToImage(info, RSTRING_PTR(blob), RSTRING_LEN(blob), &exception); // Destroy info before raising an exception DestroyImageInfo(info); CHECK_EXCEPTION(); (void) DestroyExceptionInfo(&exception); UPDATE_DATA_PTR(self, image); return self; } /** * Return the image's clip mask, or nil if it doesn't have a clip mask. * * No Ruby usage (internal function) * * Notes: * - Distinguish from Image#clip_mask * * @param image the image * @return copy of the current clip-mask or nil */ static VALUE get_image_mask(Image *image) { Image *mask; ExceptionInfo exception; GetExceptionInfo(&exception); // The returned clip mask is a clone, ours to keep. mask = GetImageClipMask(image, &exception); rm_check_exception(&exception, mask, DestroyOnError); (void) DestroyExceptionInfo(&exception); return mask ? rm_image_new(mask) : Qnil; } /** * Set the image mask. * * Ruby usage: * - @verbatim Image#mask= @endverbatim * * @param self this object * @param mask the mask to use * @return copy of the current clip-mask or nil * @deprecated Please use Image_mask(mask-image). * @see Image_mask(mask-image) * @see get_image_mask */ VALUE Image_mask_eq(VALUE self, VALUE mask) { VALUE v[1]; v[0] = mask; return Image_mask(1, v, self); } /** * Associate a clip mask with the image. * * Ruby usage: * - @verbatim Image#mask @endverbatim * - @verbatim Image#mask(mask-image) @endverbatim * * Notes: * - Omit the argument to get a copy of the current clip mask. * - Pass "nil" for the mask-image to remove the current clip mask. * - If the clip mask is not the same size as the target image, resizes the * clip mask to match the target. * - Distinguish from Image#clip_mask= * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return copy of the current clip-mask or nil * @see get_image_mask */ VALUE Image_mask(int argc, VALUE *argv, VALUE self) { volatile VALUE mask; Image *image, *mask_image, *resized_image; Image *clip_mask; long x, y; PixelPacket *q; ExceptionInfo exception; image = rm_check_destroyed(self); if (argc == 0) { return get_image_mask(image); } if (argc > 1) { rb_raise(rb_eArgError, "wrong number of arguments (expected 0 or 1, got %d)", argc); } rb_check_frozen(self); mask = argv[0]; if (mask != Qnil) { mask = rm_cur_image(mask); mask_image = rm_check_destroyed(mask); clip_mask = rm_clone_image(mask_image); // Resize if necessary if (clip_mask->columns != image->columns || clip_mask->rows != image->rows) { GetExceptionInfo(&exception); resized_image = ResizeImage(clip_mask, image->columns, image->rows , UndefinedFilter, 0.0, &exception); rm_check_exception(&exception, resized_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(resized_image); (void) DestroyImage(clip_mask); clip_mask = resized_image; } // The following section is copied from mogrify.c (6.2.8-8) #if defined(HAVE_SYNCAUTHENTICPIXELS) GetExceptionInfo(&exception); #endif for (y = 0; y < (long) clip_mask->rows; y++) { #if defined(HAVE_GETAUTHENTICPIXELS) q = GetAuthenticPixels(clip_mask, 0, y, clip_mask->columns, 1, &exception); rm_check_exception(&exception, clip_mask, DestroyOnError); #else q = GetImagePixels(clip_mask, 0, y, clip_mask->columns, 1); rm_check_image_exception(clip_mask, DestroyOnError); #endif if (!q) { break; } for (x = 0; x < (long) clip_mask->columns; x++) { if (clip_mask->matte == MagickFalse) { q->opacity = PIXEL_INTENSITY(q); } q->red = q->opacity; q->green = q->opacity; q->blue = q->opacity; q += 1; } #if defined(HAVE_SYNCAUTHENTICPIXELS) SyncAuthenticPixels(clip_mask, &exception); rm_check_exception(&exception, clip_mask, DestroyOnError); #else SyncImagePixels(clip_mask); rm_check_image_exception(clip_mask, DestroyOnError); #endif } #if defined(HAVE_SYNCAUTHENTICPIXELS) (void) DestroyExceptionInfo(&exception); #endif SetImageStorageClass(clip_mask, DirectClass); rm_check_image_exception(clip_mask, DestroyOnError); clip_mask->matte = MagickTrue; // SetImageClipMask clones the clip_mask image. We can // destroy our copy after SetImageClipMask is done with it. (void) SetImageClipMask(image, clip_mask); (void) DestroyImage(clip_mask); } else { (void) SetImageClipMask(image, NULL); } // Always return a copy of the mask! return get_image_mask(image); } /** * Get matte attribute. * * Ruby usage: * - @verbatim Image#matte @endverbatim * * @param self this object * @return the matte * @deprecated Deprecated as of ImageMagick 6.3.6. See Image_alpha * @see Image_alpha * @see Image_alpha_eq */ VALUE Image_matte(VALUE self) { Image *image; image = rm_check_destroyed(self); return image->matte ? Qtrue : Qfalse; } /** * Set matte attribute. * * Ruby usage: * - @verbatim Image#matte= @endverbatim * * @param self this object * @param matte the matte * @return the matte * @deprecated Deprecated as of ImageMagick 6.3.6. See Image_alpha_eq * @see Image_alpha_eq * @see Image_alpha */ VALUE Image_matte_eq(VALUE self, VALUE matte) { #if defined(HAVE_SETIMAGEALPHACHANNEL) VALUE alpha_channel_type; if (RTEST(matte)) { alpha_channel_type = rb_const_get(Module_Magick, rb_intern("ActivateAlphaChannel")); } else { alpha_channel_type = rb_const_get(Module_Magick, rb_intern("DeactivateAlphaChannel")); } return Image_alpha_eq(self, alpha_channel_type); #else Image *image = rm_check_frozen(self); image->matte = RTEST(matte) ? MagickTrue : MagickFalse; return matte; #endif } /** * Return the matte color. * * Ruby usage: * - @verbatim Image#matte_color @endverbatim * * @param self this object * @return the matte color */ VALUE Image_matte_color(VALUE self) { Image *image = rm_check_destroyed(self); return rm_pixelpacket_to_color_name(image, &image->matte_color); } /** * Set the matte color. * * Ruby usage: * - @verbatim Image#matte_color= @endverbatim * * @param self this object * @param color the matte color * @return self */ VALUE Image_matte_color_eq(VALUE self, VALUE color) { Image *image = rm_check_frozen(self); Color_to_PixelPacket(&image->matte_color, color); return self; } /** * Call MatteFloodFillImage. * * Ruby usage: * - @verbatim Image#matte_flood_fill(color, opacity, x, y, method_obj) @endverbatim * * @param self this object * @param color the color * @param opacity the opacity * @param x_obj x position * @param y_obj y position * @param method_obj which method to call: FloodfillMethod or FillToBorderMethod * @return a new image */ VALUE Image_matte_flood_fill(VALUE self, VALUE color, VALUE opacity, VALUE x_obj, VALUE y_obj, VALUE method_obj) { Image *image, *new_image; PixelPacket target; Quantum op; long x, y; PaintMethod method; image = rm_check_destroyed(self); Color_to_PixelPacket(&target, color); op = APP2QUANTUM(opacity); VALUE_TO_ENUM(method_obj, method, PaintMethod); if (!(method == FloodfillMethod || method == FillToBorderMethod)) { rb_raise(rb_eArgError, "paint method_obj must be FloodfillMethod or " "FillToBorderMethod (%d given)", method); } x = NUM2LONG(x_obj); y = NUM2LONG(y_obj); if ((unsigned long)x > image->columns || (unsigned long)y > image->rows) { rb_raise(rb_eArgError, "target out of range. %ldx%ld given, image is %lux%lu" , x, y, image->columns, image->rows); } new_image = rm_clone_image(image); #if defined(HAVE_FLOODFILLPAINTIMAGE) { DrawInfo *draw_info; MagickPixelPacket target_mpp; MagickBooleanType invert; // FloodfillPaintImage looks for the opacity in the DrawInfo.fill field. draw_info = CloneDrawInfo(NULL, NULL); if (!draw_info) { rb_raise(rb_eNoMemError, "not enough memory to continue"); } draw_info->fill.opacity = op; if (method == FillToBorderMethod) { invert = MagickTrue; target_mpp.red = (MagickRealType) image->border_color.red; target_mpp.green = (MagickRealType) image->border_color.green; target_mpp.blue = (MagickRealType) image->border_color.blue; } else { invert = MagickFalse; target_mpp.red = (MagickRealType) target.red; target_mpp.green = (MagickRealType) target.green; target_mpp.blue = (MagickRealType) target.blue; } (void) FloodfillPaintImage(new_image, OpacityChannel, draw_info, &target_mpp, x, y, invert); } #else (void) MatteFloodfillImage(new_image, target, op, x, y, method); #endif rm_check_image_exception(new_image, DestroyOnError); return rm_image_new(new_image); } /** * Apply a digital filter that improves the quality of a noisy image. Each pixel * is replaced by the median in a set of neighboring pixels as defined by * radius. * * Ruby usage: * - @verbatim Image#median_filter @endverbatim * - @verbatim Image#median_filter(radius) @endverbatim * * Notes: * - Default radius is 0.0 * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_median_filter(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; double radius = 0.0; ExceptionInfo exception; image = rm_check_destroyed(self); switch (argc) { case 1: radius = NUM2DBL(argv[0]); case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 or 1)", argc); break; } GetExceptionInfo(&exception); new_image = MedianFilterImage(image, radius, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Get image mean error per pixel * * Ruby usage: * - @verbatim Image#mean_error_per_pixel @endverbatim * * @param self this object * @return the mean error per pixel */ DEF_ATTR_READERF(Image, mean_error_per_pixel, error.mean_error_per_pixel, dbl) /** * Return the officially registered (or de facto) MIME media-type corresponding * to the image format. * * Ruby usage: * - @verbatim Image#mime_type @endverbatim * * @param self this object * @return the mime type */ VALUE Image_mime_type(VALUE self) { Image *image; char *type; volatile VALUE mime_type; image = rm_check_destroyed(self); type = MagickToMime(image->magick); if (!type) { return Qnil; } mime_type = rb_str_new2(type); // The returned string must be deallocated by the user. magick_free(type); return mime_type; } /** * Scale an image proportionally to half its size. * * Ruby usage: * - @verbatim Image#minify @endverbatim * * @return minify: a new image 1/2x the size of the input image * @return minify!: self, 1/2x * @return a new image * @see Image_minify_bang */ VALUE Image_minify(VALUE self) { (void) rm_check_destroyed(self); return magnify(False, self, MinifyImage); } /** * Scale an image proportionally to half its size. * * Ruby usage: * - @verbatim Image#minify! @endverbatim * * @param self this object * @return self * @see Image_minify */ VALUE Image_minify_bang(VALUE self) { (void) rm_check_frozen(self); return magnify(True, self, MinifyImage); } /** * Control the brightness, saturation, and hue of an image. * * Ruby usage: * - @verbatim Image#modulate @endverbatim * - @verbatim Image#modulate(brightness) @endverbatim * - @verbatim Image#modulate(brightness, saturation) @endverbatim * - @verbatim Image#modulate(brightness, saturation, hue) @endverbatim * * Notes: * - Default brightness is 100.0 * - Default saturation is 100.0 * - Default hue is 100.0 * - all three arguments are optional and default to 100% * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_modulate(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; double pct_brightness = 100.0, pct_saturation = 100.0, pct_hue = 100.0; char modulate[100]; image = rm_check_destroyed(self); switch (argc) { case 3: pct_hue = 100*NUM2DBL(argv[2]); case 2: pct_saturation = 100*NUM2DBL(argv[1]); case 1: pct_brightness = 100*NUM2DBL(argv[0]); break; case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 to 3)", argc); break; } if (pct_brightness <= 0.0) { rb_raise(rb_eArgError, "brightness is %g%%, must be positive", pct_brightness); } sprintf(modulate, "%f%%,%f%%,%f%%", pct_brightness, pct_saturation, pct_hue); new_image = rm_clone_image(image); (void) ModulateImage(new_image, modulate); rm_check_image_exception(new_image, DestroyOnError); return rm_image_new(new_image); } /** * Establish a progress monitor. * * Ruby usage: * - @verbatim Image#monitor= proc @endverbatim * * Notes: * - A progress monitor is a callable object. Save the monitor proc as the * client_data and establish `progress_monitor' as the monitor exit. When * `progress_monitor' is called, retrieve the proc and call it. * * @param self this object * @param monitor the progress monitor * @return self */ VALUE Image_monitor_eq(VALUE self, VALUE monitor) { Image *image = rm_check_frozen(self); if (NIL_P(monitor)) { image->progress_monitor = NULL; } else { (void) SetImageProgressMonitor(image, rm_progress_monitor, (void *)monitor); } return self; } /** * Return true if all the pixels in the image have the same red, green, and blue * intensities and the intensity is either 0 or QuantumRange. * * Ruby usage: * - @verbatim Image#monochrome? @endverbatim * * @param self this object * @return true if monochrome, false otherwise */ VALUE Image_monochrome_q(VALUE self) { return has_attribute(self, (MagickBooleanType (*)(const Image *, ExceptionInfo *))IsMonochromeImage); } /** * Tile size and offset within an image montage. Only valid for montage images. * * Ruby usage: * - @verbatim Image#montage @endverbatim * * @param self this object * @return the tile size and offset */ DEF_ATTR_READER(Image, montage, str) /** * Called from Image_motion_blur and Image_sketch. * * No Ruby usage (internal function) * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @param fp the blur function to call * @return a new image * @see Image_motion_blur * @see Image_sketch */ static VALUE motion_blur(int argc, VALUE *argv, VALUE self , Image *fp(const Image *, const double, const double, const double, ExceptionInfo *)) { Image *image, *new_image; double radius = 0.0; double sigma = 1.0; double angle = 0.0; ExceptionInfo exception; switch (argc) { case 3: angle = NUM2DBL(argv[2]); case 2: sigma = NUM2DBL(argv[1]); case 1: radius = NUM2DBL(argv[0]); case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 to 3)", argc); break; } if (sigma == 0.0) { rb_raise(rb_eArgError, "sigma must be != 0.0"); } Data_Get_Struct(self, Image, image); GetExceptionInfo(&exception); new_image = (fp)(image, radius, sigma, angle, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Simulate motion blur. Convolve the image with a Gaussian operator of the * given radius and standard deviation (sigma). For reasonable results, radius * should be larger than sigma. Use a radius of 0 and motion_blur selects a * suitable radius for you. Angle gives the angle of the blurring motion. * * Ruby usage: * - @verbatim Image#motion_blur @endverbatim * - @verbatim Image#motion_blur(radius) @endverbatim * - @verbatim Image#motion_blur(radius, sigma) @endverbatim * - @verbatim Image#motion_blur(radius, sigma, angle) @endverbatim * * Notes: * - Default radius is 0.0 * - Default sigma is 1.0 * - Default angle is 0.0 * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_motion_blur(int argc, VALUE *argv, VALUE self) { (void) rm_check_destroyed(self); return motion_blur(argc, argv, self, MotionBlurImage); } /** * Negate the colors in the reference image. The grayscale option means that * only grayscale values within the image are negated. * * Ruby usage: * - @verbatim Image#negate @endverbatim * - @verbatim Image#negate(grayscale) @endverbatim * * Notes: * - Default grayscale is false. * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_negate(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; unsigned int grayscale = MagickFalse; image = rm_check_destroyed(self); if (argc == 1) { grayscale = RTEST(argv[0]); } else if (argc > 1) { rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 or 1)", argc); } new_image = rm_clone_image(image); (void) NegateImage(new_image, grayscale); rm_check_image_exception(new_image, DestroyOnError); return rm_image_new(new_image); } /** * Negate the colors on a particular channel. The grayscale option means that * only grayscale values within the image are negated. * * Ruby usage: * - @verbatim Image#negate_channel(grayscale=false, channel=AllChannels) @endverbatim * * Ruby usage: * - @verbatim Image#negate_channel @endverbatim * - @verbatim Image#negate_channel(grayscale) @endverbatim * - @verbatim Image#negate_channel(grayscale, channel) @endverbatim * - @verbatim Image#negate_channel(grayscale, channel, ...) @endverbatim * * Notes: * - Default grayscale is false. * - Default channel is AllChannels. * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_negate_channel(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; ChannelType channels; unsigned int grayscale = MagickFalse; image = rm_check_destroyed(self); channels = extract_channels(&argc, argv); // There can be at most 1 remaining argument. if (argc > 1) { raise_ChannelType_error(argv[argc-1]); } else if (argc == 1) { grayscale = RTEST(argv[0]); } Data_Get_Struct(self, Image, image); new_image = rm_clone_image(image); (void)NegateImageChannel(new_image, channels, grayscale); rm_check_image_exception(new_image, DestroyOnError); return rm_image_new(new_image); } /** * "Allocate" a new Image object * * No Ruby usage (internal function) * * Notes: * - Actually we defer allocating the image until the initialize method so we * can run the parm block if it's present. * * @param class the Ruby class for an Image * @return a newly allocated image */ VALUE Image_alloc(VALUE class) { volatile VALUE image_obj; image_obj = Data_Wrap_Struct(class, NULL, rm_image_destroy, NULL); return image_obj; } /** * Initialize a new Image object If the fill argument is omitted, fill with * background color. * * Ruby usage: * - @verbatim Image#initialize(cols,rows) @endverbatim * - @verbatim Image#initialize(cols,rows,fill) @endverbatim * * Notes: * - Default fill is false * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self */ VALUE Image_initialize(int argc, VALUE *argv, VALUE self) { volatile VALUE fill = 0; Info *info; volatile VALUE info_obj; Image *image; unsigned long cols, rows; switch (argc) { case 3: fill = argv[2]; case 2: rows = NUM2ULONG(argv[1]); cols = NUM2ULONG(argv[0]); break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc); break; } // Create a new Info object to use when creating this image. info_obj = rm_info_new(); Data_Get_Struct(info_obj, Info, info); image = AcquireImage(info); if (!image) { rb_raise(rb_eNoMemError, "not enough memory to continue"); } rm_set_user_artifact(image, info); // NOW store a real image in the image object. UPDATE_DATA_PTR(self, image); SetImageExtent(image, cols, rows); // If the caller did not supply a fill argument, call SetImageBackgroundColor // to fill the image using the background color. The background color can // be set by specifying it when creating the Info parm block. if (!fill) { (void) SetImageBackgroundColor(image); } // fillobj.fill(self) else { (void) rb_funcall(fill, rm_ID_fill, 1, self); } return self; } /** * Create a new Image object from an Image structure. * * No Ruby usage (internal function) * * Notes: * - Since the Image is already created we don't need to call Image_alloc or * Image_initialize. * * @param image the Image structure * @return a new image */ VALUE rm_image_new(Image *image) { if (!image) { rb_bug("rm_image_new called with NULL argument"); } (void) rm_trace_creation(image); return Data_Wrap_Struct(Class_Image, NULL, rm_image_destroy, image); } /** * Enhance the contrast of a color image by adjusting the pixels color to span * the entire range of colors available. * * Ruby usage: * - @verbatim Image#normalize @endverbatim * * @param self this object * @return a new image */ VALUE Image_normalize(VALUE self) { Image *image, *new_image; image = rm_check_destroyed(self); new_image = rm_clone_image(image); (void) NormalizeImage(new_image); rm_check_image_exception(new_image, DestroyOnError); return rm_image_new(new_image); } /** * Call NormalizeImageChannel. * * Ruby usage: * - @verbatim Image#normalize_channel @endverbatim * - @verbatim Image#normalize_channel(channel) @endverbatim * * Notes: * - Default channel is AllChannels * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_normalize_channel(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; ChannelType channels; image = rm_check_destroyed(self); channels = extract_channels(&argc, argv); // Ensure all arguments consumed. if (argc > 0) { raise_ChannelType_error(argv[argc-1]); } new_image = rm_clone_image(image); (void) NormalizeImageChannel(new_image, channels); rm_check_image_exception(new_image, DestroyOnError); return rm_image_new(new_image); } /** * Get image normalized mean error * * Ruby usage: * - @verbatim Image#normalized_mean_error @endverbatim * * @param self this object * @return the normalized mean error */ DEF_ATTR_READERF(Image, normalized_mean_error, error.normalized_mean_error, dbl) /** * Get image normalized maximum error * * Ruby usage: * - @verbatim Image#normalized_maximum_error @endverbatim * * @param self this object * @return the normalized maximum error */ DEF_ATTR_READERF(Image, normalized_maximum_error, error.normalized_maximum_error, dbl) /** * Return the number of unique colors in the image. * * Ruby usage: * - @verbatim Image#number_colors @endverbatim * * @param self this object * @return number of unique colors */ VALUE Image_number_colors(VALUE self) { Image *image; ExceptionInfo exception; unsigned long n = 0; image = rm_check_destroyed(self); GetExceptionInfo(&exception); n = (unsigned long) GetNumberColors(image, NULL, &exception); CHECK_EXCEPTION() (void) DestroyExceptionInfo(&exception); return ULONG2NUM(n); } DEF_ATTR_ACCESSOR(Image, offset, long) /** * Apply a special effect filter that simulates an oil painting. * * Ruby usage: * - @verbatim Image#oil_paint @endverbatim * - @verbatim Image#oil_paint(radius) @endverbatim * * Notes: * - Default radius is 3.0 * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_oil_paint(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; double radius = 3.0; ExceptionInfo exception; image = rm_check_destroyed(self); switch (argc) { case 1: radius = NUM2DBL(argv[0]); case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 or 1)", argc); break; } GetExceptionInfo(&exception); new_image = OilPaintImage(image, radius, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Change any pixel that matches target with the color defined by fill. * * Ruby usage: * - @verbatim Image#opaque(target-color-name, fill-color-name) @endverbatim * - @verbatim Image#opaque(target-pixel, fill-pixel) @endverbatim * * Notes: * - By default a pixel must match the specified target color exactly. * - Use Image_fuzz_eq to set the amount of tolerance acceptable to consider * two colors as the same. * * @param self this object * @param target either the color name or the pixel * @param fill the color for filling * @see Image_fuzz_eq */ VALUE Image_opaque(VALUE self, VALUE target, VALUE fill) { Image *image, *new_image; MagickPixelPacket target_pp; MagickPixelPacket fill_pp; MagickBooleanType okay; image = rm_check_destroyed(self); new_image = rm_clone_image(image); // Allow color name or Pixel Color_to_MagickPixelPacket(image, &target_pp, target); Color_to_MagickPixelPacket(image, &fill_pp, fill); #if defined(HAVE_OPAQUEPAINTIMAGECHANNEL) okay = OpaquePaintImageChannel(new_image, DefaultChannels, &target_pp, &fill_pp, MagickFalse); #else okay = PaintOpaqueImageChannel(new_image, DefaultChannels, &target_pp, &fill_pp); #endif rm_check_image_exception(new_image, DestroyOnError); if (!okay) { // Force exception DestroyImage(new_image); rm_ensure_result(NULL); } return rm_image_new(new_image); } /** * Improved Image#opaque available in ImageMagick 6.3.7-10. * * Ruby usage: * - @verbatim Image#opaque_channel @endverbatim * - @verbatim opaque_channel(target, fill) @endverbatim * - @verbatim opaque_channel(target, fill, invert) @endverbatim * - @verbatim opaque_channel(target, fill, invert, fuzz) @endverbatim * - @verbatim opaque_channel(target, fill, invert, fuzz, channel) @endverbatim * - @verbatim opaque_channel(target, fill, invert, fuzz, channel, ...) @endverbatim * * Notes: * - Default invert is false * - Default fuzz is the image's fuzz (see Image_fuzz_eq) * - Default channel is AllChannels * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_opaque_channel(int argc, VALUE *argv, VALUE self) { #if defined(HAVE_OPAQUEPAINTIMAGECHANNEL) Image *image, *new_image; MagickPixelPacket target_pp, fill_pp; ChannelType channels; double keep, fuzz; MagickBooleanType okay, invert = MagickFalse; image = rm_check_destroyed(self); channels = extract_channels(&argc, argv); if (argc > 4) { raise_ChannelType_error(argv[argc-1]); } // Default fuzz value is image's fuzz attribute. fuzz = image->fuzz; switch (argc) { case 4: fuzz = NUM2DBL(argv[3]); if (fuzz < 0.0) { rb_raise(rb_eArgError, "fuzz must be >= 0.0 (%g given)", fuzz); } case 3: invert = RTEST(argv[2]); case 2: // Allow color name or Pixel Color_to_MagickPixelPacket(image, &fill_pp, argv[1]); Color_to_MagickPixelPacket(image, &target_pp, argv[0]); break; default: rb_raise(rb_eArgError, "wrong number of arguments (got %d, expected 2 or more)", argc); break; } new_image = rm_clone_image(image); keep = new_image->fuzz; new_image->fuzz = fuzz; okay = OpaquePaintImageChannel(new_image, channels, &target_pp, &fill_pp, invert); // Restore saved fuzz value new_image->fuzz = keep; rm_check_image_exception(new_image, DestroyOnError); if (!okay) { // Force exception DestroyImage(new_image); rm_ensure_result(NULL); } return rm_image_new(new_image); #else argc = argc; // defeat "unused parameter" messages argv = argv; self = self; rm_not_implemented(); return(VALUE)0; #endif } /** * Return true if any of the pixels in the image have an opacity value other * than opaque ( 0 ). * * Ruby usage: * - @verbatim Image#opaque? @endverbatim * * @param self this object * @return true if opaque, false otherwise */ VALUE Image_opaque_q(VALUE self) { return has_attribute(self, IsOpaqueImage); } /** * Perform ordered dither on image. * * Ruby usage: * - @verbatim Image#ordered_dither @endverbatim * - @verbatim Image#ordered_dither(threshold_map) @endverbatim * * Notes: * - Default threshold_map is '2x2' * - Order of threshold_map must be 2, 3, or 4. * - If using ImageMagick >= 6.3.0, order can be any of the threshold strings * listed by "convert -list Thresholds" * - Does not call OrderedDitherImages anymore. Sometime after ImageMagick * 6.0.0 it quit working. Uses the same routines as ImageMagick and * GraphicsMagick for their "ordered-dither" option. * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_ordered_dither(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; int order; const char *threshold_map = "2x2"; ExceptionInfo exception; image = rm_check_destroyed(self); if (argc > 1) { rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 or 1)", argc); } if (argc == 1) { if (TYPE(argv[0]) == T_STRING) { threshold_map = StringValuePtr(argv[0]); } else { order = NUM2INT(argv[0]); if (order == 3) { threshold_map = "3x3"; } else if (order == 4) { threshold_map = "4x4"; } else if (order != 2) { rb_raise(rb_eArgError, "order must be 2, 3, or 4 (%d given)", order); } } } new_image = rm_clone_image(image); GetExceptionInfo(&exception); // ImageMagick >= 6.2.9 (void) OrderedPosterizeImage(new_image, threshold_map, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); return rm_image_new(new_image); } /** * Return the orientation attribute as an OrientationType enum value. * * Ruby usage: * - @verbatim Image#orientation @endverbatim * * @param self this object * @return the orientation */ VALUE Image_orientation(VALUE self) { Image *image = rm_check_destroyed(self); return OrientationType_new(image->orientation); } /** * Set the orientation attribute. * * Ruby usage: * - @verbatim Image#orientation= @endverbatim * * @param self this object * @param orientation the orientation * @return self */ VALUE Image_orientation_eq(VALUE self, VALUE orientation) { Image *image = rm_check_frozen(self); VALUE_TO_ENUM(orientation, image->orientation, OrientationType); return self; } /** * The page attribute getter. * * Ruby usage: * - @verbatim Image#page @endverbatim * * @param self * @return the page rectangle */ VALUE Image_page(VALUE self) { Image *image = rm_check_destroyed(self); return Import_RectangleInfo(&image->page); } /** * The page attribute setter. * * Ruby usage: * - @verbatim Image#page= @endverbatim * * @param self this object * @param rect the page rectangle * @return self */ VALUE Image_page_eq(VALUE self, VALUE rect) { Image *image = rm_check_frozen(self); Export_RectangleInfo(&image->page, rect); return self; } /** * Improved version of Image#transparent available in ImageMagick 6.3.7-10. * * Ruby usage: * - @verbatim Image#paint_transparent(target) @endverbatim * - @verbatim Image#paint_transparent(target, opacity) @endverbatim * - @verbatim Image#paint_transparent(target, opacity, invert) @endverbatim * - @verbatim Image#paint_transparent(target, opacity, invert, fuzz) @endverbatim * * Notes: * - Default opacity is TransparentOpacity * - Default invert is false * - Default fuzz is the image's fuzz (see Image_fuzz_eq) * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_paint_transparent(int argc, VALUE *argv, VALUE self) { #if defined(HAVE_TRANSPARENTPAINTIMAGE) Image *image, *new_image; MagickPixelPacket color; Quantum opacity = TransparentOpacity; double keep, fuzz; MagickBooleanType okay, invert = MagickFalse; image = rm_check_destroyed(self); // Default fuzz value is image's fuzz attribute. fuzz = image->fuzz; switch (argc) { case 4: fuzz = NUM2DBL(argv[3]); case 3: invert = RTEST(argv[2]); case 2: opacity = APP2QUANTUM(argv[1]); case 1: Color_to_MagickPixelPacket(image, &color, argv[0]); break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 to 4)", argc); break; } new_image = rm_clone_image(image); // Use fuzz value from caller keep = new_image->fuzz; new_image->fuzz = fuzz; okay = TransparentPaintImage(new_image, (const MagickPixelPacket *)&color, opacity, invert); new_image->fuzz = keep; // Is it possible for TransparentPaintImage to silently fail? rm_check_image_exception(new_image, DestroyOnError); if (!okay) { // Force exception DestroyImage(new_image); rm_ensure_result(NULL); } return rm_image_new(new_image); #else argc = argc; // defeat "unused parameter" messages argv = argv; self = self; rm_not_implemented(); return(VALUE)0; #endif } /** * Return true if the image is PseudoClass and has 256 unique colors or less. * * Ruby usage: * - @verbatim Image#palette? @endverbatim * * @param self this object * @return true if palette, otherwise false */ VALUE Image_palette_q(VALUE self) { return has_attribute(self, IsPaletteImage); } /** * Call ImagePing. * * Ruby usage: * - @verbatim Image.ping(file) @endverbatim * * @param class the Ruby class for an Image * @param file_arg the file containing image info * @return an array of 1 or more new image objects (without pixel data) * @see Image_read * @see rd_image */ VALUE Image_ping(VALUE class, VALUE file_arg) { return rd_image(class, file_arg, PingImage); } /** * Get/set the color of the pixel at x,y. * * Ruby usage: * - @verbatim Image#pixel_color(x, y) @endverbatim * - @verbatim Image#pixel_color(x, y, color) @endverbatim * * Notes: * - Without color, does a get. With color, does a set. * - "color", if present, may be either a color name or a Magick::Pixel. * - Based on Magick++'s Magick::pixelColor methods * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return Magick::Pixel for pixel x,y. If called to set a new color, the * return value is the old color. */ VALUE Image_pixel_color(int argc, VALUE *argv, VALUE self) { Image *image; PixelPacket old_color, new_color, *pixel; ExceptionInfo exception; long x, y; unsigned int set = False; MagickBooleanType okay; memset(&old_color, 0, sizeof(old_color)); image = rm_check_destroyed(self); switch (argc) { case 3: rb_check_frozen(self); set = True; // Replace with new color? The arg can be either a color name or // a Magick::Pixel. Color_to_PixelPacket(&new_color, argv[2]); case 2: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc); break; } x = NUM2LONG(argv[0]); y = NUM2LONG(argv[1]); // Get the color of a pixel if (!set) { GetExceptionInfo(&exception); #if defined(HAVE_GETVIRTUALPIXELS) old_color = *GetVirtualPixels(image, x, y, 1, 1, &exception); #else old_color = *AcquireImagePixels(image, x, y, 1, 1, &exception); #endif CHECK_EXCEPTION() (void) DestroyExceptionInfo(&exception); // PseudoClass if (image->storage_class == PseudoClass) { #if defined(HAVE_GETAUTHENTICINDEXQUEUE) IndexPacket *indexes = GetAuthenticIndexQueue(image); #else IndexPacket *indexes = GetIndexes(image); #endif old_color = image->colormap[*indexes]; } if (!image->matte) { old_color.opacity = OpaqueOpacity; } return Pixel_from_PixelPacket(&old_color); } // ImageMagick segfaults if the pixel location is out of bounds. // Do what IM does and return the background color. if (x < 0 || y < 0 || (unsigned long)x >= image->columns || (unsigned long)y >= image->rows) { return Pixel_from_PixelPacket(&image->background_color); } // Set the color of a pixel. Return previous color. // Convert to DirectClass if (image->storage_class == PseudoClass) { okay = SetImageStorageClass(image, DirectClass); rm_check_image_exception(image, RetainOnError); if (!okay) { rb_raise(Class_ImageMagickError, "SetImageStorageClass failed. Can't set pixel color."); } } #if defined(HAVE_GETAUTHENTICPIXELS) || defined(HAVE_SYNCAUTHENTICPIXELS) GetExceptionInfo(&exception); #endif #if defined(HAVE_GETAUTHENTICPIXELS) pixel = GetAuthenticPixels(image, x, y, 1, 1, &exception); CHECK_EXCEPTION() #else pixel = GetImagePixels(image, x, y, 1, 1); rm_check_image_exception(image, RetainOnError); #endif if (pixel) { old_color = *pixel; if (!image->matte) { old_color.opacity = OpaqueOpacity; } } *pixel = new_color; #if defined(HAVE_SYNCAUTHENTICPIXELS) SyncAuthenticPixels(image, &exception); CHECK_EXCEPTION() #else SyncImagePixels(image); rm_check_image_exception(image, RetainOnError); #endif #if defined(HAVE_GETAUTHENTICPIXELS) || defined(HAVE_SYNCAUTHENTICPIXELS) (void) DestroyExceptionInfo(&exception); #endif return Pixel_from_PixelPacket(&old_color); } /** * Get the "interpolate" field in the Image structure. * * Ruby usage: * - @verbatim Image.pixel_interpolation_method @endverbatim * * @param self this object * @return the interpolate field * @see Image_pixel_interpolation_method_eq * @see Image.interpolate_pixel_color */ VALUE Image_pixel_interpolation_method(VALUE self) { Image *image = rm_check_destroyed(self); return InterpolatePixelMethod_new(image->interpolate); } /** * Set the "interpolate" field in the Image structure. * * Ruby usage: * - @verbatim Image.pixel_interpolation_method=method @endverbatim * * @param self this object * @param method the interpolate field * @return self * @see Image_pixel_interpolation_method * @see Image.interpolate_pixel_color */ VALUE Image_pixel_interpolation_method_eq(VALUE self, VALUE method) { Image *image = rm_check_frozen(self); VALUE_TO_ENUM(method, image->interpolate, InterpolatePixelMethod); return self; } /** * Call PolaroidImage. * * Ruby usage: * - @verbatim Image#polaroid { optional parms } @endverbatim * - @verbatim Image#polaroid(angle) { optional parms } @endverbatim * * Notes: * - Default angle is -5 * - Accepts an options block to get Draw attributes for drawing the label. * Specify self.border_color to set a non-default border color. * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_polaroid(int argc, VALUE *argv, VALUE self) { Image *image, *clone, *new_image; volatile VALUE options; double angle = -5.0; Draw *draw; ExceptionInfo exception; image = rm_check_destroyed(self); switch (argc) { case 1: angle = NUM2DBL(argv[0]); case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 or 1)", argc); break; } options = rm_polaroid_new(); Data_Get_Struct(options, Draw, draw); clone = rm_clone_image(image); clone->background_color = draw->shadow_color; clone->border_color = draw->info->border_color; GetExceptionInfo(&exception); new_image = PolaroidImage(clone, draw->info, angle, &exception); rm_check_exception(&exception, clone, DestroyOnError); (void) DestroyImage(clone); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Call PosterizeImage. * * Ruby usage: * - @verbatim Image#posterize(levels=4, dither=false) @endverbatim * * Notes: * - Default levels is 4 * - Default dither is false * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_posterize(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; MagickBooleanType dither = MagickFalse; unsigned long levels = 4; image = rm_check_destroyed(self); switch (argc) { case 2: dither = (MagickBooleanType) RTEST(argv[1]); /* fall through */ case 1: levels = NUM2ULONG(argv[0]); /* fall through */ case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 to 2)", argc); } new_image = rm_clone_image(image); (void) PosterizeImage(new_image, levels, dither); rm_check_image_exception(new_image, DestroyOnError); return rm_image_new(new_image); } /** * Call PreviewImage. * * Ruby usage: * - @verbatim Image#preview(preview) @endverbatim * * @param self this object * @param preview the preview * @return a new image */ VALUE Image_preview(VALUE self, VALUE preview) { Image *image, *new_image; PreviewType preview_type; ExceptionInfo exception; GetExceptionInfo(&exception); image = rm_check_destroyed(self); VALUE_TO_ENUM(preview, preview_type, PreviewType); new_image = PreviewImage(image, preview_type, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Set the image profile. If "profile" is nil, deletes the profile. Otherwise * "profile" must be a string containing the specified profile. * * Ruby usage: * - @verbatim Image#profile!(name, profile) @endverbatim * * @param self this object * @param name the profile name * @param profile the profile * @return self */ VALUE Image_profile_bang(VALUE self, VALUE name, VALUE profile) { if (profile == Qnil) { return Image_delete_profile(self, name); } else { return set_profile(self, StringValuePtr(name), profile); } } /** * Get image quality. * * Ruby usage: * - @verbatim Image#quality @endverbatim * * @param self this object * @return the quality */ DEF_ATTR_READER(Image, quality, ulong) /** * Return image depth to nearest quantum. * * Ruby usage: * - @verbatim Image#quantum_depth -> 8, 16, or 32 @endverbatim * * Notes: * - IM 6.0.0 introduced GetImageQuantumDepth * - IM 6.0.5 added a 2nd argument. The MagickFalse argument gives the 6.0.5 * version the same behavior as before. * * @param self this object * @return image depth */ VALUE Image_quantum_depth(VALUE self) { Image *image; unsigned long quantum_depth; image = rm_check_destroyed(self); quantum_depth = GetImageQuantumDepth(image, MagickFalse); rm_check_image_exception(image, RetainOnError); return ULONG2NUM(quantum_depth); } /** * This method is an adapter method that calls the EvaluateImageChannel method. * * Ruby usage: * - @verbatim Image#quantum_operator(operator, rvalue) @endverbatim * - @verbatim Image#quantum_operator(operator, rvalue, channel) @endverbatim * - @verbatim Image#quantum_operator(operator, rvalue, channel, ...) @endverbatim * * Notes: * - Historically this method used QuantumOperatorRegionImage in * GraphicsMagick. By necessity this method implements the "lowest common * denominator" of the two implementations. * - Default channel is AllChannels * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self */ VALUE Image_quantum_operator(int argc, VALUE *argv, VALUE self) { Image *image; QuantumExpressionOperator operator; MagickEvaluateOperator qop; double rvalue; ChannelType channel; ExceptionInfo exception; image = rm_check_destroyed(self); // The default channel is AllChannels channel = AllChannels; /* If there are 3 arguments, argument 2 is a ChannelType argument. Arguments 1 and 0 are required and are the rvalue and operator, respectively. */ switch (argc) { case 3: VALUE_TO_ENUM(argv[2], channel, ChannelType); /* Fall through */ case 2: rvalue = NUM2DBL(argv[1]); VALUE_TO_ENUM(argv[0], operator, QuantumExpressionOperator); break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 or 3)", argc); break; } // Map QuantumExpressionOperator to MagickEvaluateOperator switch (operator) { default: case UndefinedQuantumOperator: qop = UndefinedEvaluateOperator; break; case AddQuantumOperator: qop = AddEvaluateOperator; break; case AndQuantumOperator: qop = AndEvaluateOperator; break; case DivideQuantumOperator: qop = DivideEvaluateOperator; break; case LShiftQuantumOperator: qop = LeftShiftEvaluateOperator; break; case MaxQuantumOperator: qop = MaxEvaluateOperator; break; case MinQuantumOperator: qop = MinEvaluateOperator; break; case MultiplyQuantumOperator: qop = MultiplyEvaluateOperator; break; case OrQuantumOperator: qop = OrEvaluateOperator; break; case RShiftQuantumOperator: qop = RightShiftEvaluateOperator; break; case SubtractQuantumOperator: qop = SubtractEvaluateOperator; break; case XorQuantumOperator: qop = XorEvaluateOperator; break; #if defined(HAVE_ENUM_POWEVALUATEOPERATOR) case PowQuantumOperator: qop = PowEvaluateOperator; break; #endif #if defined(HAVE_ENUM_LOGEVALUATEOPERATOR) case LogQuantumOperator: qop = LogEvaluateOperator; break; #endif #if defined(HAVE_ENUM_THRESHOLDEVALUATEOPERATOR) case ThresholdQuantumOperator: qop = ThresholdEvaluateOperator; break; #endif #if defined(HAVE_ENUM_THRESHOLDBLACKEVALUATEOPERATOR) case ThresholdBlackQuantumOperator: qop = ThresholdBlackEvaluateOperator; break; #endif #if defined(HAVE_ENUM_THRESHOLDWHITEEVALUATEOPERATOR) case ThresholdWhiteQuantumOperator: qop = ThresholdWhiteEvaluateOperator; break; #endif #if defined(HAVE_ENUM_GAUSSIANNOISEEVALUATEOPERATOR) case GaussianNoiseQuantumOperator: qop = GaussianNoiseEvaluateOperator; break; #endif #if defined(HAVE_ENUM_IMPULSENOISEEVALUATEOPERATOR) case ImpulseNoiseQuantumOperator: qop = ImpulseNoiseEvaluateOperator; break; #endif #if defined(HAVE_ENUM_LAPLACIANNOISEEVALUATEOPERATOR) case LaplacianNoiseQuantumOperator: qop = LaplacianNoiseEvaluateOperator; break; #endif #if defined(HAVE_ENUM_MULTIPLICATIVENOISEEVALUATEOPERATOR) case MultiplicativeNoiseQuantumOperator: qop = MultiplicativeNoiseEvaluateOperator; break; #endif #if defined(HAVE_ENUM_POISSONNOISEEVALUATEOPERATOR) case PoissonNoiseQuantumOperator: qop = PoissonNoiseEvaluateOperator; break; #endif #if defined(HAVE_ENUM_UNIFORMNOISEEVALUATEOPERATOR) case UniformNoiseQuantumOperator: qop = UniformNoiseEvaluateOperator; break; #endif #if defined(HAVE_ENUM_COSINEEVALUATEOPERATOR) case CosineQuantumOperator: qop = CosineEvaluateOperator; break; #endif #if defined(HAVE_ENUM_SINEEVALUATEOPERATOR) case SineQuantumOperator: qop = SineEvaluateOperator; break; #endif #if defined(HAVE_ENUM_ADDMODULUSEVALUATEOPERATOR) case AddModulusQuantumOperator: qop = AddModulusEvaluateOperator; break; #endif } GetExceptionInfo(&exception); (void) EvaluateImageChannel(image, channel, qop, rvalue, &exception); CHECK_EXCEPTION() (void) DestroyExceptionInfo(&exception); return self; } /** * Call QuantizeImage. * * Ruby usage: * - @verbatim Image#quantize @endverbatim * - @verbatim Image#quantize(number_colors) @endverbatim * - @verbatim Image#quantize(number_colors, colorspace) @endverbatim * - @verbatim Image#quantize(number_colors, colorspace, dither) @endverbatim * - @verbatim Image#quantize(number_colors, colorspace, dither, tree_depth) @endverbatim * - @verbatim Image#quantize(number_colors, colorspace, dither, tree_depth, measure_error) @endverbatim * * Notes: * - Default number_colors is 256 * - Default colorspace is Magick::RGBColorspace * - Default dither is true * - Default tree_depth is 0 * - Default measure_error is false * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_quantize(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; QuantizeInfo quantize_info; image = rm_check_destroyed(self); GetQuantizeInfo(&quantize_info); switch (argc) { case 5: quantize_info.measure_error = (MagickBooleanType) RTEST(argv[4]); case 4: quantize_info.tree_depth = NUM2UINT(argv[3]); case 3: #if defined(HAVE_TYPE_DITHERMETHOD) && defined(HAVE_ENUM_NODITHERMETHOD) if (rb_obj_is_kind_of(argv[2], Class_DitherMethod)) { VALUE_TO_ENUM(argv[2], quantize_info.dither_method, DitherMethod); quantize_info.dither = quantize_info.dither_method != NoDitherMethod; } #else quantize_info.dither = (MagickBooleanType) RTEST(argv[2]); #endif case 2: VALUE_TO_ENUM(argv[1], quantize_info.colorspace, ColorspaceType); case 1: quantize_info.number_colors = NUM2UINT(argv[0]); case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 to 5)", argc); break; } new_image = rm_clone_image(image); (void) QuantizeImage(&quantize_info, new_image); rm_check_image_exception(new_image, DestroyOnError); return rm_image_new(new_image); } /** * Call RadialBlurImage. * * Ruby usage: * - @verbatim Image#radial_blur(angle) @endverbatim * * @param self this object * @param angle the angle (in degrees) * @return a new image */ VALUE Image_radial_blur(VALUE self, VALUE angle) { Image *image, *new_image; ExceptionInfo exception; image = rm_check_destroyed(self); GetExceptionInfo(&exception); new_image = RadialBlurImage(image, NUM2DBL(angle), &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Call RadialBlurImageChannel. * * Ruby usage: * - @verbatim Image#radial_blur_channel(angle) @endverbatim * - @verbatim Image#radial_blur_channel(angle, channel) @endverbatim * - @verbatim Image#radial_blur_channel(angle, channel, ...) @endverbatim * * Notes: * - Default channel is AllChannels * - Angle is in degrees * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_radial_blur_channel(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; ExceptionInfo exception; ChannelType channels; image = rm_check_destroyed(self); channels = extract_channels(&argc, argv); // There must be 1 remaining argument. if (argc == 0) { rb_raise(rb_eArgError, "wrong number of arguments (0 for 1 or more)"); } else if (argc > 1) { raise_ChannelType_error(argv[argc-1]); } GetExceptionInfo(&exception); new_image = RadialBlurImageChannel(image, channels, NUM2DBL(argv[0]), &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Call RandomThresholdImageChannel. * * Ruby usage: * - @verbatim Image#random_threshold_channel(geometry_str) @endverbatim * - @verbatim Image#random_threshold_channel(geometry_str, channel) @endverbatim * - @verbatim Image#random_threshold_channel(geometry_str, channel, ...) @endverbatim * * Notes: * - Default channel is AllChannels * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_random_threshold_channel(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; ChannelType channels; char *thresholds; volatile VALUE geom_str; ExceptionInfo exception; image = rm_check_destroyed(self); channels = extract_channels(&argc, argv); // There must be 1 remaining argument. if (argc == 0) { rb_raise(rb_eArgError, "missing threshold argument"); } else if (argc > 1) { raise_ChannelType_error(argv[argc-1]); } // Accept any argument that has a to_s method. geom_str = rm_to_s(argv[0]); thresholds = StringValuePtr(geom_str); new_image = rm_clone_image(image); GetExceptionInfo(&exception); (void) RandomThresholdImageChannel(new_image, channels, thresholds, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); return rm_image_new(new_image); } /** * Create a simulated three-dimensional button-like effect by lightening and * darkening the edges of the image. The "width" and "height" arguments define * the width of the vertical and horizontal edge of the effect. If "raised" is * true, creates a raised effect, otherwise a lowered effect. * * Ruby usage: * - @verbatim Image#raise @endverbatim * - @verbatim Image#raise(width) @endverbatim * - @verbatim Image#raise(width, height) @endverbatim * - @verbatim Image#raise(width, height, raised) @endverbatim * * Notes: * - Default width is 6 * - Default height is 6 * - Default raised is true * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_raise(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; RectangleInfo rect; int raised = MagickTrue; // default memset(&rect, 0, sizeof(rect)); rect.width = 6; // default rect.height = 6; // default image = rm_check_destroyed(self); switch (argc) { case 3: raised = RTEST(argv[2]); case 2: rect.height = NUM2ULONG(argv[1]); case 1: rect.width = NUM2ULONG(argv[0]); case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 to 3)", argc); break; } new_image = rm_clone_image(image); (void) RaiseImage(new_image, &rect, raised); rm_check_image_exception(new_image, DestroyOnError); return rm_image_new(new_image); } /** * Call ReadImage. * * Ruby usage: * - @verbatim Image.read(file) @endverbatim * * @param class the Ruby class for an Image * @param file_arg the file containing image data * @return an array of 1 or more new image objects * @see rd_image */ VALUE Image_read(VALUE class, VALUE file_arg) { return rd_image(class, file_arg, ReadImage); } /** * Called when `rm_obj_to_s' raised an exception. * * No Ruby usage (internal function) * * @param arg the bad arg given * @return 0 */ static VALUE file_arg_rescue(VALUE arg) { rb_raise(rb_eTypeError, "argument must be path name or open file (%s given)", rb_class2name(CLASS_OF(arg))); return(VALUE)0; } /** * Transform arguments, call either ReadImage or PingImage. * * No Ruby usage (internal function) * * Notes: * - Yields to a block to get Image::Info attributes before calling * Read/PingImage * * @param class the Ruby class for an Image * @param file the file containing image data * @param reader which image reader to use (ReadImage or PingImage) * @return an array of 1 or more new image objects * @see Image_read * @see Image_ping * @see array_from_images */ static VALUE rd_image(VALUE class, VALUE file, reader_t reader) { char *filename; long filename_l; Info *info; volatile VALUE info_obj; Image *images; ExceptionInfo exception; class = class; // defeat gcc message // Create a new Info structure for this read/ping info_obj = rm_info_new(); Data_Get_Struct(info_obj, Info, info); if (TYPE(file) == T_FILE) { OpenFile *fptr; // Ensure file is open - raise error if not GetOpenFile(file, fptr); rb_io_check_readable(fptr); SetImageInfoFile(info, GetReadFile(fptr)); } else { // Convert arg to string. If an exception occurs raise an error condition. file = rb_rescue(rb_String, file, file_arg_rescue, file); filename = rm_str2cstr(file, &filename_l); filename_l = min(filename_l, MaxTextExtent-1); memcpy(info->filename, filename, (size_t)filename_l); info->filename[filename_l] = '\0'; SetImageInfoFile(info, NULL); } GetExceptionInfo(&exception); images = (reader)(info, &exception); rm_check_exception(&exception, images, DestroyOnError); rm_set_user_artifact(images, info); (void) DestroyExceptionInfo(&exception); return array_from_images(images); } /** * Call RecolorImage. * * Ruby usage: * - @verbatim Image#recolor(matrix) @endverbatim * * @param self this object * @param color_matrix the matrix * @return a new image */ VALUE Image_recolor(VALUE self, VALUE color_matrix) { Image *image, *new_image; unsigned long order; long x, len; double *matrix; ExceptionInfo exception; image = rm_check_destroyed(self); GetExceptionInfo(&exception); // Allocate color matrix from Ruby's memory len = RARRAY_LEN(color_matrix); matrix = ALLOC_N(double, len); for (x = 0; x < len; x++) { matrix[x] = NUM2DBL(rb_ary_entry(color_matrix, x)); } order = (unsigned long)sqrt((double)(len + 1.0)); // RecolorImage sets the ExceptionInfo and returns a NULL image if an error occurs. new_image = RecolorImage(image, order, matrix, &exception); xfree((void *)matrix); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); return rm_image_new(new_image); } /** * Read a Base64-encoded image. * * Ruby usage: * - @verbatim Image.read_inline(content) @endverbatim * * Notes: * - This is similar to, but not the same as ReadInlineImage. ReadInlineImage * requires a comma preceeding the image data. This method allows but does * not require a comma. * * @param self this object * @param content the content * @return an array of new images * @see array_from_images */ VALUE Image_read_inline(VALUE self, VALUE content) { volatile VALUE info_obj; Image *images; ImageInfo *info; char *image_data; long x, image_data_l; unsigned char *blob; size_t blob_l; ExceptionInfo exception; self = self; // defeat gcc message image_data = rm_str2cstr(content, &image_data_l); // Search for a comma. If found, we'll set the start of the // image data just following the comma. Otherwise we'll assume // the image data starts with the first byte. for (x = 0; x < image_data_l; x++) { if (image_data[x] == ',') { break; } } if (x < image_data_l) { image_data += x + 1; } blob = Base64Decode(image_data, &blob_l); if (blob_l == 0) { rb_raise(rb_eArgError, "can't decode image"); } GetExceptionInfo(&exception); // Create a new Info structure for this read. About the // only useful attribute that can be set is `format'. info_obj = rm_info_new(); Data_Get_Struct(info_obj, Info, info); images = BlobToImage(info, blob, blob_l, &exception); magick_free((void *)blob); rm_check_exception(&exception, images, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_set_user_artifact(images, info); return array_from_images(images); } /** * Convert a list of images to an array of Image objects. * * No Ruby usage (internal function) * * @param images the images * @return array of images */ static VALUE array_from_images(Image *images) { volatile VALUE image_obj, image_ary; Image *image; // Orphan the image, create an Image object, add it to the array. image_ary = rb_ary_new(); while (images) { image = RemoveFirstImageFromList(&images); image_obj = rm_image_new(image); (void) rb_ary_push(image_ary, image_obj); } return image_ary; } /** * Smooth the contours of an image while still preserving edge information. * * Ruby usage: * - @verbatim Image#reduce_noise(radius) @endverbatim * * @param self this object * @param radius the radius * @return a new image */ VALUE Image_reduce_noise(VALUE self, VALUE radius) { Image *image, *new_image; ExceptionInfo exception; image = rm_check_destroyed(self); GetExceptionInfo(&exception); new_image = ReduceNoiseImage(image, NUM2DBL(radius), &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); return rm_image_new(new_image); } /** * Call RemapImage. * * Ruby usage: * - @verbatim Image#remap(remap_image) @endverbatim * - @verbatim Image#remap(remap_image, dither_method) @endverbatim * * Notes: * - Default dither_method is RiemersmaDitherMethod * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self */ VALUE Image_remap(int argc, VALUE *argv, VALUE self) { #if defined(HAVE_REMAPIMAGE) || defined(HAVE_AFFINITYIMAGE) Image *image, *remap_image; QuantizeInfo quantize_info; image = rm_check_frozen(self); if (argc > 0) { volatile VALUE t = rm_cur_image(argv[0]); remap_image = rm_check_destroyed(t); } GetQuantizeInfo(&quantize_info); switch (argc) { case 2: VALUE_TO_ENUM(argv[1], quantize_info.dither_method, DitherMethod); quantize_info.dither = MagickTrue; break; case 1: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc); break; } #if defined(HAVE_REMAPIMAGE) (void) RemapImage(&quantize_info, image, remap_image); #else (void) AffinityImage(&quantize_info, image, remap_image); #endif rm_check_image_exception(image, RetainOnError); return self; #else self = self; argc = argc; argv = argv; rm_not_implemented(); return(VALUE)0; #endif } /** * Get rendering_intent. * * Ruby usage: * - @verbatim Image#rendering_intent @endverbatim * * @param self this object * @return the rendering intent */ VALUE Image_rendering_intent(VALUE self) { Image *image = rm_check_destroyed(self); return RenderingIntent_new(image->rendering_intent); } /** * Set rendering_intent. * * Ruby usage: * - @verbatim Image#rendering_intent= @endverbatim * * @param self this object * @param ri the rendering intent * @return self */ VALUE Image_rendering_intent_eq(VALUE self, VALUE ri) { Image *image = rm_check_frozen(self); VALUE_TO_ENUM(ri, image->rendering_intent, RenderingIntent); return self; } /** * Scale an image to the desired dimensions using the specified filter and blur * factor. * * No Ruby usage (internal function) * * @param bang whether the bang (!) version of the method was called * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self if bang, otherwise a new image * @see Image_resize * @see Image_resize_bang */ static VALUE resize(int bang, int argc, VALUE *argv, VALUE self) { Image *image, *new_image; double scale_arg; FilterTypes filter; unsigned long rows, columns; double blur, drows, dcols; ExceptionInfo exception; Data_Get_Struct(self, Image, image); // Set up defaults filter = image->filter; blur = image->blur; rows = image->rows; columns = image->columns; switch (argc) { case 4: blur = NUM2DBL(argv[3]); case 3: VALUE_TO_ENUM(argv[2], filter, FilterTypes); case 2: rows = NUM2ULONG(argv[1]); columns = NUM2ULONG(argv[0]); if (columns == 0 || rows == 0) { rb_raise(rb_eArgError, "invalid result dimension (%lu, %lu given)", columns, rows); } break; case 1: scale_arg = NUM2DBL(argv[0]); if (scale_arg < 0.0) { rb_raise(rb_eArgError, "invalid scale_arg value (%g given)", scale_arg); } drows = scale_arg * image->rows + 0.5; dcols = scale_arg * image->columns + 0.5; if (drows > (double)ULONG_MAX || dcols > (double)ULONG_MAX) { rb_raise(rb_eRangeError, "resized image too big"); } rows = (unsigned long) drows; columns = (unsigned long) dcols; break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 to 4)", argc); break; } GetExceptionInfo(&exception); new_image = ResizeImage(image, columns, rows, filter, blur, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); if (bang) { UPDATE_DATA_PTR(self, new_image); (void) rm_image_destroy(image); return self; } return rm_image_new(new_image); } /** * Scale an image to the desired dimensions using the specified filter and blur * factor. * * Ruby usage: * - @verbatim Image#resize(scale) @endverbatim * - @verbatim Image#resize(cols, rows) @endverbatim * - @verbatim Image#resize(cols, rows, filter) @endverbatim * - @verbatim Image#resize(cols, rows, filter, blur) @endverbatim * * Notes: * - Default filter is image->filter * - Default blur is image->blur * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image * @see resize * @see Image_resize_bang */ VALUE Image_resize(int argc, VALUE *argv, VALUE self) { (void) rm_check_destroyed(self); return resize(False, argc, argv, self); } /** * Scale an image to the desired dimensions using the specified filter and blur * factor. * * Ruby usage: * - @verbatim Image#resize!(scale) @endverbatim * - @verbatim Image#resize!(cols, rows) @endverbatim * - @verbatim Image#resize!(cols, rows, filter) @endverbatim * - @verbatim Image#resize!(cols, rows, filter, blur) @endverbatim * * Notes: * - Default filter is image->filter * - Default blur is image->blur * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self * @see resize * @see Image_resize */ VALUE Image_resize_bang(int argc, VALUE *argv, VALUE self) { (void) rm_check_frozen(self); return resize(True, argc, argv, self); } /** * Offset an image as defined by x_offset and y_offset. * * Ruby usage: * - @verbatim Image#roll(x_offset, y_offset) @endverbatim * * @param self this object * @param x_offset the x offset * @param y_offset the y offset * @return a new image */ VALUE Image_roll(VALUE self, VALUE x_offset, VALUE y_offset) { Image *image, *new_image; ExceptionInfo exception; image = rm_check_destroyed(self); GetExceptionInfo(&exception); new_image = RollImage(image, NUM2LONG(x_offset), NUM2LONG(y_offset), &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Rotate the image. * * No Ruby usage (internal function) * * @param bang whether the bang (!) version of the method was called * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self if bang, otherwise a new image * @see Image_rotate * @see Image_rotate_bang */ static VALUE rotate(int bang, int argc, VALUE *argv, VALUE self) { Image *image, *new_image; double degrees; char *arrow; long arrow_l; ExceptionInfo exception; Data_Get_Struct(self, Image, image); switch (argc) { case 2: arrow = rm_str2cstr(argv[1], &arrow_l); if (arrow_l != 1 || (*arrow != '<' && *arrow != '>')) { rb_raise(rb_eArgError, "second argument must be '<' or '>', '%s' given", arrow); } if (*arrow == '>' && image->columns <= image->rows) { return Qnil; } if (*arrow == '<' && image->columns >= image->rows) { return Qnil; } case 1: degrees = NUM2DBL(argv[0]); break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc); break; } GetExceptionInfo(&exception); new_image = RotateImage(image, degrees, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); if (bang) { UPDATE_DATA_PTR(self, new_image); (void) rm_image_destroy(image); return self; } return rm_image_new(new_image); } /** * Rotate the image. * * Ruby usage: * - @verbatim Image#rotate(degrees) @endverbatim * - @verbatim Image#rotate(degrees, '<') @endverbatim * - @verbatim Image#rotate(degrees, '>') @endverbatim * * Notes: * - If the 2nd argument is '<' rotate only if width < height. If the 2nd * argument is '>' rotate only if width > height. * - Default is to always rotate * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image * @see rotate * @see Image_rotate_bang */ VALUE Image_rotate(int argc, VALUE *argv, VALUE self) { (void) rm_check_destroyed(self); return rotate(False, argc, argv, self); } /** * Rotate the image. * * Ruby usage: * - @verbatim Image#rotate!(degrees) @endverbatim * - @verbatim Image#rotate!(degrees, '<') @endverbatim * - @verbatim Image#rotate!(degrees, '>') @endverbatim * * Notes: * - If the 2nd argument is '<' rotate only if width < height. If the 2nd * argument is '>' rotate only if width > height. * - Default is to always rotate * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self * @see rotate * @see Image_rotate */ VALUE Image_rotate_bang(int argc, VALUE *argv, VALUE self) { (void) rm_check_frozen(self); return rotate(True, argc, argv, self); } /** * Return image rows. * * Ruby usage: * - @verbatim Image#rows @endverbatim * * @param self this object * @return the image rows */ DEF_ATTR_READER(Image, rows, int) /** * Scale an image to the desired dimensions with pixel sampling. * * Ruby usage: * - @verbatim Image#sample(scale) @endverbatim * - @verbatim Image#sample(cols, rows) @endverbatim * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image * @see scale * @see Image_sample_bang */ VALUE Image_sample(int argc, VALUE *argv, VALUE self) { (void) rm_check_destroyed(self); return scale(False, argc, argv, self, SampleImage); } /** * Scale an image to the desired dimensions with pixel sampling. * * Ruby usage: * - @verbatim Image#sample!(scale) @endverbatim * - @verbatim Image#sample!(cols, rows) @endverbatim * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self * @see scale * @see Image_sample */ VALUE Image_sample_bang(int argc, VALUE *argv, VALUE self) { (void) rm_check_frozen(self); return scale(True, argc, argv, self, SampleImage); } /** * Change the size of an image to the given dimensions. * * Ruby usage: * - @verbatim Image#scale(scale) @endverbatim * - @verbatim Image#scale(cols, rows) @endverbatim * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image * @see scale * @see Image_scale_bang */ VALUE Image_scale(int argc, VALUE *argv, VALUE self) { (void) rm_check_destroyed(self); return scale(False, argc, argv, self, ScaleImage); } /** * Change the size of an image to the given dimensions. * * Ruby usage: * - @verbatim Image#scale!(scale) @endverbatim * - @verbatim Image#scale!(cols, rows) @endverbatim * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self * @see scale * @see Image_scale */ VALUE Image_scale_bang(int argc, VALUE *argv, VALUE self) { (void) rm_check_frozen(self); return scale(True, argc, argv, self, ScaleImage); } /** * Call ScaleImage or SampleImage * * Notes: * - If 1 argument > 0, multiply current size by this much. * - If 2 arguments, (cols, rows). * * No Ruby usage (internal function) * * @param bang whether the bang (!) version of the method was called * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @param scaler which scalar to use (ScaleImage or SampleImage) * @return self if bang, otherwise a new image * @see Image_sample * @see Image_sample_bang * @see Image_scale * @see Image_scale_bang */ static VALUE scale(int bang, int argc, VALUE *argv, VALUE self, scaler_t scaler) { Image *image, *new_image; unsigned long columns, rows; double scale_arg, drows, dcols; ExceptionInfo exception; Data_Get_Struct(self, Image, image); switch (argc) { case 2: columns = NUM2ULONG(argv[0]); rows = NUM2ULONG(argv[1]); if (columns == 0 || rows == 0) { rb_raise(rb_eArgError, "invalid result dimension (%lu, %lu given)", columns, rows); } break; case 1: scale_arg = NUM2DBL(argv[0]); if (scale_arg <= 0) { rb_raise(rb_eArgError, "invalid scale value (%g given)", scale_arg); } drows = scale_arg * image->rows + 0.5; dcols = scale_arg * image->columns + 0.5; if (drows > (double)ULONG_MAX || dcols > (double)ULONG_MAX) { rb_raise(rb_eRangeError, "resized image too big"); } rows = (unsigned long) drows; columns = (unsigned long) dcols; break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc); break; } GetExceptionInfo(&exception); new_image = (scaler)(image, columns, rows, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); if (bang) { UPDATE_DATA_PTR(self, new_image); (void) rm_image_destroy(image); return self; } return rm_image_new(new_image); } /** * Return image scene. * * Ruby usage: * - @verbatim Image#scene @endverbatim * * @param self this object * @return the image scene */ DEF_ATTR_READER(Image, scene, ulong) /** * Call SelectiveBlurImageChannel. * * Ruby usage: * - @verbatim Image#selective_blur_channel(radius, sigma, threshold) @endverbatim * - @verbatim Image#selective_blur_channel(radius, sigma, threshold, channel) @endverbatim * - @verbatim Image#selective_blur_channel(radius, sigma, threshold, channel, ...) @endverbatim * * Notes: * - Default channel is AllChannels * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_selective_blur_channel(int argc, VALUE *argv, VALUE self) { #if defined(HAVE_SELECTIVEBLURIMAGECHANNEL) Image *image, *new_image; double radius, sigma, threshold; ExceptionInfo exception; ChannelType channels; image = rm_check_destroyed(self); channels = extract_channels(&argc, argv); if (argc > 3) { raise_ChannelType_error(argv[argc-1]); } if (argc != 3) { rb_raise(rb_eArgError, "wrong number of arguments (%d for 3 or more)", argc); } radius = NUM2DBL(argv[0]); sigma = NUM2DBL(argv[1]); // threshold is either a floating-point number or a string in the form "NN%". // Either way it's supposed to represent a percentage of the QuantumRange. threshold = rm_percentage(argv[2],1.0) * QuantumRange; GetExceptionInfo(&exception); new_image = SelectiveBlurImageChannel(image, channels, radius, sigma, threshold, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); #else rm_not_implemented(); argc = argc; argv = argv; self = self; return (VALUE)0; #endif } /** * Call SetImageChannelDepth. * * Ruby usage: * - @verbatim Image#set_channel_depth(channel, depth) @endverbatim * * @param self this object * @param channel_arg the channel * @param depth the depth * @return self */ VALUE Image_set_channel_depth(VALUE self, VALUE channel_arg, VALUE depth) { Image *image; ChannelType channel; unsigned long channel_depth; image = rm_check_frozen(self); VALUE_TO_ENUM(channel_arg, channel, ChannelType); channel_depth = NUM2ULONG(depth); (void) SetImageChannelDepth(image, channel, channel_depth); rm_check_image_exception(image, RetainOnError); return self; } /** * Call SeparateImages. * * Ruby usage: * - @verbatim separate @endverbatim * - @verbatim separate(channel) @endverbatim * - @verbatim separate(channel, ...) @endverbatim * * Notes: * - Default channel is AllChannels * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new ImageList */ VALUE Image_separate(int argc, VALUE *argv, VALUE self) { Image *image, *new_images; ChannelType channels = 0; ExceptionInfo exception; image = rm_check_destroyed(self); channels = extract_channels(&argc, argv); // All arguments are ChannelType enums if (argc > 0) { raise_ChannelType_error(argv[argc-1]); } GetExceptionInfo(&exception); new_images = SeparateImages(image, channels, &exception); rm_check_exception(&exception, new_images, DestroyOnError); DestroyExceptionInfo(&exception); rm_ensure_result(new_images); return rm_imagelist_from_images(new_images); } /** * Call SepiaToneImage. * * Ruby usage: * - @verbatim Image#sepiatone @endverbatim * - @verbatim Image#sepiatone(threshold) @endverbatim * * Notes: * - Default threshold is QuantumRange * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_sepiatone(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; double threshold = (double) QuantumRange; ExceptionInfo exception; image = rm_check_destroyed(self); switch (argc) { case 1: threshold = NUM2DBL(argv[0]); break; case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 or 1)", argc); } GetExceptionInfo(&exception); new_image = SepiaToneImage(image, threshold, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Call SegmentImage. * * Ruby usage: * - @verbatim Image#segment @endverbatim * - @verbatim Image#segment(colorspace) @endverbatim * - @verbatim Image#segment(colorspace,cluster_threshold) @endverbatim * - @verbatim Image#segment(colorspace,cluster_threshold,smoothing_threshold) @endverbatim * - @verbatim Image#segment(colorspace,cluster_threshold,smoothing_threshold,verbose) @endverbatim * * Notes: * - Default colorspace is RGBColorspace * - Default cluster_threshold is 1.0 * - Default smoothing_threshold is 1.5 * - Default verbose is false * - The default values are the same as Magick++ * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_segment(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; int colorspace = RGBColorspace; // These are the Magick++ defaults unsigned int verbose = MagickFalse; double cluster_threshold = 1.0; double smoothing_threshold = 1.5; image = rm_check_destroyed(self); switch (argc) { case 4: verbose = RTEST(argv[3]); case 3: smoothing_threshold = NUM2DBL(argv[2]); case 2: cluster_threshold = NUM2DBL(argv[1]); case 1: VALUE_TO_ENUM(argv[0], colorspace, ColorspaceType); case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 to 4)", argc); break; } new_image = rm_clone_image(image); (void) SegmentImage(new_image, colorspace, verbose, cluster_threshold, smoothing_threshold); rm_check_image_exception(new_image, DestroyOnError); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Call SetImageOpacity. * * Ruby usage: * - @verbatim Image#opacity= @endverbatim * * @param self this object * @param opacity_arg the opacity * @return self */ VALUE Image_opacity_eq(VALUE self, VALUE opacity_arg) { Image *image; Quantum opacity; image = rm_check_frozen(self); opacity = APP2QUANTUM(opacity_arg); (void) SetImageOpacity(image, opacity); rm_check_image_exception(image, RetainOnError); return self; } /** * Traverse the attributes and yield to the block. If no block, return a hash * of all the attribute keys & values. * * Ruby usage: * - @verbatim Image#properties [{ |k,v| block }] @endverbatim * * Notes: * - I use the word "properties" to distinguish between these "user-added" * attribute strings and Image object attributes. * * @param self this object * @return self if block, else hash of attribute keys and values. */ VALUE Image_properties(VALUE self) { Image *image; volatile VALUE attr_hash; volatile VALUE ary; char *property; const char *value; image = rm_check_destroyed(self); if (rb_block_given_p()) { ary = rb_ary_new2(2); ResetImagePropertyIterator(image); property = GetNextImageProperty(image); while (property) { value = GetImageProperty(image, property); (void) rb_ary_store(ary, 0, rb_str_new2(property)); (void) rb_ary_store(ary, 1, rb_str_new2(value)); (void) rb_yield(ary); property = GetNextImageProperty(image); } rm_check_image_exception(image, RetainOnError); return self; } // otherwise return properties hash else { attr_hash = rb_hash_new(); ResetImagePropertyIterator(image); property = GetNextImageProperty(image); while (property) { value = GetImageProperty(image, property); (void) rb_hash_aset(attr_hash, rb_str_new2(property), rb_str_new2(value)); property = GetNextImageProperty(image); } rm_check_image_exception(image, RetainOnError); return attr_hash; } } /** * Shine a distant light on an image to create a three-dimensional effect. You * control the positioning of the light with azimuth and elevation; azimuth is * measured in degrees off the x axis and elevation is measured in pixels above * the Z axis. * * Ruby usage: * - @verbatim Image#shade @endverbatim * - @verbatim Image#shade(shading) @endverbatim * - @verbatim Image#shade(shading, azimuth) @endverbatim * - @verbatim Image#shade(shading, azimuth, elevation) @endverbatim * * Notes: * - Default shading is false * - Default azimuth is 30 * - Default elevation is 30 * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_shade(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; double azimuth = 30.0, elevation = 30.0; unsigned int shading=MagickFalse; ExceptionInfo exception; image = rm_check_destroyed(self); switch (argc) { case 3: elevation = NUM2DBL(argv[2]); case 2: azimuth = NUM2DBL(argv[1]); case 1: shading = RTEST(argv[0]); case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 to 3)", argc); break; } GetExceptionInfo(&exception); new_image = ShadeImage(image, shading, azimuth, elevation, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Call ShadowImage. X- and y-offsets are the pixel offset. Opacity is either a * number between 0 and 1 or a string "NN%". Sigma is the std. dev. of the * Gaussian, in pixels. * * Ruby usage: * - @verbatim Image#shadow @endverbatim * - @verbatim Image#shadow(x_offset) @endverbatim * - @verbatim Image#shadow(x_offset, y_offset) @endverbatim * - @verbatim Image#shadow(x_offset, y_offset, sigma) @endverbatim * - @verbatim Image#shadow(x_offset, y_offset, sigma, opacity) @endverbatim * * Notes: * - Default x_offset is 4 * - Default y_offset is 4 * - Default sigma is 4.0 * - Default opacity is 1.0 * - The defaults are taken from the mogrify.c source, except for opacity, * which has no default. * - Introduced in ImageMagick 6.1.7 * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_shadow(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; double opacity = 100.0; double sigma = 4.0; long x_offset = 4L; long y_offset = 4L; ExceptionInfo exception; image = rm_check_destroyed(self); switch (argc) { case 4: opacity = rm_percentage(argv[3],1.0); // Clamp to 1.0 < x <= 100.0 if (fabs(opacity) < 0.01) { rb_warning("shadow will be transparent - opacity %g very small", opacity); } opacity = FMIN(opacity, 1.0); opacity = FMAX(opacity, 0.01); opacity *= 100.0; case 3: sigma = NUM2DBL(argv[2]); case 2: y_offset = NUM2LONG(argv[1]); case 1: x_offset = NUM2LONG(argv[0]); case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 to 4)", argc); break; } GetExceptionInfo(&exception); new_image = ShadowImage(image, opacity, sigma, x_offset, y_offset, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Sharpen an image. * * Ruby usage: * - @verbatim Image#sharpen @endverbatim * - @verbatim Image#sharpen(radius) @endverbatim * - @verbatim Image#sharpen(radius, sigma) @endverbatim * * Notes: * - Default radius is 0.0 * - Default sigma is 1.0 * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image * @see effect_image */ VALUE Image_sharpen(int argc, VALUE *argv, VALUE self) { return effect_image(self, argc, argv, SharpenImage); } /** * Sharpen image on a channel. * * Ruby usage: * - @verbatim Image#sharpen_channel @endverbatim * - @verbatim Image#sharpen_channel(radius) @endverbatim * - @verbatim Image#sharpen_channel(radius, sigma) @endverbatim * - @verbatim Image#sharpen_channel(radius, sigma, channel) @endverbatim * - @verbatim Image#sharpen_channel(radius, sigma, channel, ...) @endverbatim * * Notes: * - Default radius is 0.0 * - Default sigma is 1.0 * - Default channel is AllChannels * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_sharpen_channel(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; ChannelType channels; ExceptionInfo exception; double radius = 0.0, sigma = 1.0; image = rm_check_destroyed(self); channels = extract_channels(&argc, argv); // There must be 0, 1, or 2 remaining arguments. switch (argc) { case 2: sigma = NUM2DBL(argv[1]); /* Fall thru */ case 1: radius = NUM2DBL(argv[0]); /* Fall thru */ case 0: break; default: raise_ChannelType_error(argv[argc-1]); } new_image = rm_clone_image(image); GetExceptionInfo(&exception); (void) SharpenImageChannel(new_image, channels, radius, sigma, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); return rm_image_new(new_image); } /** * Shave pixels from the image edges, leaving a rectangle of the specified width * & height in the center. * * Ruby usage: * - @verbatim Image#shave(width, height) @endverbatim * * @param self this object * @param width the width to leave * @param height the hight to leave * @return a new image * @see xform_image * @see Image_shave_bang */ VALUE Image_shave(VALUE self, VALUE width, VALUE height) { (void) rm_check_destroyed(self); return xform_image(False, self, INT2FIX(0), INT2FIX(0), width, height, ShaveImage); } /** * Shave pixels from the image edges, leaving a rectangle of the specified width * & height in the center. * * Ruby usage: * - @verbatim Image#shave!(width, height) @endverbatim * * @param self this object * @param width the width to leave * @param height the hight to leave * @return self * @see xform_image * @see Image_shave */ VALUE Image_shave_bang(VALUE self, VALUE width, VALUE height) { (void) rm_check_frozen(self); return xform_image(True, self, INT2FIX(0), INT2FIX(0), width, height, ShaveImage); } /** * Call ShearImage. * * Ruby usage: * - @verbatim Image#shear(x_shear, y_shear) @endverbatim * * @param self this object * @param x_shear the x shear (in degrees) * @param y_shear the y shear (in degrees) * @return a new image */ VALUE Image_shear(VALUE self, VALUE x_shear, VALUE y_shear) { Image *image, *new_image; ExceptionInfo exception; image = rm_check_destroyed(self); GetExceptionInfo(&exception); new_image = ShearImage(image, NUM2DBL(x_shear), NUM2DBL(y_shear), &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Call SigmoidalContrastImageChannel. * * Ruby usage: * - @verbatim Image#sigmoidal_contrast_channel @endverbatim * - @verbatim Image#sigmoidal_contrast_channel(contrast) @endverbatim * - @verbatim Image#sigmoidal_contrast_channel(contrast, midpoint) @endverbatim * - @verbatim Image#sigmoidal_contrast_channel(contrast, midpoint, sharpen) @endverbatim * - @verbatim Image#sigmoidal_contrast_channel(contrast, midpoint, sharpen, channel) @endverbatim * - @verbatim Image#sigmoidal_contrast_channel(contrast, midpoint, sharpen, channel, ...) @endverbatim * * Notes: * - Default contrast is 3.0 * - Default midpoint is 50.0 * - Default sharpen is false * - Default channel is AllChannels * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_sigmoidal_contrast_channel(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; MagickBooleanType sharpen = MagickFalse; double contrast = 3.0; double midpoint = 50.0; ChannelType channels; image = rm_check_destroyed(self); channels = extract_channels(&argc, argv); switch (argc) { case 3: sharpen = (MagickBooleanType) RTEST(argv[2]); case 2: midpoint = NUM2DBL(argv[1]); case 1: contrast = NUM2DBL(argv[0]); case 0: break; default: raise_ChannelType_error(argv[argc-1]); break; } new_image = rm_clone_image(image); (void) SigmoidalContrastImageChannel(new_image, channels, sharpen, contrast, midpoint); rm_check_image_exception(new_image, DestroyOnError); return rm_image_new(new_image); } /** * Compute a message digest from an image pixel stream with an implementation of * the NIST SHA-256 Message Digest algorithm. * * Ruby usage: * - @verbatim Image#signature @endverbatim * * @param self this object * @return the message digest */ VALUE Image_signature(VALUE self) { Image *image; const char *signature; image = rm_check_destroyed(self); (void) SignatureImage(image); signature = rm_get_property(image, "signature"); rm_check_image_exception(image, RetainOnError); if (!signature) { return Qnil; } return rb_str_new(signature, 64); } /** * Call SketchImage. * * Ruby usage: * - @verbatim Image#sketch @endverbatim * - @verbatim Image#sketch(radius) @endverbatim * - @verbatim Image#sketch(radius, sigma) @endverbatim * - @verbatim Image#sketch(radius, sigma, angle) @endverbatim * * Notes: * - Default radius is 0.0 * - Default sigma is 1.0 * - Default angle is 0.0 * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image * @see motion_blur */ VALUE Image_sketch(int argc, VALUE *argv, VALUE self) { (void) rm_check_destroyed(self); return motion_blur(argc, argv, self, SketchImage); } /** * Apply a special effect to the image, similar to the effect achieved in a * photo darkroom by selectively exposing areas of photo sensitive paper to * light. Threshold ranges from 0 to QuantumRange and is a measure of the extent * of the solarization. * * Ruby usage: * - @verbatim Image#solarize @endverbatim * - @verbatim Image#solarize(threshold) @endverbatim * * Notes: * - Default threshold is 50.0 * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_solarize(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; double threshold = 50.0; image = rm_check_destroyed(self); switch (argc) { case 1: threshold = NUM2DBL(argv[0]); if (threshold < 0.0 || threshold > QuantumRange) { rb_raise(rb_eArgError, "threshold out of range, must be >= 0.0 and < QuantumRange"); } case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 or 1)", argc); break; } new_image = rm_clone_image(image); (void) SolarizeImage(new_image, threshold); rm_check_image_exception(new_image, DestroyOnError); return rm_image_new(new_image); } /** * Compare two images. * * Ruby usage: * - @verbatim Image#<=> @endverbatim * * @param self this image * @param other other image * @return -1, 0, 1 */ VALUE Image_spaceship(VALUE self, VALUE other) { Image *imageA, *imageB; const char *sigA, *sigB; int res; imageA = rm_check_destroyed(self); // If the other object isn't a Image object, then they can't be equal. if (!rb_obj_is_kind_of(other, Class_Image)) { return Qnil; } imageB = rm_check_destroyed(other); (void) SignatureImage(imageA); (void) SignatureImage(imageB); sigA = rm_get_property(imageA, "signature"); sigB = rm_get_property(imageB, "signature"); if (!sigA || !sigB) { rb_raise(Class_ImageMagickError, "can't get image signature"); } res = memcmp(sigA, sigB, 64); res = res > 0 ? 1 : (res < 0 ? -1 : 0); // reduce to 1, -1, 0 return INT2FIX(res); } #if defined(HAVE_SPARSECOLORIMAGE) /** * Count the number of channels from the specified list are in an image. Note * that this method also removes invalid channels based on the image. * * No Ruby usage (internal function) * * @param image the image * @param channels the channels * @return number of channels */ static unsigned long count_channels(Image *image, ChannelType *channels) { unsigned long ncolors = 0UL; if (image->colorspace != CMYKColorspace) { *channels = (ChannelType) (*channels & ~IndexChannel); /* remove index channels from count */ } if ( image->matte == MagickFalse ) { *channels = (ChannelType) (*channels & ~OpacityChannel); /* remove matte/alpha *channels from count */ } if (*channels & RedChannel) { ncolors += 1; } if (*channels & GreenChannel) { ncolors += 1; } if (*channels & BlueChannel) { ncolors += 1; } if (*channels & IndexChannel) { ncolors += 1; } if (*channels & OpacityChannel) { ncolors += 1; } return ncolors; } #endif /** * Call SparseColorInterpolate. * * Ruby usage: * - @verbatim Image#sparse_color(method, x1, y1, color) @endverbatim * - @verbatim Image#sparse_color(method, x1, y1, color, x2, y2, color) @endverbatim * - @verbatim Image#sparse_color(method, x1, y1, color, x2, y2, color, ...) @endverbatim * - @verbatim Image#sparse_color(method, x1, y1, color, channel) @endverbatim * - @verbatim Image#sparse_color(method, x1, y1, color, x2, y2, color, channel) @endverbatim * - @verbatim Image#sparse_color(method, x1, y1, color, x2, y2, color, ..., channel) @endverbatim * - @verbatim Image#sparse_color(method, x1, y1, color, channel, ...) @endverbatim * - @verbatim Image#sparse_color(method, x1, y1, color, x2, y2, color, channel, ...) @endverbatim * - @verbatim Image#sparse_color(method, x1, y1, color, x2, y2, color, ..., channel, ...) @endverbatim * * Notes: * - Default channel is AllChannels * - As usual, 'color' can be either a color name or a pixel * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_sparse_color(int argc, VALUE *argv, VALUE self) { #if defined(HAVE_SPARSECOLORIMAGE) Image *image, *new_image; unsigned long x, nargs, ncolors; SparseColorMethod method; int n, exp; double * volatile args; ChannelType channels; MagickPixelPacket pp; ExceptionInfo exception; image = rm_check_destroyed(self); n = argc; channels = extract_channels(&argc, argv); n -= argc; // n is now the number of channel arguments // After the channel arguments have been removed, and not counting the first // (method) argument, the number of arguments should be a multiple of 3. if (argc < 4 || argc % 3 != 1) { exp = argc - 1; exp = (argc + 2) / 3 * 3; exp = max(exp, 3); rb_raise(rb_eArgError, "wrong number of arguments (expected at least %d, got %d)", n+exp+1, n+argc); } // Get the method from the argument list VALUE_TO_ENUM(argv[0], method, SparseColorMethod); argv += 1; argc -= 1; // A lot of the following code is based on SparseColorOption, in wand/mogrify.c ncolors = count_channels(image, &channels); nargs = (argc / 3) * (2 + ncolors); // Allocate args from Ruby's memory so that GC will collect it if one of // the type conversions below raises an exception. args = ALLOC_N(double, nargs); memset(args, 0, nargs * sizeof(double)); x = 0; n = 0; while (n < argc) { args[x++] = NUM2DBL(argv[n++]); args[x++] = NUM2DBL(argv[n++]); Color_to_MagickPixelPacket(NULL, &pp, argv[n++]); if (channels & RedChannel) { args[x++] = pp.red / QuantumRange; } if (channels & GreenChannel) { args[x++] = pp.green / QuantumRange; } if (channels & BlueChannel) { args[x++] = pp.blue / QuantumRange; } if (channels & IndexChannel) { args[x++] = pp.index / QuantumRange; } if (channels & OpacityChannel) { args[x++] = pp.opacity / QuantumRange; } } GetExceptionInfo(&exception); new_image = SparseColorImage(image, channels, method, nargs, args, &exception); xfree(args); CHECK_EXCEPTION(); rm_ensure_result(new_image); return rm_image_new(new_image); #else self = self; argc = argc; argv = argv; rm_not_implemented(); return(VALUE)0; #endif } /** * Splice a solid color into the part of the image specified by the x, y, width, * and height arguments. If the color argument is specified it must be a color * name or Pixel. * * Ruby usage: * - @verbatim Image#splice(x, y, width, height) @endverbatim * - @verbatim Image#splice(x, y, width, height, color) @endverbatim * * Notes: * - Default color is the background color. * - Splice is the inverse of chop * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image * @see Image_chop */ VALUE Image_splice(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; PixelPacket color, old_color; RectangleInfo rectangle; ExceptionInfo exception; image = rm_check_destroyed(self); switch (argc) { case 4: // use background color color = image->background_color; break; case 5: // Convert color argument to PixelPacket Color_to_PixelPacket(&color, argv[4]); break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 4 or 5)", argc); break; } rectangle.x = NUM2LONG(argv[0]); rectangle.y = NUM2LONG(argv[1]); rectangle.width = NUM2ULONG(argv[2]); rectangle.height = NUM2ULONG(argv[3]); GetExceptionInfo(&exception); // Swap in color for the duration of this call. old_color = image->background_color; image->background_color = color; new_image = SpliceImage(image, &rectangle, &exception); image->background_color = old_color; rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Randomly displace each pixel in a block defined by "radius". * * Ruby usage: * - @verbatim Image#spread @endverbatim * - @verbatim Image#spread(radius) @endverbatim * * Notes: * - Default radius is 3.0 * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_spread(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; double radius = 3.0; ExceptionInfo exception; image = rm_check_destroyed(self); switch (argc) { case 1: radius = NUM2DBL(argv[0]); case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 or 1)", argc); break; } GetExceptionInfo(&exception); new_image = SpreadImage(image, radius, &exception); rm_check_exception(&exception, new_image, DestroyOnError); rm_ensure_result(new_image); (void) DestroyExceptionInfo(&exception); return rm_image_new(new_image); } DEF_ATTR_ACCESSOR(Image, start_loop, bool) /** * Hide a digital watermark within the image. Recover the hidden watermark later * to prove that the authenticity of an image. * * Ruby usage: * - @verbatim Image#stegano(watermark, offset) @endverbatim * * @param self this object * @param watermark_image the watermark image * @param offset the start position within the image to hide the watermark. * @return a new image */ VALUE Image_stegano(VALUE self, VALUE watermark_image, VALUE offset) { Image *image, *new_image; volatile VALUE wm_image; Image *watermark; ExceptionInfo exception; image = rm_check_destroyed(self); wm_image = rm_cur_image(watermark_image); watermark = rm_check_destroyed(wm_image); image->offset = NUM2LONG(offset); GetExceptionInfo(&exception); new_image = SteganoImage(image, watermark, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Combine two images and produces a single image that is the composite of a * left and right image of a stereo pair. Special red-green stereo glasses are * required to view this effect. * * Ruby usage: * - @verbatim Image#stereo(offset_image) @endverbatim * * @param self this object * @param offset_image_arg the other image * @return a new image */ VALUE Image_stereo(VALUE self, VALUE offset_image_arg) { Image *image, *new_image; volatile VALUE offset_image; Image *offset; ExceptionInfo exception; image = rm_check_destroyed(self); offset_image = rm_cur_image(offset_image_arg); offset = rm_check_destroyed(offset_image); GetExceptionInfo(&exception); new_image = StereoImage(image, offset, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Return the image's storage class (a.k.a. storage type, class type). * * Ruby usage: * - @verbatim Image#class_type @endverbatim * * Notes: * - Based on Magick++'s Magick::Magick::classType * * @param self this object * @return the storage class */ VALUE Image_class_type(VALUE self) { Image *image = rm_check_destroyed(self); return ClassType_new(image->storage_class); } /** * Change the image's storage class. * * Ruby usage: * - @verbatim Image#class_type= @endverbatim * * Notes: * - Based on Magick++'s Magick::Magick::classType * * @param self this object * @param new_class_type the storage class * @return self */ VALUE Image_class_type_eq(VALUE self, VALUE new_class_type) { Image *image; ClassType class_type; QuantizeInfo qinfo; image = rm_check_frozen(self); VALUE_TO_ENUM(new_class_type, class_type, ClassType); if (image->storage_class == PseudoClass && class_type == DirectClass) { (void) SyncImage(image); magick_free(image->colormap); image->colormap = NULL; } else if (image->storage_class == DirectClass && class_type == PseudoClass) { GetQuantizeInfo(&qinfo); qinfo.number_colors = QuantumRange+1; (void) QuantizeImage(&qinfo, image); } (void) SetImageStorageClass(image, class_type); return self; } /** * Replace the pixels in the specified rectangle. * * Ruby usage: * - @verbatim Image#store_pixels(x,y,cols,rows,new_pixels) @endverbatim * * Notes: * - Calls GetImagePixels, then SyncImagePixels after replacing the pixels. * - This is the complement of get_pixels. The array object returned by * get_pixels is suitable for use as the "new_pixels" argument. * * @param self this object * @param x_arg x position of start of region * @param y_arg y position of start of region * @param cols_arg width of region * @param rows_arg height of region * @param new_pixels the replacing pixels * @return self */ VALUE Image_store_pixels(VALUE self, VALUE x_arg, VALUE y_arg, VALUE cols_arg , VALUE rows_arg, VALUE new_pixels) { Image *image; Pixel *pixels, *pixel; volatile VALUE new_pixel; long n, size; long x, y; unsigned long cols, rows; unsigned int okay; image = rm_check_destroyed(self); x = NUM2LONG(x_arg); y = NUM2LONG(y_arg); cols = NUM2ULONG(cols_arg); rows = NUM2ULONG(rows_arg); if (x < 0 || y < 0 || x+cols > image->columns || y+rows > image->rows) { rb_raise(rb_eRangeError, "geometry (%lux%lu%+ld%+ld) exceeds image bounds" , cols, rows, x, y); } size = (long)(cols * rows); rm_check_ary_len(new_pixels, size); okay = SetImageStorageClass(image, DirectClass); rm_check_image_exception(image, RetainOnError); if (!okay) { rb_raise(Class_ImageMagickError, "SetImageStorageClass failed. Can't store pixels."); } // Get a pointer to the pixels. Replace the values with the PixelPackets // from the pixels argument. { #if defined(HAVE_SYNCAUTHENTICPIXELS) || defined(HAVE_GETAUTHENTICPIXELS) ExceptionInfo exception; GetExceptionInfo(&exception); #endif #if defined(HAVE_GETAUTHENTICPIXELS) pixels = GetAuthenticPixels(image, x, y, cols, rows, &exception); CHECK_EXCEPTION() #else pixels = GetImagePixels(image, x, y, cols, rows); rm_check_image_exception(image, RetainOnError); #endif if (pixels) { for (n = 0; n < size; n++) { new_pixel = rb_ary_entry(new_pixels, n); Data_Get_Struct(new_pixel, Pixel, pixel); pixels[n] = *pixel; } #if defined(HAVE_SYNCAUTHENTICPIXELS) SyncAuthenticPixels(image, &exception); CHECK_EXCEPTION() #else SyncImagePixels(image); rm_check_image_exception(image, RetainOnError); #endif } #if defined(HAVE_SYNCAUTHENTICPIXELS) || defined(HAVE_GETAUTHENTICPIXELS) DestroyExceptionInfo(&exception); #endif } return self; } /** * Strips an image of all profiles and comments. * * Ruby usage: * - @verbatim Image#strip! @endverbatim * * @param self this object * @return self */ VALUE Image_strip_bang(VALUE self) { Image *image = rm_check_frozen(self); (void) StripImage(image); rm_check_image_exception(image, RetainOnError); return self; } /** * Swirl the pixels about the center of the image, where degrees indicates the * sweep of the arc through which each pixel is moved. You get a more dramatic * effect as the degrees move from 1 to 360. * * Ruby usage: * - @verbatim Image#swirl(degrees) @endverbatim * * @param self this object * @param degrees the degrees * @return a new image */ VALUE Image_swirl(VALUE self, VALUE degrees) { Image *image, *new_image; ExceptionInfo exception; image = rm_check_destroyed(self); GetExceptionInfo(&exception); new_image = SwirlImage(image, NUM2DBL(degrees), &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Synchronize image properties with the image profiles. * * Ruby usage: * - @verbatim Image#sync_profiles @endverbatim * * @param self this object * @return true if succeeded, otherwise false */ VALUE Image_sync_profiles(VALUE self) { Image *image = rm_check_destroyed(self); volatile VALUE okay = SyncImageProfiles(image) ? Qtrue : Qfalse; rm_check_image_exception(image, RetainOnError); return okay; } /** * Emulates Magick++'s floodFillTexture. * * If the FloodfillMethod method is specified, flood-fills texture across pixels * starting at the target pixel and matching the specified color. * * If the FillToBorderMethod method is specified, flood-fills 'texture across * pixels starting at the target pixel and stopping at pixels matching the * specified color.' * * Ruby usage: * - @verbatim Image#texture_flood_fill(color, texture, x, y, method) @endverbatim * * @param self this object * @param color_obj the color * @param texture_obj the texture to fill * @param x_obj the x position * @param y_obj the y position * @param method_obj the method to call (FloodfillMethod or FillToBorderMethod) * @return a new image */ VALUE Image_texture_flood_fill(VALUE self, VALUE color_obj, VALUE texture_obj , VALUE x_obj, VALUE y_obj, VALUE method_obj) { Image *image, *new_image; Image *texture_image; PixelPacket color; volatile VALUE texture; DrawInfo *draw_info; long x, y; PaintMethod method; image = rm_check_destroyed(self); Color_to_PixelPacket(&color, color_obj); texture = rm_cur_image(texture_obj); texture_image = rm_check_destroyed(texture); x = NUM2LONG(x_obj); y = NUM2LONG(y_obj); if ((unsigned long)x > image->columns || (unsigned long)y > image->rows) { rb_raise(rb_eArgError, "target out of range. %ldx%ld given, image is %lux%lu" , x, y, image->columns, image->rows); } VALUE_TO_ENUM(method_obj, method, PaintMethod); if (method != FillToBorderMethod && method != FloodfillMethod) { rb_raise(rb_eArgError, "paint method must be FloodfillMethod or " "FillToBorderMethod (%d given)", (int)method); } draw_info = CloneDrawInfo(NULL, NULL); if (!draw_info) { rb_raise(rb_eNoMemError, "not enough memory to continue"); } draw_info->fill_pattern = rm_clone_image(texture_image); new_image = rm_clone_image(image); #if defined(HAVE_FLOODFILLPAINTIMAGE) { MagickPixelPacket color_mpp; MagickBooleanType invert; GetMagickPixelPacket(new_image, &color_mpp); if (method == FillToBorderMethod) { invert = MagickTrue; color_mpp.red = (MagickRealType) image->border_color.red; color_mpp.green = (MagickRealType) image->border_color.green; color_mpp.blue = (MagickRealType) image->border_color.blue; } else { invert = MagickFalse; color_mpp.red = (MagickRealType) color.red; color_mpp.green = (MagickRealType) color.green; color_mpp.blue = (MagickRealType) color.blue; } (void) FloodfillPaintImage(new_image, DefaultChannels, draw_info, &color_mpp, x, y, invert); } #else (void) ColorFloodfillImage(new_image, draw_info, color, x, y, method); #endif (void) DestroyDrawInfo(draw_info); rm_check_image_exception(new_image, DestroyOnError); return rm_image_new(new_image); } /** * Change the value of individual pixels based on the intensity of each pixel * compared to threshold. The result is a high-contrast, two color image. * * Ruby usage: * - @verbatim Image#threshold(threshold) @endverbatim * * @param self this object * @param threshold the threshold * @return a new image */ VALUE Image_threshold(VALUE self, VALUE threshold) { Image *image, *new_image; image = rm_check_destroyed(self); new_image = rm_clone_image(image); (void) BilevelImageChannel(new_image, DefaultChannels, NUM2DBL(threshold)); rm_check_image_exception(new_image, DestroyOnError); return rm_image_new(new_image); } /** * Call one of the xxxxThresholdImage methods. * * No Ruby usage (internal function) * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @param thresholder which xxxxThresholdImage method to call * @return a new image */ static VALUE threshold_image(int argc, VALUE *argv, VALUE self, thresholder_t thresholder) { Image *image, *new_image; double red, green, blue, opacity; char ctarg[200]; image = rm_check_destroyed(self); switch (argc) { case 4: red = NUM2DBL(argv[0]); green = NUM2DBL(argv[1]); blue = NUM2DBL(argv[2]); opacity = NUM2DBL(argv[3]); sprintf(ctarg, "%f,%f,%f,%f", red, green, blue, opacity); break; case 3: red = NUM2DBL(argv[0]); green = NUM2DBL(argv[1]); blue = NUM2DBL(argv[2]); sprintf(ctarg, "%f,%f,%f", red, green, blue); break; case 2: red = NUM2DBL(argv[0]); green = NUM2DBL(argv[1]); sprintf(ctarg, "%f,%f", red, green); break; case 1: red = NUM2DBL(argv[0]); sprintf(ctarg, "%f", red); break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 to 4)", argc); } new_image = rm_clone_image(image); (thresholder)(new_image, ctarg); rm_check_image_exception(new_image, DestroyOnError); return rm_image_new(new_image); } /** * Fast resize for thumbnail images. * * No Ruby usage (internal function) * * Notes: * - Uses BoxFilter, blur attribute of input image * * @param bang whether the bang (!) version of the method was called * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self if bang, otherwise a new image * @see Image_thumbnail * @see Image_thumbnail_bang */ static VALUE thumbnail(int bang, int argc, VALUE *argv, VALUE self) { Image *image, *new_image; unsigned long columns, rows; double scale_arg, drows, dcols; ExceptionInfo exception; Data_Get_Struct(self, Image, image); switch (argc) { case 2: columns = NUM2ULONG(argv[0]); rows = NUM2ULONG(argv[1]); if (columns == 0 || rows == 0) { rb_raise(rb_eArgError, "invalid result dimension (%lu, %lu given)", columns, rows); } break; case 1: scale_arg = NUM2DBL(argv[0]); if (scale_arg < 0.0) { rb_raise(rb_eArgError, "invalid scale value (%g given)", scale_arg); } drows = scale_arg * image->rows + 0.5; dcols = scale_arg * image->columns + 0.5; if (drows > (double)ULONG_MAX || dcols > (double)ULONG_MAX) { rb_raise(rb_eRangeError, "resized image too big"); } rows = (unsigned long) drows; columns = (unsigned long) dcols; break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc); break; } GetExceptionInfo(&exception); new_image = ThumbnailImage(image, columns, rows, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); if (bang) { UPDATE_DATA_PTR(self, new_image); (void) rm_image_destroy(image); return self; } return rm_image_new(new_image); } /** * Fast resize for thumbnail images. * * Ruby usage: * - @verbatim Image#thumbnail(scale) @endverbatim * - @verbatim Image#thumbnail(cols, rows) @endverbatim * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image * @see thumbnail * @see Image_thumbnail_bang */ VALUE Image_thumbnail(int argc, VALUE *argv, VALUE self) { (void) rm_check_destroyed(self); return thumbnail(False, argc, argv, self); } /** * Fast resize for thumbnail images. * * Ruby usage: * - @verbatim Image#thumbnail!(scale) @endverbatim * - @verbatim Image#thumbnail!(cols, rows) @endverbatim * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self * @see thumbnail * @see Image_thumbnail */ VALUE Image_thumbnail_bang(int argc, VALUE *argv, VALUE self) { (void) rm_check_frozen(self); return thumbnail(True, argc, argv, self); } /** * The ticks_per_second attribute reader. * * Ruby usage: * - @verbatim Image#ticks_per_second @endverbatim * * @param self this object * @return ticks per second */ VALUE Image_ticks_per_second(VALUE self) { Image *image = rm_check_destroyed(self); return INT2FIX(image->ticks_per_second); } /** * The ticks_per_second attribute writer. * * Ruby usage: * - @verbatim Image#ticks_per_second= @endverbatim * * @param self this object * @param tps ticks per second * @return self */ VALUE Image_ticks_per_second_eq(VALUE self, VALUE tps) { Image *image = rm_check_frozen(self); image->ticks_per_second = NUM2ULONG(tps); return self; } /** * Call TintImage. * * Ruby usage: * - @verbatim Image#tint(tint, red_opacity) @endverbatim * - @verbatim Image#tint(tint, red_opacity, green_opacity) @endverbatim * - @verbatim Image#tint(tint, red_opacity, green_opacity, blue_opacity) @endverbatim * - @verbatim Image#tint(tint, red_opacity, green_opacity, blue_opacity, alpha_opacity) @endverbatim * * Notes: * - Default green_opacity is red_opacity * - Default blue_opacity is red_opacity * - Default alpha_opacity is 1.0 * - Opacity values are percentages: 0.10 -> 10%. * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_tint(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; Pixel *tint; double red_pct_opaque, green_pct_opaque, blue_pct_opaque; double alpha_pct_opaque = 1.0; char opacity[50]; ExceptionInfo exception; image = rm_check_destroyed(self); switch (argc) { case 2: red_pct_opaque = NUM2DBL(argv[1]); green_pct_opaque = blue_pct_opaque = red_pct_opaque; break; case 3: red_pct_opaque = NUM2DBL(argv[1]); green_pct_opaque = NUM2DBL(argv[2]); blue_pct_opaque = red_pct_opaque; break; case 4: red_pct_opaque = NUM2DBL(argv[1]); green_pct_opaque = NUM2DBL(argv[2]); blue_pct_opaque = NUM2DBL(argv[3]); break; case 5: red_pct_opaque = NUM2DBL(argv[1]); green_pct_opaque = NUM2DBL(argv[2]); blue_pct_opaque = NUM2DBL(argv[3]); alpha_pct_opaque = NUM2DBL(argv[4]); break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 to 5)", argc); break; } if (red_pct_opaque < 0.0 || green_pct_opaque < 0.0 || blue_pct_opaque < 0.0 || alpha_pct_opaque < 0.0) { rb_raise(rb_eArgError, "opacity percentages must be non-negative."); } #if defined(HAVE_SNPRINTF) snprintf(opacity, sizeof(opacity), #else sprintf(opacity, #endif "%g,%g,%g,%g", red_pct_opaque*100.0, green_pct_opaque*100.0 , blue_pct_opaque*100.0, alpha_pct_opaque*100.0); Data_Get_Struct(argv[0], Pixel, tint); GetExceptionInfo(&exception); new_image = TintImage(image, opacity, *tint, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Return a "blob" (a String) from the image. * * Ruby usage: * - @verbatim Image#to_blob @endverbatim * * Notes: * - The magick member of the Image structure determines the format of the * returned blob (GIG, JPEG, PNG, etc.) * * @param self this object * @return the blob */ VALUE Image_to_blob(VALUE self) { Image *image; Info *info; const MagickInfo *magick_info; volatile VALUE info_obj; volatile VALUE blob_str; void *blob = NULL; size_t length = 2048; // Do what Magick++ does ExceptionInfo exception; // The user can specify the depth (8 or 16, if the format supports // both) and the image format by setting the depth and format // values in the info parm block. info_obj = rm_info_new(); Data_Get_Struct(info_obj, Info, info); image = rm_check_destroyed(self); // Copy the depth and magick fields to the Image if (info->depth != 0) { (void) SetImageDepth(image, info->depth); rm_check_image_exception(image, RetainOnError); } GetExceptionInfo(&exception); if (*info->magick) { (void) SetImageInfo(info, MagickTrue, &exception); CHECK_EXCEPTION() if (*info->magick == '\0') { return Qnil; } strncpy(image->magick, info->magick, sizeof(info->magick)-1); } // Fix #2844 - libjpeg exits when image is 0x0 magick_info = GetMagickInfo(image->magick, &exception); CHECK_EXCEPTION() if (magick_info) { if ( (!rm_strcasecmp(magick_info->name, "JPEG") || !rm_strcasecmp(magick_info->name, "JPG")) && (image->rows == 0 || image->columns == 0)) { rb_raise(rb_eRuntimeError, "Can't convert %lux%lu %.4s image to a blob" , image->columns, image->rows, magick_info->name); } } rm_sync_image_options(image, info); blob = ImageToBlob(info, image, &length, &exception); CHECK_EXCEPTION() (void) DestroyExceptionInfo(&exception); if (length == 0 || !blob) { return Qnil; } blob_str = rb_str_new(blob, length); magick_free((void*)blob); return blob_str; } /** * Return a color name for the color intensity specified by the Magick::Pixel * argument. * * Ruby usage: * - @verbatim Image#to_color(pixel) @endverbatim * * Notes: * - Respects depth and matte attributes * * @param self this object * @param pixel_arg the pixel * @return the color name */ VALUE Image_to_color(VALUE self, VALUE pixel_arg) { Image *image; Pixel *pixel; ExceptionInfo exception; char name[MaxTextExtent]; image = rm_check_destroyed(self); Data_Get_Struct(pixel_arg, Pixel, pixel); GetExceptionInfo(&exception); // QueryColorname returns False if the color represented by the PixelPacket // doesn't have a "real" name, just a sequence of hex digits. We don't care // about that. name[0] = '\0'; (void) QueryColorname(image, pixel, AllCompliance, name, &exception); CHECK_EXCEPTION() (void) DestroyExceptionInfo(&exception); return rb_str_new2(name); } /** * Alias for Image#number_colors. * * Ruby usage: * - @verbatim Image#total_colors @endverbatim * * Notes: * - This used to be a direct reference to the `total_colors' field in Image * but that field is not reliable. * * @param self this object * @return number of unique colors * @see Image_number_colors */ VALUE Image_total_colors(VALUE self) { return Image_number_colors(self); } /** * Return value from GetImageTotalInkDensity. * * Ruby usage: * - @verbatim Image#total_ink_density @endverbatim * * Notes: * - Raises an exception if the image is not CMYK * * @param self this object * @return the total ink density */ VALUE Image_total_ink_density(VALUE self) { Image *image; double density; image = rm_check_destroyed(self); density = GetImageTotalInkDensity(image); rm_check_image_exception(image, RetainOnError); return rb_float_new(density); } /** * Call TransparentPaintImage. * * Ruby usage: * - @verbatim Image#transparent(color-name) @endverbatim * - @verbatim Image#transparent(color-name, opacity) @endverbatim * - @verbatim Image#transparent(pixel) @endverbatim * - @verbatim Image#transparent(pixel, opacity) @endverbatim * * Notes: * - Default opacity is Magick::TransparentOpacity. * - Can use Magick::OpaqueOpacity or Magick::TransparentOpacity, or any * value >= 0 && <= QuantumRange. * - Use Image#fuzz= to define the tolerance level. * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_transparent(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; MagickPixelPacket color; Quantum opacity = TransparentOpacity; MagickBooleanType okay; image = rm_check_destroyed(self); switch (argc) { case 2: opacity = APP2QUANTUM(argv[1]); case 1: Color_to_MagickPixelPacket(image, &color, argv[0]); break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc); break; } new_image = rm_clone_image(image); #if defined(HAVE_TRANSPARENTPAINTIMAGE) okay = TransparentPaintImage(new_image, &color, opacity, MagickFalse); #else okay = PaintTransparentImage(new_image, &color, opacity); #endif rm_check_image_exception(new_image, DestroyOnError); if (!okay) { // Force exception DestroyImage(new_image); rm_magick_error("TransparentPaintImage failed with no explanation", NULL); } return rm_image_new(new_image); } /** * Call TransparentPaintImageChroma. * * Ruby usage: * - @verbatim Image#transparent_chroma(low, high) @endverbatim * - @verbatim Image#transparent_chroma(low, high, opacity) @endverbatim * - @verbatim Image#transparent_chroma(low, high, opacity, invert) @endverbatim * * Notes: * - Default opacity is TransparentOpacity * - Default invert is false * - Available in ImageMagick >= 6.4.5-6 * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_transparent_chroma(int argc, VALUE *argv, VALUE self) { #if defined(HAVE_TRANSPARENTPAINTIMAGECHROMA) Image *image, *new_image; Quantum opacity = TransparentOpacity; MagickPixelPacket low, high; MagickBooleanType invert = MagickFalse; MagickBooleanType okay; image = rm_check_destroyed(self); switch (argc) { case 4: invert = RTEST(argv[3]); case 3: opacity = APP2QUANTUM(argv[2]); case 2: Color_to_MagickPixelPacket(image, &high, argv[1]); Color_to_MagickPixelPacket(image, &low, argv[0]); break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 2, 3 or 4)", argc); break; } new_image = rm_clone_image(image); okay = TransparentPaintImageChroma(new_image, &low, &high, opacity, invert); rm_check_image_exception(new_image, DestroyOnError); if (!okay) { // Force exception DestroyImage(new_image); rm_magick_error("TransparentPaintImageChroma failed with no explanation", NULL); } return rm_image_new(new_image); #else rm_not_implemented(); return (VALUE)0; argc = argc; argv = argv; self = self; #endif } /** * Return the name of the transparent color as a String. * * Ruby usage: * - @verbatim Image#transparent_color @endverbatim * * @param self this object * @return the name of the transparent color */ VALUE Image_transparent_color(VALUE self) { Image *image = rm_check_destroyed(self); return rm_pixelpacket_to_color_name(image, &image->transparent_color); } /** * Set the the transparent color to the specified color spec. * * Ruby usage: * - @verbatim Image#transparent_color= @endverbatim * * @param self this object * @param color the transparent color * @return self */ VALUE Image_transparent_color_eq(VALUE self, VALUE color) { Image *image = rm_check_frozen(self); Color_to_PixelPacket(&image->transparent_color, color); return self; } /** * Call TransposeImage. * * Ruby usage: * - @verbatim Image#transpose @endverbatim * * @param self this object * @return a new image * @see crisscross * @see Image_transpose_bang */ VALUE Image_transpose(VALUE self) { (void) rm_check_destroyed(self); return crisscross(False, self, TransposeImage); } /** * Call TransposeImage. * * Ruby usage: * - @verbatim Image#transpose! @endverbatim * * @param self this object * @return self * @see crisscross * @see Image_transpose */ VALUE Image_transpose_bang(VALUE self) { (void) rm_check_frozen(self); return crisscross(True, self, TransposeImage); } /** * Call TransverseImage. * * Ruby usage: * - @verbatim Image#transverse @endverbatim * * @param self this object * @return a new image * @see crisscross * @see Image_transverse_bang */ VALUE Image_transverse(VALUE self) { (void) rm_check_destroyed(self); return crisscross(False, self, TransverseImage); } /** * Call TransverseImage. * * Ruby usage: * - @verbatim Image#transverse! @endverbatim * * @param self this object * @return self * @see crisscross * @see Image_transverse_bang */ VALUE Image_transverse_bang(VALUE self) { (void) rm_check_frozen(self); return crisscross(True, self, TransverseImage); } /** * Convenient front-end to CropImage. * * No Ruby usage (internal function) * * Notes: * - Respects fuzz attribute. * * @param bang whether the bang (!) version of the method was called * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self if bang, otherwise a new image * @see Image_trim * @see Image_trim_bang */ static VALUE trimmer(int bang, int argc, VALUE *argv, VALUE self) { Image *image, *new_image; ExceptionInfo exception; int reset_page = 0; switch (argc) { case 1: reset_page = RTEST(argv[0]); case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (expecting 0 or 1, got %d)", argc); break; } Data_Get_Struct(self, Image, image); GetExceptionInfo(&exception); new_image = TrimImage(image, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); if (reset_page) { ResetImagePage(new_image, "0x0+0+0"); } if (bang) { UPDATE_DATA_PTR(self, new_image); (void) rm_image_destroy(image); return self; } return rm_image_new(new_image); } /** * Convenient front-end to CropImage. * * Ruby usage: * - @verbatim Image#trim @endverbatim * - @verbatim Image#trim(reset_page) @endverbatim * * Notes: * - Default reset_page is false * - Respects fuzz attribute. * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image * @see trimmer * @see Image_trim_bang */ VALUE Image_trim(int argc, VALUE *argv, VALUE self) { (void) rm_check_destroyed(self); return trimmer(False, argc, argv, self); } /** * Convenient front-end to CropImage. * * Ruby usage: * - @verbatim Image#trim! @endverbatim * - @verbatim Image#trim!(reset_page) @endverbatim * * Notes: * - Default reset_page is false * - Respects fuzz attribute. * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self * @see trimmer * @see Image_trim */ VALUE Image_trim_bang(int argc, VALUE *argv, VALUE self) { (void) rm_check_frozen(self); return trimmer(True, argc, argv, self); } /** * Get the image gravity attribute. * * Ruby usage: * - @verbatim Image#gravity @endverbatim * * @param self this object * @return the image gravity */ VALUE Image_gravity(VALUE self) { Image *image = rm_check_destroyed(self); return GravityType_new(image->gravity); } /** * Set the image gravity attribute. * * Ruby usage: * - @verbatim Image#gravity= @endverbatim * * @param self this object * @param gravity the image gravity * @return the image gravity */ VALUE Image_gravity_eq(VALUE self, VALUE gravity) { Image *image = rm_check_frozen(self); VALUE_TO_ENUM(gravity, image->gravity, GravityType); return gravity; } /** * Call GetImageType to get the image type. * * Ruby usage: * - @verbatim Image#image_type @endverbatim * * @param self this object * @return the image type */ VALUE Image_image_type(VALUE self) { Image *image; ImageType type; ExceptionInfo exception; image = rm_check_destroyed(self); GetExceptionInfo(&exception); type = GetImageType(image, &exception); CHECK_EXCEPTION() (void) DestroyExceptionInfo(&exception); return ImageType_new(type); } /** * Call SetImageType to set the image type. * * Ruby usage: * - @verbatim Image#image_type= @endverbatim * * @param self this object * @param image_type the image type * @return the image type */ VALUE Image_image_type_eq(VALUE self, VALUE image_type) { Image *image; ImageType type; image = rm_check_frozen(self); VALUE_TO_ENUM(image_type, type, ImageType); SetImageType(image, type); return image_type; } /** * Call RemoveImageArtifact. * * Ruby usage: * - @verbatim Image#undefine(artifact) @endverbatim * * Notes: * - Normally a script should never call this method. * * @param self this object * @param artifact the artifact * @return self * @see Image_define */ VALUE Image_undefine(VALUE self, VALUE artifact) { #if defined(HAVE_REMOVEIMAGEARTIFACT) Image *image; char *key; long key_l; image = rm_check_frozen(self); key = rm_str2cstr(artifact, &key_l); (void) RemoveImageArtifact(image, key); return self; #else rm_not_implemented(); artifact = artifact; self = self; return(VALUE)0; #endif } /** * Call UniqueImageColors. * * Ruby usage: * - @verbatim Image#unique_colors @endverbatim * * @param self this object * @return a new image */ VALUE Image_unique_colors(VALUE self) { Image *image, *new_image; ExceptionInfo exception; image = rm_check_destroyed(self); GetExceptionInfo(&exception); new_image = UniqueImageColors(image, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Get the resolution type field. * * Ruby usage: * - @verbatim Image#units @endverbatim * * @param self this object * @return the resolution type */ VALUE Image_units(VALUE self) { Image *image = rm_check_destroyed(self); return ResolutionType_new(image->units); } /** * Set the resolution type field. * * Ruby usage: * - @verbatim Image#units= @endverbatim * * @param self this object * @param restype the resolution type * @return self */ VALUE Image_units_eq(VALUE self, VALUE restype) { ResolutionType units; Image *image = rm_check_frozen(self); VALUE_TO_ENUM(restype, units, ResolutionType); if (image->units != units) { switch (image->units) { case PixelsPerInchResolution: if (units == PixelsPerCentimeterResolution) { image->x_resolution /= 2.54; image->y_resolution /= 2.54; } break; case PixelsPerCentimeterResolution: if (units == PixelsPerInchResolution) { image->x_resolution *= 2.54; image->y_resolution *= 2.54; } break; default: // UndefinedResolution image->x_resolution = 0.0; image->y_resolution = 0.0; break; } image->units = units; } return self; } /** * Sharpen an image. "amount" is the percentage of the difference between the * original and the blur image that is added back into the original. "threshold" * is the threshold in pixels needed to apply the diffence amount. * * No Ruby usage (internal function) * * @param argc number of input arguments * @param argv array of input arguments * @param radious the radious * @param sigma the sigma * @param amount the amount * @param threshold the threshold * @see Image_unsharp_mask */ static void unsharp_mask_args(int argc, VALUE *argv, double *radius, double *sigma , double *amount, double *threshold) { switch (argc) { case 4: *threshold = NUM2DBL(argv[3]); if (*threshold < 0.0) { rb_raise(rb_eArgError, "threshold must be >= 0.0"); } case 3: *amount = NUM2DBL(argv[2]); if (*amount <= 0.0) { rb_raise(rb_eArgError, "amount must be > 0.0"); } case 2: *sigma = NUM2DBL(argv[1]); if (*sigma == 0.0) { rb_raise(rb_eArgError, "sigma must be != 0.0"); } case 1: *radius = NUM2DBL(argv[0]); if (*radius < 0.0) { rb_raise(rb_eArgError, "radius must be >= 0.0"); } case 0: break; // This case can't occur if we're called from Image_unsharp_mask_channel // because it has already raised an exception for the the argc > 4 case. default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 to 4)", argc); } } /** * Sharpen an image. "amount" is the percentage of the difference between the * original and the blur image that is added back into the original. "threshold" * is the threshold in pixels needed to apply the diffence amount. * * Ruby usage: * - @verbatim Image#unsharp_mask @endverbatim * - @verbatim Image#unsharp_mask(radius) @endverbatim * - @verbatim Image#unsharp_mask(radius, sigma) @endverbatim * - @verbatim Image#unsharp_mask(radius, sigma, amount) @endverbatim * - @verbatim Image#unsharp_mask(radius, sigma, amount, threshold) @endverbatim * * Notes: * - Default radius is 0.0 * - Default sigma is 1.0 * - Default amount is 1.0 * - Default threshold is 0.05 * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image * @see unsharp_mask_args */ VALUE Image_unsharp_mask(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; double radius = 0.0, sigma = 1.0, amount = 1.0, threshold = 0.05; ExceptionInfo exception; image = rm_check_destroyed(self); unsharp_mask_args(argc, argv, &radius, &sigma, &amount, &threshold); GetExceptionInfo(&exception); new_image = UnsharpMaskImage(image, radius, sigma, amount, threshold, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Call UnsharpMaskImageChannel. * * Ruby usage: * - @verbatim Image#unsharp_mask @endverbatim * - @verbatim Image#unsharp_mask(radius) @endverbatim * - @verbatim Image#unsharp_mask(radius, sigma) @endverbatim * - @verbatim Image#unsharp_mask(radius, sigma, amount) @endverbatim * - @verbatim Image#unsharp_mask(radius, sigma, amount, threshold) @endverbatim * - @verbatim Image#unsharp_mask(radius, sigma, amount, threshold, channel) @endverbatim * - @verbatim Image#unsharp_mask(radius, sigma, amount, threshold, channel, ...) @endverbatim * * Notes: * - Default radius is 0.0 * - Default sigma is 1.0 * - Default amount is 1.0 * - Default threshold is 0.05 * - Default channel is AllChannels * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image * @see unsharp_mask_args */ VALUE Image_unsharp_mask_channel(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; ChannelType channels; double radius = 0.0, sigma = 1.0, amount = 1.0, threshold = 0.05; ExceptionInfo exception; image = rm_check_destroyed(self); channels = extract_channels(&argc, argv); if (argc > 4) { raise_ChannelType_error(argv[argc-1]); } unsharp_mask_args(argc, argv, &radius, &sigma, &amount, &threshold); GetExceptionInfo(&exception); new_image = UnsharpMaskImageChannel(image, channels, radius, sigma, amount , threshold, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Soften the edges of an image. * * Ruby usage: * - @verbatim Image#vignette @endverbatim * - @verbatim Image#vignette(horz_radius) @endverbatim * - @verbatim Image#vignette(horz_radius, vert_radius) @endverbatim * - @verbatim Image#vignette(horz_radius, vert_radius, radius) @endverbatim * - @verbatim Image#vignette(horz_radius, vert_radius, radius, sigma) @endverbatim * * Notes: * - Default horz_radius is image-columns*0.1+0.5 * - Default vert_radius is image-rows*0.1+0.5 * - Default radius is 0.0 * - Default sigma is 1.0 * - The outer edges of the image are replaced by the background color. * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_vignette(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; long horz_radius, vert_radius; double radius = 0.0, sigma = 10.0; ExceptionInfo exception; image = rm_check_destroyed(self); horz_radius = (long)(image->columns * 0.10 + 0.5); vert_radius = (long)(image->rows * 0.10 + 0.5); switch (argc) { case 4: sigma = NUM2DBL(argv[3]); case 3: radius = NUM2DBL(argv[2]); case 2: vert_radius = NUM2INT(argv[1]); case 1: horz_radius = NUM2INT(argv[0]); case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 to 4)", argc); break; } GetExceptionInfo(&exception); new_image = VignetteImage(image, radius, sigma, horz_radius, vert_radius, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Get the VirtualPixelMethod for the image. * * Ruby usage: * - @verbatim Image#virtual_pixel_method @endverbatim * * @param self this object * @return the VirtualPixelMethod */ VALUE Image_virtual_pixel_method(VALUE self) { Image *image; VirtualPixelMethod vpm; image = rm_check_destroyed(self); vpm = GetImageVirtualPixelMethod(image); rm_check_image_exception(image, RetainOnError); return VirtualPixelMethod_new(vpm); } /** * Set the virtual pixel method for the image. * * Ruby usage: * - @verbatim Image#virtual_pixel_method= @endverbatim * * @param self this object * @param method the VirtualPixelMethod * @return self */ VALUE Image_virtual_pixel_method_eq(VALUE self, VALUE method) { Image *image; VirtualPixelMethod vpm; image = rm_check_frozen(self); VALUE_TO_ENUM(method, vpm, VirtualPixelMethod); (void) SetImageVirtualPixelMethod(image, vpm); rm_check_image_exception(image, RetainOnError); return self; } /** * Add a watermark to an image. * * Ruby usage: * - @verbatim Image#watermark(mark) @endverbatim * - @verbatim Image#watermark(mark, brightness) @endverbatim * - @verbatim Image#watermark(mark, brightness, saturation) @endverbatim * - @verbatim Image#watermark(mark, brightness, saturation, gravity) @endverbatim * - @verbatim Image#watermark(mark, brightness, saturation, gravity, x_off) @endverbatim * - @verbatim Image#watermark(mark, brightness, saturation, gravity, x_off, y_off) @endverbatim * - @verbatim Image#watermark(mark, brightness, saturation, x_off) @endverbatim * - @verbatim Image#watermark(mark, brightness, saturation, x_off, y_off) @endverbatim * * Notes: * - Default brightness is 100% * - Default saturation is 100% * - Default x_off is 0 * - Default y_off is 0 * - x_off and y_off can be negative, which means measure from the * right/bottom of the target image. * */ VALUE Image_watermark(int argc, VALUE *argv, VALUE self) { Image *image, *overlay, *new_image; double src_percent = 100.0, dst_percent = 100.0; long x_offset = 0L, y_offset = 0L; char geometry[20]; volatile VALUE ovly; image = rm_check_destroyed(self); if (argc < 1) { rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 to 6)", argc); } ovly = rm_cur_image(argv[0]); overlay = rm_check_destroyed(ovly); if (argc > 3) { get_composite_offsets(argc-3, &argv[3], image, overlay, &x_offset, &y_offset); // There must be 3 arguments left argc = 3; } switch (argc) { case 3: dst_percent = rm_percentage(argv[2],1.0) * 100.0; case 2: src_percent = rm_percentage(argv[1],1.0) * 100.0; case 1: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 2 to 6)", argc); break; } blend_geometry(geometry, sizeof(geometry), src_percent, dst_percent); (void) CloneString(&overlay->geometry, geometry); #if defined(HAVE_SETIMAGEARTIFACT) (void) SetImageArtifact(overlay,"compose:args", geometry); #endif new_image = rm_clone_image(image); (void) CompositeImage(new_image, ModulateCompositeOp, overlay, x_offset, y_offset); rm_check_image_exception(new_image, DestroyOnError); return rm_image_new(new_image); } /** * Create a "ripple" effect in the image by shifting the pixels vertically along * a sine wave whose amplitude and wavelength is specified by the given * parameters. * * Ruby usage: * - @verbatim Image#wave @endverbatim * - @verbatim Image#wave(amplitude) @endverbatim * - @verbatim Image#wave(amplitude, wavelength) @endverbatim * * Notes: * - Default amplitude is 25.0 * - Default wavelength is 150.0 * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE Image_wave(int argc, VALUE *argv, VALUE self) { Image *image, *new_image; double amplitude = 25.0, wavelength = 150.0; ExceptionInfo exception; image = rm_check_destroyed(self); switch (argc) { case 2: wavelength = NUM2DBL(argv[1]); case 1: amplitude = NUM2DBL(argv[0]); case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 to 2)", argc); break; } GetExceptionInfo(&exception); new_image = WaveImage(image, amplitude, wavelength, &exception); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Construct a "wet floor" reflection. * * Ruby usage: * - @verbatim Image#wet_floor @endverbatim * - @verbatim Image#wet_floor(initial) @endverbatim * - @verbatim Image#wet_floor(initial, rate) @endverbatim * * Notes: * - Default initial is 0.5 * - Default rate is 1.0 * - `initial' is a number between 0 and 1, inclusive, that represents the * initial level of transparency. Smaller numbers are less transparent than * larger numbers. 0 is fully opaque. 1.0 is fully transparent. * - `rate' is the rate at which the initial level of transparency changes to * complete transparency. Larger values cause the change to occur more * rapidly. The resulting reflection will be shorter. Smaller values cause * the change to occur less rapidly. The resulting reflection will be * taller. If the rate is exactly 0 then the amount of transparency doesn't * change at all. * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image * @see http://en.wikipedia.org/wiki/Wet_floor_effect */ VALUE Image_wet_floor(int argc, VALUE *argv, VALUE self) { Image *image, *reflection, *flip_image; const PixelPacket *p; PixelPacket *q; RectangleInfo geometry; long x, y, max_rows; double initial = 0.5; double rate = 1.0; double opacity, step; const char *func; ExceptionInfo exception; image = rm_check_destroyed(self); switch (argc) { case 2: rate = NUM2DBL(argv[1]); case 1: initial = NUM2DBL(argv[0]); case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 to 2)", argc); break; } if (initial < 0.0 || initial > 1.0) { rb_raise(rb_eArgError, "Initial transparency must be in the range 0.0-1.0 (%g)", initial); } if (rate < 0.0) { rb_raise(rb_eArgError, "Transparency change rate must be >= 0.0 (%g)", rate); } initial *= TransparentOpacity; // The number of rows in which to transition from the initial level of // transparency to complete transparency. rate == 0.0 -> no change. if (rate > 0.0) { max_rows = (long)((double)image->rows) / (3.0 * rate); max_rows = (long)min((unsigned long)max_rows, image->rows); step = (TransparentOpacity - initial) / max_rows; } else { max_rows = (long)image->rows; step = 0.0; } GetExceptionInfo(&exception); flip_image = FlipImage(image, &exception); CHECK_EXCEPTION(); geometry.x = 0; geometry.y = 0; geometry.width = image->columns; geometry.height = max_rows; reflection = CropImage(flip_image, &geometry, &exception); DestroyImage(flip_image); CHECK_EXCEPTION(); (void) SetImageStorageClass(reflection, DirectClass); rm_check_image_exception(reflection, DestroyOnError); reflection->matte = MagickTrue; opacity = initial; for (y = 0; y < max_rows; y++) { if (opacity > TransparentOpacity) { opacity = TransparentOpacity; } #if defined(HAVE_GETVIRTUALPIXELS) p = GetVirtualPixels(reflection, 0, y, image->columns, 1, &exception); #else p = AcquireImagePixels(reflection, 0, y, image->columns, 1, &exception); #endif rm_check_exception(&exception, reflection, DestroyOnError); if (!p) { func = "AcquireImagePixels"; goto error; } #if defined(HAVE_QUEUEAUTHENTICPIXELS) q = QueueAuthenticPixels(reflection, 0, y, image->columns, 1, &exception); #else q = SetImagePixels(reflection, 0, y, image->columns, 1); #endif rm_check_exception(&exception, reflection, DestroyOnError); if (!q) { func = "SetImagePixels"; goto error; } for (x = 0; x < (long) image->columns; x++) { q[x] = p[x]; // Never make a pixel *less* transparent than it already is. q[x].opacity = max(q[x].opacity, (Quantum)opacity); } #if defined(HAVE_SYNCAUTHENTICPIXELS) SyncAuthenticPixels(reflection, &exception); rm_check_exception(&exception, reflection, DestroyOnError); #else SyncImagePixels(reflection); rm_check_image_exception(reflection, DestroyOnError); #endif opacity += step; } (void) DestroyExceptionInfo(&exception); return rm_image_new(reflection); error: (void) DestroyExceptionInfo(&exception); (void) DestroyImage(reflection); rb_raise(rb_eRuntimeError, "%s failed on row %lu", func, y); return(VALUE)0; } /** * Call WhiteThresholdImage. * * Ruby usage: * - @verbatim Image#white_threshold(red_channel) @endverbatim * - @verbatim Image#white_threshold(red_channel, green_channel) @endverbatim * - @verbatim Image#white_threshold(red_channel, green_channel, blue_channel) @endverbatim * - @verbatim Image#white_threshold(red_channel, green_channel, blue_channel, opacity_channel) @endverbatim * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image * @see threshold_image * @see Image_black_threshold */ VALUE Image_white_threshold(int argc, VALUE *argv, VALUE self) { return threshold_image(argc, argv, self, WhiteThresholdImage); } /** * Copy the filename to the Info and to the Image. Add format prefix if * necessary. This complicated code is necessary to handle filenames like the * kind Tempfile.new produces, which have an "extension" in the form ".n", which * confuses SetMagickInfo. So we don't use SetMagickInfo any longer. * * No Ruby usage (internal function) * * @param info the Info * @param file the file */ void add_format_prefix(Info *info, VALUE file) { char *filename; long filename_l; const MagickInfo *magick_info, *magick_info2; ExceptionInfo exception; char magic[MaxTextExtent]; size_t magic_l; size_t prefix_l; char *p; // Convert arg to string. If an exception occurs raise an error condition. file = rb_rescue(rb_String, file, file_arg_rescue, file); filename = rm_str2cstr(file, &filename_l); if (*info->magick == '\0') { memset(info->filename, 0, sizeof(info->filename)); memcpy(info->filename, filename, (size_t)min(filename_l, MaxTextExtent-1)); return; } // If the filename starts with a prefix, and it's a valid image format // prefix, then check for a conflict. If it's not a valid format prefix, // ignore it. p = memchr(filename, ':', (size_t)filename_l); if (p) { memset(magic, '\0', sizeof(magic)); magic_l = p - filename; memcpy(magic, filename, magic_l); GetExceptionInfo(&exception); magick_info = GetMagickInfo(magic, &exception); CHECK_EXCEPTION(); DestroyExceptionInfo(&exception); if (magick_info && magick_info->module) { // We have to compare the module names because some formats have // more than one name. JPG and JPEG, for example. GetExceptionInfo(&exception); magick_info2 = GetMagickInfo(info->magick, &exception); CHECK_EXCEPTION(); DestroyExceptionInfo(&exception); if (magick_info2->module && strcmp(magick_info->module, magick_info2->module) != 0) { rb_raise(rb_eRuntimeError , "filename prefix `%s' conflicts with output format `%s'" , magick_info->name, info->magick); } // The filename prefix already matches the specified format. // Just copy the filename as-is. memset(info->filename, 0, sizeof(info->filename)); filename_l = min((size_t)filename_l, sizeof(info->filename)); memcpy(info->filename, filename, (size_t)filename_l); return; } } // The filename doesn't start with a format prefix. Add the format from // the image info as the filename prefix. memset(info->filename, 0, sizeof(info->filename)); prefix_l = min(sizeof(info->filename)-1, strlen(info->magick)); memcpy(info->filename, info->magick, prefix_l); info->filename[prefix_l++] = ':'; filename_l = min(sizeof(info->filename) - prefix_l - 1, (size_t)filename_l); memcpy(info->filename+prefix_l, filename, (size_t)filename_l); info->filename[prefix_l+filename_l] = '\0'; return; } /** * Write the image to the file. * * Ruby usage: * - @verbatim Image#write(filename) @endverbatim * * @param self this object * @param file the filename * @return self */ VALUE Image_write(VALUE self, VALUE file) { Image *image; Info *info; volatile VALUE info_obj; image = rm_check_destroyed(self); info_obj = rm_info_new(); Data_Get_Struct(info_obj, Info, info); if (TYPE(file) == T_FILE) { OpenFile *fptr; // Ensure file is open - raise error if not GetOpenFile(file, fptr); rb_io_check_writable(fptr); SetImageInfoFile(info, GetWriteFile(fptr)); memset(image->filename, 0, sizeof(image->filename)); } else { add_format_prefix(info, file); strcpy(image->filename, info->filename); SetImageInfoFile(info, NULL); } rm_sync_image_options(image, info); info->adjoin = MagickFalse; (void) WriteImage(info, image); rm_check_image_exception(image, RetainOnError); return self; } DEF_ATTR_ACCESSOR(Image, x_resolution, dbl) DEF_ATTR_ACCESSOR(Image, y_resolution, dbl) /** * Determine if the argument list is x, y, width, height * or * gravity, width, height * or * gravity, x, y, width, height * * If the 2nd or 3rd, compute new x, y values. * * The argument list can have a trailing true, false, or nil argument. If * present and true, after cropping reset the page fields in the image. * * No Ruby usage (internal function) * * Notes: * - Call xform_image to do the cropping. * * @param bang whether the bang (!) version of the method was called * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self if bang, otherwise a new image * @see xform_image */ static VALUE cropper(int bang, int argc, VALUE *argv, VALUE self) { volatile VALUE x, y, width, height; unsigned long nx = 0, ny = 0; unsigned long columns, rows; int reset_page = 0; GravityType gravity; Image *image; VALUE cropped; // Check for a "reset page" trailing argument. if (argc >= 1) { switch (TYPE(argv[argc-1])) { case T_TRUE: reset_page = 1; // fall thru case T_FALSE: case T_NIL: argc -= 1; default: break; } } switch (argc) { case 5: Data_Get_Struct(self, Image, image); VALUE_TO_ENUM(argv[0], gravity, GravityType); x = argv[1]; y = argv[2]; width = argv[3]; height = argv[4]; nx = NUM2ULONG(x); ny = NUM2ULONG(y); columns = NUM2ULONG(width); rows = NUM2ULONG(height); switch (gravity) { case NorthEastGravity: case EastGravity: case SouthEastGravity: nx = image->columns - columns - nx; break; case NorthGravity: case SouthGravity: case CenterGravity: case StaticGravity: nx += image->columns/2 - columns/2; break; default: break; } switch (gravity) { case SouthWestGravity: case SouthGravity: case SouthEastGravity: ny = image->rows - rows - ny; break; case EastGravity: case WestGravity: case CenterGravity: case StaticGravity: ny += image->rows/2 - rows/2; break; case NorthEastGravity: case NorthGravity: default: break; } x = ULONG2NUM(nx); y = ULONG2NUM(ny); break; case 4: x = argv[0]; y = argv[1]; width = argv[2]; height = argv[3]; break; case 3: // Convert the width & height arguments to unsigned longs. // Compute the x & y offsets from the gravity and then // convert them to VALUEs. VALUE_TO_ENUM(argv[0], gravity, GravityType); width = argv[1]; height = argv[2]; columns = NUM2ULONG(width); rows = NUM2ULONG(height); Data_Get_Struct(self, Image, image); switch (gravity) { case ForgetGravity: case NorthWestGravity: nx = 0; ny = 0; break; case NorthGravity: nx = (image->columns - columns) / 2; ny = 0; break; case NorthEastGravity: nx = image->columns - columns; ny = 0; break; case WestGravity: nx = 0; ny = (image->rows - rows) / 2; break; case EastGravity: nx = image->columns - columns; ny = (image->rows - rows) / 2; break; case SouthWestGravity: nx = 0; ny = image->rows - rows; break; case SouthGravity: nx = (image->columns - columns) / 2; ny = image->rows - rows; break; case SouthEastGravity: nx = image->columns - columns; ny = image->rows - rows; break; case StaticGravity: case CenterGravity: nx = (image->columns - columns) / 2; ny = (image->rows - rows) / 2; break; } x = ULONG2NUM(nx); y = ULONG2NUM(ny); break; default: if (reset_page) { rb_raise(rb_eArgError, "wrong number of arguments (%d for 4, 5, or 6)", argc); } else { rb_raise(rb_eArgError, "wrong number of arguments (%d for 3, 4, or 5)", argc); } break; } cropped = xform_image(bang, self, x, y, width, height, CropImage); if (reset_page) { Data_Get_Struct(cropped, Image, image); ResetImagePage(image, "0x0+0+0"); } return cropped; } /** * Call one of the image transformation functions. * * No Ruby usage (internal function) * * @param bang whether the bang (!) version of the method was called * @param self this object * @param x x position of start of region * @param y y position of start of region * @param width width of region * @param height height of region * @param xformer the transformation function * @return self if bang, otherwise a new image */ static VALUE xform_image(int bang, VALUE self, VALUE x, VALUE y, VALUE width, VALUE height, xformer_t xformer) { Image *image, *new_image; RectangleInfo rect; ExceptionInfo exception; Data_Get_Struct(self, Image, image); rect.x = NUM2LONG(x); rect.y = NUM2LONG(y); rect.width = NUM2ULONG(width); rect.height = NUM2ULONG(height); GetExceptionInfo(&exception); new_image = (xformer)(image, &rect, &exception); // An exception can occur in either the old or the new images rm_check_image_exception(image, RetainOnError); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); if (bang) { UPDATE_DATA_PTR(self, new_image); (void) rm_image_destroy(image); return self; } return rm_image_new(new_image); } /** * Remove all the ChannelType arguments from the end of the argument list. * * No Ruby usage (internal function) * * Notes: * - Returns DefaultChannels if no channel arguments were found. * - Returns the number of remaining arguments. * * @param argc number of input arguments * @param argv array of input arguments * @return A ChannelType value suitable for passing into an xMagick function. */ ChannelType extract_channels(int *argc, VALUE *argv) { volatile VALUE arg; ChannelType channels, ch_arg; channels = 0; while (*argc > 0) { arg = argv[(*argc)-1]; // Stop when you find a non-ChannelType argument if (CLASS_OF(arg) != Class_ChannelType) { break; } VALUE_TO_ENUM(arg, ch_arg, ChannelType); channels |= ch_arg; *argc -= 1; } if (channels == 0) { channels = DefaultChannels; } return channels; } /** * Raise TypeError when an non-ChannelType object is unexpectedly encountered. * * No Ruby usage (internal function) * * @param arg the argument */ void raise_ChannelType_error(VALUE arg) { rb_raise(rb_eTypeError, "argument must be a ChannelType value (%s given)" , rb_class2name(CLASS_OF(arg))); } /** * If Magick.trace_proc is not nil, build an argument list and call the proc. * * No Ruby usage (internal function) * * @param image the image * @param which which operation the proc is being called for */ static void call_trace_proc(Image *image, const char *which) { volatile VALUE trace; VALUE trace_args[4]; if (rb_ivar_defined(Module_Magick, rm_ID_trace_proc) == Qtrue) { trace = rb_ivar_get(Module_Magick, rm_ID_trace_proc); if (!NIL_P(trace)) { // Maybe the stack won't get extended until we need the space. char buffer[MaxTextExtent]; int n; trace_args[0] = ID2SYM(rb_intern(which)); build_inspect_string(image, buffer, sizeof(buffer)); trace_args[1] = rb_str_new2(buffer); n = sprintf(buffer, "%p", (void *)image); buffer[n] = '\0'; trace_args[2] = rb_str_new2(buffer+2); // don't use leading 0x trace_args[3] = ID2SYM(THIS_FUNC()); (void) rb_funcall2(trace, rm_ID_call, 4, (VALUE *)trace_args); } } } /** * Trace image creation * * No Ruby usage (internal function) * * @param image the image * @see call_trace_proc */ void rm_trace_creation(Image *image) { call_trace_proc(image, "c"); } /** * Destroy an image. Called from GC when all references to the image have gone * out of scope. * * No Ruby usage (internal function) * * Notes: * - A NULL Image pointer indicates that the image has already been destroyed * by Image#destroy! * * @param img the image */ void rm_image_destroy(void *img) { Image *image = (Image *)img; if (img != NULL) { call_trace_proc(image, "d"); (void) DestroyImage(image); } } rmagick-2.13.2/ext/RMagick/MANIFEST0000644000004100000410000001672712147515547016542 0ustar www-datawww-dataMANIFEST for RMagick-2.13.2 - 16:03:50 02/02/13 ChangeLog Doxyfile README-Mac-OSX.txt README.html build_tarball.rake doc/.cvsignore doc/comtasks.html doc/constants.html doc/css/doc.css doc/css/popup.css doc/css/ref.css doc/draw.html doc/ex/InitialCoords.rb doc/ex/NewCoordSys.rb doc/ex/OrigCoordSys.rb doc/ex/PreserveAspectRatio.rb doc/ex/RotateScale.rb doc/ex/Skew.rb doc/ex/Use01.rb doc/ex/Use02.rb doc/ex/Use03.rb doc/ex/ViewBox.rb doc/ex/adaptive_threshold.rb doc/ex/add_noise.rb doc/ex/affine.rb doc/ex/affine_transform.rb doc/ex/arc.rb doc/ex/arcpath.rb doc/ex/arcs01.rb doc/ex/arcs02.rb doc/ex/average.rb doc/ex/axes.rb doc/ex/baseline_shift01.rb doc/ex/bilevel_channel.rb doc/ex/blur_image.rb doc/ex/border.rb doc/ex/bounding_box.rb doc/ex/cbezier1.rb doc/ex/cbezier2.rb doc/ex/cbezier3.rb doc/ex/cbezier4.rb doc/ex/cbezier5.rb doc/ex/cbezier6.rb doc/ex/channel.rb doc/ex/charcoal.rb doc/ex/chop.rb doc/ex/circle.rb doc/ex/circle01.rb doc/ex/clip_path.rb doc/ex/coalesce.rb doc/ex/color_fill_to_border.rb doc/ex/color_floodfill.rb doc/ex/color_histogram.rb doc/ex/color_reset.rb doc/ex/colorize.rb doc/ex/colors.rb doc/ex/compose_mask.rb doc/ex/composite.rb doc/ex/composite_layers.rb doc/ex/composite_tiled.rb doc/ex/contrast.rb doc/ex/crop.rb doc/ex/crop_with_gravity.rb doc/ex/cubic01.rb doc/ex/cubic02.rb doc/ex/cycle_colormap.rb doc/ex/dissolve.rb doc/ex/drawcomp.rb doc/ex/drop_shadow.rb doc/ex/edge.rb doc/ex/ellipse.rb doc/ex/ellipse01.rb doc/ex/emboss.rb doc/ex/enhance.rb doc/ex/equalize.rb doc/ex/evenodd.rb doc/ex/fill_pattern.rb doc/ex/flatten_images.rb doc/ex/flip.rb doc/ex/flop.rb doc/ex/font_styles.rb doc/ex/fonts.rb doc/ex/frame.rb doc/ex/gaussian_blur.rb doc/ex/get_multiline_type_metrics.rb doc/ex/get_pixels.rb doc/ex/get_type_metrics.rb doc/ex/gradientfill.rb doc/ex/grav.rb doc/ex/gravity.rb doc/ex/group.rb doc/ex/hatchfill.rb doc/ex/image.rb doc/ex/images/Apple.miff doc/ex/images/Ballerina.jpg doc/ex/images/Ballerina3.jpg doc/ex/images/Button_0.gif doc/ex/images/Button_1.gif doc/ex/images/Button_2.gif doc/ex/images/Button_3.gif doc/ex/images/Button_4.gif doc/ex/images/Button_5.gif doc/ex/images/Button_6.gif doc/ex/images/Button_7.gif doc/ex/images/Button_8.gif doc/ex/images/Button_9.gif doc/ex/images/Button_A.gif doc/ex/images/Button_B.gif doc/ex/images/Button_C.gif doc/ex/images/Button_D.gif doc/ex/images/Button_E.gif doc/ex/images/Button_F.gif doc/ex/images/Button_G.gif doc/ex/images/Button_H.gif doc/ex/images/Button_I.gif doc/ex/images/Button_J.gif doc/ex/images/Button_K.gif doc/ex/images/Button_L.gif doc/ex/images/Button_M.gif doc/ex/images/Button_N.gif doc/ex/images/Button_O.gif doc/ex/images/Button_P.gif doc/ex/images/Button_Q.gif doc/ex/images/Button_R.gif doc/ex/images/Button_S.gif doc/ex/images/Button_T.gif doc/ex/images/Button_U.gif doc/ex/images/Button_V.gif doc/ex/images/Button_W.gif doc/ex/images/Button_X.gif doc/ex/images/Button_Y.gif doc/ex/images/Button_Z.gif doc/ex/images/Cheetah.jpg doc/ex/images/Coffee.wmf doc/ex/images/Flower_Hat.jpg doc/ex/images/Gold_Statue.jpg doc/ex/images/Hot_Air_Balloons.jpg doc/ex/images/Hot_Air_Balloons_H.jpg doc/ex/images/Leaf.miff doc/ex/images/No.wmf doc/ex/images/Polynesia.jpg doc/ex/images/Red_Rocks.jpg doc/ex/images/Rocks_On_Beach.miff doc/ex/images/Shorts.jpg doc/ex/images/Snake.wmf doc/ex/images/Violin.jpg doc/ex/images/Yellow_Rose.miff doc/ex/images/big-duck.gif doc/ex/images/duck.gif doc/ex/images/duck0.gif doc/ex/images/duck1.gif doc/ex/images/duck10.gif doc/ex/images/duck11.gif doc/ex/images/duck12.gif doc/ex/images/duck13.gif doc/ex/images/duck14.gif doc/ex/images/duck15.gif doc/ex/images/duck2.gif doc/ex/images/duck3.gif doc/ex/images/duck4.gif doc/ex/images/duck5.gif doc/ex/images/duck6.gif doc/ex/images/duck7.gif doc/ex/images/duck8.gif doc/ex/images/duck9.gif doc/ex/images/graydient230x6.gif doc/ex/images/logo400x83.gif doc/ex/images/model.miff doc/ex/images/notimplemented.gif doc/ex/images/smile.miff doc/ex/images/spin.gif doc/ex/implode.rb doc/ex/level.rb doc/ex/level_colors.rb doc/ex/line.rb doc/ex/line01.rb doc/ex/mask.rb doc/ex/matte_fill_to_border.rb doc/ex/matte_floodfill.rb doc/ex/matte_replace.rb doc/ex/median_filter.rb doc/ex/modulate.rb doc/ex/mono.rb doc/ex/morph.rb doc/ex/mosaic.rb doc/ex/motion_blur.rb doc/ex/negate.rb doc/ex/negate_channel.rb doc/ex/nested_rvg.rb doc/ex/nonzero.rb doc/ex/normalize.rb doc/ex/oil_paint.rb doc/ex/opacity.rb doc/ex/ordered_dither.rb doc/ex/path.rb doc/ex/pattern1.rb doc/ex/pattern2.rb doc/ex/polaroid.rb doc/ex/polygon.rb doc/ex/polygon01.rb doc/ex/polyline.rb doc/ex/polyline01.rb doc/ex/posterize.rb doc/ex/preview.rb doc/ex/qbezierpath.rb doc/ex/quad01.rb doc/ex/quantize-m.rb doc/ex/radial_blur.rb doc/ex/raise.rb doc/ex/random_threshold_channel.rb doc/ex/rect01.rb doc/ex/rect02.rb doc/ex/rectangle.rb doc/ex/reduce_noise.rb doc/ex/remap.rb doc/ex/remap_images.rb doc/ex/resize_to_fill.rb doc/ex/resize_to_fit.rb doc/ex/roll.rb doc/ex/rotate.rb doc/ex/rotate_f.rb doc/ex/roundrect.rb doc/ex/rubyname.rb doc/ex/rvg_clippath.rb doc/ex/rvg_linecap.rb doc/ex/rvg_linejoin.rb doc/ex/rvg_opacity.rb doc/ex/rvg_pattern.rb doc/ex/rvg_stroke_dasharray.rb doc/ex/segment.rb doc/ex/sepiatone.rb doc/ex/shade.rb doc/ex/shadow.rb doc/ex/shave.rb doc/ex/shear.rb doc/ex/sketch.rb doc/ex/skewx.rb doc/ex/skewy.rb doc/ex/smile.rb doc/ex/solarize.rb doc/ex/sparse_color.rb doc/ex/splice.rb doc/ex/spread.rb doc/ex/stegano.rb doc/ex/stroke_dasharray.rb doc/ex/stroke_fill.rb doc/ex/stroke_linecap.rb doc/ex/stroke_linejoin.rb doc/ex/stroke_width.rb doc/ex/swirl.rb doc/ex/text.rb doc/ex/text01.rb doc/ex/text_align.rb doc/ex/text_antialias.rb doc/ex/text_styles.rb doc/ex/text_undercolor.rb doc/ex/texture_fill_to_border.rb doc/ex/texture_floodfill.rb doc/ex/texturefill.rb doc/ex/threshold.rb doc/ex/to_blob.rb doc/ex/translate.rb doc/ex/transparent.rb doc/ex/transpose.rb doc/ex/transverse.rb doc/ex/tref01.rb doc/ex/triangle01.rb doc/ex/trim.rb doc/ex/tspan01.rb doc/ex/tspan02.rb doc/ex/tspan03.rb doc/ex/unsharp_mask.rb doc/ex/viewex.rb doc/ex/vignette.rb doc/ex/watermark.rb doc/ex/wave.rb doc/ex/wet_floor.rb doc/ex/writing_mode01.rb doc/ex/writing_mode02.rb doc/ilist.html doc/image1.html doc/image2.html doc/image3.html doc/imageattrs.html doc/imusage.html doc/index.html doc/info.html doc/magick.html doc/optequiv.html doc/rvg.html doc/rvgclip.html doc/rvggroup.html doc/rvgimage.html doc/rvgpattern.html doc/rvgshape.html doc/rvgstyle.html doc/rvgtext.html doc/rvgtspan.html doc/rvgtut.html doc/rvguse.html doc/rvgxform.html doc/scripts/doc.js doc/scripts/stripeTables.js doc/struct.html doc/usage.html examples/constitute.rb examples/crop_with_gravity.rb examples/demo.rb examples/describe.rb examples/find_similar_region.rb examples/histogram.rb examples/identify.rb examples/image_opacity.rb examples/import_export.rb examples/pattern_fill.rb examples/rotating_text.rb examples/spinner.rb examples/thumbnail.rb examples/vignette.rb ext/RMagick/MANIFEST ext/RMagick/extconf.rb ext/RMagick/rmagick.c ext/RMagick/rmagick.h ext/RMagick/rmdraw.c ext/RMagick/rmenum.c ext/RMagick/rmfill.c ext/RMagick/rmilist.c ext/RMagick/rmimage.c ext/RMagick/rminfo.c ext/RMagick/rmmain.c ext/RMagick/rmmontage.c ext/RMagick/rmpixel.c ext/RMagick/rmstruct.c ext/RMagick/rmutil.c lib/RMagick.rb lib/rvg/clippath.rb lib/rvg/container.rb lib/rvg/deep_equal.rb lib/rvg/describable.rb lib/rvg/embellishable.rb lib/rvg/misc.rb lib/rvg/paint.rb lib/rvg/pathdata.rb lib/rvg/rvg.rb lib/rvg/stretchable.rb lib/rvg/stylable.rb lib/rvg/text.rb lib/rvg/transformable.rb lib/rvg/units.rb metaconfig post-clean.rb post-install.rb post-setup.rb rmagick.gemspec setup.rb uninstall.rb rmagick-2.13.2/ext/RMagick/rmagick.h0000644000004100000410000013562012147515547017171 0ustar www-datawww-data/**************************************************************************//** * RMagick declarations and definitions. * * Copyright © 2002 - 2009 by Timothy P. Hunter * * Changes since Nov. 2009 copyright © by Benjamin Thomas and Omer Bar-or * * @file rmagick.h * @version $Id: rmagick.h,v 1.282 2010/02/16 06:50:28 baror Exp $ * @author Tim Hunter ******************************************************************************/ #ifndef _RMAGICK_H_ #define _RMAGICK_H_ //! Suppress warnings about deprecated functions on Windows #define _CRT_SECURE_NO_DEPRECATE 1 #include #include #include #if defined(HAVE_STDINT_H) #include #endif #include #include #include #if defined(HAVE_SYS_TYPES_H) #include #endif #include "ruby.h" #if defined(HAVE_RUBY_IO_H) #include "ruby/io.h" // >= 1.9.0-5 #else #include "rubyio.h" #endif // Undef Ruby's versions of these symbols #undef PACKAGE_VERSION #undef PACKAGE_NAME #undef PACKAGE_STRING #undef PACKAGE_BUGREPORT #undef PACKAGE_TARNAME #undef WORDS_BIGENDIAN #include "magick/MagickCore.h" #include "magick/magick-config.h" // Undef ImageMagick's versions of these symbols #undef PACKAGE_STRING #include "extconf.h" //! For quoting preprocessor symbols #define Q2(q) #q //! For quoting preprocessor symbols #define Q(q) Q2(q) //! Trace new image creation in bang methods #define UPDATE_DATA_PTR(_obj_, _new_) \ do { (void) rm_trace_creation(_new_);\ DATA_PTR(_obj_) = (void *)(_new_);\ } while(0) // Handle Quantum <-> Ruby Numeric object conversion #if (QuantumDepth == 8 || QuantumDepth == 16) #define QUANTUM2NUM(q) INT2FIX((q)) /**< Quantum -> Ruby Numeric conversion */ #define NUM2QUANTUM(n) (Quantum)NUM2UINT((n)) /**< Quantum <- Ruby Numeric conversion */ #elif (QuantumDepth == 32) #define QUANTUM2NUM(q) UINT2NUM((q)) /**< Quantum -> Ruby Numeric conversion */ #define NUM2QUANTUM(n) (Quantum)NUM2UINT((n)) /**< Quntum <- Ruby Numeric conversion */ #elif (QuantumDepth == 64) #define QUANTUM2NUM(q) ULL2NUM((q)) /**< Quantum -> Ruby Numeric conversion */ #define NUM2QUANTUM(n) (Quantum)NUM2ULL((n)) /**< Quntum <- Ruby Numeric conversion */ #else #error Specified QuantumDepth is not supported. #endif //! Convert user-supplied objects to Quantum #define APP2QUANTUM(n) rm_app2quantum((n)) //! degrees to radians conversion #undef DegreesToRadians // defined in ImageMagick.h in 6.0.2 #define DegreesToRadians(x) ((x)*3.14159265358979323846/180.0) //! pixel intensity calculation #define PIXEL_INTENSITY(q) ((Quantum)(0.299*(q)->red + 0.587*(q)->green + 0.114*(q)->blue + 0.5)) //! find maximum of longs #define LMAX(a,b) ((((long)(a))>((long)(b)))?((long)(a)):((long)(b))) //! find maximum of floats #define FMAX(a,b) ((((double)(a))>((double)(b)))?((double)(a)):((double)(b))) //! find minimum of floats #define FMIN(a,b) ((((double)(a))<=((double)(b)))?((double)(a)):((double)(b))) #define RMAGICK_PI 3.14159265358979 /**< pi */ //! round to Quantum #define ROUND_TO_QUANTUM(value) ((Quantum) ((value) > (Quantum)QuantumRange ? QuantumRange : (value) + 0.5)) // Ruby 1.9.0 changed the name to rb_frame_this_func #if defined(HAVE_RB_FRAME_THIS_FUNC) #define THIS_FUNC() rb_frame_this_func() /**< get the Ruby function being called */ #else #define THIS_FUNC() rb_frame_last_func() /**< get the Ruby function being called */ #endif // GetReadFile doesn't exist in Ruby 1.9.0 #if !defined(GetReadFile) #define GetReadFile(fptr) rb_io_stdio_file(fptr) /**< Ruby read file pointer */ #define GetWriteFile(fptr) rb_io_stdio_file(fptr) /**< Ruby write file pointer */ #endif // rb_io_t replaces OpenFile in Ruby 1.9.0 #if defined(HAVE_RB_IO_T) #undef OpenFile #define OpenFile rb_io_t /**< Ruby open file */ #endif // These macros are required in 1.9.1 but aren't defined prior to 1.8.6. #if !defined(RSTRING_LEN) #define RSTRING_LEN(s) (RSTRING((s))->len) /**< Ruby string length */ #endif #if !defined(RSTRING_PTR) #define RSTRING_PTR(s) (RSTRING((s))->ptr) /**< Ruby string pointer */ #endif // Backport these two macros to 1.8 #if !defined(RARRAY_LEN) #define RARRAY_LEN(a) RARRAY((a))->len /**< Ruby array length */ #endif // Matz says this macro is read-only! (see http://www.ruby-forum.com/topic/146072) #if !defined(RARRAY_PTR) #define RARRAY_PTR(a) RARRAY((a))->ptr /**< Ruby array pointer */ #endif //! Convert a C string to a Ruby symbol. Used in marshal_dump/marshal_load methods #define CSTR2SYM(s) ID2SYM(rb_intern(s)) //! Convert a C string to a Ruby String, or nil if the ptr is NULL #define MAGICK_STRING_TO_OBJ(f) (f) ? rb_str_new2(f) : Qnil /** * Copy the C string in a Ruby String object to ImageMagick memory, or set the * pointer to NULL if the object is nil. */ #define OBJ_TO_MAGICK_STRING(f, obj) \ if ((obj) != Qnil)\ magick_clone_string(&f, RSTRING_PTR(obj));\ else\ f = NULL; /** ImageMagick 6.5.7 replaced DestroyConstitute with * ConstituteComponentTerminus. Both have the same signature. */ #if defined(HAVE_CONSTITUTECOMPONENTTERMINUS) #define DestroyConstitute(void) ConstituteComponentTerminus(void) #endif /** ImageMagick 6.5.9 replaced MagickLibSubversion with * MagickLibAddendum. */ #if defined(HAVE_MAGICKLIBADDENDUM) #define MagickLibSubversion MagickLibAddendum #endif /** IM 6.4.1 replaced AllocateImage with AcquireImage. * Both have the same signature. */ #if !defined(HAVE_ACQUIREIMAGE) #define AcquireImage(info) AllocateImage(info) #endif // ImageLayerMethod replaced MagickLayerMethod starting with 6.3.6 #if defined(HAVE_TYPE_IMAGELAYERMETHOD) #define LAYERMETHODTYPE ImageLayerMethod /**< layer method */ #define CLASS_LAYERMETHODTYPE Class_ImageLayerMethod /**< layer method class */ #define LAYERMETHODTYPE_NAME ImageLayerMethod_name /**< layer method name */ #define LAYERMETHODTYPE_NEW ImageLayerMethod_new /**< new layer method */ #else #define LAYERMETHODTYPE MagickLayerMethod /**< layer method */ #define CLASS_LAYERMETHODTYPE Class_MagickLayerMethod /**< layer method class */ #define LAYERMETHODTYPE_NAME MagickLayerMethod_name /**< layer method name */ #define LAYERMETHODTYPE_NEW MagickLayerMethod_new /**< new layer method */ #endif typedef ImageInfo Info; /**< Make type name match class name */ typedef PixelPacket Pixel; /**< Make type name match class name */ //! Montage typedef struct { CompositeOperator compose; /**< compose operator */ MontageInfo *info; /**< montage info */ } Montage; // Draw //! tmp filename linked list struct TmpFile_Name { struct TmpFile_Name *next; /**< the next tmp filename */ char name[1]; /**< expandable char array for this filename */ }; //! Draw class. typedef struct { DrawInfo *info; /**< the DrawInfo struct */ VALUE primitives; /**< the primitive string */ struct TmpFile_Name *tmpfile_ary; /**< the tmp filenames */ PixelPacket shadow_color; /**< PolaroidOptions#shadow_color */ } Draw; // make the type match the class name // Enum //! enumerator over Magick ids typedef struct { ID id; /**< the Magick id */ int val; /**< its value */ } MagickEnum; #undef False // defined in deprecate.h in 6.0.2 #undef True // defined in deprecate.h in 6.0.2 //! generic boolean typedef enum { False = 0, /**< false */ True = 1 /**< true */ } rm_boolean; //! enumerator over weight types typedef enum { AnyWeight, /**< any */ NormalWeight, /**< normal */ BoldWeight, /**< bold */ BolderWeight, /**< bolder */ LighterWeight /**< lighter */ } WeightType; //! Draw#text_anchor AnchorType argument typedef enum { StartAnchor = 1, /**< start */ MiddleAnchor = 2, /**< midle */ EndAnchor = 3 /**< end */ } AnchorType; //! dumped image typedef struct { unsigned char id; /**< Dumped image id = 0xd1 */ unsigned char mj; /**< Major format number = 1 */ unsigned char mi; /**< Minor format number = 0 */ unsigned char len; /**< Length of image magick string */ char magick[MaxTextExtent]; /**< magick string */ } DumpedImage; #define DUMPED_IMAGE_ID 0xd1 /**< ID of Dumped image id */ #define DUMPED_IMAGE_MAJOR_VERS 1 /**< Dumped image major version */ #define DUMPED_IMAGE_MINOR_VERS 0 /**< Dumped image minor version */ #define MAGICK_LOC "magick_location" /**< instance variable name in ImageMagickError class */ #define MAX_GEOM_STR 51 /**< max length of a geometry string */ //! Quantum expression adapter. /** * Both ImageMagick and GraphicsMagick define an enum type for quantum-level * expressions, but they're different types. The QuantumExpressionOperator * type is an adapter type that can be mapped to either one. */ typedef enum _QuantumExpressionOperator { UndefinedQuantumOperator, /**< undefined */ AddQuantumOperator, /**< add */ AndQuantumOperator, /**< and */ DivideQuantumOperator, /**< divide */ LShiftQuantumOperator, /**< lshift */ MaxQuantumOperator, /**< max */ MinQuantumOperator, /**< min */ MultiplyQuantumOperator, /**< multiply */ OrQuantumOperator, /**< or */ RShiftQuantumOperator, /**< rshift */ SubtractQuantumOperator, /**< subtract */ XorQuantumOperator, /**< xor */ #if defined(HAVE_ENUM_POWEVALUATEOPERATOR) PowQuantumOperator, /**< pow */ #endif #if defined(HAVE_ENUM_LOGEVALUATEOPERATOR) LogQuantumOperator, /**< log */ #endif #if defined(HAVE_ENUM_THRESHOLDEVALUATEOPERATOR) ThresholdQuantumOperator, /**< threshold */ #endif #if defined(HAVE_ENUM_THRESHOLDBLACKEVALUATEOPERATOR) ThresholdBlackQuantumOperator, /**< threshold black */ #endif #if defined(HAVE_ENUM_THRESHOLDWHITEEVALUATEOPERATOR) ThresholdWhiteQuantumOperator, /**< threshold white */ #endif #if defined(HAVE_ENUM_GAUSSIANNOISEEVALUATEOPERATOR) GaussianNoiseQuantumOperator, /**< gaussian noise */ #endif #if defined(HAVE_ENUM_IMPULSENOISEEVALUATEOPERATOR) ImpulseNoiseQuantumOperator, /**< impulse noise */ #endif #if defined(HAVE_ENUM_LAPLACIANNOISEEVALUATEOPERATOR) LaplacianNoiseQuantumOperator, /**< laplacian noise */ #endif #if defined(HAVE_ENUM_MULTIPLICATIVENOISEEVALUATEOPERATOR) MultiplicativeNoiseQuantumOperator, /**< multiplicative noise */ #endif #if defined(HAVE_ENUM_POISSONNOISEEVALUATEOPERATOR) PoissonNoiseQuantumOperator, /**< poisson noise */ #endif #if defined(HAVE_ENUM_UNIFORMNOISEEVALUATEOPERATOR) UniformNoiseQuantumOperator, /**< uniform noise */ #endif #if defined(HAVE_ENUM_COSINEEVALUATEOPERATOR) CosineQuantumOperator, /**< cosine */ #endif #if defined(HAVE_ENUM_SINEEVALUATEOPERATOR) SineQuantumOperator, /**< sine */ #endif #if defined(HAVE_ENUM_ADDMODULUSEVALUATEOPERATOR) AddModulusQuantumOperator /**< add modulus */ #endif } QuantumExpressionOperator ; /** This implements the "omitted storage class model" for external variables. * (Ref: Harbison & Steele.) The rmmain.c file defines MAIN, which causes * the single defining declarations to be generated. No other source files * define MAIN and therefore generate referencing declarations. */ #undef EXTERN #if defined(MAIN) #define EXTERN #else #define EXTERN extern #endif /* * RMagick Module and Class VALUEs */ EXTERN VALUE Module_Magick; EXTERN VALUE Class_ImageList; EXTERN VALUE Class_Info; EXTERN VALUE Class_Draw; EXTERN VALUE Class_DrawOptions; EXTERN VALUE Class_Image; EXTERN VALUE Class_Montage; EXTERN VALUE Class_ImageMagickError; EXTERN VALUE Class_FatalImageMagickError; EXTERN VALUE Class_DestroyedImageError; EXTERN VALUE Class_GradientFill; EXTERN VALUE Class_TextureFill; EXTERN VALUE Class_AffineMatrix; EXTERN VALUE Class_Chromaticity; EXTERN VALUE Class_Color; EXTERN VALUE Class_Font; EXTERN VALUE Class_Geometry; EXTERN VALUE Class_GeometryValue; // Defined in RMagick.rb EXTERN VALUE Class_Pixel; EXTERN VALUE Class_Point; EXTERN VALUE Class_PolaroidOptions; EXTERN VALUE Class_Primary; EXTERN VALUE Class_Rectangle; EXTERN VALUE Class_Segment; EXTERN VALUE Class_TypeMetric; EXTERN VALUE Class_MetricType; EXTERN VALUE Class_QuantumExpressionOperator; // Enum classes EXTERN VALUE Class_Enum; EXTERN VALUE Class_AlignType; EXTERN VALUE Class_AlphaChannelType; EXTERN VALUE Class_AnchorType; EXTERN VALUE Class_ChannelType; EXTERN VALUE Class_ClassType; EXTERN VALUE Class_ColorspaceType; EXTERN VALUE Class_ComplianceType; EXTERN VALUE Class_CompositeOperator; EXTERN VALUE Class_CompressionType; EXTERN VALUE Class_DecorationType; EXTERN VALUE Class_DisposeType; EXTERN VALUE Class_DistortImageMethod; #if defined(HAVE_TYPE_DITHERMETHOD) EXTERN VALUE Class_DitherMethod; #endif EXTERN VALUE Class_EndianType; EXTERN VALUE Class_FilterTypes; EXTERN VALUE Class_GravityType; EXTERN VALUE Class_ImageType; EXTERN VALUE Class_InterlaceType; EXTERN VALUE Class_InterpolatePixelMethod; EXTERN VALUE CLASS_LAYERMETHODTYPE; EXTERN VALUE Class_MagickFunction; EXTERN VALUE Class_NoiseType; EXTERN VALUE Class_OrientationType; EXTERN VALUE Class_PaintMethod; EXTERN VALUE Class_PreviewType; EXTERN VALUE Class_RenderingIntent; EXTERN VALUE Class_ResolutionType; #if defined(HAVE_SPARSECOLORIMAGE) EXTERN VALUE Class_SparseColorMethod; #endif EXTERN VALUE Class_SpreadMethod; EXTERN VALUE Class_StorageType; EXTERN VALUE Class_StretchType; EXTERN VALUE Class_StyleType; EXTERN VALUE Class_WeightType; EXTERN VALUE Class_VirtualPixelMethod; /** * Commonly-used IDs */ EXTERN ID rm_ID_trace_proc; /**< "@trace_proc" */ EXTERN ID rm_ID_call; /**< "call" */ EXTERN ID rm_ID_changed; /**< "changed" */ EXTERN ID rm_ID_cur_image; /**< "cur_image" */ EXTERN ID rm_ID_dup; /**< "dup" */ EXTERN ID rm_ID_fill; /**< "fill" */ EXTERN ID rm_ID_flag; /**< "flag" */ EXTERN ID rm_ID_from_s; /**< "from_s" */ EXTERN ID rm_ID_Geometry; /**< "Geometry" */ EXTERN ID rm_ID_GeometryValue; /**< "GeometryValue" */ EXTERN ID rm_ID_has_key_q; /**< "has_key?" */ EXTERN ID rm_ID_height; /**< "height" */ EXTERN ID rm_ID_initialize_copy; /**< "initialize_copy" */ EXTERN ID rm_ID_length; /**< "length" */ EXTERN ID rm_ID_notify_observers; /**< "notify_observers" */ EXTERN ID rm_ID_new; /**< "new" */ EXTERN ID rm_ID_push; /**< "push" */ EXTERN ID rm_ID_spaceship; /**< "<=>" */ EXTERN ID rm_ID_to_i; /**< "to_i" */ EXTERN ID rm_ID_to_s; /**< "to_s" */ EXTERN ID rm_ID_values; /**< "values" */ EXTERN ID rm_ID_width; /**< "width" */ EXTERN ID rm_ID_x; /**< "x" */ EXTERN ID rm_ID_y; /**< "y" */ #if !defined(min) #define min(a,b) ((a)<(b)?(a):(b)) /**< min of two values */ #endif #if !defined(max) #define max(a,b) ((a)>(b)?(a):(b)) /**< max of two values */ #endif /** Handle warnings & errors */ //! Handle warnings & errors #define CHECK_EXCEPTION() rm_check_exception(&exception, NULL, RetainOnError); /* Call rb_define_method for an attribute accessor method */ //! attribute reader #define DCL_ATTR_READER(class, attr) \ rb_define_method(Class_##class, #attr, class##_##attr, 0); //! attribute writer #define DCL_ATTR_WRITER(class, attr) \ rb_define_method(Class_##class, #attr "=", class##_##attr##_eq, 1); //! attribute accessor #define DCL_ATTR_ACCESSOR(class, attr) \ DCL_ATTR_READER(class, attr) \ DCL_ATTR_WRITER(class, attr) //! Borrow another class' attribute writer definition #define SHARE_ATTR_WRITER(to, from, attr) \ rb_define_method(Class_##to, #attr "=", from##_##attr##_eq, 1); /* Define simple attribute accessor methods (boolean, int, string, and double types) */ #define C_bool_to_R_bool(attr) (attr) ? Qtrue : Qfalse /**< C boolean -> Ruby boolean */ #define R_bool_to_C_bool(attr) RTEST(attr) /**< C boolean <- Ruby boolean */ #define C_int_to_R_int(attr) INT2FIX(attr) /**< C int -> Ruby int */ #define R_int_to_C_int(attr) NUM2INT(attr) /**< C int <- Ruby int */ #define C_long_to_R_long(attr) INT2NUM(attr) /**< C long -> Ruby long */ #define R_long_to_C_long(attr) NUM2LONG(attr) /**< C long <- Ruby long */ #define C_ulong_to_R_ulong(attr) UINT2NUM(attr) /**< C unsigned long -> Ruby unsigned long */ #define R_ulong_to_C_ulong(attr) NUM2ULONG(attr) /**< C unsigned long <- Ruby unsigned long */ #define C_str_to_R_str(attr) attr ? rb_str_new2(attr) : Qnil /**< C string -> Ruby string */ #define C_dbl_to_R_dbl(attr) rb_float_new(attr) /**< C double -> Ruby double */ #define R_dbl_to_C_dbl(attr) NUM2DBL(attr) /**< C double <- Ruby double */ //! define attribute reader #define DEF_ATTR_READER(class, attr, type) \ VALUE class##_##attr(VALUE self)\ {\ class *ptr;\ if (rb_obj_is_kind_of(self, Class_Image) == Qtrue) {\ (void) rm_check_destroyed(self); \ }\ Data_Get_Struct(self, class, ptr);\ return C_##type##_to_R_##type(ptr->attr);\ } //! define attribute reader when attribute name is different from the field name #define DEF_ATTR_READERF(class, attr, field, type) \ VALUE class##_##attr(VALUE self)\ {\ class *ptr;\ (void) rm_check_destroyed(self); \ Data_Get_Struct(self, class, ptr);\ return C_##type##_to_R_##type(ptr->field);\ } //! define attribute writer #define DEF_ATTR_WRITER(class, attr, type) \ VALUE class##_##attr##_eq(VALUE self, VALUE val)\ {\ class *ptr;\ if (rb_obj_is_kind_of(self, Class_Image) == Qtrue) {\ (void) rm_check_destroyed(self); \ }\ rb_check_frozen(self);\ Data_Get_Struct(self, class, ptr);\ ptr->attr = R_##type##_to_C_##type(val);\ return self;\ } //! define attribute accessor #define DEF_ATTR_ACCESSOR(class, attr, type)\ DEF_ATTR_READER(class, attr, type)\ DEF_ATTR_WRITER(class, attr, type) /* * Declare attribute accessors */ //! declare attribute reader #define ATTR_READER(class, attr) \ extern VALUE class##_##attr(VALUE); //! declare attribute writer #define ATTR_WRITER(class, attr) \ extern VALUE class##_##attr##_eq(VALUE, VALUE); //! declare attribute accessor #define ATTR_ACCESSOR(class, attr) \ ATTR_READER(class, attr)\ ATTR_WRITER(class, attr) /* * Define functions to get/set attributes in Image::Info that * use the Get/SetImageOption API. */ //! Option attribute reader. For Image::Info. #define OPTION_ATTR_READER(opt, key) \ VALUE Info_##opt(VALUE self)\ {\ return get_option(self, #key);\ } //! Option attribute writer. For Image::Info. #define OPTION_ATTR_WRITER(opt, key) \ VALUE Info_##opt##_eq(VALUE self, VALUE string)\ {\ return set_option(self, #key, string);\ } //! Option attribute accessor. For Image::Info. #define OPTION_ATTR_ACCESSOR(opt, key)\ OPTION_ATTR_READER(opt, key)\ OPTION_ATTR_WRITER(opt, key) /* * Declare Pixel channel attribute writers */ //! Pixel channel attribute writer. #define DEF_PIXEL_CHANNEL_WRITER(_channel_) \ extern VALUE \ Pixel_##_channel_##_eq(VALUE self, VALUE v) \ { \ Pixel *pixel; \ \ rb_check_frozen(self); \ Data_Get_Struct(self, Pixel, pixel); \ pixel->_channel_ = APP2QUANTUM(v); \ (void) rb_funcall(self, rm_ID_changed, 0); \ (void) rb_funcall(self, rm_ID_notify_observers, 1, self); \ return QUANTUM2NUM((pixel->_channel_)); \ } /* * Declare Pixel CMYK channel attribute accessors */ //! Pixel CMYK channel attribute accessor. #define DEF_PIXEL_CMYK_CHANNEL_ACCESSOR(_cmyk_channel_, _rgb_channel_) \ extern VALUE \ Pixel_##_cmyk_channel_##_eq(VALUE self, VALUE v) \ { \ Pixel *pixel; \ \ rb_check_frozen(self); \ Data_Get_Struct(self, Pixel, pixel); \ pixel->_rgb_channel_ = APP2QUANTUM(v); \ (void) rb_funcall(self, rm_ID_changed, 0); \ (void) rb_funcall(self, rm_ID_notify_observers, 1, self); \ return QUANTUM2NUM(pixel->_rgb_channel_); \ } \ \ extern VALUE \ Pixel_##_cmyk_channel_(VALUE self) \ { \ Pixel *pixel; \ \ Data_Get_Struct(self, Pixel, pixel); \ return INT2NUM(pixel->_rgb_channel_); \ } /* * Enum constants - define a subclass of Enum for the specified enumeration. * Define an instance of the subclass for each member in the enumeration. * Initialize each instance with its name and value. */ //! define Ruby enum #define DEF_ENUM(tag) {\ VALUE _cls, _enum;\ _cls = Class_##tag = rm_define_enum_type(#tag); //! define Ruby enumerator elements #define ENUMERATOR(val)\ _enum = rm_enum_new(_cls, ID2SYM(rb_intern(#val)), INT2NUM(val));\ rb_define_const(Module_Magick, #val, _enum); //! end of an enumerator #define END_ENUM } //! Define a Magick module constant #if QuantumDepth == 64 #define DEF_CONST(constant) rb_define_const(Module_Magick, #constant, ULL2NUM(constant)) #else // QuantumDepth == 8, 16, 32 #define DEF_CONST(constant) rb_define_const(Module_Magick, #constant, UINT2NUM(constant)) #endif //! Convert a Ruby enum constant back to a C enum member. #define VALUE_TO_ENUM(value, e, type) \ do {\ MagickEnum *magick_enum;\ if (CLASS_OF(value) != Class_##type)\ rb_raise(rb_eTypeError, "wrong enumeration type - expected %s, got %s"\ , rb_class2name(Class_##type),rb_class2name(CLASS_OF(value)));\ Data_Get_Struct(value, MagickEnum, magick_enum);\ e = (type)(magick_enum->val);\ } while(0) //! create case statement, mapping enum to its name #define ENUM_TO_NAME(_enum) case _enum: return #_enum; // Method, external function declarations. These declarations are // grouped by the source file in which the methods are defined. // We don't need any "extern/no extern" stuff here. An external function // declaration can refer to a function defined in another source file or // the same source file. // rmmain.c extern void Init_RMagick2(void); // rmagick.c extern VALUE Magick_colors(VALUE); extern VALUE Magick_fonts(VALUE); extern VALUE Magick_init_formats(VALUE); extern VALUE Magick_limit_resource(int, VALUE *, VALUE); extern VALUE Magick_set_cache_threshold(VALUE, VALUE); extern VALUE Magick_set_log_event_mask(int, VALUE *, VALUE); extern VALUE Magick_set_log_format(VALUE, VALUE); // rmdraw.c ATTR_WRITER(Draw, affine) ATTR_WRITER(Draw, align) ATTR_WRITER(Draw, border_color) ATTR_WRITER(Draw, decorate) ATTR_WRITER(Draw, density) ATTR_WRITER(Draw, encoding) ATTR_WRITER(Draw, fill) ATTR_WRITER(Draw, fill_pattern) ATTR_WRITER(Draw, font) ATTR_WRITER(Draw, font_family) ATTR_WRITER(Draw, font_stretch) ATTR_WRITER(Draw, font_style) ATTR_WRITER(Draw, font_weight) ATTR_WRITER(Draw, gravity) ATTR_WRITER(Draw, interline_spacing) ATTR_WRITER(Draw, interword_spacing) ATTR_WRITER(Draw, kerning) ATTR_WRITER(Draw, pointsize) ATTR_WRITER(Draw, rotation) ATTR_WRITER(Draw, stroke) ATTR_WRITER(Draw, stroke_pattern) ATTR_WRITER(Draw, stroke_width) ATTR_WRITER(Draw, text_antialias) ATTR_WRITER(Draw, tile) ATTR_WRITER(Draw, undercolor) extern VALUE Draw_alloc(VALUE); extern VALUE Draw_annotate(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE); extern VALUE Draw_clone(VALUE); extern VALUE Draw_composite(int, VALUE *, VALUE); extern VALUE Draw_draw(VALUE, VALUE); extern VALUE Draw_dup(VALUE); extern VALUE Draw_get_multiline_type_metrics(int, VALUE *, VALUE); extern VALUE Draw_get_type_metrics(int, VALUE *, VALUE); extern VALUE Draw_init_copy(VALUE, VALUE); extern VALUE Draw_initialize(VALUE); extern VALUE Draw_inspect(VALUE); extern VALUE Draw_marshal_dump(VALUE); extern VALUE Draw_marshal_load(VALUE, VALUE); extern VALUE Draw_primitive(VALUE, VALUE); extern VALUE DrawOptions_alloc(VALUE); extern VALUE DrawOptions_initialize(VALUE); extern VALUE PolaroidOptions_alloc(VALUE); extern VALUE PolaroidOptions_initialize(VALUE); extern VALUE rm_polaroid_new(void); ATTR_WRITER(PolaroidOptions, shadow_color); ATTR_WRITER(PolaroidOptions, border_color); // rmmontage.c ATTR_WRITER(Montage, background_color) ATTR_WRITER(Montage, border_color) ATTR_WRITER(Montage, border_width) ATTR_WRITER(Montage, compose) ATTR_WRITER(Montage, filename) ATTR_WRITER(Montage, fill) ATTR_WRITER(Montage, font) ATTR_WRITER(Montage, frame) ATTR_WRITER(Montage, geometry) ATTR_WRITER(Montage, gravity) ATTR_WRITER(Montage, matte_color) ATTR_WRITER(Montage, pointsize) ATTR_WRITER(Montage, shadow) ATTR_WRITER(Montage, stroke) ATTR_WRITER(Montage, texture) ATTR_WRITER(Montage, tile) ATTR_WRITER(Montage, title) extern VALUE Montage_initialize(VALUE); extern VALUE Montage_alloc(VALUE); extern VALUE rm_montage_new(void); // rmilist.c extern VALUE ImageList_animate(int, VALUE *, VALUE); extern VALUE ImageList_append(VALUE, VALUE); extern VALUE ImageList_average(VALUE); extern VALUE ImageList_coalesce(VALUE); extern VALUE ImageList_composite_layers(int, VALUE *, VALUE); extern VALUE ImageList_deconstruct(VALUE); extern VALUE ImageList_display(VALUE); extern VALUE ImageList_flatten_images(VALUE); extern VALUE ImageList_fx(int, VALUE *, VALUE); extern VALUE ImageList_map(int, VALUE *, VALUE); extern VALUE ImageList_montage(VALUE); extern VALUE ImageList_morph(VALUE, VALUE); extern VALUE ImageList_mosaic(VALUE); extern VALUE ImageList_optimize_layers(VALUE, VALUE); extern VALUE ImageList_quantize(int, VALUE*, VALUE); extern VALUE ImageList_remap(int, VALUE *, VALUE); extern VALUE ImageList_to_blob(VALUE); extern VALUE ImageList_write(VALUE, VALUE); extern VALUE rm_imagelist_from_images(Image *); // rminfo.c ATTR_ACCESSOR(Info, antialias) ATTR_ACCESSOR(Info, attenuate) ATTR_ACCESSOR(Info, authenticate) ATTR_ACCESSOR(Info, background_color) ATTR_ACCESSOR(Info, border_color) ATTR_ACCESSOR(Info, caption) ATTR_ACCESSOR(Info, colorspace) ATTR_ACCESSOR(Info, comment) ATTR_ACCESSOR(Info, compression) ATTR_ACCESSOR(Info, delay) ATTR_ACCESSOR(Info, density) ATTR_ACCESSOR(Info, depth) ATTR_ACCESSOR(Info, dispose) ATTR_ACCESSOR(Info, dither) ATTR_ACCESSOR(Info, encoding) ATTR_ACCESSOR(Info, endian) ATTR_ACCESSOR(Info, extract) ATTR_ACCESSOR(Info, filename) ATTR_ACCESSOR(Info, fill) ATTR_ACCESSOR(Info, font) ATTR_ACCESSOR(Info, format) ATTR_ACCESSOR(Info, fuzz) ATTR_ACCESSOR(Info, gravity) ATTR_ACCESSOR(Info, group) ATTR_ACCESSOR(Info, image_type) ATTR_ACCESSOR(Info, interlace) ATTR_ACCESSOR(Info, label) ATTR_ACCESSOR(Info, matte_color) ATTR_WRITER(Info, monitor) ATTR_ACCESSOR(Info, monochrome) ATTR_ACCESSOR(Info, number_scenes) ATTR_ACCESSOR(Info, orientation) ATTR_ACCESSOR(Info, origin) ATTR_ACCESSOR(Info, page) ATTR_ACCESSOR(Info, pen) // ATTR_ACCESSOR(Info, ping) obsolete ATTR_ACCESSOR(Info, pointsize) ATTR_ACCESSOR(Info, quality) ATTR_ACCESSOR(Info, sampling_factor) ATTR_ACCESSOR(Info, scene) ATTR_ACCESSOR(Info, server_name) ATTR_ACCESSOR(Info, size) ATTR_ACCESSOR(Info, stroke) ATTR_ACCESSOR(Info, stroke_width) ATTR_WRITER(Info, texture) ATTR_ACCESSOR(Info, tile_offset) ATTR_ACCESSOR(Info, transparent_color) ATTR_ACCESSOR(Info, undercolor) ATTR_ACCESSOR(Info, units) ATTR_ACCESSOR(Info, view) //ATTR_ACCESSOR(Info, verbose) extern VALUE Info_alloc(VALUE); extern VALUE Info_define(int, VALUE *, VALUE); extern VALUE Info_aset(int, VALUE *, VALUE); extern VALUE Info_aref(int, VALUE *, VALUE); extern VALUE Info_channel(int, VALUE *, VALUE); extern VALUE Info_undefine(VALUE, VALUE, VALUE); extern VALUE Info_initialize(VALUE); extern VALUE rm_info_new(void); extern DisposeType rm_dispose_to_enum(const char *); extern GravityType rm_gravity_to_enum(const char *); // rmimage.c ATTR_WRITER(Image, alpha) ATTR_ACCESSOR(Image, background_color) ATTR_READER(Image, base_columns) ATTR_READER(Image, base_filename) ATTR_READER(Image, base_rows) ATTR_ACCESSOR(Image, bias) ATTR_ACCESSOR(Image, black_point_compensation) ATTR_ACCESSOR(Image, blur) ATTR_ACCESSOR(Image, border_color) ATTR_READER(Image, bounding_box) ATTR_ACCESSOR(Image, chromaticity) ATTR_ACCESSOR(Image, class_type) ATTR_ACCESSOR(Image, color_profile) ATTR_READER(Image, colors) ATTR_ACCESSOR(Image, colorspace) ATTR_READER(Image, columns) ATTR_ACCESSOR(Image, compose) ATTR_ACCESSOR(Image, compression) ATTR_ACCESSOR(Image, delay) ATTR_ACCESSOR(Image, density) ATTR_READER(Image, depth) ATTR_READER(Image, directory) ATTR_ACCESSOR(Image, dispose) ATTR_ACCESSOR(Image, endian) ATTR_ACCESSOR(Image, extract_info) ATTR_READER(Image, filename) ATTR_READER(Image, filesize) ATTR_ACCESSOR(Image, filter) ATTR_ACCESSOR(Image, format) ATTR_ACCESSOR(Image, fuzz) ATTR_ACCESSOR(Image, gamma) ATTR_ACCESSOR(Image, geometry) ATTR_ACCESSOR(Image, gravity) ATTR_ACCESSOR(Image, image_type) ATTR_ACCESSOR(Image, interlace) ATTR_ACCESSOR(Image, iptc_profile) ATTR_ACCESSOR(Image, iterations) ATTR_WRITER(Image, mask) ATTR_ACCESSOR(Image, matte) ATTR_ACCESSOR(Image, matte_color) ATTR_READER(Image, mean_error_per_pixel) ATTR_READER(Image, mime_type) ATTR_WRITER(Image, monitor) ATTR_READER(Image, montage) ATTR_READER(Image, normalized_mean_error) ATTR_READER(Image, normalized_maximum_error) ATTR_READER(Image, number_colors) ATTR_ACCESSOR(Image, offset) ATTR_WRITER(Image, opacity) ATTR_ACCESSOR(Image, orientation) ATTR_ACCESSOR(Image, page) ATTR_ACCESSOR(Image, pixel_interpolation_method) ATTR_READER(Image, quality) ATTR_READER(Image, quantum_depth) ATTR_ACCESSOR(Image, rendering_intent) ATTR_READER(Image, rows) ATTR_READER(Image, scene) ATTR_ACCESSOR(Image, start_loop) ATTR_ACCESSOR(Image, ticks_per_second) ATTR_READER(Image, total_colors) ATTR_READER(Image, total_ink_density) ATTR_ACCESSOR(Image, transparent_color) ATTR_ACCESSOR(Image, units) ATTR_ACCESSOR(Image, virtual_pixel_method) ATTR_ACCESSOR(Image, x_resolution) ATTR_ACCESSOR(Image, y_resolution) extern ChannelType extract_channels(int *, VALUE *); extern void raise_ChannelType_error(VALUE); extern void add_format_prefix(Info *, VALUE); extern VALUE Image_alloc(VALUE); extern VALUE Image_initialize(int, VALUE *, VALUE); extern VALUE Image_adaptive_blur(int, VALUE *, VALUE); extern VALUE Image_adaptive_blur_channel(int, VALUE *, VALUE); extern VALUE Image_adaptive_resize(int, VALUE *, VALUE); extern VALUE Image_adaptive_sharpen(int, VALUE *, VALUE); extern VALUE Image_adaptive_sharpen_channel(int, VALUE *, VALUE); extern VALUE Image_adaptive_threshold(int, VALUE *, VALUE); extern VALUE Image_add_compose_mask(VALUE, VALUE); extern VALUE Image_add_noise(VALUE, VALUE); extern VALUE Image_add_noise_channel(int, VALUE *, VALUE); extern VALUE Image_add_profile(VALUE, VALUE); extern VALUE Image_affine_transform(VALUE, VALUE); extern VALUE Image_alpha(int, VALUE *, VALUE); extern VALUE Image_alpha_q(VALUE); extern VALUE Image_aref(VALUE, VALUE); extern VALUE Image_aset(VALUE, VALUE, VALUE); extern VALUE Image_auto_gamma_channel(int, VALUE *, VALUE); extern VALUE Image_auto_level_channel(int, VALUE *, VALUE); extern VALUE Image_auto_orient(VALUE); extern VALUE Image_auto_orient_bang(VALUE); extern VALUE Image_properties(VALUE); extern VALUE Image_bilevel_channel(int, VALUE *, VALUE); extern VALUE Image_black_threshold(int, VALUE *, VALUE); extern VALUE Image_blend(int, VALUE *, VALUE); extern VALUE Image_blue_shift(int, VALUE *, VALUE); extern VALUE Image_blur_image(int, VALUE *, VALUE); extern VALUE Image_blur_channel(int, VALUE *, VALUE); extern VALUE Image_border(VALUE, VALUE, VALUE, VALUE); extern VALUE Image_border_bang(VALUE, VALUE, VALUE, VALUE); extern VALUE Image_capture(int, VALUE *, VALUE); extern VALUE Image_change_geometry(VALUE, VALUE); extern VALUE Image_changed_q(VALUE); extern VALUE Image_channel(VALUE, VALUE); extern VALUE Image_check_destroyed(VALUE); extern VALUE Image_compare_channel(int, VALUE *, VALUE); extern VALUE Image_channel_depth(int, VALUE *, VALUE); extern VALUE Image_channel_extrema(int, VALUE *, VALUE); extern VALUE Image_channel_mean(int, VALUE *, VALUE); extern VALUE Image_charcoal(int, VALUE *, VALUE); extern VALUE Image_chop(VALUE, VALUE, VALUE, VALUE, VALUE); extern VALUE Image_clone(VALUE); extern VALUE Image_clut_channel(int, VALUE *, VALUE); extern VALUE Image_color_flood_fill(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE); extern VALUE Image_color_histogram(VALUE); extern VALUE Image_colorize(int, VALUE *, VALUE); extern VALUE Image_colormap(int, VALUE *, VALUE); extern VALUE Image_combine(int, VALUE *, VALUE); extern VALUE Image_composite(int, VALUE *, VALUE); extern VALUE Image_composite_affine(VALUE, VALUE, VALUE); extern VALUE Image_composite_bang(int, VALUE *, VALUE); extern VALUE Image_composite_channel(int, VALUE *, VALUE); extern VALUE Image_composite_channel_bang(int, VALUE *, VALUE); extern VALUE Image_composite_mathematics(int, VALUE *, VALUE); extern VALUE Image_composite_tiled(int, VALUE *, VALUE); extern VALUE Image_composite_tiled_bang(int, VALUE *, VALUE); extern VALUE Image_compress_colormap_bang(VALUE); extern VALUE Image_constitute(VALUE, VALUE, VALUE, VALUE, VALUE); extern VALUE Image_contrast(int, VALUE *, VALUE); extern VALUE Image_contrast_stretch_channel(int, VALUE *, VALUE); extern VALUE Image_convolve(VALUE, VALUE, VALUE); extern VALUE Image_convolve_channel(int, VALUE *, VALUE); extern VALUE Image_copy(VALUE); extern VALUE Image_crop(int, VALUE *, VALUE); extern VALUE Image_crop_bang(int, VALUE *, VALUE); extern VALUE Image_cycle_colormap(VALUE, VALUE); extern VALUE Image_decipher(VALUE, VALUE); extern VALUE Image_define(VALUE, VALUE, VALUE); extern VALUE Image_delete_profile(VALUE, VALUE); extern VALUE Image_delete_compose_mask(VALUE); extern VALUE Image_deskew(int, VALUE *, VALUE); extern VALUE Image_despeckle(VALUE); extern VALUE Image_destroy_bang(VALUE); extern VALUE Image_destroyed_q(VALUE); extern VALUE Image_difference(VALUE, VALUE); extern VALUE Image_dispatch(int, VALUE *, VALUE); extern VALUE Image_displace(int, VALUE *, VALUE); extern VALUE Image_display(VALUE); extern VALUE Image_dissolve(int, VALUE *, VALUE); extern VALUE Image_distort(int, VALUE *, VALUE); extern VALUE Image_distortion_channel(int, VALUE *, VALUE); extern VALUE Image__dump(VALUE, VALUE); extern VALUE Image_dup(VALUE); extern VALUE Image_each_profile(VALUE); extern VALUE Image_edge(int, VALUE *, VALUE); extern VALUE Image_emboss(int, VALUE *, VALUE); extern VALUE Image_encipher(VALUE, VALUE); extern VALUE Image_enhance(VALUE); extern VALUE Image_equalize(VALUE); extern VALUE Image_equalize_channel(int, VALUE *, VALUE); extern VALUE Image_erase_bang(VALUE); extern VALUE Image_excerpt(VALUE, VALUE, VALUE, VALUE, VALUE); extern VALUE Image_excerpt_bang(VALUE, VALUE, VALUE, VALUE, VALUE); extern VALUE Image_export_pixels(int, VALUE *, VALUE); extern VALUE Image_export_pixels_to_str(int, VALUE *, VALUE); extern VALUE Image_extent(int, VALUE *, VALUE); extern VALUE Image_find_similar_region(int, VALUE *, VALUE); extern VALUE Image_flip(VALUE); extern VALUE Image_flip_bang(VALUE); extern VALUE Image_flop(VALUE); extern VALUE Image_flop_bang(VALUE); extern VALUE Image_frame(int, VALUE *, VALUE); extern VALUE Image_from_blob(VALUE, VALUE); extern VALUE Image_function_channel(int, VALUE *, VALUE); extern VALUE Image_gamma_channel(int, VALUE *, VALUE); extern VALUE Image_gamma_correct(int, VALUE *, VALUE); extern VALUE Image_gaussian_blur(int, VALUE *, VALUE); extern VALUE Image_gaussian_blur_channel(int, VALUE *, VALUE); extern VALUE Image_get_pixels(VALUE, VALUE, VALUE, VALUE, VALUE); extern VALUE Image_gray_q(VALUE); extern VALUE Image_histogram_q(VALUE); extern VALUE Image_implode(int, VALUE *, VALUE); extern VALUE Image_import_pixels(int, VALUE *, VALUE); extern VALUE Image_init_copy(VALUE, VALUE); extern VALUE Image_inspect(VALUE); extern VALUE Image_level2(int, VALUE *, VALUE); extern VALUE Image_level_channel(int, VALUE *, VALUE); extern VALUE Image_level_colors(int, VALUE *, VALUE); extern VALUE Image_levelize_channel(int, VALUE *, VALUE); extern VALUE Image_linear_stretch(int, VALUE *, VALUE); extern VALUE Image_liquid_rescale(int, VALUE *, VALUE); extern VALUE Image__load(VALUE, VALUE); extern VALUE Image_magnify(VALUE); extern VALUE Image_magnify_bang(VALUE); extern VALUE Image_map(int, VALUE *, VALUE); extern VALUE Image_marshal_dump(VALUE); extern VALUE Image_marshal_load(VALUE, VALUE); extern VALUE Image_mask(int, VALUE *, VALUE); extern VALUE Image_matte_flood_fill(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE); extern VALUE Image_median_filter(int, VALUE *, VALUE); extern VALUE Image_minify(VALUE); extern VALUE Image_minify_bang(VALUE); extern VALUE Image_modulate(int, VALUE *, VALUE); extern VALUE Image_monochrome_q(VALUE); extern VALUE Image_motion_blur(int, VALUE *, VALUE); extern VALUE Image_negate(int, VALUE *, VALUE); extern VALUE Image_negate_channel(int, VALUE *, VALUE); extern VALUE Image_normalize(VALUE); extern VALUE Image_normalize_channel(int, VALUE *, VALUE); extern VALUE Image_oil_paint(int, VALUE *, VALUE); extern VALUE Image_opaque(VALUE, VALUE, VALUE); extern VALUE Image_opaque_channel(int, VALUE *, VALUE); extern VALUE Image_opaque_q(VALUE); extern VALUE Image_ordered_dither(int, VALUE *, VALUE); extern VALUE Image_paint_transparent(int, VALUE *, VALUE); extern VALUE Image_palette_q(VALUE); extern VALUE Image_ping(VALUE, VALUE); extern VALUE Image_pixel_color(int, VALUE *, VALUE); extern VALUE Image_polaroid(int, VALUE *, VALUE); extern VALUE Image_posterize(int, VALUE *, VALUE); extern VALUE Image_preview(VALUE, VALUE); extern VALUE Image_profile_bang(VALUE, VALUE, VALUE); extern VALUE Image_quantize(int, VALUE *, VALUE); extern VALUE Image_quantization_error(VALUE); extern VALUE Image_quantum_operator(int, VALUE *, VALUE); extern VALUE Image_radial_blur(VALUE, VALUE); extern VALUE Image_radial_blur_channel(int, VALUE *, VALUE); extern VALUE Image_raise(int, VALUE *, VALUE); extern VALUE Image_random_threshold_channel(int, VALUE *, VALUE); extern VALUE Image_read(VALUE, VALUE); extern VALUE Image_read_inline(VALUE, VALUE); extern VALUE Image_recolor(VALUE, VALUE); extern VALUE Image_reduce_noise(VALUE, VALUE); extern VALUE Image_remap(int, VALUE *, VALUE); extern VALUE Image_resize(int, VALUE *, VALUE); extern VALUE Image_resize_bang(int, VALUE *, VALUE); extern VALUE Image_roll(VALUE, VALUE, VALUE); extern VALUE Image_rotate(int, VALUE *, VALUE); extern VALUE Image_rotate_bang(int, VALUE *, VALUE); extern VALUE Image_sample(int, VALUE *, VALUE); extern VALUE Image_sample_bang(int, VALUE *, VALUE); extern VALUE Image_scale(int, VALUE *, VALUE); extern VALUE Image_scale_bang(int, VALUE *, VALUE); extern VALUE Image_selective_blur_channel(int, VALUE *, VALUE); extern VALUE Image_segment(int, VALUE *, VALUE); extern VALUE Image_separate(int, VALUE *, VALUE); extern VALUE Image_sepiatone(int, VALUE *, VALUE); extern VALUE Image_set_channel_depth(VALUE, VALUE, VALUE); extern VALUE Image_shade(int, VALUE *, VALUE); extern VALUE Image_shadow(int, VALUE *, VALUE); extern VALUE Image_sharpen(int, VALUE *, VALUE); extern VALUE Image_sharpen_channel(int, VALUE *, VALUE); extern VALUE Image_shave(VALUE, VALUE, VALUE); extern VALUE Image_shave_bang(VALUE, VALUE, VALUE); extern VALUE Image_shear(VALUE, VALUE, VALUE); extern VALUE Image_sigmoidal_contrast_channel(int, VALUE *, VALUE); extern VALUE Image_signature(VALUE); extern VALUE Image_sketch(int, VALUE *, VALUE); extern VALUE Image_solarize(int, VALUE *, VALUE); extern VALUE Image_spaceship(VALUE, VALUE); extern VALUE Image_sparse_color(int, VALUE *, VALUE); extern VALUE Image_splice(int, VALUE *, VALUE); extern VALUE Image_spread(int, VALUE *, VALUE); extern VALUE Image_stegano(VALUE, VALUE, VALUE); extern VALUE Image_stereo(VALUE, VALUE); extern VALUE Image_store_pixels(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE); extern VALUE Image_strip_bang(VALUE); extern VALUE Image_swirl(VALUE, VALUE); extern VALUE Image_sync_profiles(VALUE); extern VALUE Image_texture_flood_fill(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE); extern VALUE Image_threshold(VALUE, VALUE); extern VALUE Image_thumbnail(int, VALUE *, VALUE); extern VALUE Image_thumbnail_bang(int, VALUE *, VALUE); extern VALUE Image_tint(int, VALUE *, VALUE); extern VALUE Image_to_blob(VALUE); extern VALUE Image_to_color(VALUE, VALUE); extern VALUE Image_transparent(int, VALUE *, VALUE); extern VALUE Image_transparent_chroma(int, VALUE *, VALUE); extern VALUE Image_transpose(VALUE); extern VALUE Image_transpose_bang(VALUE); extern VALUE Image_transverse(VALUE); extern VALUE Image_transverse_bang(VALUE); extern VALUE Image_trim(int, VALUE *, VALUE); extern VALUE Image_trim_bang(int, VALUE *, VALUE); extern VALUE Image_undefine(VALUE, VALUE); extern VALUE Image_unique_colors(VALUE); extern VALUE Image_unsharp_mask(int, VALUE *, VALUE); extern VALUE Image_unsharp_mask_channel(int, VALUE *, VALUE); extern VALUE Image_vignette(int, VALUE *, VALUE); extern VALUE Image_watermark(int, VALUE *, VALUE); extern VALUE Image_wave(int, VALUE *, VALUE); extern VALUE Image_wet_floor(int, VALUE *, VALUE); extern VALUE Image_white_threshold(int, VALUE *, VALUE); extern VALUE Image_write(VALUE, VALUE); extern VALUE rm_image_new(Image *); extern void rm_image_destroy(void *); extern void rm_trace_creation(Image *); // rmfill.c extern VALUE GradientFill_alloc(VALUE); extern VALUE GradientFill_initialize(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE); extern VALUE GradientFill_fill(VALUE, VALUE); extern VALUE TextureFill_alloc(VALUE); extern VALUE TextureFill_initialize(VALUE, VALUE); extern VALUE TextureFill_fill(VALUE, VALUE); // rmpixel.c ATTR_ACCESSOR(Pixel, red) ATTR_ACCESSOR(Pixel, green) ATTR_ACCESSOR(Pixel, blue) ATTR_ACCESSOR(Pixel, opacity) ATTR_ACCESSOR(Pixel, cyan) ATTR_ACCESSOR(Pixel, magenta) ATTR_ACCESSOR(Pixel, yellow) ATTR_ACCESSOR(Pixel, black) extern void destroy_Pixel(Pixel *); extern VALUE Pixel_alloc(VALUE); extern VALUE Pixel_case_eq(VALUE, VALUE); extern VALUE Pixel_clone(VALUE); extern VALUE Pixel_dup(VALUE); extern VALUE Pixel_eql_q(VALUE, VALUE); extern VALUE Pixel_fcmp(int, VALUE *, VALUE); extern VALUE Pixel_from_color(VALUE, VALUE); extern VALUE Pixel_from_HSL(VALUE, VALUE); extern VALUE Pixel_from_hsla(int, VALUE *, VALUE); extern VALUE Pixel_hash(VALUE); extern VALUE Pixel_initialize(int, VALUE *, VALUE); extern VALUE Pixel_init_copy(VALUE, VALUE); extern VALUE Pixel_intensity(VALUE); extern VALUE Pixel_marshal_dump(VALUE); extern VALUE Pixel_marshal_load(VALUE, VALUE); extern VALUE Pixel_spaceship(VALUE, VALUE); extern VALUE Pixel_to_color(int, VALUE *, VALUE); extern VALUE Pixel_to_HSL(VALUE); extern VALUE Pixel_to_hsla(VALUE); extern VALUE Pixel_to_s(VALUE); // rmenum.c extern VALUE Enum_alloc(VALUE); extern VALUE Enum_initialize(VALUE, VALUE, VALUE); extern VALUE Enum_to_s(VALUE); extern VALUE Enum_to_i(VALUE); extern VALUE Enum_spaceship(VALUE, VALUE); extern VALUE Enum_case_eq(VALUE, VALUE); extern VALUE Enum_type_initialize(VALUE, VALUE, VALUE); extern VALUE Enum_type_each(VALUE); extern VALUE rm_enum_new(VALUE, VALUE, VALUE); // rmstruct.c extern VALUE ChromaticityInfo_to_s(VALUE); extern VALUE ChromaticityInfo_new(ChromaticityInfo *); extern void Color_to_PixelPacket(PixelPacket *, VALUE); extern void Color_to_MagickPixelPacket(Image *, MagickPixelPacket *, VALUE); extern VALUE Color_to_s(VALUE); extern VALUE Import_ColorInfo(const ColorInfo *); extern VALUE ClassType_new(ClassType); extern VALUE ColorspaceType_new(ColorspaceType); extern VALUE CompositeOperator_new(CompositeOperator); extern VALUE CompressionType_new(CompressionType); extern VALUE DisposeType_new(DisposeType); extern VALUE EndianType_new(EndianType); extern VALUE FilterTypes_new(FilterTypes); extern VALUE GravityType_new(GravityType); extern VALUE Font_to_s(VALUE); extern VALUE ImageType_new(ImageType); extern VALUE InterlaceType_new(InterlaceType); extern VALUE Pixel_from_MagickPixelPacket(const MagickPixelPacket *); extern VALUE Pixel_from_PixelPacket(const PixelPacket *); extern void Export_PointInfo(PointInfo *, VALUE); extern VALUE Import_PointInfo(PointInfo *); extern VALUE PrimaryInfo_to_s(VALUE); extern VALUE Import_PrimaryInfo(PrimaryInfo *); extern VALUE RectangleInfo_to_s(VALUE); extern VALUE Import_RectangleInfo(RectangleInfo *); extern VALUE RenderingIntent_new(RenderingIntent); extern VALUE ResolutionType_new(ResolutionType); extern VALUE SegmentInfo_to_s(VALUE); extern VALUE Import_SegmentInfo(SegmentInfo *); extern void Export_AffineMatrix(AffineMatrix *, VALUE); extern VALUE Import_AffineMatrix(AffineMatrix *); extern void Export_ChromaticityInfo(ChromaticityInfo *, VALUE); extern void Export_ColorInfo(ColorInfo *, VALUE); extern VALUE InterpolatePixelMethod_new(InterpolatePixelMethod); extern VALUE OrientationType_new(OrientationType); extern void Export_PrimaryInfo(PrimaryInfo *, VALUE); extern void Export_RectangleInfo(RectangleInfo *, VALUE); extern void Export_SegmentInfo(SegmentInfo *, VALUE); extern void Font_to_TypeInfo(TypeInfo *, VALUE); extern void Export_TypeMetric(TypeMetric *, VALUE); extern VALUE Import_TypeInfo(const TypeInfo *); extern VALUE TypeMetric_to_s(VALUE); extern void Export_TypeInfo(TypeInfo *, VALUE); extern VALUE Import_TypeMetric(TypeMetric *); extern const char *StorageType_name(StorageType); extern VALUE VirtualPixelMethod_new(VirtualPixelMethod); extern VALUE LAYERMETHODTYPE_NEW(LAYERMETHODTYPE); // rmutil.c extern VALUE ImageMagickError_initialize(int, VALUE *, VALUE); extern void *magick_malloc(const size_t); extern void *magick_safe_malloc(const size_t, const size_t); extern void magick_free(void *); extern void *magick_realloc(void *, const size_t); extern void *magick_safe_realloc(void *, const size_t, const size_t); extern void magick_clone_string(char **, const char *); extern VALUE rm_cur_image(VALUE); extern VALUE rm_pixelpacket_to_color_name(Image *, PixelPacket *); extern VALUE rm_pixelpacket_to_color_name_info(Info *, PixelPacket *); extern VALUE rm_no_freeze(VALUE); extern int rm_strcasecmp(const char *, const char *); extern int rm_strncasecmp(const char *, const char *, size_t); extern void rm_check_ary_len(VALUE, long); extern Image *rm_check_destroyed(VALUE); extern Image *rm_check_frozen(VALUE); extern VALUE rm_to_s(VALUE); extern char *rm_str2cstr(VALUE, long *); extern int rm_check_num2dbl(VALUE); extern double rm_fuzz_to_dbl(VALUE); extern Quantum rm_app2quantum(VALUE); extern double rm_percentage(VALUE,double); extern double rm_str_to_pct(VALUE); extern VALUE rm_define_enum_type(const char *); extern void rm_write_temp_image(Image *, char *); extern void rm_delete_temp_image(char *); extern void rm_not_implemented(void); extern void rm_attr_write(VALUE, VALUE); extern void rm_get_geometry(VALUE, long *, long *, unsigned long *, unsigned long *, int *); extern const char *rm_get_property(const Image *, const char *); extern MagickBooleanType rm_set_property(Image *, const char *, const char *); extern void rm_set_user_artifact(Image *, Info *); void rm_set_magick_pixel_packet(Pixel *, MagickPixelPacket *); extern void rm_sync_image_options(Image *, Info *); extern void rm_split(Image *); extern void rm_magick_error(const char *, const char *); //! whether to retain on errors typedef enum { RetainOnError = 0, /**< retain on error */ DestroyOnError = 1 /**< do not retain on error */ } ErrorRetention; extern void rm_check_image_exception(Image *, ErrorRetention); extern void rm_check_exception(ExceptionInfo *, Image *, ErrorRetention); extern void rm_ensure_result(Image *); extern Image *rm_clone_image(Image *); extern MagickBooleanType rm_progress_monitor(const char *, const MagickOffsetType, const MagickSizeType, void *); extern VALUE rm_exif_by_entry(Image *); extern VALUE rm_exif_by_number(Image *); extern void rm_get_optional_arguments(VALUE); extern void rm_fatal_error_handler(const ExceptionType, const char *, const char *); extern void rm_error_handler(const ExceptionType, const char *, const char *); extern void rm_warning_handler(const ExceptionType, const char *, const char *); #endif rmagick-2.13.2/ext/RMagick/rmdraw.c0000644000004100000410000014205412147515547017042 0ustar www-datawww-data/**************************************************************************//** * Contains Draw class methods. * * Copyright © 2002 - 2009 by Timothy P. Hunter * * Changes since Nov. 2009 copyright © by Benjamin Thomas and Omer Bar-or * * @file rmdraw.c * @version $Id: rmdraw.c,v 1.83 2009/12/20 02:33:33 baror Exp $ * @author Tim Hunter ******************************************************************************/ #include "rmagick.h" #include "float.h" static void mark_Draw(void *); static void destroy_Draw(void *); static VALUE new_DrawOptions(void); /** Method that gets type metrics */ typedef MagickBooleanType (get_type_metrics_func_t)(Image *, const DrawInfo *, TypeMetric *); static VALUE get_type_metrics(int, VALUE *, VALUE, get_type_metrics_func_t); /** * Set the affine matrix from an Magick::AffineMatrix. * * Ruby usage: * - @verbatim Draw#affine= @endverbatim * * @param self this object * @param matrix the affine matrix to set * @return self */ VALUE Draw_affine_eq(VALUE self, VALUE matrix) { Draw *draw; rb_check_frozen(self); Data_Get_Struct(self, Draw, draw); Export_AffineMatrix(&draw->info->affine, matrix); return self; } /** * Set the text alignment. * * Ruby usage: * - @verbatim Draw#align= @endverbatim * * @param self this object * @param align the alignment * @return self */ VALUE Draw_align_eq(VALUE self, VALUE align) { Draw *draw; rb_check_frozen(self); Data_Get_Struct(self, Draw, draw); VALUE_TO_ENUM(align, draw->info->align, AlignType); return self; } /** * Decorate attribute writer. * * Ruby usage: * - @verbatim Draw#decorate= @endverbatim * * @param self this object * @param decorate the decorate * @return self */ VALUE Draw_decorate_eq(VALUE self, VALUE decorate) { Draw *draw; rb_check_frozen(self); Data_Get_Struct(self, Draw, draw); VALUE_TO_ENUM(decorate, draw->info->decorate, DecorationType); return self; } /** * Density attribute writer. * * Ruby usage: * - @verbatim Draw#density= @endverbatim * * @param self this object * @param density the density * @return self */ VALUE Draw_density_eq(VALUE self, VALUE density) { Draw *draw; rb_check_frozen(self); Data_Get_Struct(self, Draw, draw); magick_clone_string(&draw->info->density, StringValuePtr(density)); return self; } /** * Encoding attribute writer. * * Ruby usage: * - @verbatim Draw#encoding= @endverbatim * * @param self this object * @param encoding the encoding * @return self */ VALUE Draw_encoding_eq(VALUE self, VALUE encoding) { Draw *draw; rb_check_frozen(self); Data_Get_Struct(self, Draw, draw); magick_clone_string(&draw->info->encoding, StringValuePtr(encoding)); return self; } /** * Fill attribute writer. * * Ruby usage: * - @verbatim Draw#fill= @endverbatim * * @param self this object * @param fill the fill * @return self */ VALUE Draw_fill_eq(VALUE self, VALUE fill) { Draw *draw; rb_check_frozen(self); Data_Get_Struct(self, Draw, draw); Color_to_PixelPacket(&draw->info->fill, fill); return self; } /** * Accept an image as a fill pattern. * * Ruby usage: * - @verbatim Draw#fill_pattern= @endverbatim * * @param self this object * @param pattern the fill pattern * @return self * @see Draw_stroke_pattern_eq * @see Draw_tile_eq */ VALUE Draw_fill_pattern_eq(VALUE self, VALUE pattern) { Draw *draw; Image *image; rb_check_frozen(self); Data_Get_Struct(self, Draw, draw); if (draw->info->fill_pattern != NULL) { // Do not trace destruction DestroyImage(draw->info->fill_pattern); draw->info->fill_pattern = NULL; } if (!NIL_P(pattern)) { pattern = rm_cur_image(pattern); image = rm_check_destroyed(pattern); // Do not trace creation draw->info->fill_pattern = rm_clone_image(image); } return self; } /** * Font attribute writer. * * Ruby usage: * - @verbatim Draw#font= @endverbatim * * @param self this object * @param font the font * @return self */ VALUE Draw_font_eq(VALUE self, VALUE font) { Draw *draw; rb_check_frozen(self); Data_Get_Struct(self, Draw, draw); magick_clone_string(&draw->info->font, StringValuePtr(font)); return self; } /** * Font family attribute writer. * * Ruby usage: * - @verbatim Draw#family= @endverbatim * * @param self this object * @param family the family * @return self */ VALUE Draw_font_family_eq(VALUE self, VALUE family) { Draw *draw; rb_check_frozen(self); Data_Get_Struct(self, Draw, draw); magick_clone_string(&draw->info->family, StringValuePtr(family)); return self; } /** * Font_stretch attribute writer. * * Ruby usage: * - @verbatim Draw#font_stretch= @endverbatim * * @param self this object * @param stretch the font_stretch * @return self */ VALUE Draw_font_stretch_eq(VALUE self, VALUE stretch) { Draw *draw; rb_check_frozen(self); Data_Get_Struct(self, Draw, draw); VALUE_TO_ENUM(stretch, draw->info->stretch, StretchType); return self; } /** * Font_style attribute writer. * * Ruby usage: * - @verbatim Draw#font_style= @endverbatim * * @param self this object * @param style the font_style * @return self */ VALUE Draw_font_style_eq(VALUE self, VALUE style) { Draw *draw; rb_check_frozen(self); Data_Get_Struct(self, Draw, draw); VALUE_TO_ENUM(style, draw->info->style, StyleType); return self; } /** * Font_weight attribute writer. * * Ruby usage: * - @verbatim Draw#font_weight= @endverbatim * * Notes: * - The font weight can be one of the font weight constants or a number * between 100 and 900 * * @param self this object * @param weight the font_weight * @return self */ VALUE Draw_font_weight_eq(VALUE self, VALUE weight) { Draw *draw; WeightType w; rb_check_frozen(self); Data_Get_Struct(self, Draw, draw); if (FIXNUM_P(weight)) { w = (WeightType) FIX2INT(weight); if (w < 100 || w > 900) { rb_raise(rb_eArgError, "invalid font weight (%d given)", w); } draw->info->weight = w; } else { VALUE_TO_ENUM(weight, w, WeightType); switch (w) { case AnyWeight: draw->info->weight = 0; break; case NormalWeight: draw->info->weight = 400; break; case BoldWeight: draw->info->weight = 700; break; case BolderWeight: if (draw->info->weight <= 800) draw->info->weight += 100; break; case LighterWeight: if (draw->info->weight >= 100) draw->info->weight -= 100; break; default: rb_raise(rb_eArgError, "unknown font weight"); break; } } return self; } /** * Gravity attribute writer. * * Ruby usage: * - @verbatim Draw#gravity= @endverbatim * * Notes: * - From Magick++'s Image.h header file: * Gravity affects text placement in bounding area according to rules: * - NorthWestGravity text bottom-left corner placed at top-left * - NorthGravity text bottom-center placed at top-center * - NorthEastGravity text bottom-right corner placed at top-right * - WestGravity text left-center placed at left-center * - CenterGravity text center placed at center * - EastGravity text right-center placed at right-center * - SouthWestGravity text top-left placed at bottom-left * - SouthGravity text top-center placed at bottom-center * - SouthEastGravity text top-right placed at bottom-right * * @param self this object * @param grav the gravity * @return self */ VALUE Draw_gravity_eq(VALUE self, VALUE grav) { Draw *draw; rb_check_frozen(self); Data_Get_Struct(self, Draw, draw); VALUE_TO_ENUM(grav, draw->info->gravity, GravityType); return self; } /** * Space between two letters. * * Ruby usage: * - @verbatim Draw#gravity=float @endverbatim * * Notes: * - New for ImageMagick 6.4.7-8 * * @param self this object * @param kerning the kerning * @return self */ VALUE Draw_kerning_eq(VALUE self, VALUE kerning) { #if defined(HAVE_ST_KERNING) Draw *draw; rb_check_frozen(self); Data_Get_Struct(self, Draw, draw); draw->info->kerning = NUM2DBL(kerning); return self; #else rm_not_implemented(); return (VALUE)0; self = self; kerning = kerning; #endif } /** * Space between two lines. * * Ruby usage: * - @verbatim Draw#interline_spacing= @endverbatim * * Notes: * - New for ImageMagick 6.5.5-8 * * @param self this object * @param spacing the spacing * @return self */ VALUE Draw_interline_spacing_eq(VALUE self, VALUE spacing) { #if defined(HAVE_ST_INTERLINE_SPACING) Draw *draw; rb_check_frozen(self); Data_Get_Struct(self, Draw, draw); draw->info->interline_spacing = NUM2DBL(spacing); return self; #else rm_not_implemented(); return (VALUE)0; self = self; spacing = spacing; #endif } /** * Space between two words. * * Ruby usage: * - @verbatim Draw#interword_spacing= @endverbatim * * Notes: * - New for ImageMagick 6.4.8-0 * * @param self this object * @param spacing the spacing * @return self */ VALUE Draw_interword_spacing_eq(VALUE self, VALUE spacing) { #if defined(HAVE_ST_INTERWORD_SPACING) Draw *draw; rb_check_frozen(self); Data_Get_Struct(self, Draw, draw); draw->info->interword_spacing = NUM2DBL(spacing); return self; #else rm_not_implemented(); return (VALUE)0; self = self; spacing = spacing; #endif } /** * Convert an image to a blob and the blob to a String. * * No Ruby usage (internal function) * * Notes: * - Returns Qnil if there is no image * * @param image the Image to convert * @return Ruby string representation of image * @see str_to_image */ static VALUE image_to_str(Image *image) { volatile VALUE dimg = Qnil; unsigned char *blob; size_t length; Info *info; ExceptionInfo exception; if (image) { info = CloneImageInfo(NULL); GetExceptionInfo(&exception); blob = ImageToBlob(info, image, &length, &exception); DestroyImageInfo(info); CHECK_EXCEPTION(); DestroyExceptionInfo(&exception); dimg = rb_str_new((char *)blob, (long)length); magick_free((void*)blob); } return dimg; } /** * Undo the image_to_str, above. * * No Ruby usage (internal function) * * Notes: * - Returns NULL if the argument is Qnil * * @param str the Ruby string to convert * @return Image represented by str * @see image_to_str */ static Image *str_to_image(VALUE str) { Image *image = NULL; Info *info; ExceptionInfo exception; if (str != Qnil) { info = CloneImageInfo(NULL); GetExceptionInfo(&exception); image = BlobToImage(info, RSTRING_PTR(str), RSTRING_LEN(str), &exception); DestroyImageInfo(info); CHECK_EXCEPTION(); DestroyExceptionInfo(&exception); } return image; } /** * Custom marshal for Draw objects. * * Ruby usage: * - @verbatim Draw#marshal_dump @endverbatim * * Notes: * - Instead of trying to replicate Ruby's support for cross-system * marshalling, exploit it. Convert the Draw fields to Ruby objects and * store them in a hash. Let Ruby marshal the hash. * - Commented out code that dumps/loads fields that are used internally by * ImageMagick and shouldn't be marshaled. I left the code as placeholders * so I'll know which fields have been deliberately omitted. * * @param self this object * @return the marshalled object (as a Ruby hash) * @todo Handle gradients when christy gets the new gradient support added (23Dec08) */ VALUE Draw_marshal_dump(VALUE self) { Draw *draw; VALUE ddraw; Data_Get_Struct(self, Draw, draw); // Raise an exception if the Draw has a non-NULL gradient or element_reference field if (draw->info->element_reference.type != UndefinedReference || draw->info->gradient.type != UndefinedGradient) { rb_raise(rb_eTypeError, "can't dump gradient definition"); } ddraw = rb_hash_new(); // rb_hash_aset(ddraw, CSTR2SYM("primitive"), MAGICK_STRING_TO_OBJ(draw->info->primitive)); internal // rb_hash_aset(ddraw, CSTR2SYM("geometry"), MAGICK_STRING_TO_OBJ(draw->info->geometry)); set by "text" primitive // rb_hash_aset(ddraw, CSTR2SYM("viewbox"), Import_RectangleInfo(&draw->info->viewbox)); internal rb_hash_aset(ddraw, CSTR2SYM("affine"), Import_AffineMatrix(&draw->info->affine)); rb_hash_aset(ddraw, CSTR2SYM("gravity"), INT2FIX(draw->info->gravity)); rb_hash_aset(ddraw, CSTR2SYM("fill"), Pixel_from_PixelPacket(&draw->info->fill)); rb_hash_aset(ddraw, CSTR2SYM("stroke"), Pixel_from_PixelPacket(&draw->info->stroke)); rb_hash_aset(ddraw, CSTR2SYM("stroke_width"), rb_float_new(draw->info->stroke_width)); // rb_hash_aset(ddraw, CSTR2SYM("gradient"), Qnil); // not used yet rb_hash_aset(ddraw, CSTR2SYM("fill_pattern"), image_to_str(draw->info->fill_pattern)); rb_hash_aset(ddraw, CSTR2SYM("tile"), Qnil); // deprecated rb_hash_aset(ddraw, CSTR2SYM("stroke_pattern"), image_to_str(draw->info->stroke_pattern)); rb_hash_aset(ddraw, CSTR2SYM("stroke_antialias"), draw->info->stroke_antialias ? Qtrue : Qfalse); rb_hash_aset(ddraw, CSTR2SYM("text_antialias"), draw->info->text_antialias ? Qtrue : Qfalse); // rb_hash_aset(ddraw, CSTR2SYM("fill_rule"), INT2FIX(draw->info->fill_rule)); internal // rb_hash_aset(ddraw, CSTR2SYM("linecap"), INT2FIX(draw->info->linecap)); // rb_hash_aset(ddraw, CSTR2SYM("linejoin"), INT2FIX(draw->info->linejoin)); // rb_hash_aset(ddraw, CSTR2SYM("miterlimit"), ULONG2NUM(draw->info->miterlimit)); // rb_hash_aset(ddraw, CSTR2SYM("dash_offset"), rb_float_new(draw->info->dash_offset)); rb_hash_aset(ddraw, CSTR2SYM("decorate"), INT2FIX(draw->info->decorate)); // rb_hash_aset(ddraw, CSTR2SYM("compose"), INT2FIX(draw->info->compose)); set via "image" primitive // rb_hash_aset(ddraw, CSTR2SYM("text"), MAGICK_STRING_TO_OBJ(draw->info->text)); set via "text" primitive // rb_hash_aset(ddraw, CSTR2SYM("face"), Qnil); internal rb_hash_aset(ddraw, CSTR2SYM("font"), MAGICK_STRING_TO_OBJ(draw->info->font)); // rb_hash_aset(ddraw, CSTR2SYM("metrics"), Qnil); internal rb_hash_aset(ddraw, CSTR2SYM("family"), MAGICK_STRING_TO_OBJ(draw->info->family)); rb_hash_aset(ddraw, CSTR2SYM("style"), INT2FIX(draw->info->style)); rb_hash_aset(ddraw, CSTR2SYM("stretch"), INT2FIX(draw->info->stretch)); rb_hash_aset(ddraw, CSTR2SYM("weight"), ULONG2NUM(draw->info->weight)); rb_hash_aset(ddraw, CSTR2SYM("encoding"), MAGICK_STRING_TO_OBJ(draw->info->encoding)); rb_hash_aset(ddraw, CSTR2SYM("pointsize"), rb_float_new(draw->info->pointsize)); rb_hash_aset(ddraw, CSTR2SYM("density"), MAGICK_STRING_TO_OBJ(draw->info->density)); rb_hash_aset(ddraw, CSTR2SYM("align"), INT2FIX(draw->info->align)); rb_hash_aset(ddraw, CSTR2SYM("undercolor"), Pixel_from_PixelPacket(&draw->info->undercolor)); // rb_hash_aset(ddraw, CSTR2SYM("border_color"), Pixel_from_PixelPacket(&draw->info->border_color)); Montage and Polaroid // rb_hash_aset(ddraw, CSTR2SYM("server_name"), MAGICK_STRING_TO_OBJ(draw->info->server_name)); // rb_hash_aset(ddraw, CSTR2SYM("dash_pattern"), dash_pattern_to_array(draw->info->dash_pattern)); internal // rb_hash_aset(ddraw, CSTR2SYM("clip_mask"), MAGICK_STRING_TO_OBJ(draw->info->clip_mask)); internal // rb_hash_aset(ddraw, CSTR2SYM("bounds"), Import_SegmentInfo(&draw->info->bounds)); internal rb_hash_aset(ddraw, CSTR2SYM("clip_units"), INT2FIX(draw->info->clip_units)); rb_hash_aset(ddraw, CSTR2SYM("opacity"), QUANTUM2NUM(draw->info->opacity)); // rb_hash_aset(ddraw, CSTR2SYM("render"), draw->info->render ? Qtrue : Qfalse); internal // rb_hash_aset(ddraw, CSTR2SYM("element_reference"), Qnil); // not used yet // rb_hash_aset(ddraw, CSTR2SYM("debug"), draw->info->debug ? Qtrue : Qfalse); #if defined(HAVE_ST_KERNING) rb_hash_aset(ddraw, CSTR2SYM("kerning"), rb_float_new(draw->info->kerning)); #endif #if defined(HAVE_ST_INTERWORD_SPACING) rb_hash_aset(ddraw, CSTR2SYM("interword_spacing"), rb_float_new(draw->info->interword_spacing)); #endif // Non-DrawInfo fields rb_hash_aset(ddraw, CSTR2SYM("primitives"), draw->primitives); // rb_hash_aset(ddraw, CSTR2SYM("shadow_color"), Pixel_from_PixelPacket(&draw->shadow_color)); Polaroid-only return ddraw; } /** * Support Marsal.load. * * Ruby usage: * - @verbatim Draw#marshal_load @endverbatim * * Notes: * - On entry all fields are all-bits-0 * * @param self this object * @param ddraw the marshalled object * @return self, once marshalled */ VALUE Draw_marshal_load(VALUE self, VALUE ddraw) { Draw *draw; Pixel *pixel; volatile VALUE val; Data_Get_Struct(self, Draw, draw); draw->info = magick_malloc(sizeof(DrawInfo)); if (!draw->info) { rb_raise(rb_eNoMemError, "not enough memory to continue"); } GetDrawInfo(NULL, draw->info); OBJ_TO_MAGICK_STRING(draw->info->geometry, rb_hash_aref(ddraw, CSTR2SYM("geometry"))); //val = rb_hash_aref(ddraw, CSTR2SYM("viewbox")); //Export_RectangleInfo(&draw->info->viewbox, val); val = rb_hash_aref(ddraw, CSTR2SYM("affine")); Export_AffineMatrix(&draw->info->affine, val); draw->info->gravity = (GravityType) FIX2INT(rb_hash_aref(ddraw, CSTR2SYM("gravity"))); val = rb_hash_aref(ddraw, CSTR2SYM("fill")); Data_Get_Struct(val, Pixel, pixel); draw->info->fill = *pixel; val = rb_hash_aref(ddraw, CSTR2SYM("stroke")); Data_Get_Struct(val, Pixel, pixel); draw->info->stroke = *pixel; draw->info->stroke_width = NUM2DBL(rb_hash_aref(ddraw, CSTR2SYM("stroke_width"))); draw->info->fill_pattern = str_to_image(rb_hash_aref(ddraw, CSTR2SYM("fill_pattern"))); draw->info->stroke_pattern = str_to_image(rb_hash_aref(ddraw, CSTR2SYM("stroke_pattern"))); draw->info->stroke_antialias = RTEST(rb_hash_aref(ddraw, CSTR2SYM("stroke_antialias"))); draw->info->text_antialias = RTEST(rb_hash_aref(ddraw, CSTR2SYM("text_antialias"))); draw->info->decorate = (DecorationType) FIX2INT(rb_hash_aref(ddraw, CSTR2SYM("decorate"))); OBJ_TO_MAGICK_STRING(draw->info->font, rb_hash_aref(ddraw, CSTR2SYM("font"))); OBJ_TO_MAGICK_STRING(draw->info->family, rb_hash_aref(ddraw, CSTR2SYM("family"))); draw->info->style = (StyleType) FIX2INT(rb_hash_aref(ddraw, CSTR2SYM("style"))); draw->info->stretch = (StretchType) FIX2INT(rb_hash_aref(ddraw, CSTR2SYM("stretch"))); draw->info->weight = NUM2ULONG(rb_hash_aref(ddraw, CSTR2SYM("weight"))); OBJ_TO_MAGICK_STRING(draw->info->encoding, rb_hash_aref(ddraw, CSTR2SYM("encoding"))); draw->info->pointsize = NUM2DBL(rb_hash_aref(ddraw, CSTR2SYM("pointsize"))); OBJ_TO_MAGICK_STRING(draw->info->density, rb_hash_aref(ddraw, CSTR2SYM("density"))); draw->info->align = (AlignType) FIX2INT(rb_hash_aref(ddraw, CSTR2SYM("align"))); val = rb_hash_aref(ddraw, CSTR2SYM("undercolor")); Data_Get_Struct(val, Pixel, pixel); draw->info->undercolor = *pixel; draw->info->clip_units = FIX2INT(rb_hash_aref(ddraw, CSTR2SYM("clip_units"))); draw->info->opacity = NUM2QUANTUM(rb_hash_aref(ddraw, CSTR2SYM("opacity"))); #if defined(HAVE_ST_KERNING) draw->info->kerning = NUM2DBL(rb_hash_aref(ddraw, CSTR2SYM("kerning"))); #endif #if defined(HAVE_ST_INTERWORD_SPACING) draw->info->interword_spacing = NUM2DBL(rb_hash_aref(ddraw, CSTR2SYM("interword_spacing"))); #endif draw->primitives = rb_hash_aref(ddraw, CSTR2SYM("primitives")); return self; } /** * Pointsize attribute writer. * * Ruby usage: * - @verbatim Draw#pointsize= @endverbatim * * @param self this object * @param pointsize the pointsize * @return self */ VALUE Draw_pointsize_eq(VALUE self, VALUE pointsize) { Draw *draw; rb_check_frozen(self); Data_Get_Struct(self, Draw, draw); draw->info->pointsize = NUM2DBL(pointsize); return self; } /** * Set rotation attribute value. * * Ruby usage: * - @verbatim Magick::Draw#rotation= @endverbatim * * Notes: * - Argument should be in degrees * - Taken from Magick++'s Magick::Image::annotate method. * Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002 * * @param self this object * @param deg the number of degrees * @return self */ VALUE Draw_rotation_eq(VALUE self, VALUE deg) { Draw *draw; double degrees; AffineMatrix affine, current; rb_check_frozen(self); Data_Get_Struct(self, Draw, draw); degrees = NUM2DBL(deg); if (fabs(degrees) > DBL_EPSILON) { affine.sx=1.0; affine.rx=0.0; affine.ry=0.0; affine.sy=1.0; affine.tx=0.0; affine.ty=0.0; current = draw->info->affine; affine.sx=cos(DegreesToRadians(fmod(degrees,360.0))); affine.rx=sin(DegreesToRadians(fmod(degrees,360.0))); affine.ry=(-sin(DegreesToRadians(fmod(degrees,360.0)))); affine.sy=cos(DegreesToRadians(fmod(degrees,360.0))); draw->info->affine.sx=current.sx*affine.sx+current.ry*affine.rx; draw->info->affine.rx=current.rx*affine.sx+current.sy*affine.rx; draw->info->affine.ry=current.sx*affine.ry+current.ry*affine.sy; draw->info->affine.sy=current.rx*affine.ry+current.sy*affine.sy; draw->info->affine.tx=current.sx*affine.tx+current.ry*affine.ty+current.tx; } return self; } /** * Stroke attribute writer. * * Ruby usage: * - @verbatim Draw#stroke= @endverbatim * * @param self this object * @param stroke the stroke * @return self */ VALUE Draw_stroke_eq(VALUE self, VALUE stroke) { Draw *draw; rb_check_frozen(self); Data_Get_Struct(self, Draw, draw); Color_to_PixelPacket(&draw->info->stroke, stroke); return self; } /** * Accept an image as a stroke pattern. * * Ruby usage: * - @verbatim Draw#stroke_pattern= @endverbatim * * @param self this object * @param pattern the pattern * @return self * @see Draw_fill_pattern_eq */ VALUE Draw_stroke_pattern_eq(VALUE self, VALUE pattern) { Draw *draw; Image *image; rb_check_frozen(self); Data_Get_Struct(self, Draw, draw); if (draw->info->stroke_pattern != NULL) { // Do not trace destruction DestroyImage(draw->info->stroke_pattern); draw->info->stroke_pattern = NULL; } if (!NIL_P(pattern)) { // DestroyDrawInfo destroys the clone pattern = rm_cur_image(pattern); image = rm_check_destroyed(pattern); // Do not trace creation draw->info->stroke_pattern = rm_clone_image(image); } return self; } /** * Stroke_width attribute writer. * * Ruby usage: * - @verbatim Draw#stroke_width= @endverbatim * * @param self this object * @param stroke_width the stroke_width * @return self */ VALUE Draw_stroke_width_eq(VALUE self, VALUE stroke_width) { Draw *draw; rb_check_frozen(self); Data_Get_Struct(self, Draw, draw); draw->info->stroke_width = NUM2DBL(stroke_width); return self; } /** * Text_antialias attribute writer. * * Ruby usage: * - @verbatim Draw#text_antialias= @endverbatim * * @param self this object * @param text_antialias the text_antialias * @return self */ VALUE Draw_text_antialias_eq(VALUE self, VALUE text_antialias) { Draw *draw; rb_check_frozen(self); Data_Get_Struct(self, Draw, draw); draw->info->text_antialias = (MagickBooleanType) RTEST(text_antialias); return self; } /** * Tile attribute writer. * * Ruby usage: * - @verbatim Draw#tile= @endverbatim * * @param self this object * @param image the image to tile * @return self */ VALUE Draw_tile_eq(VALUE self, VALUE image) { return Draw_fill_pattern_eq(self, image); } /** * Undercolor attribute writer. * * Ruby usage: * - @verbatim Draw#undercolor= @endverbatim * * @param self this object * @param undercolor the undercolor * @return self */ VALUE Draw_undercolor_eq(VALUE self, VALUE undercolor) { Draw *draw; rb_check_frozen(self); Data_Get_Struct(self, Draw, draw); Color_to_PixelPacket(&draw->info->undercolor, undercolor); return self; } /** * Annotates an image with text. * * Ruby usage: * - @verbatim Draw#annotate(img, w, h, x, y, text) <{optional parms}> @endverbatim * * Notes: * - Additional Draw attribute methods may be called in the optional block, * which is executed in the context of an Draw object. * * @param self this object * @param image_arg the image * @param width_arg the width * @param height_arg the height * @param x_arg x position * @param y_arg y position * @param text the annotation text * @return self */ VALUE Draw_annotate( VALUE self, VALUE image_arg, VALUE width_arg, VALUE height_arg, VALUE x_arg, VALUE y_arg, VALUE text) { Draw *draw; Image *image; unsigned long width, height; long x, y; AffineMatrix keep; char geometry_str[50]; // Save the affine matrix in case it is modified by // Draw#rotation= Data_Get_Struct(self, Draw, draw); keep = draw->info->affine; image_arg = rm_cur_image(image_arg); image = rm_check_frozen(image_arg); // If we have an optional parm block, run it in self's context, // allowing the app a chance to modify the object's attributes if (rb_block_given_p()) { (void)rb_obj_instance_eval(0, NULL, self); } // Translate & store in Draw structure draw->info->text = InterpretImageProperties(NULL, image, StringValuePtr(text)); if (!draw->info->text) { rb_raise(rb_eArgError, "no text"); } // Create geometry string, copy to Draw structure, overriding // any previously existing value. width = NUM2ULONG(width_arg); height = NUM2ULONG(height_arg); x = NUM2LONG(x_arg); y = NUM2LONG(y_arg); if (width == 0 && height == 0) { sprintf(geometry_str, "%+ld%+ld", x, y); } // WxH is non-zero else { sprintf(geometry_str, "%lux%lu%+ld%+ld", width, height, x, y); } magick_clone_string(&draw->info->geometry, geometry_str); (void) AnnotateImage(image, draw->info); magick_free(draw->info->text); draw->info->text = NULL; draw->info->affine = keep; rm_check_image_exception(image, RetainOnError); return self; } /** * Clones this object. * * Ruby usage: * - @verbatim Draw#clone @endverbatim * * @param self this object * @return the clone * @see Draw_dup * @see Draw_init_copy */ VALUE Draw_clone(VALUE self) { volatile VALUE clone; clone = Draw_dup(self); if (OBJ_FROZEN(self)) { OBJ_FREEZE(clone); } return clone; } /** * Implement the "image" drawing primitive. * * Ruby usage: * - @verbatim Draw#composite(x,y,width,height,img) @endverbatim * - @verbatim Draw#composite(x,y,width,height,img,operator) @endverbatim * * Notes: * - Default operator is overComposite * - The "img" argument can be either an ImageList object or an Image * argument. * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self */ VALUE Draw_composite(int argc, VALUE *argv, VALUE self) { Draw *draw; const char *op = "Over"; double x, y, width, height; CompositeOperator cop = OverCompositeOp; volatile VALUE image; Image *comp_img; struct TmpFile_Name *tmpfile_name; char name[MaxTextExtent]; // Buffer for "image" primitive char primitive[MaxTextExtent]; if (argc < 5 || argc > 6) { rb_raise(rb_eArgError, "wrong number of arguments (%d for 5 or 6)", argc); } // Retrieve the image to composite image = rm_cur_image(argv[4]); (void) rm_check_destroyed(image); x = NUM2DBL(argv[0]); y = NUM2DBL(argv[1]); width = NUM2DBL(argv[2]); height = NUM2DBL(argv[3]); // The default composition operator is "Over". if (argc == 6) { VALUE_TO_ENUM(argv[5], cop, CompositeOperator); switch (cop) { case AddCompositeOp: op = "Add"; break; case AtopCompositeOp: op = "Atop"; break; case BlendCompositeOp: op = "Blend"; break; #if defined(HAVE_ENUM_BLURCOMPOSITEOP) case BlurCompositeOp: op = "Blur"; break; #endif case BumpmapCompositeOp: op = "Bumpmap"; break; case ChangeMaskCompositeOp: op = "ChangeMask"; break; case ClearCompositeOp: op = "Clear"; break; case ColorBurnCompositeOp: op = "ColorBurn"; break; case ColorDodgeCompositeOp: op = "ColorDodge"; break; case ColorizeCompositeOp: op = "Colorize"; break; case CopyCompositeOp: op = "Copy"; break; case CopyBlackCompositeOp: op = "CopyBlack"; break; case CopyBlueCompositeOp: op = "CopyBlue"; break; case CopyCyanCompositeOp: op = "CopyCyan"; break; case CopyGreenCompositeOp: op = "CopyGreen"; break; case CopyMagentaCompositeOp: op = "CopyMagenta"; break; case CopyOpacityCompositeOp: op = "CopyOpacity"; break; case CopyRedCompositeOp: op = "CopyRed"; break; case CopyYellowCompositeOp: op = "CopyYellow"; break; case DarkenCompositeOp: op = "Darken"; break; #if defined(HAVE_ENUM_DISTORTCOMPOSITEOP) case DistortCompositeOp: op = "Distort"; break; #endif case DivideCompositeOp: op = "Divide"; break; case DstCompositeOp: op = "Dst"; break; case DstAtopCompositeOp: op = "DstAtop"; break; case DstInCompositeOp: op = "DstIn"; break; case DstOutCompositeOp: op = "DstOut"; break; case DstOverCompositeOp: op = "DstOver"; break; case DifferenceCompositeOp: op = "Difference"; break; case DisplaceCompositeOp: op = "Displace"; break; case DissolveCompositeOp: op = "Dissolve"; break; case ExclusionCompositeOp: op = "Exclusion"; break; case HardLightCompositeOp: op = "HardLight"; break; case HueCompositeOp: op = "Hue"; break; case InCompositeOp: op = "In"; break; case LightenCompositeOp: op = "Lighten"; break; #if defined(HAVE_ENUM_LINEARBURNCOMPOSITEOP) case LinearBurnCompositeOp: op = "LinearBurn"; break; #endif #if defined(HAVE_ENUM_LINEARDODGECOMPOSITEOP) case LinearDodgeCompositeOp: op = "LinearDodge"; break; #endif case LinearLightCompositeOp: op = "LinearLight"; break; case LuminizeCompositeOp: op = "Luminize"; break; case MinusCompositeOp: op = "Minus"; break; case ModulateCompositeOp: op = "Modulate"; break; case MultiplyCompositeOp: op = "Multiply"; break; case OutCompositeOp: op = "Out"; break; case OverCompositeOp: op = "Over"; break; case OverlayCompositeOp: op = "Overlay"; break; #if defined(HAVE_ENUM_PEGTOPLIGHTCOMPOSITEOP) case PegtopLightCompositeOp: op = "PegtopLight"; break; #endif #if defined(HAVE_ENUM_PINLIGHTCOMPOSITEOP) case PinLightCompositeOp: op = "PinLight"; break; #endif case PlusCompositeOp: op = "Plus"; break; case ReplaceCompositeOp: op = "Replace"; break; case SaturateCompositeOp: op = "Saturate"; break; case ScreenCompositeOp: op = "Screen"; break; case SoftLightCompositeOp: op = "SoftLight"; break; case SrcCompositeOp: op = "Src"; break; case SrcAtopCompositeOp: op = "SrcAtop"; break; case SrcInCompositeOp: op = "SrcIn"; break; case SrcOutCompositeOp: op = "SrcOut"; break; case SrcOverCompositeOp: op = "SrcOver"; break; case SubtractCompositeOp: op = "Subtract"; break; case ThresholdCompositeOp: op = "Threshold"; break; #if defined(HAVE_ENUM_VIVIDLIGHTCOMPOSITEOP) case VividLightCompositeOp: op = "VividLight"; break; #endif case XorCompositeOp: op = "Xor"; break; default: rb_raise(rb_eArgError, "unknown composite operator (%d)", cop); break; } } Data_Get_Struct(self, Draw, draw); // Create a temp copy of the composite image Data_Get_Struct(image, Image, comp_img); rm_write_temp_image(comp_img, name); // Add the temp filename to the filename array. // Use Magick storage since we need to keep the list around // until destroy_Draw is called. tmpfile_name = magick_malloc(sizeof(struct TmpFile_Name)+strlen(name)); strcpy(tmpfile_name->name, name); tmpfile_name->next = draw->tmpfile_ary; draw->tmpfile_ary = tmpfile_name; // Form the drawing primitive (void) sprintf(primitive, "image %s %g,%g,%g,%g '%s'", op, x, y, width, height, name); // Send "primitive" to self. (void) rb_funcall(self, rb_intern("primitive"), 1, rb_str_new2(primitive)); return self; } /** * Execute the stored drawing primitives on the current image. * * Ruby usage: * - @verbatim Draw#draw(i) @endverbatim * * @param self this object * @param image_arg the image argument * @return self */ VALUE Draw_draw(VALUE self, VALUE image_arg) { Draw *draw; Image *image; image_arg = rm_cur_image(image_arg); image = rm_check_frozen(image_arg); Data_Get_Struct(self, Draw, draw); if (draw->primitives == 0) { rb_raise(rb_eArgError, "nothing to draw"); } // Point the DrawInfo structure at the current set of primitives. magick_clone_string(&(draw->info->primitive), StringValuePtr(draw->primitives)); (void) DrawImage(image, draw->info); rm_check_image_exception(image, RetainOnError); magick_free(draw->info->primitive); draw->info->primitive = NULL; return self; } /** * Copy a Draw object. * * Ruby usage: * - @verbatim Draw#dup @endverbatim * * Notes: * - Constructs a new Draw object, then calls initialize_copy. * * @param self this object * @return the duplicate * @see Draw_clone * @see Draw_init_copy */ VALUE Draw_dup(VALUE self) { Draw *draw; volatile VALUE dup; draw = ALLOC(Draw); memset(draw, 0, sizeof(Draw)); dup = Data_Wrap_Struct(CLASS_OF(self), mark_Draw, destroy_Draw, draw); if (rb_obj_tainted(self)) { (void)rb_obj_taint(dup); } return rb_funcall(dup, rm_ID_initialize_copy, 1, self); } /** * Returns measurements for a given font and text string. * * Ruby usage: * - @verbatim Draw#get_type_metrics(text) @endverbatim * - @verbatim Draw#get_type_metrics(image, text) @endverbatim * * Notes: * - If the image argument has been omitted, use a dummy image, but make sure * the text has none of the special characters that refer to image * attributes. * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return the duplicate */ VALUE Draw_get_type_metrics( int argc, VALUE *argv, VALUE self) { return get_type_metrics(argc, argv, self, GetTypeMetrics); } /** * Returns measurements for a given font and text string. * * Ruby usage: * - @verbatim Draw#get_multiline_type_metrics(text) @endverbatim * - @verbatim Draw#get_multiline_type_metrics(image, text) @endverbatim * * Notes: * - If the image argument has been omitted, use a dummy image, but make sure * the text has none of the special characters that refer to image * attributes. * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return the duplicate */ VALUE Draw_get_multiline_type_metrics( int argc, VALUE *argv, VALUE self) { return get_type_metrics(argc, argv, self, GetMultilineTypeMetrics); } /** * Initialize clone, dup methods. * * Ruby usage: * - @verbatim Draw#initialize_copy @endverbatim * * @param self this object * @param orig the original object * @return self * @see Draw_clone * @see Draw_dup */ VALUE Draw_init_copy(VALUE self, VALUE orig) { Draw *copy, *original; Data_Get_Struct(orig, Draw, original); Data_Get_Struct(self, Draw, copy); copy->info = CloneDrawInfo(NULL, original->info); if (!copy->info) { rb_raise(rb_eNoMemError, "not enough memory to continue"); } if (original->primitives) { copy->primitives = rb_str_dup(original->primitives); } return self; } /** * Initialize Draw object. * * Ruby usage: * - @verbatim Draw#initialize <{ info initializers }> @endverbatim * * @param self this object * @return self */ VALUE Draw_initialize(VALUE self) { Draw *draw, *draw_options; volatile VALUE options; Data_Get_Struct(self, Draw, draw); options = new_DrawOptions(); Data_Get_Struct(options, Draw, draw_options); draw->info = draw_options->info; draw_options->info = NULL; return self; } /** * Display the primitives. * * Ruby usage: * - @verbatim Draw#inspect @endverbatim * * @param self this object * @return the draw primitives or the Ruby string "(no primitives defined)" if * they are not defined */ VALUE Draw_inspect(VALUE self) { Draw *draw; Data_Get_Struct(self, Draw, draw); return draw->primitives ? draw->primitives : rb_str_new2("(no primitives defined)"); } /** * Create a new Draw object. * * Ruby usage: * - @verbatim Draw.new @endverbatim * - @verbatim Draw.allocate @endverbatim * * @param class the Ruby Draw class * @return a new Draw object * @throw ImageMagickError if no memory */ VALUE Draw_alloc(VALUE class) { Draw *draw; volatile VALUE draw_obj; draw = ALLOC(Draw); memset(draw, 0, sizeof(Draw)); draw_obj = Data_Wrap_Struct(class, mark_Draw, destroy_Draw, draw); return draw_obj; } /** * Add a drawing primitive to the list of primitives in the Draw object. * * Ruby usage: * - @verbatim Draw#primitive @endverbatim * * @param self this object * @param primitive the primitive to add * @return self */ VALUE Draw_primitive(VALUE self, VALUE primitive) { Draw *draw; rb_check_frozen(self); Data_Get_Struct(self, Draw, draw); if (draw->primitives == (VALUE)0) { draw->primitives = primitive; } else { draw->primitives = rb_str_concat(draw->primitives, rb_str_new2("\n")); draw->primitives = rb_str_concat(draw->primitives, primitive); } return self; } /** * Mark referenced objects. * * No Ruby usage (internal function) * * @param drawptr pointer to a Draw object */ static void mark_Draw(void *drawptr) { Draw *draw = (Draw *)drawptr; if (draw->primitives != (VALUE)0) { rb_gc_mark(draw->primitives); } } /** * Free the memory associated with an Draw object. * * No Ruby usage (internal function) * * @param drawptr pointer to a Draw object */ static void destroy_Draw(void *drawptr) { Draw *draw = (Draw *)drawptr; struct TmpFile_Name *tmpfile_name; if (draw->info) { (void) DestroyDrawInfo(draw->info); draw->info = NULL; } // Erase any temporary image files. while (draw->tmpfile_ary) { tmpfile_name = draw->tmpfile_ary; draw->tmpfile_ary = draw->tmpfile_ary->next; rm_delete_temp_image(tmpfile_name->name); magick_free(tmpfile_name); } xfree(drawptr); } /** * Allocate & initialize a DrawOptions object. * * No Ruby usage (internal function) * * @return a new DrawOptions object */ static VALUE new_DrawOptions(void) { return DrawOptions_initialize(Draw_alloc(Class_DrawOptions)); } /** * Create a DrawOptions object. * * Ruby usage: * - @verbatim DrawOptions#allocate @endverbatim * - @verbatim DrawOptions#new @endverbatim * * Notes: * - The DrawOptions class is the same as the Draw class except is has only * the attribute writer functions * * @param class the Ruby DrawOptions class * @return a new DrawOptions object */ VALUE DrawOptions_alloc(VALUE class) { Draw *draw_options; volatile VALUE draw_options_obj; draw_options = ALLOC(Draw); memset(draw_options, 0, sizeof(Draw)); draw_options_obj = Data_Wrap_Struct(class, mark_Draw, destroy_Draw, draw_options); return draw_options_obj; } /** * Initialize a DrawOptions object. * * Ruby usage: * - @verbatim DrawOptions#initialize @endverbatim * * @param self this object * @return self */ VALUE DrawOptions_initialize(VALUE self) { Draw *draw_options; Data_Get_Struct(self, Draw, draw_options); draw_options->info = magick_malloc(sizeof(DrawInfo)); if (!draw_options->info) { rb_raise(rb_eNoMemError, "not enough memory to continue"); } GetDrawInfo(NULL, draw_options->info); if (rb_block_given_p()) { // Run the block in self's context (void) rb_obj_instance_eval(0, NULL, self); } return self; } /** * Allocate a new Magick::PolaroidOptions object. * * Ruby usage: * - @verbatim Magick::PolaroidOptions#allocate @endverbatim * - @verbatim Magick::PolaroidOptions#new @endverbatim * * Notes: * - Internally a PolaroidOptions object is the same as a Draw object. The * methods are implemented by Draw methods in rmdraw.c. * * @param class the Ruby PoloradoidOptions class * @return a new DrawOptions object */ VALUE PolaroidOptions_alloc(VALUE class) { volatile VALUE polaroid_obj; ImageInfo *image_info; Draw *draw; image_info = CloneImageInfo(NULL); draw = ALLOC(Draw); memset(draw, 0, sizeof(*draw)); draw->info=CloneDrawInfo(image_info,(DrawInfo *) NULL); (void)(void) DestroyImageInfo(image_info); polaroid_obj = Data_Wrap_Struct(class, NULL, destroy_Draw, draw); return polaroid_obj; } /** * Yield to an optional block. * * Ruby usage: * - @verbatim Magick::PolaroidOptions#initialize @endverbatim * * @param self this object * @return self */ VALUE PolaroidOptions_initialize(VALUE self) { Draw *draw; ExceptionInfo exception; // Default shadow color Data_Get_Struct(self, Draw, draw); GetExceptionInfo(&exception); (void) QueryColorDatabase("gray75", &draw->shadow_color, &exception); CHECK_EXCEPTION() (void) QueryColorDatabase("#dfdfdf", &draw->info->border_color, &exception); if (rb_block_given_p()) { // Run the block in self's context (void) rb_obj_instance_eval(0, NULL, self); } return self; } /** * Allocate a PolaroidOptions instance. * * No Ruby usage (internal function) * * @return new PolaroidOptions object */ VALUE rm_polaroid_new(void) { return PolaroidOptions_initialize(PolaroidOptions_alloc(Class_PolaroidOptions)); } /** * Set the shadow color attribute. * * Ruby usage: * - @verbatim PolaroidOptions#shadow_color= @endverbatim * * @param self this object * @param shadow the shadow color * @return self */ VALUE PolaroidOptions_shadow_color_eq(VALUE self, VALUE shadow) { Draw *draw; Data_Get_Struct(self, Draw, draw); Color_to_PixelPacket(&draw->shadow_color, shadow); return self; } /** * Set the border color attribute. * * Ruby usage: * - @verbatim PolaroidOptions#border_color= @endverbatim * * @param self this object * @param border the border color * @return self */ VALUE PolaroidOptions_border_color_eq(VALUE self, VALUE border) { Draw *draw; Data_Get_Struct(self, Draw, draw); Color_to_PixelPacket(&draw->info->border_color, border); return self; } /** * Create a dummy object of an image class. * * No Ruby usage (internal function) * * @param klass the class for which to create a dummy * @return the newly allocated dummy */ static VALUE get_dummy_tm_img(VALUE klass) { #define DUMMY_IMG_CLASS_VAR "@@_dummy_img_" volatile VALUE dummy_img = 0; Info *info; Image *image; if (rb_cvar_defined(klass, rb_intern(DUMMY_IMG_CLASS_VAR)) != Qtrue) { info = CloneImageInfo(NULL); if (!info) { rb_raise(rb_eNoMemError, "not enough memory to continue"); } image = AcquireImage(info); if (!image) { rb_raise(rb_eNoMemError, "not enough memory to continue"); } (void) DestroyImageInfo(info); dummy_img = rm_image_new(image); rb_cv_set(klass, DUMMY_IMG_CLASS_VAR, dummy_img); } dummy_img = rb_cv_get(klass, DUMMY_IMG_CLASS_VAR); return dummy_img; } /** * Call a get-type-metrics function. * * No Ruby usage (internal function) * * Notes: * - called by Draw_get_type_metrics and Draw_get_multiline_type_metrics * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @param getter which type metrics to get * @return the type metrics * @see Draw_get_type_metrics * @see Draw_get_multiline_type_metrics */ static VALUE get_type_metrics( int argc, VALUE *argv, VALUE self, get_type_metrics_func_t getter) { static char attrs[] = "OPbcdefghiklmnopqrstuwxyz[@#%"; #define ATTRS_L ((int)(sizeof(attrs)-1)) Image *image; Draw *draw; volatile VALUE t; TypeMetric metrics; char *text = NULL; long text_l; long x; unsigned int okay; switch (argc) { case 1: // use default image text = rm_str2cstr(argv[0], &text_l); for (x = 0; x < text_l; x++) { // Ensure text string doesn't refer to image attributes. if (text[x] == '%' && x < text_l-1) { int y; char spec = text[x+1]; for (y = 0; y < ATTRS_L; y++) { if (spec == attrs[y]) { rb_raise(rb_eArgError, "text string contains image attribute reference `%%%c'", spec); } } } } Data_Get_Struct(get_dummy_tm_img(CLASS_OF(self)), Image, image); break; case 2: t = rm_cur_image(argv[0]); image = rm_check_destroyed(t); text = rm_str2cstr(argv[1], &text_l); break; // okay default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc); break; } if (text_l == 0) { rb_raise(rb_eArgError, "no text to measure"); } Data_Get_Struct(self, Draw, draw); draw->info->text = InterpretImageProperties(NULL, image, text); if (!draw->info->text) { rb_raise(rb_eArgError, "no text to measure"); } okay = (*getter)(image, draw->info, &metrics); magick_free(draw->info->text); draw->info->text = NULL; if (!okay) { rm_check_image_exception(image, RetainOnError); // Shouldn't get here... rb_raise(rb_eRuntimeError, "Can't measure text. Are the fonts installed? " "Is the FreeType library installed?"); } return Import_TypeMetric(&metrics); } rmagick-2.13.2/ext/RMagick/rmilist.c0000644000004100000410000007577112147515547017244 0ustar www-datawww-data/**************************************************************************//** * ImageList class method definitions for RMagick. * * Copyright © 2002 - 2009 by Timothy P. Hunter * * Changes since Nov. 2009 copyright © by Benjamin Thomas and Omer Bar-or * * @file rmilist.c * @version $Id: rmilist.c,v 1.94 2009/12/20 02:33:33 baror Exp $ * @author Tim Hunter ******************************************************************************/ #include "rmagick.h" static Image *clone_imagelist(Image *); static Image *images_from_imagelist(VALUE); static long imagelist_length(VALUE); static long check_imagelist_length(VALUE); static VALUE imagelist_scene_eq(VALUE, VALUE); static void imagelist_push(VALUE, VALUE); static VALUE ImageList_new(void); /** * Repeatedly display the images in the images array to an XWindow screen. The * "delay" argument is the number of 1/100ths of a second (0 to 65535) to delay * between images. * * Ruby usage: * - @verbatim ImageList#animate @endverbatim * - @verbatim ImageList#animate(delay) @endverbatim * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self */ VALUE ImageList_animate(int argc, VALUE *argv, VALUE self) { Image *images; Info *info; volatile VALUE info_obj; if (argc > 1) { rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 or 1)", argc); } // Create a new Info object to use with this call info_obj = rm_info_new(); // Convert the images array to an images sequence. images = images_from_imagelist(self); if (argc == 1) { Image *img; unsigned int delay; delay = NUM2UINT(argv[0]); for (img = images; img; img = GetNextImageInList(img)) { img->delay = delay; } } Data_Get_Struct(info_obj, Info, info); (void) AnimateImages(info, images); rm_check_image_exception(images, RetainOnError); rm_split(images); return self; } /** * Append all the images by calling ImageAppend. * * Ruby usage: * - @verbatim ImageList#append(stack) @endverbatim * * @param self this object * @param stack_arg the stack of images * @return a Frame object for the result */ VALUE ImageList_append(VALUE self, VALUE stack_arg) { Image *images, *new_image; unsigned int stack; ExceptionInfo exception; // Convert the image array to an image sequence. images = images_from_imagelist(self); // If stack == true, stack rectangular images top-to-bottom, // otherwise left-to-right. stack = RTEST(stack_arg); GetExceptionInfo(&exception); new_image = AppendImages(images, stack, &exception); rm_split(images); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Average all images together by calling AverageImages. * * Ruby usage: * - @verbatim ImageList#average @endverbatim * * @param self this object * @return a Frame object for the averaged image */ VALUE ImageList_average(VALUE self) { Image *images, *new_image; ExceptionInfo exception; // Convert the images array to an images sequence. images = images_from_imagelist(self); GetExceptionInfo(&exception); new_image = AverageImages(images, &exception); rm_split(images); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Call CoalesceImages. * * Ruby usage: * - @verbatim ImageList#coalesce @endverbatim * * Notes: * - Respects the delay, matte, and start_loop fields in each image. * * @param self this object * @return a new Image with the coalesced image sequence return stored in the * images array */ VALUE ImageList_coalesce(VALUE self) { Image *images, *new_images; ExceptionInfo exception; // Convert the image array to an image sequence. images = images_from_imagelist(self); GetExceptionInfo(&exception); new_images = CoalesceImages(images, &exception); rm_split(images); rm_check_exception(&exception, new_images, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_images); return rm_imagelist_from_images(new_images); } /** * Equivalent to convert's -layers composite option. * * Ruby usage: * - @verbatim ImageList#composite_layers(images) @endverbatim * - @verbatim ImageList#composite_layers(images,operator) @endverbatim * * Notes: * - Default operator is OverCompositeOp * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new imagelist * @see mogrify.c in ImageMagick */ VALUE ImageList_composite_layers(int argc, VALUE *argv, VALUE self) { volatile VALUE source_images; Image *dest, *source, *new_images; RectangleInfo geometry; CompositeOperator operator = OverCompositeOp; ExceptionInfo exception; switch (argc) { case 2: VALUE_TO_ENUM(argv[1], operator, CompositeOperator); case 1: source_images = argv[0]; break; default: rb_raise(rb_eArgError, "wrong number of arguments (expected 1 or 2, got %d)", argc); break; } // Convert ImageLists to image sequences. dest = images_from_imagelist(self); new_images = clone_imagelist(dest); rm_split(dest); source = images_from_imagelist(source_images); SetGeometry(new_images,&geometry); (void) ParseAbsoluteGeometry(new_images->geometry, &geometry); geometry.width = source->page.width != 0 ? source->page.width : source->columns; geometry.height = source->page.height != 0 ? source->page.height : source->rows; GravityAdjustGeometry(new_images->page.width != 0 ? new_images->page.width : new_images->columns , new_images->page.height != 0 ? new_images->page.height : new_images->rows , new_images->gravity, &geometry); GetExceptionInfo(&exception); CompositeLayers(new_images, operator, source, geometry.x, geometry.y, &exception); rm_split(source); rm_check_exception(&exception, new_images, DestroyOnError); (void) DestroyExceptionInfo(&exception); return rm_imagelist_from_images(new_images); } /** * Compare each image with the next in a sequence and returns the maximum * bounding region of any pixel differences it discovers. * * Ruby usage: * - @verbatim ImageList#deconstruct @endverbatim * * @param self this object * @return a new imagelist */ VALUE ImageList_deconstruct(VALUE self) { Image *new_images, *images; ExceptionInfo exception; images = images_from_imagelist(self); GetExceptionInfo(&exception); new_images = DeconstructImages(images, &exception); rm_split(images); rm_check_exception(&exception, new_images, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_images); return rm_imagelist_from_images(new_images); } /** * Display all the images to an X window screen. * * Ruby usage: * - @verbatim ImageList#display @endverbatim * * @param self this object * @return self */ VALUE ImageList_display(VALUE self) { Image *images; Info *info; volatile VALUE info_obj; // Create a new Info object to use with this call info_obj = rm_info_new(); Data_Get_Struct(info_obj, Info, info); // Convert the images array to an images sequence. images = images_from_imagelist(self); (void) DisplayImages(info, images); rm_split(images); rm_check_image_exception(images, RetainOnError); return self; } /** * Merge all the images into a single image. * * Ruby usage: * - @verbatim ImageList#flatten_images @endverbatim * * Notes: * - Can't use "flatten" because that's an Array method * * @param self this object * @return the new image */ VALUE ImageList_flatten_images(VALUE self) { Image *images, *new_image; ExceptionInfo exception; images = images_from_imagelist(self); GetExceptionInfo(&exception); #if defined(HAVE_ENUM_FLATTENLAYER) new_image = MergeImageLayers(images, FlattenLayer, &exception); #else new_image = FlattenImages(images, &exception); #endif rm_split(images); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Apply fx on the images. * * Ruby usage: * - @verbatim ImageList#fx(expression) @endverbatim * - @verbatim ImageList#fx(expression, channel) @endverbatim * - @verbatim ImageList#fx(expression, channel, ...) @endverbatim * * Notes: * - Default channel is AllChannels * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new image */ VALUE ImageList_fx(int argc, VALUE *argv, VALUE self) { Image *images, *new_image; char *expression; ChannelType channels; ExceptionInfo exception; channels = extract_channels(&argc, argv); // There must be exactly 1 remaining argument. if (argc == 0) { rb_raise(rb_eArgError, "wrong number of arguments (0 for 1 or more)"); } else if (argc > 1) { raise_ChannelType_error(argv[argc-1]); } expression = StringValuePtr(argv[0]); images = images_from_imagelist(self); GetExceptionInfo(&exception); new_image = FxImageChannel(images, channels, expression, &exception); rm_split(images); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Call MapImages. * * Ruby usage: * - @verbatim ImageList#map(reference) @endverbatim * - @verbatim ImageList#map(reference, dither) @endverbatim * * Notes: * - Default dither is false * - Sets \@scene to self.scene * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new ImageList with mapped images. */ VALUE ImageList_map(int argc, VALUE *argv, VALUE self) { Image *images, *new_images = NULL; Image *map; unsigned int dither = MagickFalse; volatile VALUE scene, new_imagelist, t; ExceptionInfo exception; #if defined(HAVE_REMAPIMAGES) rb_warning("ImageList#map is deprecated. Use ImageList#remap instead."); #endif switch (argc) { case 2: dither = RTEST(argv[1]); case 1: t = rm_cur_image(argv[0]); map = rm_check_destroyed(t); break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc); break; } // Convert image array to image sequence, clone image sequence. GetExceptionInfo(&exception); images = images_from_imagelist(self); new_images = CloneImageList(images, &exception); rm_split(images); rm_check_exception(&exception, new_images, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_images); // Call ImageMagick (void) MapImages(new_images, map, dither); rm_check_image_exception(new_images, DestroyOnError); // Set @scene in new ImageList object to same value as in self. new_imagelist = rm_imagelist_from_images(new_images); scene = rb_iv_get(self, "@scene"); (void) imagelist_scene_eq(new_imagelist, scene); return new_imagelist; } /** * Call MontageImages. * * Ruby usage: * - @verbatim ImageList#montage <{parm block}> @endverbatim * * Notes: * - Creates Montage object, yields to block if present in Montage object's * scope. * * @param self this object * @return a new image list */ VALUE ImageList_montage(VALUE self) { volatile VALUE montage_obj; Montage *montage; Image *new_images, *images; ExceptionInfo exception; // Create a new instance of the Magick::Montage class montage_obj = rm_montage_new(); if (rb_block_given_p()) { // Run the block in the instance's context, allowing the app to modify the // object's attributes. (void) rb_obj_instance_eval(0, NULL, montage_obj); } Data_Get_Struct(montage_obj, Montage, montage); images = images_from_imagelist(self); // If app specified a non-default composition operator, use it for all images. if (montage->compose != UndefinedCompositeOp) { Image *i; for (i = images; i; i = GetNextImageInList(i)) { i->compose = montage->compose; } } GetExceptionInfo(&exception); // MontageImage can return more than one image. new_images = MontageImages(images, montage->info, &exception); rm_split(images); rm_check_exception(&exception, new_images, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_images); return rm_imagelist_from_images(new_images); } /** * Requires a minimum of two images. The first image is transformed into the * second by a number of intervening images as specified by "number_images". * * Ruby usage: * - @verbatim ImageList#morph(number_images) @endverbatim * * Notes: * - Sets \@scenes to 0 * * @param self this object * @param nimages the number of images * @return a new image list with the images array set to the morph sequence. */ VALUE ImageList_morph(VALUE self, VALUE nimages) { Image *images, *new_images; ExceptionInfo exception; long number_images; // Use a signed long so we can test for a negative argument. number_images = NUM2LONG(nimages); if (number_images <= 0) { rb_raise(rb_eArgError, "number of intervening images must be > 0"); } GetExceptionInfo(&exception); images = images_from_imagelist(self); new_images = MorphImages(images, (unsigned long)number_images, &exception); rm_split(images); rm_check_exception(&exception, new_images, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_images); return rm_imagelist_from_images(new_images); } /** * Merge all the images into a single image. * * Ruby usage: * - @verbatim ImageList#mosaic @endverbatim * * @param self this object * @return the new image */ VALUE ImageList_mosaic(VALUE self) { Image *images, *new_image; ExceptionInfo exception; GetExceptionInfo(&exception); images = images_from_imagelist(self); #if defined(HAVE_ENUM_MOSAICLAYER) new_image = MergeImageLayers(images, MosaicLayer, &exception); #else new_image = MosaicImages(images, &exception); #endif rm_split(images); rm_check_exception(&exception, new_image, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_image); return rm_image_new(new_image); } /** * Equivalent to -layers option in ImageMagick 6.2.6. * * Ruby usage: * - @verbatim ImageList#optimize_layers(method) @endverbatim * * @param self this object * @param method the method to use * @return a new imagelist */ VALUE ImageList_optimize_layers(VALUE self, VALUE method) { Image *images, *new_images, *new_images2; LAYERMETHODTYPE mthd; ExceptionInfo exception; QuantizeInfo quantize_info; new_images2 = NULL; // defeat "unused variable" message GetExceptionInfo(&exception); #if defined(HAVE_TYPE_IMAGELAYERMETHOD) VALUE_TO_ENUM(method, mthd, ImageLayerMethod); #else VALUE_TO_ENUM(method, mthd, MagickLayerMethod); #endif images = images_from_imagelist(self); switch (mthd) { case CoalesceLayer: new_images = CoalesceImages(images, &exception); break; case DisposeLayer: new_images = DisposeImages(images, &exception); break; case OptimizeTransLayer: new_images = clone_imagelist(images); OptimizeImageTransparency(new_images, &exception); break; case RemoveDupsLayer: new_images = clone_imagelist(images); RemoveDuplicateLayers(&new_images, &exception); break; case RemoveZeroLayer: new_images = clone_imagelist(images); RemoveZeroDelayLayers(&new_images, &exception); break; case CompositeLayer: rm_split(images); rb_raise(rb_eNotImpError, "Magick::CompositeLayer is not supported. Use the composite_layers method instead."); break; // In 6.3.4-ish, OptimizeImageLayer replaced OptimizeLayer case OptimizeImageLayer: new_images = OptimizeImageLayers(images, &exception); break; // and OptimizeLayer became a "General Purpose, GIF Animation Optimizer" (ref. mogrify.c) case OptimizeLayer: new_images = CoalesceImages(images, &exception); rm_split(images); rm_check_exception(&exception, new_images, DestroyOnError); new_images2 = OptimizeImageLayers(new_images, &exception); DestroyImageList(new_images); rm_check_exception(&exception, new_images2, DestroyOnError); new_images = new_images2; OptimizeImageTransparency(new_images, &exception); rm_check_exception(&exception, new_images, DestroyOnError); // mogrify supports -dither here. We don't. #if defined(HAVE_REMAPIMAGE) GetQuantizeInfo(&quantize_info); (void) RemapImages(&quantize_info, new_images, NULL); #else (void) MapImages(new_images, NULL, 0); #endif break; case OptimizePlusLayer: new_images = OptimizePlusImageLayers(images, &exception); break; case CompareAnyLayer: case CompareClearLayer: case CompareOverlayLayer: new_images = CompareImageLayers(images, mthd, &exception); break; #if defined(HAVE_ENUM_MOSAICLAYER) case MosaicLayer: new_images = MergeImageLayers(images, mthd, &exception); break; #endif #if defined(HAVE_ENUM_FLATTENLAYER) case FlattenLayer: new_images = MergeImageLayers(images, mthd, &exception); break; #endif #if defined(HAVE_ENUM_MERGELAYER) case MergeLayer: new_images = MergeImageLayers(images, mthd, &exception); break; #endif #if defined(HAVE_ENUM_TRIMBOUNDSLAYER) case TrimBoundsLayer: new_images = MergeImageLayers(images, mthd, &exception); break; #endif default: rm_split(images); rb_raise(rb_eArgError, "undefined layer method"); break; } rm_split(images); rm_check_exception(&exception, new_images, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_images); return rm_imagelist_from_images(new_images); } /** * Create a new ImageList object with no images. * * No Ruby usage (internal function) * * Notes: * - this simply calls ImageList.new() in RMagick.rb * * @return a new imagelist */ static VALUE ImageList_new(void) { return rb_funcall(Class_ImageList, rm_ID_new, 0); } /** * Construct a new imagelist object from a list of images. * * No Ruby usage (internal function) * * Notes: * - Sets \@scene to 0. * * @param images the images * @return a new imagelist * @see images_from_imagelist */ VALUE rm_imagelist_from_images(Image *images) { volatile VALUE new_imagelist; Image *image; if (!images) { rb_bug("rm_imagelist_from_images called with NULL argument"); } new_imagelist = ImageList_new(); while (images) { image = RemoveFirstImageFromList(&images); imagelist_push(new_imagelist, rm_image_new(image)); } (void) rb_iv_set(new_imagelist, "@scene", INT2FIX(0)); return new_imagelist; } /** * Convert an array of Image *s to an ImageMagick scene sequence (i.e. a * doubly-linked list of Images). * * No Ruby usage (internal function) * * @param imagelist the imagelist * @return a pointer to the head of the scene sequence list * @see rm_imagelist_from_images */ static Image * images_from_imagelist(VALUE imagelist) { long x, len; Image *head = NULL; volatile VALUE images, t; len = check_imagelist_length(imagelist); images = rb_iv_get(imagelist, "@images"); for (x = 0; x < len; x++) { Image *image; t = rb_ary_entry(images, x); image = rm_check_destroyed(t); AppendImageToList(&head, image); } return head; } /** * \@scene attribute writer. * * No Ruby usage (internal function) * * @param imagelist the imagelist * @param scene the scene * @return the scene */ static VALUE imagelist_scene_eq(VALUE imagelist, VALUE scene) { rb_check_frozen(imagelist); (void) rb_iv_set(imagelist, "@scene", scene); return scene; } /** * return the # of images in an imagelist. * * No Ruby usage (internal function) * * @param imagelist the imagelist * @return the number of images */ static long imagelist_length(VALUE imagelist) { volatile VALUE images = rb_iv_get(imagelist, "@images"); return RARRAY_LEN(images); } /** * Raise exception if imagelist is emtpy. * * No Ruby usage (internal function) * * @param imagelist the imagelist * @return the number of images * @throw ArgError */ static long check_imagelist_length(VALUE imagelist) { long len = imagelist_length(imagelist); if (len == 0) { rb_raise(rb_eArgError, "no images in this image list"); } return len; } /** * Push an image onto the end of the imagelist. * * No Ruby usage (internal function) * * @param imagelist the imagelist * @param image the image */ static void imagelist_push(VALUE imagelist, VALUE image) { rb_check_frozen(imagelist); (void) rb_funcall(imagelist, rm_ID_push, 1, image); } /** * Clone a list of images, handle errors. * * No Ruby usage (internal function) * * @param images the images * @return a new array of images */ static Image * clone_imagelist(Image *images) { Image *new_imagelist = NULL, *image, *clone; ExceptionInfo exception; GetExceptionInfo(&exception); image = GetFirstImageInList(images); while (image) { clone = CloneImage(image, 0, 0, MagickTrue, &exception); rm_check_exception(&exception, new_imagelist, DestroyOnError); AppendImageToList(&new_imagelist, clone); image = GetNextImageInList(image); } (void) DestroyExceptionInfo(&exception); return new_imagelist; } /** * Call QuantizeImages. * * Ruby usage: * - @verbatim ImageList#quantize @endverbatim * - @verbatim ImageList#quantize(number_colors) @endverbatim * - @verbatim ImageList#quantize(number_colors, colorspace) @endverbatim * - @verbatim ImageList#quantize(number_colors, colorspace, dither) @endverbatim * - @verbatim ImageList#quantize(number_colors, colorspace, dither, tree_depth) @endverbatim * - @verbatim ImageList#quantize(number_colors, colorspace, dither, tree_depth, measure_error) @endverbatim * * Notes: * - Default number_colors is 256 * - Default coorspace is Magick::RGBColorsapce * - Default dither is true * - Default tree_depth is 0 * - Default measure_error is false * - Sets \@scene to the same value as self.scene * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return a new ImageList with quantized images */ VALUE ImageList_quantize(int argc, VALUE *argv, VALUE self) { Image *images, *new_images; Image *new_image; QuantizeInfo quantize_info; ExceptionInfo exception; volatile VALUE new_imagelist, scene; GetQuantizeInfo(&quantize_info); switch (argc) { case 5: quantize_info.measure_error = (MagickBooleanType) RTEST(argv[4]); case 4: quantize_info.tree_depth = (unsigned long)NUM2INT(argv[3]); case 3: #if defined(HAVE_TYPE_DITHERMETHOD) && defined(HAVE_ENUM_NODITHERMETHOD) if (rb_obj_is_kind_of(argv[2], Class_DitherMethod)) { VALUE_TO_ENUM(argv[2], quantize_info.dither_method, DitherMethod); quantize_info.dither = quantize_info.dither_method != NoDitherMethod; } #else quantize_info.dither = (MagickBooleanType) RTEST(argv[2]); #endif case 2: VALUE_TO_ENUM(argv[1], quantize_info.colorspace, ColorspaceType); case 1: quantize_info.number_colors = NUM2ULONG(argv[0]); case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 to 5)", argc); break; } // Convert image array to image sequence, clone image sequence. GetExceptionInfo(&exception); images = images_from_imagelist(self); new_images = CloneImageList(images, &exception); rm_split(images); rm_check_exception(&exception, new_images, DestroyOnError); (void) DestroyExceptionInfo(&exception); rm_ensure_result(new_images); (void) QuantizeImages(&quantize_info, new_images); rm_check_exception(&exception, new_images, DestroyOnError); // Create new ImageList object, convert mapped image sequence to images, // append to images array. new_imagelist = ImageList_new(); while ((new_image = RemoveFirstImageFromList(&new_images))) { imagelist_push(new_imagelist, rm_image_new(new_image)); } // Set @scene in new ImageList object to same value as in self. scene = rb_iv_get(self, "@scene"); (void) rb_iv_set(new_imagelist, "@scene", scene); return new_imagelist; } /** * Call RemapImages. * * Ruby usage: * - @verbatim ImageList#remap @endverbatim * - @verbatim ImageList#remap(remap_image) @endverbatim * - @verbatim ImageList#remap(remap_image, dither_method) @endverbatim * * Notes: * - Default remap_image is nil * - Default dither_method is RiemersmaDitherMethod * - Modifies images in-place. * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @see Image_remap */ VALUE ImageList_remap(int argc, VALUE *argv, VALUE self) { #if defined(HAVE_REMAPIMAGES) || defined(HAVE_AFFINITYIMAGES) Image *images, *remap_image = NULL; QuantizeInfo quantize_info; if (argc > 0 && argv[0] != Qnil) { volatile VALUE t = rm_cur_image(argv[0]); remap_image = rm_check_destroyed(t); } GetQuantizeInfo(&quantize_info); if (argc > 1) { VALUE_TO_ENUM(argv[1], quantize_info.dither_method, DitherMethod); quantize_info.dither = MagickTrue; } if (argc > 2) { rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc); } images = images_from_imagelist(self); #if defined(HAVE_REMAPIMAGE) (void) RemapImages(&quantize_info, images, remap_image); #else (void) AffinityImages(&quantize_info, images, remap_image); #endif rm_check_image_exception(images, RetainOnError); rm_split(images); return self; #else self = self; argc = argc; argv = argv; rm_not_implemented(); return(VALUE)0; #endif } /** * Return the imagelist as a blob (a String). * * Ruby usage: * - @verbatim ImageList#to_blob @endverbatim * * Notes: * - Runs an info parm block if present - the user can specify the image * format and depth * * @param self this object * @return the blob */ VALUE ImageList_to_blob(VALUE self) { Image *images, *image; Info *info; volatile VALUE info_obj; volatile VALUE blob_str; void *blob = NULL; size_t length = 0; ExceptionInfo exception; info_obj = rm_info_new(); Data_Get_Struct(info_obj, Info, info); // Convert the images array to an images sequence. images = images_from_imagelist(self); GetExceptionInfo(&exception); (void) SetImageInfo(info, MagickTrue, &exception); rm_check_exception(&exception, images, RetainOnError); if (*info->magick != '\0') { Image *img; for (img = images; img; img = GetNextImageInList(img)) { strncpy(img->magick, info->magick, sizeof(info->magick)-1); } } for (image = images; image; image = GetNextImageInList(image)) { rm_sync_image_options(image, info); } // Unconditionally request multi-images support. The worst that // can happen is that there's only one image or the format // doesn't support multi-image files. info->adjoin = MagickTrue; blob = ImagesToBlob(info, images, &length, &exception); if (blob && exception.severity >= ErrorException) { magick_free((void*)blob); blob = NULL; length = 0; } rm_split(images); CHECK_EXCEPTION() (void) DestroyExceptionInfo(&exception); if (length == 0 || !blob) { return Qnil; } blob_str = rb_str_new(blob, (long)length); magick_free((void*)blob); return blob_str; } /** * Write all the images to the specified file. If the file format supports * multi-image files, and the 'images' array contains more than one image, then * the images will be written as a single multi-image file. Otherwise each image * will be written to a separate file. * * Ruby usage: * - @verbatim ImageList#write(file) @endverbatim * * @param self this object * @param file the file * @return self */ VALUE ImageList_write(VALUE self, VALUE file) { Image *images, *img; Info *info; const MagickInfo *m; volatile VALUE info_obj; unsigned long scene; ExceptionInfo exception; info_obj = rm_info_new(); Data_Get_Struct(info_obj, Info, info); if (TYPE(file) == T_FILE) { OpenFile *fptr; // Ensure file is open - raise error if not GetOpenFile(file, fptr); SetImageInfoFile(info, GetReadFile(fptr)); } else { add_format_prefix(info, file); SetImageInfoFile(info, NULL); } // Convert the images array to an images sequence. images = images_from_imagelist(self); // Copy the filename into each image. Set a scene number to be used if // writing multiple files. (Ref: ImageMagick's utilities/convert.c for (scene = 0, img = images; img; img = GetNextImageInList(img)) { img->scene = scene++; strcpy(img->filename, info->filename); } // Find out if the format supports multi-images files. GetExceptionInfo(&exception); (void) SetImageInfo(info, MagickTrue, &exception); rm_check_exception(&exception, images, RetainOnError); m = GetMagickInfo(info->magick, &exception); rm_check_exception(&exception, images, RetainOnError); (void) DestroyExceptionInfo(&exception); // Tell WriteImage if we want a multi-images file. if (imagelist_length(self) > 1L && m->adjoin) { info->adjoin = MagickTrue; } for (img = images; img; img = GetNextImageInList(img)) { rm_sync_image_options(img, info); (void) WriteImage(info, img); // images will be split before raising an exception rm_check_image_exception(images, RetainOnError); if (info->adjoin) { break; } } rm_split(images); return self; } rmagick-2.13.2/ext/RMagick/rmutil.c0000644000004100000410000011743212147515547017064 0ustar www-datawww-data/**************************************************************************//** * Utility functions for RMagick. * * Copyright © 2002 - 2009 by Timothy P. Hunter * * Changes since Nov. 2009 copyright © by Benjamin Thomas and Omer Bar-or * * @file rmutil.c * @version $Id: rmutil.c,v 1.182 2009/12/21 10:34:58 baror Exp $ * @author Tim Hunter ******************************************************************************/ #include "rmagick.h" #include static void handle_exception(ExceptionInfo *, Image *, ErrorRetention); /** * ImageMagick safe version of malloc. * * No Ruby usage (internal function) * * Notes: * - Use when managing memory that ImageMagick may have allocated or may free. * - If malloc fails, it raises an exception. * - magick_safe_malloc and magick_safe_realloc prevent exceptions caused by * integer overflow. Added in 6.3.5-9 but backwards compatible with prior * releases. * * @param count the number of quantum elements to allocate * @param quantum the number of bytes in each quantum * @return a pointer to a block of memory that is at least count*quantum */ void * magick_safe_malloc(const size_t count, const size_t quantum) { void *ptr; ptr = AcquireQuantumMemory(count, quantum); if (!ptr) { rb_raise(rb_eNoMemError, "not enough memory to continue"); } return ptr; } /** * ImageMagick version of malloc. * * No Ruby usage (internal function) * * @param size the size of memory to allocate * @return pointer to a block of memory */ void * magick_malloc(const size_t size) { void *ptr; ptr = AcquireMagickMemory(size); if (!ptr) { rb_raise(rb_eNoMemError, "not enough memory to continue"); } return ptr; } /** * ImageMagick version of free. * * No Ruby usage (internal function) * * @param ptr pointer to the existing block of memory */ void magick_free(void *ptr) { (void) RelinquishMagickMemory(ptr); } /** * ImageMagick safe version of realloc. * * No Ruby usage (internal function) * * Notes: * - Use when managing memory that ImageMagick may have allocated or may free. * - If malloc fails, it raises an exception. * - magick_safe_malloc and magick_safe_realloc prevent exceptions caused by * integer overflow. Added in 6.3.5-9 but backwards compatible with prior * releases. * * @param memory the existing block of memory * @param count the number of quantum elements to allocate * @param quantum the number of bytes in each quantum * @return a pointer to a block of memory that is at least count*quantum in size */ void * magick_safe_realloc(void *memory, const size_t count, const size_t quantum) { void *v; v = ResizeQuantumMemory(memory, count, quantum); if (!v) { rb_raise(rb_eNoMemError, "not enough memory to continue"); } return v; } /** * ImageMagick version of realloc. * * No Ruby usage (internal function) * * @param ptr pointer to the existing block of memory * @param size the new size of memory to allocate * @return pointer to a block of memory */ void * magick_realloc(void *ptr, const size_t size) { void *v; v = ResizeMagickMemory(ptr, size); if (!v) { rb_raise(rb_eNoMemError, "not enough memory to continue"); } return v; } /** * Make a copy of a string in malloc'd memory. * * No Ruby usage (internal function) * * Notes: * - Any existing string pointed to by *new_str is freed. * - CloneString asserts if no memory. No need to check its return value. * * @param new_str pointer to the new string * @param str the string to copy */ void magick_clone_string(char **new_str, const char *str) { (void) CloneString(new_str, str); } /** * Compare s1 and s2 ignoring case. * * No Ruby usage (internal function) * * @param s1 the first string * @param s2 the second string * @return same as strcmp(3) */ int rm_strcasecmp(const char *s1, const char *s2) { while (*s1 && *s2) { if (toupper(*s1) != toupper(*s2)) { break; } s1 += 1; s2 += 1; } return (int)(*s1 - *s2); } /** * Compare s1 and s2 ignoring case. * * No Ruby usage (internal function) * * @param s1 the first string * @param s2 the second string * @param n number of characters to compare * @return same as strcmp(3) */ int rm_strncasecmp(const char *s1, const char *s2, size_t n) { if (n == 0) { return 0; } while (toupper(*s1) == toupper(*s2)) { if (--n == 0 || *s1 == '\0') { return 0; } s1 += 1; s2 += 1; } return (int)(*s1 - *s2); } /** * Raise exception if array too short. * * No Ruby usage (internal function) * * @param ary the array * @param len the minimum length * @throw IndexError */ void rm_check_ary_len(VALUE ary, long len) { if (RARRAY_LEN(ary) < len) { rb_raise(rb_eIndexError, "not enough elements in array - expecting %ld, got %ld", len, (long)RARRAY_LEN(ary)); } } /** * Raise an error if the image has been destroyed. * * No Ruby usage (internal function) * * @param obj the image * @return the C image structure for the image * @throw DestroyedImageError */ Image * rm_check_destroyed(VALUE obj) { Image *image; Data_Get_Struct(obj, Image, image); if (!image) { rb_raise(Class_DestroyedImageError, "destroyed image"); } return image; } /** * Raise an error if the image has been destroyed or is frozen. * * No Ruby usage (internal function) * * @param obj the image * @return the C image structure for the image */ Image * rm_check_frozen(VALUE obj) { Image *image = rm_check_destroyed(obj); rb_check_frozen(obj); return image; } /** * Overrides freeze in classes that can't be frozen. * * No Ruby usage (internal function) * * @param obj the object of the class to override * @return 0 * @throw TypeError */ VALUE rm_no_freeze(VALUE obj) { rb_raise(rb_eTypeError, "can't freeze %s", rb_class2name(CLASS_OF(obj))); return (VALUE)0; } /** * Return obj.to_s, or obj if obj is already a string. * * No Ruby usage (internal function) * * @param obj a Ruby object * @return a String representation of obj */ VALUE rm_to_s(VALUE obj) { if (TYPE(obj) != T_STRING) { return rb_funcall(obj, rm_ID_to_s, 0); } return obj; } /** * Supply our own version of the "obsolete" rb_str2cstr. * * No Ruby usage (internal function) * * @param str the Ruby string * @param len pointer to a long in which to store the number of characters * @return a C string version of str */ char * rm_str2cstr(VALUE str, long *len) { StringValue(str); if (len) { *len = RSTRING_LEN(str); } return RSTRING_PTR(str); } /** * Try to convert the argument to a double, raise an exception if fail. * * No Ruby usage (internal function) * * @param arg the argument * @return arg */ static VALUE arg_is_number(VALUE arg) { double d; d = NUM2DBL(arg); d = d; // satisfy icc return arg; } /** * Called when `rb_str_to_str' raises an exception. * * No Ruby usage (internal function) * * @param arg the argument * @return 0 * @throw TypeError */ static VALUE rescue_not_str(VALUE arg) { rb_raise(rb_eTypeError, "argument must be a number or a string in the form 'NN%%' (%s given)", rb_class2name(CLASS_OF(arg))); return (VALUE)0; } /** * Return a double between 0.0 and max (the second argument), inclusive. If the * argument is a number convert to a Float object, otherwise it's supposed to be * a string in the form * "NN%". Convert to a number and then to a Float. * * No Ruby usage (internal function) * * @param arg the argument * @param max the maximum allowed value * @return a double */ double rm_percentage(VALUE arg, double max) { double pct; long pct_long; char *pct_str, *end; int not_num; // Try to convert the argument to a number. If failure, sets not_num to non-zero. (void) rb_protect(arg_is_number, arg, ¬_num); if (not_num) { arg = rb_rescue(rb_str_to_str, arg, rescue_not_str, arg); pct_str = StringValuePtr(arg); errno = 0; pct_long = strtol(pct_str, &end, 10); if (errno == ERANGE) { rb_raise(rb_eRangeError, "`%s' out of range", pct_str); } if (*end != '\0' && *end != '%') { rb_raise(rb_eArgError, "expected percentage, got `%s'", pct_str); } if (*end == '%' && pct_long != 0) { pct = (((double)pct_long) / 100.0) * max; } else { pct = (double) pct_long; } if (pct < 0.0) { rb_raise(rb_eArgError, "percentages may not be negative (got `%s')", pct_str); } } else { pct = NUM2DBL(arg); if (pct < 0.0) { rb_raise(rb_eArgError, "percentages may not be negative (got `%g')", pct); } } return pct; } /** * Return 0 if rb_num2dbl doesn't raise an exception. * * No Ruby usage (internal function) * * @param obj the object to convert to a double * @return 0 */ static VALUE check_num2dbl(VALUE obj) { (void) rb_num2dbl(obj); return INT2FIX(1); } /** * Called if rb_num2dbl raises an exception. * * No Ruby usage (internal function) * * @param ignored a Ruby object (unused) * @return 0 */ static VALUE rescue_not_dbl(VALUE ignored) { ignored = ignored; // defeat gcc message return INT2FIX(0); } /** * Return 1 if the object can be converted to a double, 0 otherwise. * * No Ruby usage (internal function) * * @param obj the object * @return 1 or 0 */ int rm_check_num2dbl(VALUE obj) { return FIX2INT(rb_rescue(check_num2dbl, obj, rescue_not_dbl, (VALUE)0)); } /** * Given a string in the form NN% return the corresponding double. * * No Ruby usage (internal function) * * @param str the string * @return a double */ double rm_str_to_pct(VALUE str) { long pct; char *pct_str, *end; str = rb_rescue(rb_str_to_str, str, rescue_not_str, str); pct_str = StringValuePtr(str); errno = 0; pct = strtol(pct_str, &end, 10); if (errno == ERANGE) { rb_raise(rb_eRangeError, "`%s' out of range", pct_str); } if (*end != '%') { rb_raise(rb_eArgError, "expected percentage, got `%s'", pct_str); } if (pct < 0L) { rb_raise(rb_eArgError, "percentages may not be negative (got `%s')", pct_str); } return pct / 100.0; } /** * If the argument is a number, convert it to a double. Otherwise it's supposed * to be a string in the form 'NN%'. Return a percentage of QuantumRange. * * No Ruby usage (internal function) * * @param fuzz_arg the fuzz argument * @return a double * @see Image_fuzz * @see Image_fuzz_eq */ double rm_fuzz_to_dbl(VALUE fuzz_arg) { double fuzz; char *fuzz_str, *end; int not_num; // Try to convert the argument to a number. If failure, sets not_num to non-zero. (void) rb_protect(arg_is_number, fuzz_arg, ¬_num); if (not_num) { // Convert to string, issue error message if failure. fuzz_arg = rb_rescue(rb_str_to_str, fuzz_arg, rescue_not_str, fuzz_arg); fuzz_str = StringValuePtr(fuzz_arg); errno = 0; fuzz = strtod(fuzz_str, &end); if (errno == ERANGE) { rb_raise(rb_eRangeError, "`%s' out of range", fuzz_str); } if(*end == '%') { if (fuzz < 0.0) { rb_raise(rb_eArgError, "percentages may not be negative (got `%s')", fuzz_str); } fuzz = (fuzz * QuantumRange) / 100.0; } else if(*end != '\0') { rb_raise(rb_eArgError, "expected percentage, got `%s'", fuzz_str); } } else { fuzz = NUM2DBL(fuzz_arg); if (fuzz < 0.0) { rb_raise(rb_eArgError, "fuzz may not be negative (got `%g')", fuzz); } } return fuzz; } /** * Convert a application-supplied number to a Quantum. If the object is a Float, * truncate it before converting. * * No Ruby usage (internal function) * * Notes: * - Ruby says that 2147483647.5 doesn't fit into an unsigned long. If you * truncate it, it works. * - Should use this only when the input value is possibly subject to this * problem. * * @param obj the application-supplied number * @return a Quantum */ Quantum rm_app2quantum(VALUE obj) { volatile VALUE v = obj; if (TYPE(obj) == T_FLOAT) { v = rb_funcall(obj, rm_ID_to_i, 0); } return NUM2QUANTUM(v); } /** * Send the "cur_image" method to the object. If 'img' is an ImageList, then * cur_image is self[\@scene]. If 'img' is an image, then cur_image is simply * 'self'. * * No Ruby usage (internal function) * * @param img the object * @return the return value from "cur_image" */ VALUE rm_cur_image(VALUE img) { return rb_funcall(img, rm_ID_cur_image, 0); } /** * Map the color intensity to a named color. * * No Ruby usage (internal function) * * @param image the image * @param color the color intensity as a PixelPacket * @return the named color as a String * @see rm_pixelpacket_to_color_name_info */ VALUE rm_pixelpacket_to_color_name(Image *image, PixelPacket *color) { char name[MaxTextExtent]; ExceptionInfo exception; GetExceptionInfo(&exception); (void) QueryColorname(image, color, X11Compliance, name, &exception); CHECK_EXCEPTION() (void) DestroyExceptionInfo(&exception); return rb_str_new2(name); } /** * Map the color intensity to a named color. * * No Ruby usage (internal function) * * Notes: * - Simply create an Image from the Info, call QueryColorname, and then * destroy the Image. * - If the Info structure is NULL, creates a new one. * - The default depth is always used, and the matte value is set to False, * which means "don't use the alpha channel". * * @param info the info * @param color the color intensity as a PixelPacket * @return the named color as a String * @see rm_pixelpacket_to_color_name */ VALUE rm_pixelpacket_to_color_name_info(Info *info, PixelPacket *color) { Image *image; Info *my_info; volatile VALUE color_name; my_info = info ? info : CloneImageInfo(NULL); image = AcquireImage(info); image->matte = MagickFalse; color_name = rm_pixelpacket_to_color_name(image, color); (void) DestroyImage(image); if (!info) { (void) DestroyImageInfo(my_info); } return color_name; } /** * Write a temporary copy of the image to the IM registry. * * No Ruby usage (internal function) * * Notes: * - The `temp_name' argument must point to an char array of size * MaxTextExtent. * * @param image the image * @param temp_name the temporary name to use * @return the "filename" of the registered image */ void rm_write_temp_image(Image *image, char *temp_name) { #define TMPNAM_CLASS_VAR "@@_tmpnam_" MagickBooleanType okay; ExceptionInfo exception; volatile VALUE id_value; int id; GetExceptionInfo(&exception); // 'id' is always the value of its previous use if (rb_cvar_defined(Module_Magick, rb_intern(TMPNAM_CLASS_VAR)) == Qtrue) { id_value = rb_cv_get(Module_Magick, TMPNAM_CLASS_VAR); id = FIX2INT(id_value); } else { id = 0; rb_cv_set(Module_Magick, TMPNAM_CLASS_VAR, INT2FIX(id)); } id += 1; rb_cv_set(Module_Magick, TMPNAM_CLASS_VAR, INT2FIX(id)); sprintf(temp_name, "mpri:%d", id); // Omit "mpri:" from filename to form the key okay = SetImageRegistry(ImageRegistryType, temp_name+5, image, &exception); CHECK_EXCEPTION() DestroyExceptionInfo(&exception); if (!okay) { rb_raise(rb_eRuntimeError, "SetImageRegistry failed."); } } /** * Delete the temporary image from the registry. * * No Ruby usage (internal function) * * @param temp_name the name of temporary image in the registry. */ void rm_delete_temp_image(char *temp_name) { MagickBooleanType okay = DeleteImageRegistry(temp_name+5); if (!okay) { rb_warn("DeleteImageRegistry failed for `%s'", temp_name); } } /** * Raise NotImplementedError. * * No Ruby usage (internal function) * * Notes: * - Called when a xMagick API is not available. * - Replaces Ruby's rb_notimplement function. * * @throw NotImpError */ void rm_not_implemented(void) { rb_raise(rb_eNotImpError, "the `%s' method is not supported by ImageMagick " MagickLibVersionText, rb_id2name(THIS_FUNC())); } /** * Create a new ImageMagickError object and raise an exception. * * No Ruby usage (internal function) * * Notes: * - This funky technique allows me to safely add additional information to * the ImageMagickError object in both 1.6.8 and 1.8.0. * * @param msg the error mesage * @param loc the location of the error * @throw ImageMagickError * @see www.ruby_talk.org/36408. */ void rm_magick_error(const char *msg, const char *loc) { volatile VALUE exc, mesg, extra; mesg = rb_str_new2(msg); extra = loc ? rb_str_new2(loc) : Qnil; exc = rb_funcall(Class_ImageMagickError, rm_ID_new, 2, mesg, extra); (void) rb_funcall(rb_cObject, rb_intern("raise"), 1, exc); } /** * Initialize a new ImageMagickError object - store the "loc" string in the * \@magick_location instance variable. * * Ruby usage: * - @verbatim ImageMagickError#initialize(msg) @endverbatim * - @verbatim ImageMagickError#initialize(msg, loc) @endverbatim * * Notes: * - Default loc is nil * * @param argc number of input arguments * @param argv array of input arguments * @param self this object * @return self */ VALUE ImageMagickError_initialize(int argc, VALUE *argv, VALUE self) { VALUE super_argv[1] = {(VALUE)0}; int super_argc = 0; volatile VALUE extra = Qnil; switch(argc) { case 2: extra = argv[1]; case 1: super_argv[0] = argv[0]; super_argc = 1; case 0: break; default: rb_raise(rb_eArgError, "wrong number of arguments (%d for 0 to 2)", argc); } (void) rb_call_super(super_argc, (const VALUE *)super_argv); (void) rb_iv_set(self, "@"MAGICK_LOC, extra); return self; } /** * Backport GetImageProperty for pre-6.3.1 versions of ImageMagick. * * No Ruby usage (internal function) * * @param img the image * @param property the property name * @return the property value */ const char * rm_get_property(const Image *img, const char *property) { return GetImageProperty(img, property); } /** * Backport SetImageProperty for pre-6.3.1 versions of ImageMagick. * * No Ruby usage (internal function) * * @param image the image * @param property the property name * @param value the property value * @return true if successful, otherwise false */ MagickBooleanType rm_set_property(Image *image, const char *property, const char *value) { return SetImageProperty(image, property, value); } /** * If a "user" option is present in the Info, assign its value to a "user" * artifact in each image. * * No Ruby usage (internal function) * * @param images a list of images * @param info the info */ void rm_set_user_artifact(Image *images, Info *info) { #if defined(HAVE_SETIMAGEARTIFACT) Image *image; const char *value; value = GetImageOption(info, "user"); if (value) { image = GetFirstImageInList(images); while (image) { (void) SetImageArtifact(image, "user", value); image = GetNextImageInList(image); } } #else images = images; info = info; #endif } /** * Collect optional method arguments via Magick::OptionalMethodArguments. * * No Ruby usage (internal function) * * Notes: * - Creates an instance of Magick::OptionalMethodArguments, then yields to a * block in the context of the instance. * * @param img the image */ void rm_get_optional_arguments(VALUE img) { volatile VALUE OptionalMethodArguments; volatile VALUE opt_args; VALUE argv[1]; // opt_args = Magick::OptionalMethodArguments.new(img) // opt_args.instance_eval { block } if (rb_block_given_p()) { OptionalMethodArguments = rb_const_get_from(Module_Magick, rb_intern("OptionalMethodArguments")); argv[0] = img; opt_args = rb_class_new_instance(1, argv, OptionalMethodArguments); (void) rb_obj_instance_eval(0, NULL, opt_args); } return; } #if defined(HAVE_SETIMAGEARTIFACT) /** * Copy image options from the Info structure to the Image structure. * * No Ruby usage (internal function) * * @param image the Image structure to modify * @param info the Info structure */ static void copy_options(Image *image, Info *info) { char property[MaxTextExtent]; const char *value, *option; ResetImageOptionIterator(info); for (option = GetNextImageOption(info); option; option = GetNextImageOption(info)) { value = GetImageOption(info,option); if (value) { strncpy(property, value, MaxTextExtent); property[MaxTextExtent-1] = '\0'; (void) SetImageArtifact(image, property, value); } } } #endif /** * Propagate ImageInfo values to the Image * * No Ruby usage (internal function) * * @param image the Image structure to modify * @param info the Info structure * @see SyncImageSettings in mogrify.c in ImageMagick */ void rm_sync_image_options(Image *image, Info *info) { MagickStatusType flags; GeometryInfo geometry_info; const char *option; // The option strings will be set only when their attribute values were // set in the optional argument block. option = GetImageOption(info,"background"); if (option) { image->background_color = info->background_color; } option = GetImageOption(info,"bordercolor"); if (option) { image->border_color = info->border_color; } if (info->colorspace != UndefinedColorspace) { image->colorspace = info->colorspace; } if (info->compression != UndefinedCompression) { image->compression = info->compression; } option = GetImageOption(info, "delay"); if (option) { image->delay = strtoul(option, NULL, 0); } if (info->density) { flags = ParseGeometry(info->density, &geometry_info); image->x_resolution = geometry_info.rho; image->y_resolution = geometry_info.sigma; if ((flags & SigmaValue) == 0) { image->y_resolution = image->x_resolution; } } if (info->depth != 0) { image->depth = info->depth; } option = GetImageOption(info, "dispose"); if (option) { image->dispose = rm_dispose_to_enum(option); } if (info->extract) { ParseAbsoluteGeometry(info->extract, &image->extract_info); } if (info->fuzz != 0.0) { image->fuzz = info->fuzz; } option = GetImageOption(info, "gravity"); if (option) { image->gravity = rm_gravity_to_enum(option); } if (info->interlace != NoInterlace) { image->interlace = info->interlace; } option = GetImageOption(info,"mattecolor"); if (option) { image->matte_color = info->matte_color; } if (info->orientation != UndefinedOrientation) { image->orientation = info->orientation; } if (info->page) { (void)ParseAbsoluteGeometry(info->page, &image->page); } if (info->quality != 0UL) { image->quality = info->quality; } option = GetImageOption(info, "scene"); if (option) { image->scene = info->scene; } option = GetImageOption(info, "tile-offset"); if (option) { (void)ParseAbsoluteGeometry(option, &image->tile_offset); } option = GetImageOption(info, "transparent"); if (option) { image->transparent_color = info->transparent_color; } #if defined(HAVE_ST_TYPE) if (info->type != UndefinedType) { image->type = info->type; } #endif if (info->units != UndefinedResolution) { if (image->units != info->units) { switch (image->units) { case PixelsPerInchResolution: { if (info->units == PixelsPerCentimeterResolution) { image->x_resolution /= 2.54; image->y_resolution /= 2.54; } break; } case PixelsPerCentimeterResolution: { if (info->units == PixelsPerInchResolution) { image->x_resolution *= 2.54; image->y_resolution *= 2.54; } break; } default: break; } } image->units = info->units; } #if defined(HAVE_SETIMAGEARTIFACT) copy_options(image, info); #endif } /** * Replicate old (ImageMagick < 6.3.2) EXIF:* functionality using * GetImageProperty by returning the exif entries as a single string, separated * by \n's. Do this so that RMagick.rb works no matter which version of * ImageMagick is in use. * * No Ruby usage (internal function) * * @param image the image * @return string representation of exif properties * @see magick/identify.c in ImageMagick */ VALUE rm_exif_by_entry(Image *image) { const char *property, *value; char *str; size_t len = 0, property_l, value_l; volatile VALUE v; (void) GetImageProperty(image, "exif:*"); ResetImagePropertyIterator(image); property = GetNextImageProperty(image); // Measure the exif properties and values while (property) { // ignore properties that don't start with "exif:" property_l = strlen(property); if (property_l > 5 && rm_strncasecmp(property, "exif:", 5) == 0) { if (len > 0) { len += 1; // there will be a \n between property=value entries } len += property_l - 5; value = GetImageProperty(image,property); if (value) { // add 1 for the = between property and value len += 1 + strlen(value); } } property = GetNextImageProperty(image); } if (len == 0) { return Qnil; } str = xmalloc(len); len = 0; // Copy the exif properties and values into the string. ResetImagePropertyIterator(image); property = GetNextImageProperty(image); while (property) { property_l = strlen(property); if (property_l > 5 && rm_strncasecmp(property, "exif:", 5) == 0) { if (len > 0) { str[len++] = '\n'; } memcpy(str+len, property+5, property_l-5); len += property_l - 5; value = GetImageProperty(image,property); if (value) { value_l = strlen(value); str[len++] = '='; memcpy(str+len, value, value_l); len += value_l; } } property = GetNextImageProperty(image); } v = rb_str_new(str, len); xfree(str); return v; } /** * Replicate old (ImageMagick < 6.3.2) EXIF:! functionality using * GetImageProperty by returning the exif entries as a single string, separated * by \n's. Do this so that RMagick.rb works no matter which version of * ImageMagick is in use. * * No Ruby usage (internal function) * * @param image the image * @return string representation of exif properties * @see magick/identify.c in ImageMagick */ VALUE rm_exif_by_number(Image *image) { const char *property, *value; char *str; size_t len = 0, property_l, value_l; volatile VALUE v; (void) GetImageProperty(image, "exif:!"); ResetImagePropertyIterator(image); property = GetNextImageProperty(image); // Measure the exif properties and values while (property) { // ignore properties that don't start with "#" property_l = strlen(property); if (property_l > 1 && property[0] == '#') { if (len > 0) { len += 1; // there will be a \n between property=value entries } len += property_l; value = GetImageProperty(image,property); if (value) { // add 1 for the = between property and value len += 1 + strlen(value); } } property = GetNextImageProperty(image); } if (len == 0) { return Qnil; } str = xmalloc(len); len = 0; // Copy the exif properties and values into the string. ResetImagePropertyIterator(image); property = GetNextImageProperty(image); while (property) { property_l = strlen(property); if (property_l > 1 && property[0] == '#') { if (len > 0) { str[len++] = '\n'; } memcpy(str+len, property, property_l); len += property_l; value = GetImageProperty(image,property); if (value) { value_l = strlen(value); str[len++] = '='; memcpy(str+len, value, value_l); len += value_l; } } property = GetNextImageProperty(image); } v = rb_str_new(str, len); xfree(str); return v; } /** * Get the values from a Geometry object and return them in C variables. * * No Ruby usage (internal function) * * Notes: * - No return value: modifies x, y, width, height, and flag * * @param geom the Geometry object * @param x pointer to the x position of the start of the rectangle * @param y pointer to the y position of the start of the rectangle * @param width pointer to the width of the rectangle * @param height pointer to the height of the rectangle * @param flag pointer to the Geometry's flag */ void rm_get_geometry( VALUE geom, long *x, long *y, unsigned long *width, unsigned long *height, int *flag) { VALUE v; v = rb_funcall(geom, rm_ID_x, 0); *x = NUM2LONG(v); v = rb_funcall(geom, rm_ID_y, 0); *y = NUM2LONG(v); v = rb_funcall(geom, rm_ID_width, 0); *width = NUM2ULONG(v); v = rb_funcall(geom, rm_ID_height, 0); *height = NUM2ULONG(v); // Getting the flag field is a bit more difficult since it's // supposed to be an instance of the GeometryValue Enum class. We // may not know the VALUE for the GeometryValue class, and we // need to check that the flag field is an instance of that class. if (flag) { MagickEnum *magick_enum; v = rb_funcall(geom, rm_ID_flag, 0); if (!Class_GeometryValue) { Class_GeometryValue = rb_const_get(Module_Magick, rm_ID_GeometryValue); } if (CLASS_OF(v) != Class_GeometryValue) { rb_raise(rb_eTypeError, "wrong enumeration type - expected %s, got %s" , rb_class2name(Class_GeometryValue),rb_class2name(CLASS_OF(v))); } Data_Get_Struct(v, MagickEnum, magick_enum); *flag = magick_enum->val; } } /** * Clone an image, handle errors. * * No Ruby usage (internal function) * * Notes: * - Don't trace creation - the clone may not be used as an Image object. Let * the caller do the trace if desired. * * @param image the image to clone * @return the cloned image */ Image * rm_clone_image(Image *image) { Image *clone; ExceptionInfo exception; GetExceptionInfo(&exception); clone = CloneImage(image, 0, 0, MagickTrue, &exception); if (!clone) { rb_raise(rb_eNoMemError, "not enough memory to continue"); } rm_check_exception(&exception, clone, DestroyOnError); (void) DestroyExceptionInfo(&exception); return clone; } /** * SetImage(Info)ProgressMonitor exit. * * No Ruby usage (internal function) * * Notes: * - ImageMagick's "tag" argument is unused. We pass along the method name * instead. * * @param tag ImageMagick argument (unused) * @param of the offset type * @param sp the size type * @param client_data pointer to the progress method to call * @return true if calling client_data returns a non-nil value, otherwise false */ MagickBooleanType rm_progress_monitor( const char *tag, const MagickOffsetType of, const MagickSizeType sp, void *client_data) { volatile VALUE rval; volatile VALUE method, offset, span; tag = tag; // defeat gcc message #if defined(HAVE_LONG_LONG) // defined in Ruby's defines.h offset = rb_ll2inum(of); span = rb_ull2inum(sp); #else offset = rb_int2big((long)of); span = rb_uint2big((unsigned long)sp); #endif method = rb_str_new2(rb_id2name(THIS_FUNC())); rval = rb_funcall((VALUE)client_data, rm_ID_call, 3, method, offset, span); return RTEST(rval) ? MagickTrue : MagickFalse; } /** * Remove the ImageMagick links between images in an scene sequence. * * No Ruby usage (internal function) * * Notes: * - The images remain grouped via the ImageList * * @param image the image */ void rm_split(Image *image) { if (!image) { rb_bug("RMagick FATAL: split called with NULL argument."); } while (image) { (void) RemoveFirstImageFromList(&image); } } /** * If an ExceptionInfo struct in a list of images indicates a warning, issue a * warning message. If an ExceptionInfo struct indicates an error, raise an * exception and optionally destroy the images. * * No Ruby usage (internal function) * * @param imglist the list of images * @param retention retention strategy in case of an error (either RetainOnError * or DestroyOnError) */ void rm_check_image_exception(Image *imglist, ErrorRetention retention) { ExceptionInfo exception; Image *badboy = NULL; Image *image; if (imglist == NULL) { return; } GetExceptionInfo(&exception); // Find the image with the highest severity image = GetFirstImageInList(imglist); while (image) { if (image->exception.severity != UndefinedException) { if (!badboy || image->exception.severity > badboy->exception.severity) { badboy = image; InheritException(&exception, &badboy->exception); } ClearMagickException(&image->exception); } image = GetNextImageInList(image); } if (badboy) { rm_check_exception(&exception, imglist, retention); } (void) DestroyExceptionInfo(&exception); } /** * Call handle_exception if there is an exception to handle. * * No Ruby usage (internal function) * * @param exception information about the exception * @param imglist the images that caused the exception * @param retention retention strategy in case of an error (either RetainOnError * or DestroyOnError) */ void rm_check_exception(ExceptionInfo *exception, Image *imglist, ErrorRetention retention) { if (exception->severity == UndefinedException) { return; } handle_exception(exception, imglist, retention); } /** * Called from ImageMagick for a warning. * * No Ruby usage (internal function) * * @param severity information about the severity of the warning (ignored) * @param reason the reason for the warning * @param description description of the warning */ void rm_warning_handler(const ExceptionType severity, const char *reason, const char *description) { ExceptionType dummy; rb_warning("RMagick: %s: `%s'", reason, description); dummy = severity; dummy = dummy; } /** * Called from ImageMagick for a error. * * No Ruby usage (internal function) * * @param severity information about the severity of the error (ignored) * @param reason the reason for the error * @param description description of the error */ void rm_error_handler(const ExceptionType severity, const char *reason, const char *description) { char msg[500]; int len; ExceptionType dummy; memset(msg, 0, sizeof(msg)); #if defined(HAVE_SNPRINTF) len = snprintf(msg, sizeof(msg), "%s: `%s'", reason, description); #else len = sprintf(msg, "%.250s: `%.240s'", reason, description); #endif msg[len] = '\0'; rm_magick_error(msg, NULL); dummy = severity; dummy = dummy; } /** * Called from ImageMagick for a fatal error. * * No Ruby usage (internal function) * * @param severity information about the severity of the error * @param reason the reason for the error * @param description description of the error (ignored) * @throw FatalImageMagickError */ void rm_fatal_error_handler(const ExceptionType severity, const char *reason, const char *description) { rb_raise(Class_FatalImageMagickError, GetLocaleExceptionMessage(severity, reason)); description = description; } /** * Called when rm_check_exception determines that we need to either issue a * warning message or raise an exception. This function allocates a bunch of * stack so we don't call it unless we have to. * * No Ruby usage (internal function) * * @param exception information about the exception * @param imglist the images that caused the exception * @param retention retention strategy in case of an error (either RetainOnError * or DestroyOnError) */ static void handle_exception(ExceptionInfo *exception, Image *imglist, ErrorRetention retention) { char reason[500]; char desc[500]; char msg[sizeof(reason)+sizeof(desc)+20]; memset(msg, 0, sizeof(msg)); // Handle simple warning if (exception->severity < ErrorException) { #if defined(HAVE_SNPRINTF) snprintf(msg, sizeof(msg)-1, "RMagick: %s%s%s", #else sprintf(msg, "RMagick: %.500s%s%.500s", #endif GetLocaleExceptionMessage(exception->severity, exception->reason), exception->description ? ": " : "", exception->description ? GetLocaleExceptionMessage(exception->severity, exception->description) : ""); msg[sizeof(msg)-1] = '\0'; rb_warning(msg); // Caller deletes ExceptionInfo... return; } // Raise an exception. We're not coming back... // Newly-created images should be destroyed, images that are part // of image objects should be retained but split. if (imglist) { if (retention == DestroyOnError) { (void) DestroyImageList(imglist); imglist = NULL; } else { rm_split(imglist); } } // Clone the ExceptionInfo with all arguments on the stack. memset(reason, 0, sizeof(reason)); memset(desc, 0, sizeof(desc)); if (exception->reason) { strncpy(reason, exception->reason, sizeof(reason)-1); reason[sizeof(reason)-1] = '\0'; } if (exception->description) { strncpy(desc, exception->description, sizeof(desc)-1); desc[sizeof(desc)-1] = '\0'; } #if defined(HAVE_SNPRINTF) snprintf(msg, sizeof(msg)-1, "%s%s%s", GetLocaleExceptionMessage(exception->severity, reason), desc[0] ? ": " : "", desc[0] ? GetLocaleExceptionMessage(exception->severity, desc) : ""); #else sprintf(msg, "%.*s%s%.*s", sizeof(reason)-1, GetLocaleExceptionMessage(exception->severity, reason), desc[0] ? ": " : "", sizeof(desc)-1, desc[0] ? GetLocaleExceptionMessage(exception->severity, desc) : ""); #endif msg[sizeof(msg)-1] = '\0'; (void) DestroyExceptionInfo(exception); rm_magick_error(msg, NULL); } /** * RMagick expected a result. If it got NULL instead raise an exception. * * No Ruby usage (internal function) * * @param image the expected result * @throw RuntimeError */ void rm_ensure_result(Image *image) { if (!image) { rb_raise(rb_eRuntimeError, MagickPackageName " library function failed to return a result."); } } rmagick-2.13.2/doc/0000755000004100000410000000000012147515547014024 5ustar www-datawww-datarmagick-2.13.2/doc/magick.html0000644000004100000410000003302712147515547016152 0ustar www-datawww-data RMagick 2.13.2: module Magick

module Magick

module methods

colors

Magick.colors { |color| block } -> Magick
Magick.colors -> array

Description

Lists the named colors. If the optional block is present, calls the block once for each color, passing a Magick::Color object. Otherwise, returns an array of Magick::Color objects, one for each color.

The Magick::Color class is a Struct class with the following attributes:

Magick::Color attributes
Attribute Value
name The color name. For example, "red".
compliance A ComplianceType value such as X11Compliance.
color A Pixel object containing the RGB values.

Returns

If no block is associated with the call, returns an array of Magick::Color objects.

Example

This is a small sample of colors.miff, the complete image created by the example program.

Magick::colors example

Magick API

GetColorInfo

fonts

Magick.fonts { |font| block } -> Magick
Magick.fonts -> array

Description

Lists the fonts that ImageMagick knows about. If the optional block is present, calls the block once for each font, passing a Magick::Font object. Otherwise, returns an array of Magick::Font objects, one for each font.

The Magick::Font class is a Struct class with the following attributes:

Magick::Font attributes
Attribute Value
name The font name. For example, "Palatino-Roman".
description The font description. For example, "Palatino Roman".
family The font family. For example, "Palatino", "Helvetica", or "Courier".
style A StyleType value such as NormalStyle.
stretch A StretchType value such as NormalStretch.
weight The font weight, one of 100, 200, 300, 400, 500, 600, 700, 800, or 900.
encoding The font encoding, such as "AppleRoman". May be nil.
foundry The font foundry. "URW", for example. May be nil.
format If the font is a Type1 font, has the value "type1", otherwise nil.

Returns

If no block is associated with the call, returns an array of Magick::Font objects.

Example

fonts.rb

Magick API

GetFontInfo

formats

Magick.formats { |f,v| block } -> Magick
Magick.formats -> hash

Description

Describes the image formats supported by ImageMagick. If the optional block is present, calls the block once for each image format. The first argument, f, is the format name. The second argument, v, is the properties string described below.

Returns

A hash of image formats and their properties. Each key in the returned hash is the name of a supported image format. Each value is a string in the form "BRWA". The details are in this table:
Format property codes
Code Definition
B is "*" if the format has native blob support, and "-" otherwise.
R is "r" if ImageMagick can read the format, and "-" otherwise.
W is "w" if ImageMagick can write the format, and "-" otherwise.
A is "+" if the format supports multi-image files, and "-" otherwise.

Example

p Magick.formats »
   {"TIF"=>"*rw+",
   "H"=>"*rw-",
   "MNG"=>"*rw+",
   "NULL"=>"*rw-",
   ...
   "G"=>"*rw+",
   "GIF"=>"*rw+",
   "PDB"=>"*rw+"}

Magick API

GetMagickInfo

Note

ImageMagick depends on external programs for some formats. Depending on how ImageMagick was installed on your system, some formats may not be available. If you have questions, ask your system administrator.

limit_resource

Magick.limit_resource(resource_type [, limit]) -> old_limit

Description

Sets a limit to the amount of a resource, or gets the current limit for the resource. When the limit is reached, ImageMagick will fail in some fashion or take compensating actions if possible. The default limits vary according to the platform. See the ImageMagick documentation for the -limit option for more information.

Arguments

This method may be called with one or two arguments. The first argument identifies the resource. If specified, the second argument is the limit.
resource_type
One of the symbols :area, :disk, :file, :map, or :memory. You may use a string instead of a symbol.
limit
If present, the limit for the resource. This argument is always an integer number. If the resource_type is :file, the limit is the number of open files. If :memory or :map, the limit is measured megabytes. If :disk, the limit is measured in gigabytes. If the resource_type is :area the limit is the maximum width * height of an image in pixels that can reside in pixel cache memory. If this argument is omitted the limit is not changed.

Returns

The current resource limit. If a new limit is specified this is the limit before the change.

Notes

This method supercedes set_cache_threshold.

set_log_event_mask

Magick.set_log_event_mask(event_list)

Description

Specify which events to log.

Argument

A string composed of one or more of the following event types. If more than one event type is specified, separate the event types with commas.

All, Annotate, Blob, Cache, Coder, Configure, Deprecate, Draw, Exception, Locale, Module, None, Resource, Trace, Transform, User, Wand, X11

Example

Magick.set_log_event_mask("Module,Coder")

Magick API

SetLogEventMask

See also

set_log_format

Log configuration

Magick logging is configured with the log.xml file in Magick's config directory. See Resources in the ImageMagick documentation for more information.

Use this command to find out about the current log configuration.

convert -list log

set_log_format

Magick.set_log_format(format)

Description

Specify the event log format.

Argument

A fprintf-like format string composed of optional "normal" text (to which no meaning is assigned) and the following format characters:

%d
domain
%e
event
%f
function
%l
line
%m
module
%p
process ID
%r
read CPU time
%t
wall clock time
%u
user CPU time
%%
percent sign
\n
newline
\r
carriage return

trace_proc

Magick.trace_proc = proc

Description

If the Magick module attribute trace_proc is set to a Proc object, RMagick calls the proc whenever an image is created or destroyed. You can use this proc to keep track of which images your program has created and which have been destroyed.

Arguments

The proc should accept these four arguments:

which
A symbol that indicates which operation the proc is being called for. If the proc is called for an image creation, the value is :c. If called for an image destruction, the value is :d.
description
A string describing the image. This is the same string that would be returned by calling the image's inspect method.
id
A unique identifier for the image. This identifier is not the same as the object's object_id. No two images will have the same id at the same time. However, the id of an image that has been destroyed may be reused for a subsequent image.
method
The name of the method responsible for creating or destroying the image.

Notes

If called while Ruby is cleaning up after the program has finished, any methods the proc calls may not be executed.

Use the "user" option to add an additional identifying string to the image's description.

 

rmagick-2.13.2/doc/rvg.html0000644000004100000410000006516412147515547015524 0ustar www-datawww-data RMagick 2.13.2: RVG Reference: RVG Class

class RVG < Object

Table of Contents

class methods

attributes

instance methods

shared methods

In addition to the methods listed above, class RVG also implements the styles method, the shape methods and the transform methods.

Units

class methods

new

RVG.new(width=nil, height=nil) [ { |canvas| drawing method calls } ] -> rvg

Description

Creates a container that can have its own coordinate system. Within the block, call drawing methods on canvas to render shapes, text, and raster images in the container.

An RVG object is always the outermost container for a drawing. Call the draw method on the returned RVG object to produce the final image.

Arguments

If the RVG object is the outermost container, width and height are required and specify the width and height of the final drawing in pixels. You can call conversion methods to use units such as inches and millimeters instead of pixels.

Otherwise, width and height specify the area of the viewbox. If the RVG object will be used as an argument to the use method, then width and height may be omitted here, then specified as arguments to use.

Returns

An RVG object

Example

See the tutorial for a simple example. The image below demonstrates an advanced use of RVG.new. This example creates an RVG object that draws an orange-and-green target. The width and height arguments are omitted in the RVG.new call. Instead, the viewport width and height are specified as arguments to 4 invocations of use. Each use specifies a different viewport size, so the same RVG object draws 4 different-sized targets.

Click the image to see the example script.

nested RVG example

See also

Group

attributes

background_fill=

canvas.background_fill = value

Description

Specify a background fill color. The attribute value may be either a pixel or a color name. The default fill color is "#00000000". This color is usually called "none". This attribute has no effect on nested RVG objects.

Example

canvas.background_fill = 'white'

Returns

value

background_fill_opacity=

canvas.background_fill_opacity = value

Description

Specify the opacity of the background fill color when the background fill is not the default. The value is a number between 0.0 (fully transparent) and 1.0 (fully opaque). The default is 1.0. The attribute is ignored unless background_fill is specified. This attribute has no effect on nested RVG objects.

Example

canvas.background_fill = 'white'
canvas.background_fill_opacity = 0.50

Returns

value

background_image=

canvas.background_image = image

Description

Specify an image to be used as the canvas background. The value is an Image object. This attribute has no effect on nested RVG objects.

Example

canvas.background_image = Magick::Image.read('myBackground.gif').first

Returns

image

See also

background_position=

background_pattern=

canvas.background_pattern = fill

Description

Specify an Fill object to fill the canvas background. This attribute has no effect on nested RVG objects.

Example

canvas.background_pattern = Magick::GradientFill.new(0, 0, 0, 100, "#900", "#000")

Returns

a Fill object

background_position=

canvas.background_position = pos

Description

If the dimensions of the image specified by background_image do not exactly match the canvas dimensions, this attribute specifies how to position the image on the background. This attribute has no effect on nested RVG objects.

Argument

The value of pos can be any one of the following symbols :
:scaled
The image is scaled to fit. The image proportions are not retained.
:tiled
The image is tiled across the background.
:fit
The image is scaled to fit. The image proportions are retained. Any part of the background that is not covered by the image is colored with the background color.

Example

canvas.background_image = Magick::Image.read('myBackground.gif').first
canvas.background_position = :scaled

Returns

pos

canvas

rvg.canvas -> image

Description

After the draw method has been used, returns the rendered image. This is the same image that draw returns.

Returns

An image

desc, desc=

rvg.desc -> string
rvg.desc = string

Description

Use the desc attribute to assign a text description to the drawing. The description will be assigned to the "desc" property of the resulting image. This attribute has no effect on nested RVG objects.

height

rvg.height -> height

Description

The height of the RVG object in user coordinates.

See also

width

metadata, metadata=

rvg.metadata -> string
rvg.metadata = string

Description

Use the metadata attribute to assign additional metadata to the drawing. The metadata string will be assigned to the "metadata" property of the resulting image. This attribute has no effect on nested RVG objects.

title, title=

rvg.title -> string
rvg.title = string

Description

Use the title attribute to assign a title to the drawing. The title will be assigned to the "title" property of the resulting image. This attribute has no effect on nested RVG objects.

width

rvg.width -> width

Description

The width of the RVG object in user coordinates.

See also

height

x

rvg.x -> x-offset

Description

If this RVG object is nested within another RVG object, returns the x-offset in user coordinates from the upper-left corner of the enclosing RVG object.

See also

y

y

rvg.y -> y-offset

Description

If this RVG object is nested within another RVG object, returns the y-offset in user coordinates from the upper-left corner of the enclosing RVG object.

See also

x

instance methods

draw

rvg.draw -> image

Description

Causes all the drawing objects that have been added to the canvas to be rendered.

Regardless of the order in which methods were called, draw executes the methods in this order:

  1. transforms, in the order they were called.
  2. viewbox and preserve_aspect_ratio
  3. styles
  4. nested groups, RVG objects, shapes, text, and images, in the order they were added to the containing object

Nested groups and RVG objects also follow this sequence.

Returns

An image

Example

      img = rvg.draw
      img.write('myDrawing.jpg')

g

rvg.g [{|grp| ...}] -> group

Description

Calls RVG::Group.new to construct a group and adds it to the enclosing RVG object. Yields to a block if one is present, passing the new group as an argument.

Returns

Returns the new group, so RVG::Group methods can be chained to this method.

image

rvg.image(raster_image, width=nil, height=nil, x=0, y=0) -> image

Description

Calls RVG::Image.new to construct an image and adds it to the enclosing RVG object.

Returns

Returns the new image, so RVG::Image methods can be chained to this method.

Notes

An RVG::Image object is not the same as a Magick::Image object!

preserve_aspect_ratio

rvg.preserve_aspect_ratio(align, meet_or_slice='meet') [{|self| ...}] -> self

Description

If you use the viewbox method and the user coordinate system does not scale uniformly to the default coordinate system (for example, the width and height of the RVG object is 4x3 and the user coordinate system is 16x9), use the preserve_aspect_ratio method to specify whether or not the content is stretched to fit. If not, you can specify how to fit the content into the space.

Preserve_aspect_ratio yields to a block if one is present, passing self as an argument.

Arguments

align
When the value of the meet_or_slice argument is 'meet' or 'slice', this argument controls the placement of the content within the viewport. The align argument is the concatenation of an x-alignment and a y-alignment. The values are shown in these lists:
x-alignment
xMin
align the minimum x value of the content with the left corner of the viewport.
xMid
vertically center the content within the viewport.
xMax
align the maximum x value of the content with the right corner of the viewport.
y-alignment
YMin
align the minimum y value of the content with the top of the viewport.
YMid
horizontally center the content within the viewport.
YMax
align the maximum y value of the content with the bottom of the viewport
meet_or_slice
This argument can have one of these three values:
'none'
The content is scaled as necessary so that it fits exactly within the viewport. The aspect ratio is not maintained.
'meet'
The content is scaled as necessary so that the larger dimension exactly fits the viewport. There may be some unused space in the viewport. The aspect ratio is maintained.
'slice'
The content is scaled as necessary so that the smaller dimension exactly fits the viewport. Some of the content in the larger dimension may be cut off. The aspect ratio is maintained.

Example

preserve_aspect_ratio example

Returns

Self, so other RVG methods can be chained to this method.

See Also

viewbox

rvg

rvg.rvg(width, height, x=0, y=0) [{|new_rvg| ...}] -> self

Description

This method constructs a new RVG object and adds it to the enclosing RVG object. Each nested RVG object can use the viewbox method to define its own coordinate system. The rvg method yields to a block, passing the nested RVG object as an argument. Within the block, any drawing objects added to the nested RVG object are rendered within the nested RVG object's viewport.

Arguments

width, height
Specifies the viewport width and height. The units are in the user coordinate system of the parent container.
x, y
The x- and y-axis offsets of the viewport upper-left corner. The units are in the user coordinate system of the parent container.

Example

See the example for preserve_aspect_ratio.

Returns

The RVG object, so other RVG methods can be chained to this method.

text

rvg.text(x=0, y=0, text=nil) [{|text| ...}] -> text

Description

Calls RVG::Text.new to construct a text object and adds it to the enclosing RVG object. Yields to a block if one is present, passing the new text object as an argument.

Returns

The RVG::Text object, so other RVG::Text methods can be chained to this method.

use

rvg.use(obj, x=0, y=0, width=nil, height=nil) -> use

Description

Calls RVG::Use.new to construct a use object and adds it to the RVG object.

When the referenced argument is another RVG object, width and height can be used to specify the width and height of the viewport. If present and non-nil, these arguments override any width and height specified when the RVG object was created. You must specify the viewport size either when creating the RVG object or when referencing it with use.

Examples

See RVG::Use.new

Returns

The RVG::Use object, so other RVG::Use methods can be chained to this method.

viewbox

rvg.viewbox(min_x, min_y, width, height) [{|self| ...}] -> self

Description

The area of the RVG object is called the viewport. By default the origin of the coordinate system for an RVG object is (0,0). The user coordinates are pixels and the width and height are established by the width and height arguments to RVG.new.

Use the viewbox method to superimpose a user coordinate system on the viewport. The viewbox method lets you set up a coordinate system using the units of your choice.

The viewbox method yields to a block if one is present, passing self as an argument.

Arguments

min_x, min_y
The minimum x-coordinate and y-coordinate of the user coordinate system.
width, height
The width and height of the user coordinate system.

Example

In the following examples, because the viewbox method specifies the dimensions of the coordinate system, the dimensions specified for the graphic objects can remain the same while the size of the canvas changes.

Rendered into a 300x200 viewportviewbox 300x200 example

Rendered into a 150x200 viewportviewbox 150x200 example

Returns

Self, so other RVG methods may be chained to viewbox.

See Also

preserve_aspect_ratio

Units

RVG supports a subset of the unit identifiers defined by the SVG specification. In RVG, unit identifiers are methods in the Float and Fixnum classes. The units are (for the most part) defined in terms of "dots per inch," accordingly, the unit identifier methods are added only if the value

    Magick::RVG.dpi = NN

is defined, where NN is the number of "dots" (pixels) per inch you wish to use. (Hint: 90 is a good default.)

For example, to specify a length of 10 inches, you can use

    Magick::RVG.dpi = 90
    length = 10.in  # => 900 pixels

If the dpi is defined, the following methods are added to Float and Fixnum

px
Pixel. The default unit of measurement.
in
Converts inches to pixels
mm
Converts millimeters to pixels
cm
Converts centimeters to pixels
pt
Converts points to pixels. There are 72 points to the inch.
pc
Converts picas to pixels. There are 12 points to the pica.
deg
Degrees. The default unit of rotation.
rad
Converts radians to degrees.
grad
Converts grads to degrees. There are 400 grads in a circle.
pct
This conversion takes an numeric argument and returns a percentage of the argument. For example 20.pct(150) -> 30

SVG also supports em and ex, which are measurements based on the font size. RVG does not.

 

rmagick-2.13.2/doc/index.html0000644000004100000410000003062112147515547016023 0ustar www-datawww-data RMagick 2.13.2 User's Guide and Reference

Ruby+ImageMagickTM
Version 2.13.2

User's Guide and Reference

Table of Contents

Introduction

What is RMagick?

RMagick is a binding from Ruby to the ImageMagick TM image manipulation library. Here's how the ImageMagick home page describes ImageMagick:

ImageMagickTM... is a free software suite to create, edit, and compose bitmap images. It can read, convert and write images in a large variety of formats. Images can be cropped, colors can be changed, various effects can be applied, images can be rotated and combined, and text, lines, polygons, ellipses and Bézier curves can be added to images and stretched and rotated.

ImageMagick offers a full range of image processing tools that provide the capability to:

  • Convert an image from one format to another (e.g. TIFF to JPEG)
  • Resize, rotate, sharpen, color reduce, or add special effects to an image
  • Create a montage of image thumbnails
  • Create a transparent image suitable for use on the Web
  • Turn a group of images into a GIF animation sequence
  • Create a composite image by combining several separate images
  • Draw shapes or text on an image
  • Decorate an image with a border or frame
  • Describe the format and characteristics of an image

RMagick is a complete interface to ImageMagick. Version 1.0.0 was released in February, 2003. Within its four major classes and 18 minor classes RMagick defines over 650 methods and 350 constants. RMagick exploits Ruby idioms such as blocks and iterators, Struct classes, symbols, ?- and !-suffixed methods, and exceptions.

About this document

This document describes Version 2.13.2 of RMagick. It is divided into 4 parts. The first is this page. The second part is a user's guide covering both RMagick and ImageMagick usage and conventions. The third part is a reference guide to the ImageList, Image, and Draw classes. This guide includes many examples. The fourth part covers Ruby Vector Graphics (RVG). RVG is a facade for Draw that provides a high-level API for scalable vector graphics. The RVG section includes a tutorial and complete reference documentation.

Accompanying the HTML documentation is a set of over 175 example RMagick programs. Each is a complete, stand-alone program that either creates an image from scratch or modifies an input image using one or more RMagick methods. The output images are used as illustrations in the HTML documentation. Throughout this document, click any example image to see the program that created it.

Conventions

Names  I've tried to follow existing Ruby conventions in this document. A class is identified by its name, which always starts with a capital letter. An object is referred to by its class name, starting with a small letter. For example, a generic ImageList object is referred to as an imagelist. Class methods are identified like this: Class.method. Instance methods are identified like this: Class#method.

RMagick is implemented in the Magick module, therefore its constants are in the Magick namespace. However, for clarity I've omitted the Magick:: prefix in most places in this document. You can use the include Magick statement to add the constants and methods to the Object namespace.

ImageMagick documentation  Text that looks like this is quoted from the ImageMagick documentation.

Example programs and images   All of the example images on these pages were created by RMagick. Click the image to see the program code. (You may need to configure your browser to allow JavaScript and pop-up windows.) All example images show the result of applying the method. Many example images show the "before" image as well. When the image is accompanied by this symbol rollover mouse over the image to see the "before" version.

How to get help

If you have a question that is not answered by these pages, you can post it at the Support Request Tracker or the Feature Request Tracker on RubyForge, or email me at rmagick at rubyforge dot org.

Reporting bugs

Please report problems with RMagick installation and usage to the Bug Tracker at RubyForge, or email me at rmagick at rubyforge dot org.

For quickest results, include the RMagick, ImageMagick and Ruby version numbers, along with a thorough description of the problem. RMagick will tell you both its version number and ImageMagick's version number. Simply bring up irb and run this command:

$ ruby -rRMagick -e "puts Magick::Long_version"
This is RMagick 2.0.0 ($Date: 2009/02/28 23:50:16 $) Copyright (C) 2007 by Timothy P. Hunter
Built with ImageMagick 6.3.7 12/20/07 Q16 http://www.imagemagick.org
Built for ruby 1.8.6
Web page: http://rmagick.rubyforge.org
Email: rmagick@rubyforge.org

(Using RubyGems?  If you haven't added rubygems to your RUBYOPT environment variable you may need to use this command instead: ruby -rubygems -r RMagick -e "puts Magick::Long_version".)

It will help a lot if you supply a small Ruby program that reproduces the problem. Don't forget to include any input image files!

Please remember I can't help with Ruby or ImageMagick installation and configuration problems. For help with Ruby, post your questions to comp.lang.ruby. For help with ImageMagick, you can post to the ImageMagick Discourse Server.

I'm not an image processing guru, either, so I probably won't be able to help with questions about specific image formats and transformations. I will be glad, however, to intermediate between RMagick users and the ImageMagick developers.

Copyright Notices

  • RMagick © 2002-2009 Timothy P. Hunter.
  • ImageMagick © 1999-2009 ImageMagick Studio.
  • Ruby is copyrighted free software by Yukihiro Matsumoto.
rmagick-2.13.2/doc/rvgpattern.html0000644000004100000410000003240712147515547017114 0ustar www-datawww-data RMagick 2.13.2: RVG Reference: RVG::Pattern Class

class RVG::Pattern < Object

Table of Contents

class methods

instance methods

shared methods

In addition to the methods listed above, this class also implements the styles method, the shape methods and the transform methods.

class methods

new

RVG::Pattern.new(width=0, height=0, x=0, y=0) [ { |pattern| drawing method calls } ] -> pattern

Description

Creates a pattern that can be used with the :fill and :stroke styles.

Define the pattern in the associated block. The pattern can be composed of shapes, text, raster images, groups, and RVG objects. You can use the use method to include graphic objects in the pattern.

Arguments

width, height
These arguments define the pattern viewport.
x, y
Specify the starting offset of the pattern. The pattern will be repeated at x+m*width and y+n*height offsets.

Example

pattern example

instance methods

g

pattern.g [{|grp| ...}] -> group

Description

Calls RVG::Group.new to construct a group and adds it to the pattern. Yields to a block if one is present, passing the new group as an argument.

Returns

Returns the new group, so RVG::Group methods can be chained to this method.

image

pattern.image(raster_image, width=nil, height=nil, x=0, y=0) -> image

Description

Calls RVG::Image.new to construct an image and adds it to the pattern.

Returns

Returns the new image, so RVG::Image methods can be chained to this method.

preserve_aspect_ratio

pattern.preserve_aspect_ratio(align, meet_or_slice='meet') [{|self| ...}] -> self

Description

If you use the viewbox method and the user coordinate system does not scale uniformly to the default coordinate system, use the preserve_aspect_ratio method to specify whether or not the content is stretched to fit. If not, you can specify how to fit the content into the space.

Preserve_aspect_ratio yields to a block if one is present, passing self as an argument.

Arguments

align
When the value of the meet_or_slice argument is 'meet' or 'slice', this argument controls the placement of the content within the viewport. The align argument is the concatenation of an x-alignment and a y-alignment. The values are shown in these lists:
x-alignment
xMin
align the minimum x value of the content with the left corner of the viewport.
xMid
vertically center the content within the viewport.
xMax
align the maximum x value of the content with the right corner of the viewport.
y-alignment
YMin
align the minimum y value of the content with the top of the viewport.
YMid
horizontally center the content within the viewport.
YMax
align the maximum y value of the content with the bottom of the viewport
meet_or_slice
This argument can have one of these three values:
'none'
The content is scaled as necessary so that it fits exactly within the viewport. The aspect ratio is not maintained.
'meet'
The content is scaled as necessary so that the larger dimension exactly fits the viewport. There may be some unused space in the viewport. The aspect ratio is maintained.
'slice'
The content is scaled as necessary so that the smaller dimension exactly fits the viewport. Some of the content in the larger dimension may be cut off. The aspect ratio is maintained.

Example

See the RVG class example.

Returns

Self, so other RVG::Pattern methods can be chained to this method.

See Also

viewbox

rvg

pattern.rvg(width, height, x=0, y=0) [{|new_rvg| ...}] -> pattern

Description

This method constructs a new RVG object and adds it to the pattern. Each nested RVG object can use the viewbox method to define its own coordinate system. The rvg method yields to a block, passing the nested RVG object as an argument. Within the block, any drawing objects added to the nested RVG object are rendered within the nested RVG object's viewport.

Arguments

width, height
Specifies the viewport width and height. The units are in the user coordinate system of the parent container.
x, y
The x- and y-axis offsets of the viewport upper-left corner. The units are in the user coordinate system of the parent container.

Example

See the example for preserve_aspect_ratio in class RVG.

Returns

The RVG object, so other RVG methods can be chained to this method.

text

pattern.text(x=0, y=0, text=nil) [{|text| ...}] -> text

Description

Calls RVG::Text.new to construct a text object and adds it to the pattern. Yields to a block if one is present, passing the new text object as an argument.

Returns

The RVG::Text object, so other RVG::Text methods can be chained to this method.

use

pattern.use(obj, x=0, y=0, width=nil, height=nil) -> use

Description

Calls RVG::Use.new to constructs a use object and adds it to the pattern.

When the referenced argument is an RVG object, width and height can be used to specify the width and height of the viewport. If present and non-nil, these arguments override any width and height specified when the RVG object was created. You must specify the viewport size either when creating the RVG object or when referencing it with use.

Examples

See RVG::Use.new

Returns

The RVG::Use object, so other RVG::Use methods can be chained to this method.

viewbox

pattern.viewbox(min_x, min_y, width, height) [{|self| ...}] -> self

Description

The area of the pattern is called the viewport. By default the origin of the coordinate system for an pattern is (0,0). The user coordinates are pixels and the width and height are established by the width and height arguments to RVG::Pattern.new.

Use the viewbox method to superimpose a user coordinate system on the viewport. The viewbox method lets you set up a coordinate system using the units of your choice.

The viewbox method yields to a block if one is present, passing self as an argument.

Arguments

min_x, min_y
The minimum x-coordinate and y-coordinate of the user coordinate system.
width, height
The width and height of the user coordinate system.

Example

See the example for the RVG class.

Returns

Self, so other RVG::Pattern methods may be chained to viewbox.

See Also

preserve_aspect_ratio

 

rmagick-2.13.2/doc/ex/0000755000004100000410000000000012147515547014440 5ustar www-datawww-datarmagick-2.13.2/doc/ex/fonts.rb0000644000004100000410000000074512147515547016124 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Compute column widths name_length = 0 family_length = 0 Magick::fonts { |font| if font.name.length > name_length name_length = font.name.length end if font.family.length > family_length family_length = font.family.length end } # Print all fonts Magick::fonts { |font| printf("%-*s %-*s %d %s\t%s\n", name_length, font.name, family_length, font.family, font.weight, font.style, font.stretch) } rmagick-2.13.2/doc/ex/sketch.rb0000644000004100000410000000060312147515547016245 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' img = Magick::Image.read('images/Flower_Hat.jpg').first # Convert to grayscale sketch = img.quantize(256, Magick::GRAYColorspace) # Apply histogram equalization sketch = sketch.equalize # Sketch, then dissolve 25% of the original back in sketch = sketch.sketch(0, 10, 135) img = img.dissolve(sketch, 0.75, 0.25) img.write('sketch.jpg') rmagick-2.13.2/doc/ex/crop.rb0000644000004100000410000000142612147515547015733 0ustar www-datawww-data#!/usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#crop method img = Magick::Image.read('images/Flower_Hat.jpg')[0] # Crop the specified rectangle out of the img. chopped = img.crop(23, 81, 107, 139) # Go back to the original and highlight the area # corresponding to the retained rectangle. rect = Magick::Draw.new rect.stroke('transparent') rect.fill('white') rect.fill_opacity(0.25) rect.rectangle(23, 81, 107+23, 139+81) rect.draw(img) img.write('crop_before.png') # Create a image to use as a background for # the "after" image. bg = Magick::Image.new(img.columns, img.rows) {self.background_color="none"} # Composite the the "after" (chopped) image on the background bg = bg.composite(chopped, 23, 81, Magick::OverCompositeOp) bg.write('crop_after.png') exit rmagick-2.13.2/doc/ex/baseline_shift01.rb0000644000004100000410000000116012147515547020103 0ustar www-datawww-datarequire 'rvg/rvg' rvg = Magick::RVG.new(150, 100) do |canvas| canvas.background_fill = 'white' canvas.text(40, 35).styles(:font_weight=>'bold', :font_size=>28) do |txt| txt.tspan('H') txt.tspan('2').styles(:font_size=>20, :fill=>'red', :baseline_shift=>'sub') txt.tspan('O') end canvas.text(40, 80).styles(:font_style=>'italic', :font_size=>28) do |txt| txt.tspan('e=mc') txt.tspan('2').styles(:font_size=>20, :fill=>'red', :baseline_shift=>'super') end canvas.rect(149, 99).styles(:fill=>'none', :stroke=>'blue') end rvg.draw.write('baseline_shift01.gif') rmagick-2.13.2/doc/ex/negate.rb0000644000004100000410000000027412147515547016233 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#negate method img = Magick::Image.read('images/Flower_Hat.jpg').first img = img.negate img.write('negate.jpg') exit rmagick-2.13.2/doc/ex/equalize.rb0000644000004100000410000000030212147515547016577 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#equalize method img = Magick::Image.read('images/Flower_Hat.jpg').first img = img.equalize img.write('equalize.jpg') exit rmagick-2.13.2/doc/ex/triangle01.rb0000644000004100000410000000074512147515547016741 0ustar www-datawww-datarequire 'rvg/rvg' Magick::RVG.dpi = 90 rvg = Magick::RVG.new(4.cm, 4.cm).viewbox(0, 0, 400, 400) do |canvas| canvas.title = "Example triangle01 - simple example of a 'path'" canvas.desc = 'A path that draws a triangle' canvas.background_fill = 'white' canvas.rect(395, 395, 1, 1).styles(:fill=>'none', :stroke=>'blue') canvas.path('M 100 100 L 300 100 L 200 300 z').styles(:fill=>'red', :stroke=>'blue', :stroke_width=>3) end rvg.draw.write('triangle01.gif') rmagick-2.13.2/doc/ex/Use03.rb0000644000004100000410000000076212147515547015671 0ustar www-datawww-datarequire 'rvg/rvg' Magick::RVG.dpi = 90 rvg = Magick::RVG.new(10.cm, 3.cm).viewbox(0, 0, 100, 30) do |canvas| canvas.background_fill = 'white' canvas.desc = "Example Use03 - 'use' with a 'transform' attribute" myrect = Magick::RVG::Group.new do |grp| grp.rect(60, 10) end canvas.rect(99.6, 29.6, 0.1, 0.1).styles(:fill=>'none', :stroke=>'blue', :stroke_width=>0.2) canvas.use(myrect).translate(20,2.5).rotate(10) end rvg.draw.write('Use03.gif') rmagick-2.13.2/doc/ex/normalize.rb0000644000004100000410000000031312147515547016762 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#normalize method img = Magick::Image.read('images/Hot_Air_Balloons.jpg').first img = img.normalize img.write('normalize.jpg') exit rmagick-2.13.2/doc/ex/flop.rb0000644000004100000410000000026112147515547015724 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#flop method img = Magick::Image.read('images/Flower_Hat.jpg').first img.flop! img.write('flop.jpg') exit rmagick-2.13.2/doc/ex/Skew.rb0000644000004100000410000000301112147515547015671 0ustar www-datawww-datarequire 'rvg/rvg' rvg = Magick::RVG.new(400, 120) do |canvas| canvas.desc = 'Example Skew - Show effects of skewX and skewY' canvas.background_fill = 'white' canvas.g.styles(:fill=>'none',:stroke=>'black',:stroke_width=>3) do |grp| # Draw the axes of the original coordinate system grp.line(0, 1.5, 400, 1.5) grp.line(1.5, 0, 1.5, 120) end # Establisha new coordinate system whose origin is at (30,30) # in the initial coord. system and which is skewed in X by 30 degrees. canvas.g.translate(30,30) do |grp| grp.skewX(30) do |grp2| grp2.g.styles(:fill=>'none', :stroke=>'red', :stroke_width=>3) do |grp3| grp3.line(0, 0, 50, 0) grp3.line(0, 0, 0, 50) end grp.text(0, 0, 'ABC (skewX)').styles(:font_size=>20, :fill=>'blue', :font_family=>'Verdana', :font_weight=>'normal', :font_style=>'normal') end end # Establish a new coordinate system whose origin is at (200,30) # in the initial coord. system and which is skewed in Y by 30 degrees. canvas.g.translate(200,30) do |grp| grp.skewY(30) do |grp2| grp2.g.styles(:fill=>'none', :stroke=>'red', :stroke_width=>3) do |grp3| grp3.line(0, 0, 50, 0) grp3.line(0, 0, 0, 50) end grp.text(0, 0, 'ABC (skewY)').styles(:font_size=>20, :fill=>'blue', :font_family=>'Verdana', :font_weight=>'normal', :font_style=>'normal') end end end rvg.draw.write('Skew.gif') rmagick-2.13.2/doc/ex/wave.rb0000644000004100000410000000022112147515547015722 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' img = Magick::Image.read('images/Flower_Hat.jpg').first img = img.wave img.write('wave.jpg') exit rmagick-2.13.2/doc/ex/threshold.rb0000644000004100000410000000042712147515547016764 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#threshold method img = Magick::Image.read('images/Flower_Hat.jpg').first # Use a threshold of 55% of QuantumRange. img = img.threshold(Magick::QuantumRange*0.55) #img.display img.write('threshold.jpg') exit rmagick-2.13.2/doc/ex/drop_shadow.rb0000644000004100000410000000263112147515547017300 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Add a drop shadow to a text string. This example # uses a 3-image animation to show each step of the # process Rows = 60 Cols = 250 Text = 'Ruby rocks!' # This imagelist will contain the animation frames anim = Magick::ImageList.new ex = Magick::Image.new(Cols, Rows) # Create a Draw object to draw the text with. Most of the text # attributes are shared between the shadow and the foreground. text = Magick::Draw.new text.gravity = Magick::CenterGravity text.pointsize = 36 text.font_weight = Magick::BoldWeight text.font_style = Magick::ItalicStyle text.stroke = 'transparent' # Draw the shadow text first. The color is a very light gray. # Position the text to the right and down. text.annotate(ex, 0,0,2,2, Text) { self.fill = 'gray60' } # Save the first frame of the animation. anim << ex.copy # Blur the shadow. Save a copy of the image as the 2nd frame. ex = ex.blur_image(0,3) anim << ex.copy # Add the foreground text in solid black. Position it # to the left and up from the shadow text. text.annotate(ex, 0,0,-1,-1, Text) { self.fill = 'maroon' } # Save yet another copy of the image as the 3rd frame. anim << ex.copy # Set the delay between frames to 1 second. anim.delay = 100 # Set the delay after the last frame to 3 seconds. anim.cur_image.delay = 300 # Iterate forever. anim.iterations = 0 #anim.animate anim.write('drop_shadow.gif') exit rmagick-2.13.2/doc/ex/group.rb0000644000004100000410000000141712147515547016124 0ustar www-datawww-datarequire 'rvg/rvg' Magick::RVG.dpi = 90 rvg = Magick::RVG.new(6.cm, 4.cm).viewbox(0,0,600,400) do |canvas| canvas.background_fill = 'white' canvas.rect(595,395,1,1).styles(:stroke=>'blue', :fill=>'none', :stroke_width=>2) # Define a stick figure. stick = Magick::RVG::Group.new.styles(:stroke=>'black', :fill=>'none', :stroke_width=>6) do |fig| fig.circle(42, 50, 50).styles(:stroke=>'red') fig.polyline(30,40, 50,40, 45,60, 50,40, 65,40).styles(:stroke_width=>4) fig.polyline(10,100, 50,130, 90,100) fig.line(50,97, 50, 155) fig.polyline(10,200, 50,155, 90,200) end # Draw 12 copies. 2.times {|y| 6.times {|x| canvas.use(stick, x*100, y*200) } } end rvg.draw.write('group.gif') rmagick-2.13.2/doc/ex/preview.rb0000644000004100000410000000027712147515547016454 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' img = Magick::Image.read("images/Flower_Hat.jpg").first preview = img.preview(Magick::SolarizePreview) preview.minify.write('preview.jpg') exit rmagick-2.13.2/doc/ex/motion_blur.rb0000644000004100000410000000032312147515547017314 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#blur_image method img = Magick::Image.read('images/Flower_Hat.jpg').first img = img.motion_blur(0,7,180) img.write('motion_blur.jpg') exit rmagick-2.13.2/doc/ex/color_floodfill.rb0000644000004100000410000000131212147515547020132 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#color_floodfill method before = Magick::Image.new(200,200) { self.background_color = 'white' } before.border!(1,1,'black') circle = Magick::Draw.new circle.fill('transparent') circle.stroke_width(2) circle.stroke('black') circle.circle(100,100,180,100) circle.fill('plum1') circle.stroke('transparent') circle.circle( 60,100, 40,100) circle.circle(140,100,120,100) circle.circle(100, 60,100, 40) circle.circle(100,140,100,120) circle.draw(before) before.write('color_floodfill_before.gif') aquamarine = Magick::Pixel.from_color('aquamarine') after = before.color_floodfill(100,100, aquamarine) after.write('color_floodfill_after.gif') exit rmagick-2.13.2/doc/ex/reduce_noise.rb0000644000004100000410000000130612147515547017431 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#reduce_noise method img = Magick::Image.read('images/Flower_Hat.jpg').first img = img.add_noise(Magick::UniformNoise) eimg = img.reduce_noise(0) # Zoom in so we can see the change img.resize!(3) eimg.resize!(3) # Make a before-and-after composite eimg.crop!(eimg.columns/2, 0, eimg.columns/2, eimg.rows) img = img.composite(eimg, Magick::EastGravity, Magick::OverCompositeOp) # Draw a black line between the before and after parts. line = Magick::Draw.new line.line(img.columns/2, 0, img.columns/2, img.rows) line.draw(img) # Crop everything but the face. img.crop!(Magick::CenterGravity, 250, 200) img.write('reduce_noise.jpg') exit rmagick-2.13.2/doc/ex/text_undercolor.rb0000644000004100000410000000113212147515547020202 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Draw#text_undercolor method canvas = Magick::Image.new(250, 100) {self.background_color ='white'} gc = Magick::Draw.new gc.font_weight(Magick::NormalWeight) gc.font_style(Magick::NormalStyle) gc.stroke('transparent') gc.pointsize(16) gc.gravity(Magick::CenterGravity) gc.text_undercolor('cyan') gc.text(0,-20,"text_undercolor('cyan')") gc.text_undercolor('yellow') gc.text(0,0,"text_undercolor('yellow')") gc.text_undercolor('pink') gc.text(0,20,"text_undercolor('pink')") gc.draw(canvas) canvas.write('text_undercolor.gif') exit rmagick-2.13.2/doc/ex/line01.rb0000644000004100000410000000140612147515547016056 0ustar www-datawww-datarequire 'rvg/rvg' Magick::RVG.dpi = 90 rvg = Magick::RVG.new(12.cm, 4.cm).viewbox(0, 0, 1200, 400) do |canvas| canvas.background_fill = 'white' canvas.desc = "Example line01 - lines expressed in user coordinates" # Show outline of canvas using the 'rect' method canvas.rect(1195, 395, 1, 1).styles(:fill=>'none', :stroke=>'blue', :stroke_width=>2) canvas.g.styles(:stroke=>'green') do |grp| grp.line(100, 300, 300, 100).styles(:stroke_width=>5) grp.line(300, 300, 500, 100).styles(:stroke_width=>10) grp.line(500, 300, 700, 100).styles(:stroke_width=>15) grp.line(700, 300, 900, 100).styles(:stroke_width=>20) grp.line(900, 300, 1100, 100).styles(:stroke_width=>25) end end rvg.draw.write('line01.gif') rmagick-2.13.2/doc/ex/hatchfill.rb0000644000004100000410000000113612147515547016724 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the HatchFill class Cols = 300 Rows = 100 Background = "white" Foreground = "LightCyan2" fill = Magick::HatchFill.new(Background, Foreground) img = Magick::ImageList.new img.new_image(Cols, Rows, fill) # Annotate the filled image with the code that created the fill. ann = Magick::Draw.new ann.annotate(img, 0,0,0,0, "HatchFill.new('#{Background}', '#{Foreground}')") { self.gravity = Magick::CenterGravity self.fill = 'black' self.stroke = 'transparent' self.pointsize = 14 } #img.display img.write('hatchfill.gif') exit rmagick-2.13.2/doc/ex/coalesce.rb0000644000004100000410000000314312147515547016544 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' buttons = Magick::ImageList.new # Read 25 alphabet image files, scale to 1/4 size letter = 'A' 26.times { if letter != 'M' # "M" is not the same size as the other letters tiny = Magick::Image.read('images/Button_' + letter + '.gif').first tiny.scale! 0.25 buttons << tiny end letter.succ! } # Create a image that will hold the alphabet images in 5 rows and 5 columns. cells = Magick::ImageList.new cells.new_image buttons.columns*5, buttons.rows*5 do self.background_color = "#000000ff" # transparent end cells.matte = true offset = Magick::Rectangle.new(0,0,0,0) # Create 2 arrays from which we can randomly choose row,col pairs row = [0]*5 + [1]*5 + [2]*5 + [3]*5 + [4]*5 col = (0..4).to_a * 5 # The coalesce method composites the 2nd image over the 1st, the 3rd image # over the result, and so forth, respecting the page offset of the images. srand 1234 25.times { |i| # Randomly select a row and column for this copy of the "tinya" image. # Compute the x,y position of this copy in pixels and store the # result in the image's page attribute. Append a copy of the image # to the image array in "a". n = rand row.length x = row.delete_at n y = col.delete_at n button = buttons[i] offset.x = x*button.columns offset.y = y*button.rows button.page = offset button.matte = true cells << button } puts "This may take a few seconds..." cells.delay = 10 cells.iterations = 10000 res = cells.coalesce res.write "coalesce_anim.gif" res[25].write "coalesce.gif" exit rmagick-2.13.2/doc/ex/cbezier6.rb0000644000004100000410000000227612147515547016505 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' imgl = Magick::ImageList.new imgl.new_image(400, 300, Magick::HatchFill.new('white','lightcyan2')) gc = Magick::Draw.new # Draw Bezier curve gc.stroke('red') gc.stroke_width(2) gc.fill_opacity(0) gc.bezier(50,150, 50,50, 200,50, 200,150, 200,250, 350,250, 350,150) # Draw filled circles for the control points gc.fill('gray50') gc.stroke('gray50') gc.fill_opacity(1) gc.circle(50,50, 53,53) gc.circle(200,50, 203,53) gc.circle(200,250, 203,253) gc.circle(350,250, 353,253) # Draw circles on the points the curve passes through gc.fill_opacity(0) gc.circle(50,150, 53,153) gc.circle(200,150, 203,153) gc.circle(350,150, 353,153) # Draw the gray lines between points and control points gc.line(50,50, 50,150) gc.line(200,50, 200,250) gc.line(350,150, 350,250) # Annotate gc.font_weight(Magick::NormalWeight) gc.font_style(Magick::NormalStyle) gc.fill('black') gc.stroke('transparent') gc.text(30,170, "'50,150'") gc.text(30, 40, "'50,50'") gc.text(180,40, "'200,50'") gc.text(210,155,"'200,150'") gc.text(180,270,"'200,250'") gc.text(330,270,"'350,250'") gc.text(330,140,"'350,150'") gc.draw(imgl) imgl.border!(1,1, 'lightcyan2') imgl.write("cbezier6.gif") exit rmagick-2.13.2/doc/ex/rvg_pattern.rb0000644000004100000410000000154712147515547017327 0ustar www-datawww-datarequire 'rvg/rvg' rvg = Magick::RVG.new(300, 300) do |canvas| canvas.background_fill = 'white' triangles = Magick::RVG::Pattern.new(16, 16).viewbox(0,0, 50,50) do |pat| pat.rect(50, 50).styles(:fill=>'darkblue') pat.polygon(0,0, 25,50, 50,0, 0,0).styles(:fill=>'yellow', :stroke=>'red') end canvas.ellipse(130, 60, 150, 75).styles(:stroke_width=>16, :fill=>'none', :stroke=>triangles) hat = Magick::Image.read('images/Flower_Hat.jpg').first hats = Magick::RVG::Pattern.new(hat.columns/4.0, hat.rows/4.0) do |pat| pat.image(hat, hat.columns/4.0, hat.rows/4.0) end canvas.g.translate(0, 150) do |grp| grp.ellipse(130, 60, 150, 75).styles(:fill=>hats) end canvas.rect(299, 299, 0, 0).styles(:fill=>'none', :stroke=>'blue') canvas.line(1, 150, 299, 150) end rvg.draw.write('rvg_pattern.gif') rmagick-2.13.2/doc/ex/emboss.rb0000644000004100000410000000027212147515547016256 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#edge method img = Magick::Image.read('images/Flower_Hat.jpg').first img = img.emboss img.write('emboss.jpg') exit rmagick-2.13.2/doc/ex/cbezier4.rb0000644000004100000410000000165212147515547016500 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' imgl = Magick::ImageList.new imgl.new_image(390, 360, Magick::HatchFill.new('white','lightcyan2')) gc = Magick::Draw.new # Draw Bezier curve gc.stroke('red') gc.stroke_width(3) gc.fill_opacity(0) gc.bezier(20,180, 20,30, 320, 330, 320,180) # Draw circles around endpoints gc.fill_opacity(0) gc.stroke('gray50').stroke_width(1) gc.circle(20,180, 23, 183) gc.circle(320,180, 323, 183) # Draw filled circles around control points gc.line(20,180, 20,30) gc.line(320,180, 320,330) gc.fill_opacity(1) gc.fill('gray50') gc.circle(20,30, 23,33) gc.circle(320,330, 323,333) # Annotate gc.font_weight(Magick::NormalWeight) gc.font_style(Magick::NormalStyle) gc.fill('black') gc.stroke('transparent') gc.text(29,180, "'20,180'") gc.text(29,33, "'20,30'") gc.text(329,330, "'320,330'") gc.text(329,180, "'320,180'") gc.draw(imgl) imgl.border!(1,1, "lightcyan2") imgl.write('cbezier4.gif') exit(0) rmagick-2.13.2/doc/ex/unsharp_mask.rb0000644000004100000410000000127412147515547017464 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#enhance method img = Magick::Image.read('images/Flower_Hat.jpg').first eimg = img.unsharp_mask(3.0, 1.0, 1.0, 0.05) img.resize!(3) eimg.resize!(3) # Make a before-and-after composite eimg.crop!(eimg.columns/2, 0, eimg.columns/2, eimg.rows) img = img.composite(eimg, Magick::EastGravity, Magick::OverCompositeOp) # Draw a black line between the before and after parts. line = Magick::Draw.new line.line(img.columns/2, 0, img.columns/2, img.rows) line.draw(img) # Zoom in so we can see the change, # then crop everything but the face. img.crop!(Magick::CenterGravity, 250, 200) #img.display img.write('unsharp_mask.jpg') exit rmagick-2.13.2/doc/ex/cbezier2.rb0000644000004100000410000000165012147515547016474 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' imgl = Magick::ImageList.new imgl.new_image(470, 150, Magick::HatchFill.new('white','lightcyan2')) gc = Magick::Draw.new # Draw Bezier curve gc.stroke('red') gc.stroke_width(3) gc.fill_opacity(0) gc.bezier(25,125, 100,25, 400,25, 325,125) # Draw circles around end points gc.fill_opacity(0) gc.stroke('gray50').stroke_width(1) gc.circle(25,125, 28, 128) gc.circle(325,125, 328, 123) # Draw filled circles around control points gc.line(25,125, 100,25) gc.line(325,125, 400,25) gc.fill_opacity(1) gc.fill('gray50') gc.circle(100,25, 103,28) gc.circle(400,25, 403,28) # Annotate gc.font_weight(Magick::NormalWeight) gc.font_style(Magick::NormalStyle) gc.fill('black') gc.stroke('transparent') gc.text(34,125, "'25,125'") gc.text(107,25, "'100,25'") gc.text(335,125, "'325,125'") gc.text(405,25, "'400,25'") gc.draw(imgl) imgl.border!(1,1, "lightcyan2") imgl.write('cbezier2.gif') exit(0) rmagick-2.13.2/doc/ex/rvg_linecap.rb0000644000004100000410000000317212147515547017261 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'rvg/rvg' Magick::RVG.dpi = 90 BUTT = {:stroke=>'black', :stroke_width=>70, :stroke_linecap=>'butt'} ROUND = {:stroke=>'black', :stroke_width=>70, :stroke_linecap=>'round'} SQUARE = {:stroke=>'black', :stroke_width=>70, :stroke_linecap=>'square'} THIN = {:stroke=>'#ffcccc', :stroke_width=>5} TEXT = {:text_anchor=>'middle', :font_size=>50, :font_family=>'Verdana'} CIRCLE = {:fill=>'#ffcccc', :stroke=>'none'} rvg = Magick::RVG.new(12.cm, 2.cm).viewbox(0, 0, 1200, 200) do |canvas| canvas.background_fill = 'white' canvas.desc = "Example linecap - demonstrates three stroke-linecap values" canvas.g.translate(200, 75) do |butt| butt.line(-125, 0, 125, 0).styles(BUTT) butt.line(-125, 0, 125, 0).styles(THIN) butt.circle(8, -125, 0).styles(CIRCLE) butt.circle(8, 125, 0).styles(CIRCLE) butt.text(0, 90, "'butt' cap").styles(TEXT) end canvas.g.translate(600, 75) do |round| round.line(-125, 0, 125, 0).styles(ROUND) round.line(-125, 0, 125, 0).styles(THIN) round.circle(8, -125, 0).styles(CIRCLE) round.circle(8, 125, 0).styles(CIRCLE) round.text(0, 90, "'round' cap").styles(TEXT) end canvas.g.translate(1000, 75) do |square| square.line(-125, 0, 125, 0).styles(SQUARE) square.line(-125, 0, 125, 0).styles(THIN) square.circle(8, -125, 0).styles(CIRCLE) square.circle(8, 125, 0).styles(CIRCLE) square.text(0, 90, "'square' cap").styles(TEXT) end canvas.rect(1192, 195, 1, 1).styles(:stroke=>'blue', :fill=>'none') end rvg.draw.write('rvg_linecap.gif') rmagick-2.13.2/doc/ex/cbezier5.rb0000644000004100000410000000164512147515547016503 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' imgl = Magick::ImageList.new imgl.new_image(390, 150, Magick::HatchFill.new('white','lightcyan2')) gc = Magick::Draw.new # Draw Bezier curve gc.stroke('red') gc.stroke_width(3) gc.fill_opacity(0) gc.bezier(20,120, 95,20, 245,20, 320,120) # Draw circles around endpoints gc.fill_opacity(0) gc.stroke('gray50').stroke_width(1) gc.circle(20,120, 23, 123) gc.circle(320,120, 323, 123) # Draw filled circles around control points gc.line(20,120, 95,20) gc.line(320,120, 245,20) gc.fill_opacity(1) gc.fill('gray50') gc.circle(95,20, 98,23) gc.circle(245,20, 248,23) # Annotate gc.font_weight(Magick::NormalWeight) gc.font_style(Magick::NormalStyle) gc.fill('black') gc.stroke('transparent') gc.text(29,120, "'20,120'") gc.text(104,20, "'95,20'") gc.text(254,20, "'245,20'") gc.text(329,120, "'320,120'") gc.draw(imgl) imgl.border!(1,1, 'lightcyan2') imgl.write('cbezier5.gif') exit(0) rmagick-2.13.2/doc/ex/negate_channel.rb0000644000004100000410000000036512147515547017724 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#negate_channel method img = Magick::Image.read('images/Flower_Hat.jpg').first result = img.negate_channel(false, Magick::GreenChannel) result.write('negate_channel.jpg') exit rmagick-2.13.2/doc/ex/tref01.rb0000644000004100000410000000121712147515547016067 0ustar www-datawww-datarequire 'rvg/rvg' Magick::RVG.dpi = 90 Fill = %w{yellow pink green blue cyan red purple brown} rvg = Magick::RVG.new(6.cm, 6.cm).viewbox(0,0,600,600) do |canvas| canvas.background_fill = 'white' ref_text = Magick::RVG::Tspan.new("Referenced").styles(:font_size=>52, :font_weight=>'bold') canvas.g.translate(300,270) do |grp| angle = 0 8.times do |n| grp.text do |txt| txt.tref(ref_text).d(0,30).rotate(angle).styles(:fill=>Fill[n]) angle += 45 end end end canvas.rect(596,596).styles(:fill=>'none',:stroke=>'blue') end rvg.draw.write('tref01.gif') rmagick-2.13.2/doc/ex/nonzero.rb0000644000004100000410000000440512147515547016462 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'rvg/rvg' Magick::RVG.dpi = 90 rvg = Magick::RVG.new(12.cm, 4.cm).viewbox(0, 0, 1200, 400) do |canvas| canvas.background_fill = 'white' canvas.desc = "Example fillrule - nonzero - demonstrates fill_rule=>'nonzero'" canvas.rect(1195, 393, 1, 1).styles(:fill=>'none', :stroke=>'blue') triangle = Magick::RVG::Group.new do |defs| defs.path("M 16,0 L -8,9 v-18 z").styles(:fill=>'black', :stroke=>'none') end canvas.g.styles(:fill_rule=>'nonzero', :fill=>'red', :stroke=>'black', :stroke_width=>3) do |grp| grp.path("M 250,75 L 323,301 131,161 369,161 177,301 z") grp.use(triangle).translate(306.21, 249).rotate(72) grp.use(triangle).translate(175.16,193.2).rotate(216) grp.use(triangle).translate(314.26,161).rotate(0) grp.use(triangle).translate(221.16,268.8).rotate(144) grp.use(triangle).translate(233.21,126.98).rotate(288) grp.path("M 600,81 A 107,107 0 0,1 600,295 A 107,107 0 0,1 600,81 z" + "M 600,139 A 49,49 0 0,1 600,237 A 49,49 0 0,1 600,139 z") grp.use(triangle).translate(600,188).rotate(0).translate(107,0).rotate(90) grp.use(triangle).translate(600,188).rotate(120).translate(107,0).rotate(90) grp.use(triangle).translate(600,188).rotate(240).translate(107,0).rotate(90) grp.use(triangle).translate(600,188).rotate(60).translate(49,0).rotate(90) grp.use(triangle).translate(600,188).rotate(180).translate(49,0).rotate(90) grp.use(triangle).translate(600,188).rotate(300).translate(49,0).rotate(90) grp.path("M 950,81 A 107,107 0 0,1 950,295 A 107,107 0 0,1 950,81 z" + "M 950,139 A 49,49 0 0,0 950,237 A 49,49 0 0,0 950,139 z") grp.use(triangle).translate(950,188).rotate(0).translate(107,0).rotate(90) grp.use(triangle).translate(950,188).rotate(120).translate(107,0).rotate(90) grp.use(triangle).translate(950,188).rotate(240).translate(107,0).rotate(90) grp.use(triangle).translate(950,188).rotate(60).translate(49,0).rotate(-90) grp.use(triangle).translate(950,188).rotate(180).translate(49,0).rotate(-90) grp.use(triangle).translate(950,188).rotate(300).translate(49,0).rotate(-90) end end rvg.draw.write('nonzero.gif') rmagick-2.13.2/doc/ex/font_styles.rb0000644000004100000410000000251012147515547017334 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'rvg/rvg' rvg = Magick::RVG.new(200, 250) do |canvas| canvas.background_fill = 'white' canvas.g do |grp| grp.g.styles(:font_weight=>'normal', :font_style=>'normal') do |grp2| grp2.text(10, 30, "default size") grp2.text(10, 50, ":font_size=>14").styles(:font_size=>14) grp2.text(10, 70, ":font_size=>16").styles(:font_size=>16) grp2.text(10,100, ":font_size=>24").styles(:font_size=>24) end end canvas.g.styles(:font_size=>14, :font_weight=>'normal', :font_style=>'normal') do |grp| if RUBY_PLATFORM =~ /mswin32/ grp.text( 8, 120, ":font_family=>'Courier-New'").styles(:font_family=>'Courier-New') else grp.text( 8, 120, ":font_family=>'Courier'").styles(:font_family=>'Courier') end grp.text(10, 140, ":font_weight=>'bold'").styles(:font_weight=>'bold') grp.text(10, 160, ":font_stretch=>'normal'").styles(:font_stretch=>'normal') grp.text(10, 180, ":font_stretch=>'condensed'").styles(:font_stretch=>'condensed') grp.text(10, 200, ":font_style=>'italic'").styles(:font_style=>'italic') grp.text(10, 220, ":font_weight=>900").styles(:font_weight=>900) end canvas.rect(199, 249).styles(:fill=>'none', :stroke=>'blue') end rvg.draw.write('font_styles.gif') rmagick-2.13.2/doc/ex/oil_paint.rb0000644000004100000410000000030512147515547016741 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#oil_paint method img = Magick::Image.read('images/Flower_Hat.jpg').first img = img.oil_paint img.write('oil_paint.jpg') exit rmagick-2.13.2/doc/ex/mono.rb0000644000004100000410000000143412147515547015737 0ustar www-datawww-data#!/usr/local/bin/ruby -w require 'RMagick' # Demonstrate the ImageListImage#quantize method by converting # a color image into a monochrome image. # Read the large color cheetah image and scale it to a third # of its size. cheetah = Magick::Image.read("images/Cheetah.jpg").first cheetah.scale!(0.33) # Quantize the cheetah image into 256 colors in the GRAY colorspace. mono_cheetah = cheetah.quantize 256, Magick::GRAYColorspace # Cut the top off the monochrome cheetah image. mono_bottom = mono_cheetah.crop 0, mono_cheetah.rows/2, mono_cheetah.columns, mono_cheetah.rows/2 # Composite the half-height mono cheetah onto the bottom of # the original color cheetah. before_after = cheetah.composite mono_bottom, 0, cheetah.rows/2, Magick::OverCompositeOp before_after.write "mono.jpg" exit rmagick-2.13.2/doc/ex/compose_mask.rb0000644000004100000410000000137212147515547017450 0ustar www-datawww-datarequire 'RMagick' background = Magick::Image.read('images/Flower_Hat.jpg').first source = Magick::Image.read('pattern:checkerboard') {self.size = "#{background.columns}x#{background.rows}"}.first mask = Magick::Image.new(background.columns, background.rows) {self.background_color = "black"} # Make a mask gc = Magick::Draw.new gc.annotate(mask, 0, 0, 0, 0, "Ruby") do gc.gravity = Magick::CenterGravity gc.pointsize = 100 gc.rotation = 90 gc.font_weight = Magick::BoldWeight gc.fill = "white" gc.stroke = "none" end background.add_compose_mask(mask) result = background.composite(source, Magick::CenterGravity, Magick::OverCompositeOp) result.write "compose_mask_example.jpg" source.write "compose_mask_source.gif" mask.write "compose_mask.gif" rmagick-2.13.2/doc/ex/clip_path.rb0000644000004100000410000000240212147515547016726 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' points = [145, 65, 174,151, 264,151, 192,205, 218,291, 145,240, 72,291, 98,205, 26,151, 116,151] pr = Magick::Draw.new # Define a clip-path. # The name of the clip-path is "example" pr.define_clip_path('example') { pr.polygon(*points) } # Enable the clip-path pr.push pr.clip_path('example') # Composite the Flower Hat image over # the background using the clip-path girl = Magick::ImageList.new girl.read("images/Flower_Hat.jpg") cols = rows = nil # Our final image is about 280 pixels wide, so here # we widen our picture to fit. The change_geometry # method will adjust the height proportionately. girl.change_geometry("280") do |c,r| pr.composite(0,0, c, r, girl) cols = c rows = r end pr.pop # Create a canvas to draw on, a bit bigger than the star. canvas = Magick::Image.new(cols, rows) star = Magick::Draw.new star.stroke('gray50') star.fill('gray50') points.map! {|p| p + 8} star.polygon(*points) star.draw(canvas) canvas = canvas.blur_image(0, 3) # Draw the star shadow over the background pr.draw(canvas) # Crop away all the solid white border pixels. crop = canvas.bounding_box canvas.crop!(crop.x, crop.y, crop.width, crop.height) canvas.write("clip_path.gif") exit rmagick-2.13.2/doc/ex/contrast.rb0000644000004100000410000000142212147515547016621 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#contrast method img = Magick::ImageList.new('images/Flower_Hat.jpg') img.resize!(0.5) # Prepare to label each image with a number from 1 to 4 legend = Magick::Draw.new legend.stroke = 'transparent' legend.pointsize = 12 legend.gravity = Magick::SouthEastGravity # Add 3 images, each one having slightly less contrast f = 1 3.times { img << img.contrast # Annotate the previous image legend.annotate(img[f-1], 0,0,7,10, f.to_s) f += 1 } # Annotate the last image legend.annotate(img, 0,0,7,10, f.to_s) # Montage into a single image imgs = img.montage { self.geometry = Magick::Geometry.new(img.columns, img.rows) self.tile = "2x2" } imgs.write('contrast.jpg') #imgs.display exit rmagick-2.13.2/doc/ex/tspan01.rb0000644000004100000410000000112112147515547016246 0ustar www-datawww-datarequire 'rvg/rvg' Magick::RVG.dpi = 90 rvg = Magick::RVG.new(10.cm, 3.cm).viewbox(0,0,1000,300) do |canvas| canvas.background_fill = 'white' canvas.desc = "Example tspan01 - using tspan to change visual attributes" canvas.g.styles(:font_family=>'Verdana', :font_size=>45) do |grp| grp.text(200, 150, "You are").styles(:fill=>'blue') do |txt| txt.tspan(" not").styles(:font_weight=>'bold', :fill=>'red') txt.tspan(" a banana") end end canvas.rect(997, 297).styles(:fill=>'none', :stroke=>'blue') end rvg.draw.write('tspan01.gif') rmagick-2.13.2/doc/ex/enhance.rb0000644000004100000410000000126512147515547016372 0ustar www-datawww-data#!/usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#enhance method img = Magick::Image.read('images/Flower_Hat.jpg').first img = img.add_noise(Magick::UniformNoise) eimg = img.enhance # Zoom in so we can see the change img.resize!(3) eimg.resize!(3) # Make a before-and-after composite eimg.crop!(Magick::EastGravity, eimg.columns/2, eimg.rows) img = img.composite(eimg, Magick::EastGravity, Magick::OverCompositeOp) # Draw a black line between the before and after parts. line = Magick::Draw.new line.line(img.columns/2, 0, img.columns/2, img.rows) line.draw(img) # Crop everything but the face. img.crop!(Magick::CenterGravity, 250, 200) img.write('enhance.jpg') exit rmagick-2.13.2/doc/ex/color_reset.rb0000644000004100000410000000040212147515547017301 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#color_reset! method f = Magick::Image.new(100,100) { self.background_color = 'white' } red = Magick::Pixel.from_color('red') f.color_reset!(red) #f.display f.write('color_reset.gif') exit rmagick-2.13.2/doc/ex/pattern2.rb0000644000004100000410000000112612147515547016524 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' hat = Magick::Image.read("images/Flower_Hat.jpg").first hat.resize!(0.25) # Construct a pattern using the hat image gc = Magick::Draw.new gc.pattern('hat', 0, 0, hat.columns, hat.rows) { gc.composite(0, 0, 0, 0, hat) } # Set the fill to the hat "pattern." Draw an ellipse gc.fill('hat') gc.ellipse(150, 75, 140, 70, 0, 360) # Create a canvas to draw on img = Magick::Image.new(300, 150, Magick::HatchFill.new('white','lightcyan2',8)) # Draw the ellipse using the fill gc.draw(img) img.border!(1,1, "lightcyan2") img.write('pattern2.gif') exit rmagick-2.13.2/doc/ex/get_multiline_type_metrics.rb0000644000004100000410000000176212147515547022423 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' TEXT = 'get\nmultiline\ntype\nmetrics' background = Magick::Image.new(200, 200) gc = Magick::Draw.new # Draw the text centered on the background gc.annotate(background, 0, 0, 0, 0, TEXT) do gc.font_family = 'Verdana' gc.pointsize = 36 gc.gravity = Magick::CenterGravity gc.stroke = 'none' end # Get the metrics metrics = gc.get_multiline_type_metrics(background, TEXT) # Compute the corners for a rectangle surrounding the text x = (background.columns - metrics.width) / 2 y = (background.rows - metrics.height) / 2 # Draw 2 rectangles over the text. gc = Magick::Draw.new gc.stroke('red') gc.stroke_width(5) gc.stroke_linejoin('round') gc.fill('cyan') gc.fill_opacity(0.10) gc.rectangle(x, y, x+metrics.width, y+metrics.height) gc.stroke('white') gc.stroke_width(1) gc.fill('none') gc.rectangle(x, y, x+metrics.width, y+metrics.height) gc.draw(background) background.border!(1,1, 'blue') background.write('get_multiline_type_metrics.gif') rmagick-2.13.2/doc/ex/InitialCoords.rb0000644000004100000410000000137312147515547017534 0ustar www-datawww-datarequire 'rvg/rvg' rvg = Magick::RVG.new(300, 100) do |canvas| canvas.desc = "Example InitialCoords - SVG's initial coordinate system" canvas.background_fill = 'white' canvas.g.styles(:fill=>'none', :stroke=>'black', :stroke_width=>3) do |grp| grp.line(0, 1.5, 300, 1.5) grp.line(1.5, 0, 1.5, 100) end canvas.g.styles(:fill=>'red', :stroke=>'none') do |grp| grp.rect(3, 3) grp.rect(3, 3, 297, 0) grp.rect(3, 3, 0, 97) end canvas.g.styles(:font_size=>14, :font_family=>'Verdana', :font_weight=>'normal', :font_style=>'normal') do |grp| grp.text(10, 20, '(0,0)') grp.text(240, 20, '(300,0)') grp.text(10, 90, '(0,100)') end end rvg.draw.write('InitialCoords.gif') rmagick-2.13.2/doc/ex/shade.rb0000644000004100000410000000027412147515547016054 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate Image#shade img = Magick::Image.read('images/Flower_Hat.jpg').first img = img.shade(true, 50, 50) img.write('shade.jpg') exit rmagick-2.13.2/doc/ex/colorize.rb0000644000004100000410000000065712147515547016623 0ustar www-datawww-data#!/usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#colorize method by converting # a full-color image to "sepia-tone" img = Magick::Image.read('images/Flower_Hat.jpg').first # Convert the color image to monochrome mono = img.quantize(256, Magick::GRAYColorspace) # Colorize with a 30% blend of a brownish-orange color colorized = mono.colorize(0.30, 0.30, 0.30, '#cc9933') colorized.write('colorize.jpg') exit rmagick-2.13.2/doc/ex/channel.rb0000644000004100000410000000122312147515547016373 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' img = Magick::Image.read('images/Flower_Hat.jpg').first imgs = Magick::ImageList.new imgs << img imgs << img.channel(Magick::RedChannel) imgs.cur_image['Label'] = 'RedChannel' imgs << img.channel(Magick::GreenChannel) imgs.cur_image['Label'] = 'GreenChannel' imgs << img.channel(Magick::BlueChannel) imgs.cur_image['Label'] = 'BlueChannel' result = imgs.montage { self.tile = "2x2" self.background_color = 'black' self.stroke = 'transparent' self.fill = 'white' self.pointsize =9 self.geometry = Magick::Geometry.new(img.columns/2, img.rows/2, 5, 5) } result.write('channel.jpg') rmagick-2.13.2/doc/ex/text01.rb0000644000004100000410000000111312147515547016106 0ustar www-datawww-datarequire 'rvg/rvg' Magick::RVG.dpi = 90 rvg = Magick::RVG.new(10.cm, 3.cm).viewbox(0,0,1000,300) do |canvas| canvas.background_fill = 'white' canvas.desc = "Example text01 - 'Hello, out there' in blue" canvas.text(250, 150, "Hello, out there"). styles(:font_family=>'Verdana', :font_size=>55, :fill=>'blue', :font_weight=>'normal', :font_style=>'normal') canvas.circle(5, 250, 150).styles(:fill=>'red') # Show outline of canvas using 'rect' element canvas.rect(997, 297).styles(:fill=>'none', :stroke=>'blue') end rvg.draw.write('text01.gif') rmagick-2.13.2/doc/ex/remap.rb0000644000004100000410000000046212147515547016073 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' img = Magick::Image.read("images/Flower_Hat.jpg").first rose = Magick::Image.read("images/Yellow_Rose.miff").first begin img.affinity(rose) rescue NotImplementedError img = Magick::Image.read("images/notimplemented.gif").first end img.write("remap.jpg") rmagick-2.13.2/doc/ex/shear.rb0000644000004100000410000000031612147515547016067 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#shear method. img = Magick::Image.read("images/Flower_Hat.jpg").first img = img.shear(-30,-30) #img.display img.write('shear.jpg') exit rmagick-2.13.2/doc/ex/stroke_dasharray.rb0000644000004100000410000000165412147515547020340 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' imgl = Magick::ImageList.new imgl.new_image(500,180, Magick::HatchFill.new('white','lightcyan2')) gc = Magick::Draw.new gc.stroke_width(5) gc.fill('transparent') gc.stroke_dasharray(30,10, 10,10) gc.stroke('green') gc.line(10, 20, 490, 20) gc.stroke_dasharray(5,10,5) gc.stroke_dashoffset(10) gc.stroke('blue') gc.line(10, 80, 490, 80) gc.stroke_dasharray(10,10) gc.stroke_dashoffset(0) gc.stroke('red') gc.line(10, 140, 490, 140) gc.fill('black') gc.stroke('transparent') gc.font_weight(Magick::NormalWeight) gc.font_style(Magick::NormalStyle) gc.gravity(Magick::CenterGravity) gc.text( 0, -60, "'gc.stroke_dasharray(30, 10, 10, 10)'") gc.text( 0, 0, "'gc.stroke_dasharray(5, 10, 5)'") gc.text( 0, 12, "'gc.stroke_dashoffset(10)'") gc.text( 0, 60, "'gc.stroke_dasharray(10, 10)'") gc.draw(imgl) imgl.border!(1,1,"lightcyan2") #imgl.display imgl.write("stroke_dasharray.gif") exit rmagick-2.13.2/doc/ex/cbezier1.rb0000644000004100000410000000164312147515547016475 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' imgl = Magick::ImageList.new imgl.new_image(390, 140, Magick::HatchFill.new('white','lightcyan2')) gc = Magick::Draw.new # Draw Bezier curve gc.stroke('red') gc.stroke_width(2) gc.fill_opacity(0) gc.bezier(20,120, 20,20, 320, 20, 320,120) # Draw circles around endpoints gc.fill_opacity(0) gc.stroke('gray50').stroke_width(1) gc.circle(20,120, 23, 123) gc.circle(320,120, 323, 123) # Draw filled circles around control points gc.line(20,120, 20,20) gc.line(320,120, 320,20) gc.fill_opacity(1) gc.fill('gray50') gc.circle(20,20, 23,23) gc.circle(320,20, 323,23) # Annotate gc.font_weight(Magick::NormalWeight) gc.font_style(Magick::NormalStyle) gc.fill('black') gc.stroke('transparent') gc.text(27,120, "'20,120'") gc.text(27,20, "'20,20'") gc.text(327,120, "'320,120'") gc.text(327,20, "'320,20'") gc.draw(imgl) imgl.border!(1, 1, "lightcyan2") imgl.write('cbezier1.gif') exit(0) rmagick-2.13.2/doc/ex/transverse.rb0000644000004100000410000000030612147515547017160 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#transverse method img = Magick::Image.read('images/Flower_Hat.jpg').first img = img.transverse img.write('transverse.jpg') exit rmagick-2.13.2/doc/ex/gradientfill.rb0000644000004100000410000000112012147515547017423 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the GradientFill class Rows = 100 Cols = 300 Start = "#900" End = "#000" fill = Magick::GradientFill.new(0, 0, 0, Rows, Start, End) img = Magick::Image.new(Cols, Rows, fill); # Annotate the filled image with the code that created the fill. ann = Magick::Draw.new ann.annotate(img, 0,0,0,0, "GradientFill.new(0, 0, 0, #{Rows}, '#{Start}', '#{End}')") { self.gravity = Magick::CenterGravity self.fill = 'white' self.stroke = 'transparent' self.pointsize = 14 } #img.display img.write("gradientfill.gif") exit rmagick-2.13.2/doc/ex/NewCoordSys.rb0000644000004100000410000000232112147515547017202 0ustar www-datawww-datarequire 'rvg/rvg' rvg = Magick::RVG.new(400, 150) do |canvas| canvas.background_fill = 'white' canvas.desc = 'Example NewCoordSys - New user coordinate system' canvas.g.styles(:fill=>'none', :stroke=>'black', :stroke_width=>3) do |grp| # Draw the axes of the original coordinate system grp.line(0, 1.5, 400, 1.5) grp.line(1.5, 0, 1.5, 150) end canvas.g do |grp| grp.text(30, 30, 'ABC (orig coord system)').styles(:font_size=>20, :font_family=>'Verdana', :font_weight=>'normal', :font_style=>'normal') end # Establish a new coordinate system, which is # shifted (i.e., translated) from the initial coordinate # system by 50 user units along each axis. canvas.g.translate(50, 50) do |grp| grp.g.styles(:fill=>'none', :stroke=>'red', :stroke_width=>3) do |grp2| # Draw lines of length 50 user units along # the axes of the new coordinate system grp2.line(0, 0, 50, 0) grp2.line(0, 0, 0, 50) end grp.text(30, 30, 'ABC (translated coord system)').styles(:font_size=>20, :font_family=>'Verdana', :font_weight=>'normal', :font_style=>'normal') end end rvg.draw.write('NewCoordSys.gif') rmagick-2.13.2/doc/ex/cubic01.rb0000644000004100000410000000341012147515547016211 0ustar www-datawww-datarequire 'rvg/rvg' Magick::RVG.dpi = 90 Border = {:fill=>'none', :stroke=>'blue', :stroke_width=>1} Connect = {:fill=>'none', :stroke=>'#888', :stroke_width=>2} SamplePath = {:fill=>'none', :stroke=>'red', :stroke_width=>5} EndPoint = {:fill=>'none', :stroke=>'#888', :stroke_width=>2} CtlPoint = {:fill=>'#888', :stroke=>'none'} AutoCtlPoint = {:fill=>'none', :stroke=>'blue', :stroke_width=>4} Label = {:font_size=>22, :font_family=>'Verdana', :font_weight=>'normal', :font_style=>'normal'} rvg = Magick::RVG.new(5.cm, 4.cm).viewbox(0, 0, 500, 400) do |canvas| canvas.title = "Example cubic01 - cubic Bezier commands in path data" canvas.desc = <<-END_DESC Picture showing a simple example of path data using both a "C" and an "S" command, along with annotations showing the control points and end points. END_DESC canvas.background_fill = 'white' canvas.rect(496, 395, 1, 1).styles(Border) canvas.polyline(100,200, 100,100).styles(Connect) canvas.polyline(250,100, 250,200).styles(Connect) canvas.polyline(250,200, 250,300).styles(Connect) canvas.polyline(400,300, 400,200).styles(Connect) canvas.path("M100,200 C100,100 250,100 250,200 S400,300 400,200").styles(SamplePath) canvas.circle(10, 100, 200).styles(EndPoint) canvas.circle(10, 250, 200).styles(EndPoint) canvas.circle(10, 400, 200).styles(EndPoint) canvas.circle(10, 100, 100).styles(CtlPoint) canvas.circle(10, 250, 100).styles(CtlPoint) canvas.circle(10, 400, 300).styles(CtlPoint) canvas.circle(9, 250, 300).styles(AutoCtlPoint) canvas.text(25, 70, 'M100,200 C100,100 250,100 250,200').styles(Label) canvas.text(225, 350, 'S400,300 400,200').styles(Label) end rvg.draw.write('cubic01.gif') rmagick-2.13.2/doc/ex/text.rb0000644000004100000410000000142212147515547015750 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' imgl = Magick::ImageList.new imgl.new_image(190,190) sample = Magick::Draw.new sample.stroke('transparent') if RUBY_PLATFORM =~ /mswin32/ sample.font_family('Georgia') else sample.font_family('times') end sample.font_weight(Magick::NormalWeight) sample.pointsize(24) sample.font_style(Magick::NormalStyle) sample.text(20,40, 'NormalStyle') sample.font_style(Magick::ItalicStyle) sample.text(20,70, 'ItalicStyle') sample.font_style(Magick::ObliqueStyle) sample.text(20,100, 'ObliqueStyle') sample.font_style(Magick::NormalStyle) sample.font_weight(Magick::BoldWeight) sample.text(20,130, 'BoldWeight') sample.font_weight(Magick::LighterWeight) sample.text(20,160, 'LighterWeight') sample.draw(imgl) imgl.write('text.gif') exit rmagick-2.13.2/doc/ex/flip.rb0000644000004100000410000000026112147515547015716 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#flip method img = Magick::Image.read('images/Flower_Hat.jpg').first img.flip! img.write('flip.jpg') exit rmagick-2.13.2/doc/ex/RotateScale.rb0000644000004100000410000000301212147515547017167 0ustar www-datawww-datarequire 'rvg/rvg' rvg = Magick::RVG.new(400, 120) do |canvas| canvas.desc = 'Example RotateScale - Rotate and scale transforms' canvas.background_fill = 'white' canvas.g.styles(:fill=>'none', :stroke=>'black', :stroke_width=>3) do |grp| # Draw the axes of the original coordinate system grp.line(0, 1.5, 400, 1.5) grp.line(1.5, 0, 1.5, 120) end # Establish a new coordinate system whose origin is at (50,30) # in the original coord. system and which is rotated by 30 degrees. canvas.g.translate(50,30) do |grp| grp.g.rotate(30) do |grp2| grp2.g.styles(:fill=>'none',:stroke=>'red',:stroke_width=>3) do |grp3| grp3.line(0, 0, 50, 0) grp3.line(0, 0, 0, 50) end grp2.text(0, 0, "ABC (rotate)").styles(:font_size=>20, :fill=>'blue', :font_family=>'Verdana', :font_weight=>'normal', :font_style=>'normal') end end # Establish a new coordinate system whose origin is at (200,40) # in the original coord. systm and which is scaled by 1.5 canvas.g.translate(200,40) do |grp| grp.g.scale(1.5) do |grp2| grp2.g.styles(:fill=>'none',:stroke=>'red',:stroke_width=>3) do |grp3| grp3.line(0, 0, 50, 0) grp3.line(0, 0, 0, 50) end grp2.text(0, 0, "ABC (scale)").styles(:font_size=>20, :fill=>'blue', :font_family=>'Verdana', :font_weight=>'normal', :font_style=>'normal') end end end rvg.draw.write('RotateScale.gif') rmagick-2.13.2/doc/ex/get_pixels.rb0000644000004100000410000000320612147515547017131 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate partial transparency and the get_pixels and # store_pixels methods by creating an image that goes from # full-color on the left to monochrome on the right. # Read the colorful picture of a rock formation. Scale # it to 300 pixels high because we don't want a big picture. rocks = Magick::Image.read('images/Red_Rocks.jpg').first rocks.scale!(250.0/rocks.rows) # Make a monochrome copy. See Image#quantize for details grayrocks = rocks.quantize(256, Magick::GRAYColorspace) rows = grayrocks.rows cols = grayrocks.columns # Create an array of opacity values, proceeding from # transparent to opaque. The array should have as many # elements as there are columns in the image. The first # element should be TransparentOpacity and each succeeding # element slightly more opaque than its predecessor. step = Magick::TransparentOpacity / cols.to_f opacity_steps = Array.new(cols) cols.times { |x| opacity_steps[x] = Magick::TransparentOpacity - Integer(x * step) if opacity_steps[x] < Magick::OpaqueOpacity opacity_steps[x] = Magick::OpaqueOpacity end } # Get each row of pixels from the mono image. # Copy the pre-computed opacity values to the pixels. # Store the pixels back. rows.times { |y| pixels = grayrocks.get_pixels(0, y, cols, 1) pixels.each_with_index { |p,x| p.opacity = opacity_steps[x] } grayrocks.store_pixels(0, y, cols, 1, pixels) } # Composite the mono version of the image over the color version. grayrocks.matte = true combine = rocks.composite(grayrocks, Magick::CenterGravity, Magick::OverCompositeOp) #combine.display combine.write 'get_pixels.jpg' exit rmagick-2.13.2/doc/ex/cycle_colormap.rb0000644000004100000410000000102112147515547017752 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#cycle_colormap method balloons = Magick::Image.read('images/Hot_Air_Balloons.jpg').first balloons = balloons.quantize(256, Magick::RGBColorspace) jump = balloons.colors / 10 animation = Magick::ImageList.new animation[0] = balloons 5.times { animation << animation.cycle_colormap(jump) } 4.times { animation << animation.cycle_colormap(-jump) } animation.delay=20 animation.iterations = 10000 #animation.animate animation.write('cycle_colormap.gif') exit rmagick-2.13.2/doc/ex/translate.rb0000644000004100000410000000150112147515547016757 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' imgl = Magick::ImageList.new imgl.new_image(250, 250, Magick::HatchFill.new('white','lightcyan2')) gc = Magick::Draw.new gc.stroke('red') gc.stroke_width(2) # Move the origin to the center. gc.translate(125, 125) max_x = imgl.columns/2 max_y = imgl.rows/2 # Draw down-pointing arrow gc.line(0, -max_y, 0, max_y) gc.line(0, max_y, 10, max_y-10) gc.line(0, max_y, -10, max_y-10) # Draw right-pointing arrow gc.line(-max_x, 0, max_x, 0) gc.line( max_x, 0, max_x-10, -10) gc.line( max_x, 0, max_x-10, 10) # Add labels gc.font_weight(Magick::NormalWeight) gc.font_style(Magick::NormalStyle) gc.fill('black') gc.stroke('transparent') gc.text(8, 15, "'0,0'") gc.text(105, 16, "x") gc.text(12, 115, "y") gc.draw(imgl) imgl.border!(1,1, "lightcyan2") imgl.write("translate.gif") rmagick-2.13.2/doc/ex/color_histogram.rb0000644000004100000410000000213112147515547020155 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' NUM_COLORS = 256 HIST_HEIGHT = 200 img = Magick::Image.read('images/Hot_Air_Balloons_H.jpg').first img = img.quantize(NUM_COLORS) hist = img.color_histogram # sort pixels by increasing count pixels = hist.keys.sort_by {|pixel| hist[pixel] } scale = HIST_HEIGHT / (hist.values.max*1.025) # put 2.5% air at the top gc = Magick::Draw.new gc.stroke_width(1) gc.affine(1, 0, 0, -scale, 0, HIST_HEIGHT) # handle images with fewer than NUM_COLORS colors start = NUM_COLORS - img.number_colors pixels.each { |pixel| gc.stroke(pixel.to_color) gc.line(start, 0, start, hist[pixel]) start = start.succ } hatch = Magick::HatchFill.new("white", "gray95") canvas = Magick::Image.new(NUM_COLORS, HIST_HEIGHT, hatch) gc.draw(canvas) text = Magick::Draw.new text.annotate(canvas, 0, 0, 0, 20, "Color Frequency\nHistogram") { self.pointsize = 10 self.gravity = Magick::NorthGravity self.stroke = 'transparent' } canvas.border!(1, 1, "white") canvas.border!(1, 1, "black") canvas.border!(3, 3, "white") canvas.write("color_histogram.gif") exit rmagick-2.13.2/doc/ex/morph.rb0000644000004100000410000000101712147515547016111 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the morph method # Read 4 digit image files. Create an # animated morph sequence by inserting 8 # in-between images between each pair of digits. i = Magick::ImageList.new number = '0' 4.times do i.read "images/Button_" + number + ".gif" number.succ! end puts "This may take a few seconds..." morph = i.morph 8 morph.delay = 12 morph.iterations = 10000 # Display the resulting sequence as an animation. # morph.animate(12) morph.write "morph.gif" exit rmagick-2.13.2/doc/ex/vignette.rb0000644000004100000410000000043312147515547016612 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#vignette method. # Compare this example with the vignette.rb script in the examples directory. img = Magick::Image.read('images/Flower_Hat.jpg').first vignette = img.vignette vignette.write('vignette.jpg') exit rmagick-2.13.2/doc/ex/charcoal.rb0000644000004100000410000000031112147515547016534 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#charcoal method img = Magick::Image.read('images/Flower_Hat.jpg').first img = img.charcoal(0.75) img.write('charcoal.jpg') exit rmagick-2.13.2/doc/ex/affine.rb0000644000004100000410000000242412147515547016217 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the affine primitive. Transform the # coordinate space to put the origin in the lower # left corner. imgl = Magick::ImageList.new imgl.new_image 200, 200, Magick::HatchFill.new('white','lightcyan2') gc = Magick::Draw.new max_x = imgl.columns max_y = imgl.rows # Translate the y origin to the bottom of the window. # Invert the y points by scaling by -1. Combine the # two operations using the affine method. That is, the # affine method is equivalent to: # gc.translate 0, max_y # gc.scale 1, -1 gc.affine(1, 0, 0, -1, 0, max_y) gc.stroke('gray50') gc.fill('gray50') gc.stroke_width(1) # Draw up-pointing arrow. gc.polyline(10, 10, 10, max_y-10, 5, max_y-15, 15, max_y-15, 10, max_y-10) # Draw right-pointing arrow gc.polyline(10, 10, max_x-10, 10, max_x-15, 5, max_x-15, 15, max_x-10, 10) gc.draw(imgl) # Add labels. Use a different graphics context with a "normal" # coordinate system so the text isn't inverted. text_gc = Magick::Draw.new text_gc.pointsize(14) text_gc.font_weight(Magick::NormalWeight) text_gc.stroke('transparent') text_gc.text(15, max_y-15, "'0,0'") text_gc.text(max_x-20, max_y-16, "'+x'") text_gc.text(12, 15, "'+y'") text_gc.draw(imgl) imgl.border!(1, 1, "lightcyan2") imgl.write("affine.gif") rmagick-2.13.2/doc/ex/Use02.rb0000644000004100000410000000141512147515547015664 0ustar www-datawww-datarequire 'rvg/rvg' Magick::RVG.dpi = 90 rvg = Magick::RVG.new(10.cm, 3.5.cm).viewbox(0, 0, 100, 35) do |canvas| canvas.background_fill = 'white' canvas.desc = "Example Use02 - Chain 'styles' to 'use'" r = Magick::RVG::Group.new do |grp| grp.rect(60, 10).styles(:fill=>'yellow') end canvas.rect(99.6, 34.6, 0.1, 0.1).styles(:fill=>'none', :stroke=>'blue', :stroke_width=>0.2) # Since the rectangle specified the fill color the :fill style is ignored here. # However, since the rectangle did not specify a stroke color, the :stroke style # specified here is respected. canvas.use(r, 20, 5).styles(:fill=>'green', :stroke=>'red') canvas.use(r, 20, 20).styles(:fill=>'green', :stroke=>'blue') end rvg.draw.write('Use02.gif') rmagick-2.13.2/doc/ex/spread.rb0000644000004100000410000000027412147515547016246 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#spread method img = Magick::Image.read('images/Flower_Hat.jpg').first img = img.spread img.write('spread.jpg') exit rmagick-2.13.2/doc/ex/segment.rb0000644000004100000410000000034112147515547016425 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#segment method. img = Magick::Image.read('images/Flower_Hat.jpg').first img = img.segment(Magick::YUVColorspace, 0.4, 0.4) img.write('segment.jpg') exit rmagick-2.13.2/doc/ex/OrigCoordSys.rb0000644000004100000410000000111612147515547017352 0ustar www-datawww-datarequire 'rvg/rvg' rvg = Magick::RVG.new(400, 150) do |canvas| canvas.desc = "Example OrigCoordSys - Simple transformations: original picture" canvas.background_fill = 'white' canvas.g.styles(:fill=>'none', :stroke=>'black', :stroke_width=>3) do |grp| # Draw the axes of the original coordinate system grp.line(0, 1.5, 400, 1.5) grp.line(1.5, 0, 1.5, 150) end canvas.text(30, 30, 'ABC (orig coord system)').styles(:font_size=>20, :font_family=>'Verdana', :font_weight=>'normal', :font_style=>'normal') end rvg.draw.write('OrigCoordSys.gif') rmagick-2.13.2/doc/ex/transparent.rb0000644000004100000410000000210012147515547017317 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#transparent method. # Change all black pixels in the image to transparent. before = Magick::Image.new(200,200) { self.background_color = 'black' } circle = Magick::Draw.new circle.fill('transparent') circle.stroke('white') circle.stroke_width(8) circle.circle(100,100,180,100) circle.fill('transparent') circle.stroke('white') circle.circle( 60,100, 40,100) circle.circle(140,100,120,100) circle.circle(100, 60,100, 40) circle.circle(100,140,100,120) circle.draw(before) before.compression = Magick::LZWCompression before.write('transparent_before.gif') before.fuzz = 100 after = before.transparent('black', Magick::TransparentOpacity) # Different way of reading an image - start with an imagelist. # Use the plasma image as a background so we can see that # the black pixels have been made transparent. bg = Magick::ImageList.new bg.read('plasma:purple-gold') { self.size = '200x200' } after = bg.composite(after, Magick::CenterGravity, Magick::OverCompositeOp) after.write('transparent_after.gif') exit rmagick-2.13.2/doc/ex/roundrect.rb0000644000004100000410000000120212147515547016765 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' imgl = Magick::ImageList.new imgl.new_image(300, 200, Magick::HatchFill.new('white','LightCyan2')) gc = Magick::Draw.new gc.fill_opacity(0) gc.stroke('red') gc.stroke_width(3) # Draw rounded rectangle gc.roundrectangle(20,20, 280,180, 8, 8) gc.stroke('gray50') gc.stroke_width(1) gc.circle(20,20, 23,23) gc.circle(280,180, 283,183) # Annotate gc.font_weight(Magick::NormalWeight) gc.font_style(Magick::NormalStyle) gc.fill('black') gc.stroke('transparent') gc.text(30,35, "'20,20'") gc.text(230, 175, "'280,180'") gc.draw(imgl) imgl.border!(1,1, "lightcyan2") imgl.write("roundrect.gif") rmagick-2.13.2/doc/ex/circle01.rb0000644000004100000410000000100512147515547016363 0ustar www-datawww-datarequire 'rvg/rvg' Magick::RVG.dpi = 90 rvg = Magick::RVG.new(12.cm, 4.cm) do |canvas| canvas.viewbox(0, 0, 1200, 400) canvas.background_fill = 'white' canvas.desc = "Example circle01 - circle filled with red and stroked with blue" # Show outline of canvas using the 'rect' method canvas.rect(1195, 395, 1, 1).styles(:fill=>'none', :stroke=>'blue', :stroke_width=>2) canvas.circle(100, 600, 200).styles(:fill=>'red', :stroke=>'blue', :stroke_width=>10) end rvg.draw.write('circle01.gif') rmagick-2.13.2/doc/ex/solarize.rb0000644000004100000410000000031112147515547016610 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#solarize method img = Magick::Image.read('images/Flower_Hat.jpg').first img = img.solarize(127.5) img.write('solarize.jpg') exit rmagick-2.13.2/doc/ex/rvg_linejoin.rb0000644000004100000410000000311112147515547017446 0ustar www-datawww-datarequire 'rvg/rvg' Magick::RVG.dpi = 90 MITER = {:stroke=>'black', :stroke_width=>70, :fill=>'none', :stroke_linejoin=>'miter'} ROUND = {:stroke=>'black', :stroke_width=>70, :fill=>'none', :stroke_linejoin=>'round'} BEVEL = {:stroke=>'black', :stroke_width=>70, :fill=>'none', :stroke_linejoin=>'bevel'} THIN = {:stroke=>'#ffcccc', :stroke_width=>5, :fill=>'none'} TEXT = {:text_anchor=>'middle', :font_size=>50, :font_family=>'Verdana'} CIRCLE = {:fill=>'#ffcccc', :stroke=>'none'} rvg = Magick::RVG.new(12.cm, 3.5.cm).viewbox(0, 0, 1200, 350) do |canvas| canvas.desc = 'Example linecap - demonstrates three stroke-linecap values' canvas.background_fill = 'white' canvas.g.translate(200, 75) do |miter| miter.path("M -125,150 L 0,0 L 125,150").styles(MITER) miter.path("M -125,150 L 0,0 L 125,150").styles(THIN) miter.circle(8).styles(CIRCLE) miter.text(0, 230, "'miter' join").styles(TEXT) end canvas.g.translate(600, 75) do |round| round.path("M -125,150 L 0,0 L 125,150").styles(ROUND) round.path("M -125,150 L 0,0 L 125,150").styles(THIN) round.circle(8).styles(CIRCLE) round.text(0, 230, "'round' join").styles(TEXT) end canvas.g.translate(1000, 75) do |bevel| bevel.path("M -125,150 L 0,0 L 125,150").styles(BEVEL) bevel.path("M -125,150 L 0,0 L 125,150").styles(THIN) bevel.circle(8).styles(CIRCLE) bevel.text(0, 230, "'bevel' join").styles(TEXT) end canvas.rect(1192, 345, 1, 1).styles(:stroke=>'blue', :fill=>'none') end rvg.draw.write('rvg_linejoin.gif') rmagick-2.13.2/doc/ex/get_type_metrics.rb0000644000004100000410000000744412147515547020344 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Add a method for drawing braces. module Magick class Draw # (w,h) - width & height of rectangle enclosing brace. # Normally the brace is drawn with its opening to the # left and its lower point on the origin. # # Set w < 0 to draw right-opening brace. Set h < 0 to # position top point at origin. # # The placement & orientation is affected by the # current user coordinate system. def brace(w, h) raise(ArgumentError, "width must be != 0") unless w != 0 raise(ArgumentError, "height must be != 0") unless h != 0 path("M0,0 Q#{w},0 #{w/2.0},#{-h/4.0} T#{w},#{-h/2.0}" + "Q0,#{-h/2.0} #{w/2.0},#{-(3.0*h/4.0)} T0,#{-h}") end end # class Draw end Origin_x = 110 Origin_y = 230 Glyph = 'g' Face = RUBY_PLATFORM =~ /mswin/ ? "Verdana" : "Times" canvas = Magick::Image.new(410, 320, Magick::HatchFill.new('white', 'lightcyan2')) # Draw a big lowercase 'g' on the canvas. Leave room on all sides for # the labels. Use 'undercolor' to set off the glyph. glyph = Magick::Draw.new glyph.annotate(canvas, 0, 0, Origin_x, Origin_y, Glyph) do glyph.pointsize = 124 glyph.stroke = 'none' glyph.fill = 'black' glyph.font_family = Face glyph.undercolor = '#ffff00c0' end # Call get_type_metrics. This is what this example's all about. metrics = glyph.get_type_metrics(canvas, Glyph) gc = Magick::Draw.new gc.translate(Origin_x, Origin_y) # Draw the origin as a big red dot. gc.stroke('red') gc.fill('red') gc.circle(0, 0, 0, 2) # All our lines will be medium-gray, dashed, and thin. gc.stroke('gray50') gc.stroke_dasharray(5,2) gc.stroke_width(1) gc.fill('none') # baseline gc.line(-10, 0, metrics.width+20, 0) # a vertical line through the origin gc.line(0, -metrics.descent-metrics.height-10, 0, -metrics.descent+15) # descent gc.line(-10, -metrics.descent, metrics.width+20, -metrics.descent) # ascent gc.line(-10, -metrics.ascent, metrics.width+20, -metrics.ascent) # height gc.line(-10, -metrics.descent-metrics.height, metrics.width+10, -metrics.descent-metrics.height) # width gc.line(metrics.width, -metrics.descent-metrics.height-10, metrics.width, -metrics.descent+20) # max_advance gc.line(metrics.max_advance, -10, metrics.max_advance, -metrics.descent+20) gc.draw(canvas) # Draw the braces and labels. Position the braces by transforming the # user coordinate system with translate and rotate methods. gc = Magick::Draw.new gc.font_family('Face') gc.pointsize(13) gc.fill('none') gc.stroke('black') gc.stroke_width(1) gc.translate(Origin_x, Origin_y) # between origin and descent gc.push gc.translate(metrics.width+23, 0) gc.brace(10, metrics.descent) gc.pop # between origin and ascent gc.push gc.translate(metrics.width+23, 0) gc.brace(10, metrics.ascent) gc.pop # between origin and height gc.push gc.translate(-13, -metrics.descent-metrics.height) gc.rotate(180) gc.brace(10, metrics.height) gc.pop # between origin and width gc.push gc.translate(metrics.width, -metrics.descent-metrics.height-10-3) gc.rotate(-90) gc.brace(10, metrics.width) gc.pop # between origin and max_advance gc.push gc.translate(0, -metrics.descent+15) gc.rotate(90) gc.brace(10, metrics.max_advance) gc.pop # Add labels gc.font_weight(Magick::NormalWeight) gc.font_style(Magick::NormalStyle) gc.stroke('none') gc.fill('black') gc.text(metrics.width+40, -(metrics.ascent/2)+4, 'ascent') gc.text(metrics.width+40, -(metrics.descent/2)+4, 'descent') gc.text(-60, -metrics.descent-metrics.height/2+4, 'height') gc.text((metrics.width/2)-15, -metrics.descent-metrics.height-25, 'width') gc.text((metrics.max_advance)/2-38, -metrics.descent+35, "max_advance") gc.draw(canvas) canvas.border!(1,1,'blue') canvas.write('get_type_metrics.gif') rmagick-2.13.2/doc/ex/smile.rb0000644000004100000410000002007212147515547016077 0ustar www-datawww-data#! /usr/local/bin/ruby -w # RMagick version of ImageMagick's "smile.c" example program. require 'RMagick' include Magick SmileWidth = 48 SmileHeight = 48 SmileBits = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] img = Image.new(SmileWidth, SmileHeight) q = Array.new # Create an array of pixels one SmileWidth.times do # row long q << Magick::Pixel.new(0,0,0,0) end n = 0 SmileHeight.times do |y| # Store pixels a row at a time SmileWidth.times do |x| # Build a row of pixels q[x].red = QuantumRange * SmileBits[n] q[x].green = QuantumRange * SmileBits[n] q[x].blue = QuantumRange * SmileBits[n] n += 1 end # Store the row of pixels img.store_pixels(0, y, SmileWidth, 1, q) end # img.display # Now display the result img.write('smile.gif') exit rmagick-2.13.2/doc/ex/evenodd.rb0000644000004100000410000000440512147515547016414 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'rvg/rvg' Magick::RVG.dpi = 90 rvg = Magick::RVG.new(12.cm, 4.cm).viewbox(0, 0, 1200, 400) do |canvas| canvas.background_fill = 'white' canvas.desc = "Example fillrule - nonzero - demonstrates fill_rule=>'nonzero'" canvas.rect(1195, 393, 1, 1).styles(:fill=>'none', :stroke=>'blue') triangle = Magick::RVG::Group.new do |defs| defs.path("M 16,0 L -8,9 v-18 z").styles(:fill=>'black', :stroke=>'none') end canvas.g.styles(:clip_rule=>'evenodd', :fill=>'red', :stroke=>'black', :stroke_width=>3) do |grp| grp.path("M 250,75 L 323,301 131,161 369,161 177,301 z") grp.use(triangle).translate(306.21, 249).rotate(72) grp.use(triangle).translate(175.16,193.2).rotate(216) grp.use(triangle).translate(314.26,161).rotate(0) grp.use(triangle).translate(221.16,268.8).rotate(144) grp.use(triangle).translate(233.21,126.98).rotate(288) grp.path("M 600,81 A 107,107 0 0,1 600,295 A 107,107 0 0,1 600,81 z" + "M 600,139 A 49,49 0 0,1 600,237 A 49,49 0 0,1 600,139 z") grp.use(triangle).translate(600,188).rotate(0).translate(107,0).rotate(90) grp.use(triangle).translate(600,188).rotate(120).translate(107,0).rotate(90) grp.use(triangle).translate(600,188).rotate(240).translate(107,0).rotate(90) grp.use(triangle).translate(600,188).rotate(60).translate(49,0).rotate(90) grp.use(triangle).translate(600,188).rotate(180).translate(49,0).rotate(90) grp.use(triangle).translate(600,188).rotate(300).translate(49,0).rotate(90) grp.path("M 950,81 A 107,107 0 0,1 950,295 A 107,107 0 0,1 950,81 z" + "M 950,139 A 49,49 0 0,0 950,237 A 49,49 0 0,0 950,139 z") grp.use(triangle).translate(950,188).rotate(0).translate(107,0).rotate(90) grp.use(triangle).translate(950,188).rotate(120).translate(107,0).rotate(90) grp.use(triangle).translate(950,188).rotate(240).translate(107,0).rotate(90) grp.use(triangle).translate(950,188).rotate(60).translate(49,0).rotate(-90) grp.use(triangle).translate(950,188).rotate(180).translate(49,0).rotate(-90) grp.use(triangle).translate(950,188).rotate(300).translate(49,0).rotate(-90) end end rvg.draw.write('evenodd.gif') rmagick-2.13.2/doc/ex/gravity.rb0000644000004100000410000000401312147515547016450 0ustar www-datawww-data#! /usr/local/bin/ruby -w # # A RMagick version of Magick++/demo/gravity.cpp # require 'RMagick' x, y = 100, 100 begin pic = Magick::ImageList.new lines = Magick::Draw.new lines.stroke "#600" lines.fill_opacity 0 lines.line 300,100, 300,500 lines.line 100,300, 500,300 lines.rectangle 100,100, 500,500 draw = Magick::Draw.new draw.pointsize = 30 draw.fill = "#600" draw.undercolor = "red" 0.step(330, 30) { |angle| puts "angle #{angle}" pic.new_image(600, 600) { self.background_color = "white" } lines.draw pic draw.annotate(pic, 0,0,x,y, "NorthWest") { self.gravity = Magick::NorthWestGravity self.rotation = angle } draw.annotate(pic, 0,0,0,y, "North") { self.gravity = Magick::NorthGravity self.rotation = angle } draw.annotate(pic, 0,0,x,y, "NorthEast") { self.gravity = Magick::NorthEastGravity self.rotation = angle } draw.annotate(pic, 0,0,x,0, "East") { self.gravity = Magick::EastGravity self.rotation = angle } draw.annotate(pic, 0,0,0,0, "Center") { self.gravity = Magick::CenterGravity self.rotation = angle } draw.annotate(pic, 0,0,x,y, "SouthEast") { self.gravity = Magick::SouthEastGravity self.rotation = angle } draw.annotate(pic, 0,0,0,y, "South") { self.gravity = Magick::SouthGravity self.rotation = angle } draw.annotate(pic, 0,0,x,y, "SouthWest") { self.gravity = Magick::SouthWestGravity self.rotation = angle } draw.annotate(pic, 0,0,x,0, "West") { self.gravity = Magick::WestGravity self.rotation = angle } } puts "Writing image \"rm_gravity_out.miff\"..." pic.delay = 20 pic.write "./rm_gravity_out.miff" rescue puts "#{$!} exception raised." exit 1 end exit 0 rmagick-2.13.2/doc/ex/ViewBox.rb0000644000004100000410000000236112147515547016352 0ustar www-datawww-datarequire 'rvg/rvg' def example(cols, rows) rvg = Magick::RVG.new(cols, rows) do |canvas| canvas.background_fill = 'white' canvas.desc = <<-'END_DESC' Example ViewBox - uses the viewBox attribute to automatically create an initial user coordinate system which causes the graphic to scale to fit into the viewport no matter what size the viewport is. END_DESC canvas.viewbox(0, 0, 1500, 1000) canvas.preserve_aspect_ratio('none') # This rectangle goes from (0,0) to (1500,1000) in user space. # Because of the viewBox attribute above, # the rectangle will end up filling the entire area # reserved for the SVG content. canvas.rect(1500, 1000).styles(:fill=>'yellow',:stroke=>'blue',:stroke_width=>12) # A large, red triangle canvas.path("M 750,100 L 250,900 L 1250,900 z").styles(:fill=>'red') # A text string that spans most of the viewport canvas.text(100, 600, 'Stretch to fit').styles(:font_size=>200, :font_style=>'normal', :font_weight=>'normal', :font_family=>'Verdana') end return rvg.draw end example(300, 200).write('ViewBox_300x200.gif') example(150, 200).write('ViewBox_150x200.gif') rmagick-2.13.2/doc/ex/remap_images.rb0000644000004100000410000000105112147515547017413 0ustar www-datawww-datarequire 'RMagick' images = Magick::ImageList.new("images/Apple.miff", "images/Rocks_On_Beach.miff", "images/Leaf.miff") rose = Magick::Image.read("images/Yellow_Rose.miff").first rose[:Label] = "Remap Image" result = Magick::ImageList.new result += images result << rose begin result += images.copy.affinity(rose) montage = result.montage { self.tile = "4x2" } montage.alpha Magick::DeactivateAlphaChannel rescue NotImplementedError montage = Magick::Image.read("images/notimplemented.gif").first end montage.write("remap_images.jpg") rmagick-2.13.2/doc/ex/radial_blur.rb0000644000004100000410000000032512147515547017245 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#radial_blur method img = Magick::Image.read('images/Flower_Hat.jpg').first result = img.radial_blur(10.0) result.write('radial_blur.jpg') exit rmagick-2.13.2/doc/ex/sepiatone.rb0000644000004100000410000000027612147515547016761 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' img = Magick::Image.read('images/Flower_Hat.jpg').first sepiatone = img.sepiatone(Magick::QuantumRange * 0.8) sepiatone.write('sepiatone.jpg') rmagick-2.13.2/doc/ex/chop.rb0000644000004100000410000000140512147515547015716 0ustar www-datawww-data#!/usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#chop method img = Magick::Image.read('images/Flower_Hat.jpg')[0] # Chop the specified rectangle out of the img. chopped = img.chop(0, img.rows/2, img.columns/2, img.rows) # Make a "before" image by highlighting the chopped area. gc = Magick::Draw.new gc.fill('white') gc.stroke('transparent') gc.fill_opacity(0.25) gc.rectangle(0, img.rows/2, img.columns/2, img.rows) gc.draw(img) img.write('chop_before.jpg') # Create a image to use as a background for # the after image. Make the chopped image the # same size as before the chop. bg = Magick::Image.new(img.columns, img.rows) chopped = bg.composite(chopped, Magick::NorthEastGravity, Magick::OverCompositeOp) chopped.write('chop_after.jpg') exit rmagick-2.13.2/doc/ex/resize_to_fit.rb0000644000004100000410000000032412147515547017631 0ustar www-datawww-data#!/usr/local/bin/ruby -w require 'RMagick' # Demonstrate the crop_resize method img = Magick::Image.read('images/Flower_Hat.jpg')[0] thumbnail = img.resize_to_fit(76, 76) thumbnail.write("resize_to_fit.jpg") rmagick-2.13.2/doc/ex/rvg_stroke_dasharray.rb0000644000004100000410000000064312147515547021213 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'rvg/rvg' rvg = Magick::RVG.new(200, 100) do |canvas| canvas.background_fill = 'white' canvas.rect(150, 50, 25, 25).round(6). styles(:fill=>'none', :stroke=>'purple', :stroke_width=>10, :stroke_dasharray=>[10,5]) canvas.rect(199, 99).styles(:fill=>'none', :stroke=>'blue') end rvg.draw.write('rvg_stroke_dasharray.gif') rmagick-2.13.2/doc/ex/color_fill_to_border.rb0000644000004100000410000000132312147515547021147 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#color_fill_to_border method before = Magick::Image.new(200,200) { self.background_color = 'white' self.border_color = 'black' } before.border!(1,1,'black') circle = Magick::Draw.new circle.fill('transparent') circle.stroke('black') circle.stroke_width(2) circle.circle(100,100,180,100) circle.fill('plum1') circle.stroke('transparent') circle.circle( 60,100, 40,100) circle.circle(140,100,120,100) circle.circle(100, 60,100, 40) circle.circle(100,140,100,120) circle.draw(before) before.write('color_fill_to_border_before.gif') after = before.color_fill_to_border(100,100, 'aquamarine') after.write('color_fill_to_border_after.gif') exit rmagick-2.13.2/doc/ex/matte_floodfill.rb0000644000004100000410000000132312147515547020130 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' img = Magick::Image.new(200,200) img.compression = Magick::LZWCompression bg = Magick::Image.read('plasma:fractal') { self.size = '200x200' } bg[0].matte = false gc = Magick::Draw.new gc.stroke_width(2) gc.stroke('black') gc.fill('white') gc.roundrectangle(0, 0, 199, 199, 8, 8) gc.fill('yellow') gc.stroke('red') gc.circle(100, 100, 100, 25) gc.draw(img) img.write('matte_floodfill_before.gif') img.fuzz = 100 img = img.matte_floodfill(100, 100) # Composite the image over a nice bright background # so that the transparent pixels will be obvious. img = bg[0].composite(img, Magick::CenterGravity, Magick::OverCompositeOp) img.write('matte_floodfill_after.gif') exit rmagick-2.13.2/doc/ex/writing_mode01.rb0000644000004100000410000000141412147515547017615 0ustar www-datawww-datarequire 'rvg/rvg' Magick::RVG.dpi = 90 TEXT_STYLES = {:writing_mode=>'tb', :glyph_orientation_vertical=>0, :fill=>'red4', :font_weight=>'bold', :font_size=>16} TEXT_STYLES2 = {:writing_mode=>'tb', :glyph_orientation_vertical=>90, :fill=>'green', :font_weight=>'bold', :font_size=>16} rvg = Magick::RVG.new(1.25.in, 7.in).viewbox(0,0,125,700) do |canvas| canvas.background_fill = 'white' canvas.text(40, 15, ":glyph_orientation_vertical=0").styles(TEXT_STYLES) canvas.text(80, 25, ":glyph_orientation_vertical=90").styles(TEXT_STYLES2) canvas.rect(124, 698).styles(:fill=>'none',:stroke=>'blue') end rvg.draw.write('writing_mode01.gif') rmagick-2.13.2/doc/ex/dissolve.rb0000644000004100000410000000053012147515547016613 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' bgnd = Magick::Image.read('images/Violin.jpg').first overlay = Magick::Image.read('images/Flower_Hat.jpg').first # Make the violin image the same size as the hat image bgnd.resize_to_fill!(overlay.columns, overlay.rows) composited = bgnd.dissolve(overlay, 0.50) composited.write('dissolve.jpg') rmagick-2.13.2/doc/ex/pattern1.rb0000644000004100000410000000076312147515547016531 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' gc = Magick::Draw.new gc.pattern('triangles', 0, 0, 16, 16) { gc.fill('darkblue') gc.rectangle(0,0, 16,16) gc.fill('yellow') gc.stroke('red') gc.polygon(0,0, 8,16, 16,0, 0,0) } gc.stroke('triangles') gc.stroke_width(16) gc.fill('none') gc.ellipse(150, 75, 130, 60, 0, 360) img = Magick::Image.new(300, 150, Magick::HatchFill.new('white','lightcyan2',8)) gc.draw(img) img.border!(1,1, "lightcyan2") img.write('pattern1.gif') exit rmagick-2.13.2/doc/ex/stroke_linecap.rb0000644000004100000410000000174312147515547017774 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' imgl = Magick::ImageList.new imgl.new_image(615, 100) gc = Magick::Draw.new gc.stroke('black').stroke_width(30) # Draw thick line with "butt" linecap gc.stroke_linecap('butt') gc.line(25,50, 175,50) # Draw thick line with "round" linecap gc.stroke_linecap('round') gc.line(225,50, 375,50) # Draw thick line with "square" linecap gc.stroke_linecap('square') gc.line(425,50, 575,50) # Show line endpoints in pink gc.fill('lightpink') gc.stroke('lightpink').stroke_width(3) gc.line(25,50, 175,50) gc.circle(25,50, 27,52).circle(175,50,177,52) gc.line(225,50, 375,50) gc.circle(225,50, 227,52).circle(375,50,377,52) gc.line(425,50, 575, 50) gc.circle(425,50, 427,52).circle(575,50,577,52) # Annotate gc.fill('black') gc.stroke('transparent') gc.pointsize(14) gc.font_weight(Magick::BoldWeight) gc.text(55,90, "\"'butt' cap\"") gc.text(250,90, "\"'round' cap\"") gc.text(450,90, "\"'square' cap\"") gc.draw(imgl) imgl.write("stroke_linecap.gif") rmagick-2.13.2/doc/ex/skewy.rb0000644000004100000410000000200412147515547016123 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' imgl = Magick::ImageList.new imgl.new_image(250, 250, Magick::HatchFill.new('white','lightcyan2')) gc = Magick::Draw.new # Move the origin to the center. gc.translate(125, 125) max_x = imgl.columns/2 max_y = imgl.rows/2 # Skew y 30 degrees gc.skewy(30) # Draw down-pointing arrow gc.fill('gray50') gc.line(0, -max_y, 0, max_y) gc.line(0, max_y, 10, max_y-10) gc.line(0, max_y, -10, max_y-10) # Draw right-pointing arrow gc.stroke('red') gc.stroke_width(3) gc.line(-max_x+10, 0, max_x-10, 0) gc.line( max_x-10, 0, max_x-20, -10) gc.line( max_x-10, 0, max_x-20, 10) gc.draw(imgl) # Add labels gc = Magick::Draw.new gc.pointsize(14) gc.font_weight(Magick::NormalWeight) gc.font_style(Magick::NormalStyle) gc.stroke('transparent') gc.gravity(Magick::CenterGravity) gc.text(15, 0, "'0,0'") gc.gravity(Magick::EastGravity) gc.text(10, 0, "'+x'") gc.gravity(Magick::SouthGravity) gc.text(10, 20, "'+y'") gc.draw(imgl) imgl.border!(1,1, 'lightcyan2') imgl.write("skewy.gif") rmagick-2.13.2/doc/ex/level.rb0000644000004100000410000000040412147515547016072 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#level method before = Magick::Image.read('images/Flower_Hat.jpg').first # Brighten up the mid-tones a bit. after = before.level(0, Magick::QuantumRange, 1.50) after.write('level.jpg') exit rmagick-2.13.2/doc/ex/crop_with_gravity.rb0000644000004100000410000000246012147515547020532 0ustar www-datawww-data#! /usr/local/bin/ruby -w #=======================================================# # Thanks to Robert Wagner for the idea of allowing a # # GravityType instead of the x- and y-offset arguments! # #=======================================================# # Demo the use of the GravityType argument to Image#crop. require 'RMagick' include Magick shorts = Image.read('images/Shorts.jpg').first regwidth = shorts.columns/2 regheight = shorts.rows/2 mask = Image.new(regwidth, regheight) { self.background_color = 'white'} mask.opacity = 0.50 * TransparentOpacity black = Image.new(shorts.columns, shorts.rows) {self.background_color = 'black'} pairs = ImageList.new [NorthWestGravity, NorthGravity, NorthEastGravity, WestGravity, CenterGravity, EastGravity, SouthWestGravity, SouthGravity, SouthEastGravity].each do |gravity| pattern = shorts.composite(mask, gravity, OverCompositeOp) cropped = shorts.crop(gravity, regwidth, regheight) result = black.composite(cropped, gravity, OverCompositeOp) result.border_color = "white" pairs << pattern pairs << result end # Montage into a single image montage = pairs.montage { self.geometry = "#{pairs.columns}x#{pairs.rows}+0+0" self.tile = "6x3" self.border_width = 1 } montage.write('crop_with_gravity.miff') #montage.display rmagick-2.13.2/doc/ex/trim.rb0000644000004100000410000000113712147515547015742 0ustar www-datawww-datarequire 'RMagick' # Demonstrate the trim method # Read the Flower_Hat image and reduce it to 80% of its original size. img = Magick::Image.read('images/Flower_Hat.jpg').first cols = img.columns rows = img.rows img.resize!(0.80) # Add a gray border to bring it back up to size before = img.border((cols-img.columns)/2, (rows-img.rows)/2, '#999') # Trim away the gray border after = before.trim # Add a white border to bring it back up to size after.border!((cols-img.columns)/2, (rows-img.rows)/2, 'white') # Need GIF for tranparency before.write('trim_before.jpg') after.write('trim_after.jpg') exit rmagick-2.13.2/doc/ex/wet_floor.rb0000644000004100000410000000277612147515547017001 0ustar www-datawww-data#!/usr/bin/env ruby require 'RMagick' results = Magick::ImageList.new img = Magick::Image.new(270, 60) {self.background_color = "black" } gc = Magick::Draw.new gc.annotate(img, 0, 0, 0, -15, "RUBY!") do gc.fill = '#a00' gc.stroke = '#f00' gc.stroke_width = 2 gc.font_weight = Magick::BoldWeight gc.gravity = Magick::SouthGravity if RUBY_PLATFORM =~ /mswin32/ gc.font_family = "Georgia" gc.pointsize = 76 else gc.font_family = "times" gc.pointsize = 80 end end # Add a little bit of shading if Magick.const_defined? "HardLightCompositeOp" shade = img.shade(true, 310, 30) img.composite!(shade, Magick::CenterGravity, Magick::HardLightCompositeOp) end # Create the default reflection reflection = img.wet_floor ilist = Magick::ImageList.new ilist << img << reflection results << ilist.append(true) # Change the initial level of transparency and the rate of transition ilist[1] = img.wet_floor(0.25, 0.5) results << ilist.append(true) # Add a slant xform = Magick::AffineMatrix.new(1.0, 0.0, Math::PI/4.0, 1.0, 0.0, 0.0) ilist[1] = ilist[1].affine_transform(xform) results << ilist.append(true) # Add a ripple ilist[1] = ilist[1].rotate(90).wave(2, 10).rotate(-90) results << ilist.append(true) # Montage into a single demo image. Use a white background so # there won't be any problems with transparency in the browser. result = results.montage do self.geometry = '270x120' self.tile = '1x4' self.background_color = 'black' end result.write('wet_floor.gif') rmagick-2.13.2/doc/ex/composite_tiled.rb0000644000004100000410000000111612147515547020147 0ustar www-datawww-datarequire 'RMagick' # Create a transparent image to tile over the background image. wm = Magick::Image.read("xc:none") { self.size = "100x50" }.first # Draw "RMagick" in semi-transparent text on the transparent image. gc = Magick::Draw.new gc.fill '#ffffff7f' gc.font_weight Magick::BoldWeight gc.font_size 18 gc.rotate 15 gc.gravity Magick::CenterGravity gc.text 0, 0, "RMagick" gc.draw wm # Read the background image. img = Magick::Image.read("images/Flower_Hat.jpg").first # Composite the tile image over the background image. img.composite_tiled! wm img.write "composite_tiled.jpg" rmagick-2.13.2/doc/ex/implode.rb0000644000004100000410000000131112147515547016412 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' img = Magick::Image.read('images/Flower_Hat.jpg').first legend = Magick::Draw.new legend.stroke = 'transparent' legend.fill = 'white' legend.gravity = Magick::SouthGravity frames = Magick::ImageList.new implosion = 0.25 8.times { frames << img.implode(implosion) legend.annotate(frames, 0,0,10,20, sprintf("% 4.2f", implosion)) frames.matte = false implosion -= 0.10 } 7.times { implosion += 0.10 frames << img.implode(implosion) legend.annotate(frames, 0,0,10,20, sprintf("% 4.2f", implosion)) frames.matte = false } frames.delay = 10 frames.iterations = 0 puts "Producing animation..." frames.write("implode.gif") exit rmagick-2.13.2/doc/ex/blur_image.rb0000644000004100000410000000034712147515547017077 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#blur_image method img = Magick::Image.read('images/Flower_Hat.jpg').first # Make a blurry copy. img = img.blur_image(0.0,2.5) img.write('blur_image.jpg') exit rmagick-2.13.2/doc/ex/writing_mode02.rb0000644000004100000410000000142112147515547017614 0ustar www-datawww-datarequire 'rvg/rvg' Magick::RVG.dpi = 90 TEXT_STYLES = {:writing_mode=>'lr', :glyph_orientation_horizontal=>0, :fill=>'red4', :font_weight=>'bold', :font_size=>16} TEXT_STYLES2 = {:writing_mode=>'lr', :glyph_orientation_horizontal=>180, :fill=>'green', :font_weight=>'bold', :font_size=>16} rvg = Magick::RVG.new(3.in, 1.in).viewbox(0,0,300,100) do |canvas| canvas.background_fill = 'white' canvas.text(15, 40, ":glyph_orientation_horizontal=0").styles(TEXT_STYLES) canvas.text(15, 80, ":glyph_orientation_horizontal=180").styles(TEXT_STYLES2) canvas.rect(299, 99).styles(:fill=>'none',:stroke=>'blue') end rvg.draw.write('writing_mode02.gif') rmagick-2.13.2/doc/ex/polygon01.rb0000644000004100000410000000137512147515547016623 0ustar www-datawww-datarequire 'rvg/rvg' Magick::RVG.dpi = 90 rvg = Magick::RVG.new(12.cm, 4.cm).viewbox(0, 0, 1200, 400) do |canvas| canvas.background_fill = 'white' canvas.desc = "Example polygon01 - star and hexagon" # Show outline of canvas using the 'rect' method canvas.rect(1195, 395, 1, 1).styles(:fill=>'none', :stroke=>'blue', :stroke_width=>2) canvas.polygon(350,75,379,161,469,161,397,215, 423,301,350,250,277,301,303,215, 231,161,321,161).styles(:fill=>'red', :stroke=>'blue', :stroke_width=>10) canvas.polygon(850,75,958,137.5,958,262.5, 850,325,742,262.6,742,137.5). styles(:fill=>'lime', :stroke=>'blue', :stroke_width=>10) end rvg.draw.write('polygon01.gif') rmagick-2.13.2/doc/ex/arcpath.rb0000644000004100000410000000146612147515547016416 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the "path" drawing primitive. imgl = Magick::ImageList.new imgl.new_image(450, 200, Magick::HatchFill.new('white','lightcyan2')) gc = Magick::Draw.new # Draw "pie chart" gc.fill('red') gc.stroke('blue') gc.stroke_width(2) gc.path('M110,100 h-75 a75,75 0 1,0 75,-75 z') gc.fill('yellow') gc.path('M97.5,87.5 v-75 a75,75 0 0,0 -75,75 z') # Draw wiggly line gc.fill_opacity(0) gc.stroke('#00cd00') gc.stroke_width(3) gc.path('M200,175 l 25,-12.5 ' + 'a12.5,12.5 -15 0,1 25,-12.5 l 25,-12.5 ' + 'a12.5,25 -15 0,1 25,-12.5 l 25,-12.5 ' + 'a12.5,37.5 -15 0,1 25,-12.5 l 25,-12.5 ' + 'a12.5,50 -15 0,1 25,-12.5 l 25,-12.5') gc.draw imgl imgl.border!(1,1, "lightcyan2") imgl.write('arcpath.gif') rmagick-2.13.2/doc/ex/tspan03.rb0000644000004100000410000000110512147515547016252 0ustar www-datawww-datarequire 'rvg/rvg' Magick::RVG.dpi = 90 rvg = Magick::RVG.new(10.cm, 3.cm).viewbox(0,0,1000,300) do |canvas| canvas.background_fill = 'white' canvas.g.translate(100, 60) do |grp| grp.text.styles(:font_family=>'Verdana', :font_size=>45) do |txt| txt.tspan("Rotation") txt.tspan(" propogates").rotate(20).styles(:fill=>'red') do |tsp| tsp.tspan(" to descendents").styles(:fill=>'green') end end end canvas.rect(997, 297).styles(:fill=>'none', :stroke=>'blue') end rvg.draw.write('tspan03.gif') rmagick-2.13.2/doc/ex/bounding_box.rb0000644000004100000410000000231712147515547017445 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' img = Magick::Image.new(200,200) { self.background_color = "#ffffcc" } # Draw a blue circle. gc = Magick::Draw.new gc.stroke_width(5) gc.stroke("blue") gc.fill_opacity(0) gc.circle(100,100, 100,150) gc.draw(img) # Get the bounding box. Use the values to draw # a gray square surrounding the circle. Highlight # the corners with tiny red circles. bb = img.bounding_box gc = Magick::Draw.new gc.stroke("gray50") gc.fill_opacity(0) gc.rectangle(bb.x, bb.y, bb.x+bb.width, bb.y+bb.height) gc.stroke("red") gc.circle(bb.x, bb.y, bb.x+2, bb.y+2) gc.circle(bb.x+bb.width, bb.y, bb.x+bb.width+2, bb.y+2) gc.circle(bb.x, bb.y+bb.height, bb.x+2, bb.y+bb.height+2) gc.circle(bb.x+bb.width, bb.y+bb.height, bb.x+bb.width+2, bb.y+bb.height+2) gc.fill("black") gc.stroke("transparent") gc.font_weight(Magick::NormalWeight) gc.font_style(Magick::NormalStyle) gc.pointsize(9) gc.text(bb.x-15, bb.y-5, "\'#{bb.x},#{bb.y}\'") gc.text(bb.x+bb.width-15, bb.y-5, "\'#{bb.x+bb.width},#{bb.y}\'") gc.text(bb.x-15, bb.y+bb.height+15, "\'#{bb.x},#{bb.y+bb.height}\'") gc.text(bb.x+bb.width-15, bb.y+bb.height+15, "\'#{bb.x+bb.width},#{bb.y+bb.height}\'") gc.draw(img) img.write("bounding_box.gif") exit rmagick-2.13.2/doc/ex/matte_fill_to_border.rb0000644000004100000410000000172312147515547021147 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' img = Magick::Image.new(200,200) img.compression = Magick::LZWCompression bg = Magick::Image.read('plasma:fractal') { self.size = '200x200' } bg[0].matte = false gc = Magick::Draw.new gc.stroke_width(2) gc.stroke('black') gc.fill('white') gc.roundrectangle(0, 0, 199, 199, 8, 8) gc.fill('black') gc.circle(100, 45, 100, 25) gc.circle( 45, 100, 25, 100) gc.circle(100, 155, 100, 175) gc.circle(155, 100, 175, 100) gc.draw(img) img.write('matte_fill_to_border_before.gif') # Set the border color. Set the fuzz attribute so that # the matte fill will fill the aliased pixels around # the edges of the black circles. img.border_color = 'black' img.fuzz = 10 img = img.matte_fill_to_border(100, 100) # Composite the image over a nice bright background # so that the transparent pixels will be obvious. img = bg[0].composite(img, Magick::CenterGravity, Magick::OverCompositeOp) img.write('matte_fill_to_border_after.gif') exit rmagick-2.13.2/doc/ex/watermark.rb0000644000004100000410000000130212147515547016756 0ustar www-datawww-data#! /usr/local/bin/ruby -w require "RMagick" img = Magick::Image.read("images/Flower_Hat.jpg").first # Make a watermark from the word "RMagick" mark = Magick::Image.new(140, 40) {self.background_color = "none"} gc = Magick::Draw.new gc.annotate(mark, 0, 0, 0, -5, "RMagick") do gc.gravity = Magick::CenterGravity gc.pointsize = 32 if RUBY_PLATFORM =~ /mswin32/ gc.font_family = "Georgia" else gc.font_family = "Times" end gc.fill = "white" gc.stroke = "none" end mark = mark.wave(2.5, 70).rotate(-90) # Composite the watermark in the lower right (southeast) corner. img2 = img.watermark(mark, 0.25, 0, Magick::SouthEastGravity) img2.write("watermark.jpg") rmagick-2.13.2/doc/ex/stroke_linejoin.rb0000644000004100000410000000215612147515547020167 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' imgl = Magick::ImageList.new imgl.new_image(400, 150) { self.background_color = 'white' } gc = Magick::Draw.new gc.stroke('black').stroke_width(15) gc.fill_opacity(0) gc.stroke_linecap('butt') # Draw lines with miter join gc.stroke_linejoin('miter') gc.polyline(25,100, 75,25, 125,100) # Draw lines with round join gc.stroke_linejoin('round') gc.polyline(150,100, 200,25, 250,100) # Draw lines with bevel join gc.stroke_linejoin('bevel') gc.polyline(275,100, 325,25, 375,100) # Show line endpoints in pink gc.fill('lightpink').fill_opacity(0) gc.stroke('lightpink').stroke_width(2) gc.stroke_linejoin('miter') gc.polyline(25,100, 75,25, 125,100) gc.polyline(150,100, 200,25, 250,100) gc.polyline(275,100, 325,25, 375,100) gc.fill_opacity(1) gc.circle(75,25, 76,26) gc.circle(200,25, 201,26) gc.circle(325,25, 326,26) # Annotate gc.fill('black') gc.stroke('transparent') gc.pointsize(14) gc.font_weight(Magick::BoldWeight) gc.text(35,120, "\"'miter' join\"") gc.text(160,120, "\"'round' join\"") gc.text(280,120, "\"'bevel' join\"") gc.draw(imgl) imgl.write("stroke_linejoin.gif") rmagick-2.13.2/doc/ex/polyline01.rb0000644000004100000410000000141612147515547016763 0ustar www-datawww-datarequire 'rvg/rvg' Magick::RVG.dpi = 90 rvg = Magick::RVG.new(12.cm, 4.cm).viewbox(0, 0, 1200, 400) do |canvas| canvas.background_fill = 'white' canvas.desc = "Example polyline01 - increasingly larger bars" # Show outline of canvas using the 'rect' method canvas.rect(1195, 395, 1, 1).styles(:fill=>'none', :stroke=>'blue', :stroke_width=>2) canvas.polyline(50,375, 150,375,150,325,250,325,250,375, 350,375,350,250,450,250,450,375, 550,375,550,175,650,175,650,375, 750,375,750,100,850,100,850,375, 950,375,950,25,1050,25,1050,375, 1150,375).styles(:fill=>'none', :stroke=>'blue', :stroke_width=>10) end rvg.draw.write('polyline01.gif') rmagick-2.13.2/doc/ex/images/0000755000004100000410000000000012147515547015705 5ustar www-datawww-datarmagick-2.13.2/doc/ex/images/Yellow_Rose.miff0000644000004100000410000026057612147515547021033 0ustar www-datawww-dataid=ImageMagick version=1.0 class=DirectClass colors=0 matte=False columns=213 rows=141 depth=8 colorspace=RGB compression=None quality=100 units=PixelsPerInch resolution=300x300 page=213x141+0+0 orientation=TopLeft create-date={2008-08-30T19:26:11-04:00} exif:Flash={} jpeg:colorspace={2} jpeg:sampling-factor={1x1,1x1,1x1} modify-date={2008-08-30T19:25:19-04:00} xapMM:DerivedFrom={} :í í í íœ í› í› íœîîïžïžðŸ ðœòª$ûÎvûÒ~øÍuõÉmñÃcí¼Yé´Oå°Hã«Bߥ6Þ /Ýž+Üœ)Üœ'Û'Üž'Þ .Þ¤5ߦ:à§<à§<à¨<à©>á«Aâ¬Aâ«>ã­:å®9æ®7ç±7é²:ê³<ëµ>ìµ?î¶:î¶5ï¸7ñ¹<ñ¹<ò¸5óµ+ó± ò¬ñ¨ñ§ð©ïªïªïªï«ïªïªîªí©ì§ì¤ì¡êžêš é•è—æœæŸå¢#æ¤*æ¥/ç§1è§/è§/è¨/é©2é©4éª7ê¬8ë¬7ë­7ë¬4ëª/ë©/ì¨+ë¥$ì£ë ëžëéœé˜ é”çŒåäzãzäxãwávàußtÞsÞsÞsÞsÝqÜqÝrÝsÝsÝsÝrÝsÝsÝsÝtÞuÝvÝuÝuÜuÜuÛwÜwÜwÜxÜyÞzÞ|ß}à}á~ááá‚ã‹ä“ä™ääž åŸ!åŸ"åŸ"åž$ä %å¡&å %äŸ"äž"âž"á›á› áš ášßšà™àšá™à˜á—â˜ãšåçšã” áââ‘ á‘ á“ à“ á•â–â•â–ã–â–ã—ã˜ã—å˜ å— å–å” â—Ý—Ù’ÖŽÕŽÔŒÓŠÕ‹×ØÙ“Ú–Û—Ý™ݘݙݛ"Ýš Üš"îŸîžîž íœ í› í›ì›î›íœíœïïï›ô¶@üÔ€ùÑz÷ÌsôÈmïÁaë¹Væ³Mã¬Dà¨;Þ¤5Ý¡0Üž,Üž-Üž.Üž-ÛŸ+ÜŸ*Ý¡+ݤ2Þ¦7à§;á¨>à©=âª>â¬?ã¬<æ­;ç°=è³Aè´>ê´:ë´=í¶?í¶;ï·7ñ·3ñ¶/ò·.óµ*ò²!ò°ï¬ï«ï©ïªï«î¬í¬#ï­"ï­#î­'î¬$ï¬#î«"ì¨ë¤ë¡éœé—é”å™ åžæ æ¢!æ¦*æ©2çª6è«3è«3é¬4é«5ë«4ë«3ê¬5ë¬4ë­4ê¬5ê«2ëª/ì©.ë¦&ë£ë¡êŸëë›ê™è• çŽå~ãyäxâvávátßsàrßqßrßqÞpÛoÛnÝoÜpÛpÜpÜqÜpÜqÞrÝsÝtÝuÜvÜuÜtÝtÜuÝuÞxÞxÞyßyÞzß{à{â}à~áƒâã–ä›äž!å "å¡%å¡%å¡&äŸ$ã ãœ"â#ä#ââœ!á›"à™ߘߘߗߕߔޕߕޖޕߕà—â™äœæä— âáŽââ’ á“ â”á”â”â• ã–ã—ã˜â˜á˜á˜à—Þ–Û”Ù’ÖԌӉ ÒŠÒ‰Òˆ ÔŠÖ×ْٔۖۖܖݚݛ!Ý›!Ýœ"î í îŸí í› íœ íœîšï›î›ð›ðœïž øÃ[ûÔøÏwöÊqñÅjë½`ç¸Vä°Háª?Þ§8Ý£2ÝŸ-ÛŸ-Üž-Ûž-Úž-Ú*ÛŸ*Ü -Þ£0Þ¤3Þ§8á©=â©=á©=â­=ä¯Aæ±Dè´Cé´EéµBëµ;ê´9î¶;ð¹9ò·1ò³%ñ¯ñ¯ð®î¯"î¯$î¯%í°'î¯)ï­(î®$í­%í¯*î®,í¯*í¯+î®+î­*î«'ì¨ ê¢èžè™ è”ç’äšä æ¢è¥$èª-è«0é¬2ê­4é®4ê®8ë¯9ë¯7ê®4ê­3í¬0ë¬0ê¬2ê¬0ê«.ëª.ì§'ë¤ í¡ëžéêšé˜ ç”çŽå~ãvãuátàràqßqßpßoßpÞoÞnÜmÛmÜmÛnÛnÛoÛpÝpÜpÜpÜqÜrÝrÝsÝtÝtÞuÞuÞuàwßwàxàyàyßyázá{à„ã ã—ãšã"åŸ%ä %ä %äŸ%äŸ%ãž$â›!âš à™ á™ß™Þ—ޖޖޔݔݓݓݒݑݑ ޓޔݔޓߓ à’â• æœæœå”âŽââ‘ââ’á•à–ߘݘÜ—Ú•Ú”Ù‘×Õ ÓŠ ÓŠ ÔŠшÐ…Ñ…Ò† Ò‡ÔŠ Ö ×Ø’ٓڕݗܚܛ!Ü›!Ýœ"ÝŸ%î¡ì¡ì íž îííœíœíœïœïœîœï£úËsúÔ‚øÏwôÉmîÁ_êºVæ´Qã¬Bá¨9ߥ3Ý¡.Ý /ÛŸ.Ù›*Û,Úž,Û)ÜŸ,Ü£1Þ¥5Þ¦7ߨ:â«@â«>â«;ä¯Bå±Gæ±Cè´Aé´?ë´<í¶9î¶6ñ´-ò²%ð®ï¬ï¬ï­í°)í².í²/í±/î²1í±2í¯0í¯-í¯*í¯+ì®.ì­.ì¬-ì­-ì¬+ì«*ì§"ê¡é›è—è’ç‘ä›ä¡ç¤!è¨'è¬/ê­/ê®1ê¯6ê¯9ë°9ì¯<ì°9ë±5ì®4í­1ì­/ì¬,ì«+ìª&ì©'ì§&ë¤ìŸì ë› êš é˜ é•èå~âsâsáqàpßpßoÞoÞnÞnÜnÜmÜlÜlÛkÛmÛmÛmÜmÛnÜnÛoÜpÜpÛpÝqÝrÝsÝuÝvÞvßvßwßwàxàyázáyáãã˜äœãä"ä$ã#ã#â#âœ!á›!áš à™á˜à—ޖޓݓݓݑÜÜÛÛÜÜ Ü Ý Ý ÝÞ ÞÞ‘ã• ç é¡ã–àŒáâ” Þ” Û’× Ö ÕŒ Ò‹ ÒŠ Ó‰ ÓˆÒ†цÐ…цш ІЄЄчÓˆ Õ‹Öר‘ٓەݗݚܚܚݛ!Ü"îŸí¡íŸ ížîžîîœîîï›í›î›ó³7úÑ}ùÑ€÷ÍvòÇhí¼Yè·Pä±Iâª=á¦4ߣ1Ý¡0Ý /Ûž*Úœ)Û,ÜŸ-Ü ,Û¢/ݤ5ߦ8Þ§7ß©:á«?â­Bä­?å¯Aæ²Dè³Cé³@ë´:íµ7ð¶4ð±$ï«îªí¬í®"ì¯&î°)í±.í²1í²3í³6í³6í±3í±4ì°1ì¯0ì­-ì¬-ì«-ë©,ì©,ìª*ë¨&ê£êŸè™ æ”è‘æ“俢é¥!éª,é­3ê¯3ë°4ë°5ì±7ì±8ì°9ì°9ì°7ì¯4ì¯1í­0í¬,íª)î©'ì©&ë¦ ë¢ìŸì ì› êš è—è•éå}áqáqàpßoßnÞmÞmÞlÝmÜmÛkÜkÛjÚjÚkÛlÛlÛlÛlÛlÜmÜnÛnÛoÜoÝpÝqÝrÝtÞtÞußvàwàwàxàxá|äŽã—ã›ä"äž$ä#âœ!áš!àš àš à˜à˜ß—à–à—ߕޔݒݑÜÛŽ Ü ÛŒ ÚŒ Û‹ ÜŒ ڋییۋÜÞÞŽÞà“ã–è› é¡ä— á–Ý“ ׋ÖˆÔ†Ó„Ó…Ò…Ò…Ò…Ò…уÏ‚΂σÐ…Є ЃÑ…Ò‡ Ó‰ Õ‹ Ö××ٔܕܖܗەܖۙۛï î  íŸížîžïžïîîîœí›ô¯)úÇ]ùÑyøÐwõÌpñÄeëºVè´Mä¬>â¨8á¤2Þ¢2Ü¡1ÛŸ-ÛŸ*Üž,ÛŸ.Û .Ü¢1Ý£2Þ¥8ߨ<à¨:âª;â¬Aä¯Fæ±Hå±Bæ²?è²Aé²;ìµ7ïµ0ð¯í©ì©ì­$ì¯)ë¯.ì°/í²3ì²3í²3ì±4ì°6ì³9í²6í±3ì°2ë®1ì«-ìª*ëª(ë¨)ê¦%é¥"é£èŸçš æ”ç‘çæ— æŸç£é¦!è¬,é®1ë°6ì²8ì±7í²8í±:ì±:í±:í±;í±8í°5í®3í®0í¬.îª*í©$ì¦ ì¢ì¡êëš é™ é–é”èå~ápàoànßnàmÞlÞkÝkÜkÛjÛjÛiÙiÙhÚgÚiÛiÚjÛkÛjÛjÛlÛlÜmÜnÜoÜpÝpÝrÞsßtÞußuàuàvàwâ„å• äš㜠âœ#ã$ã"á›!â™ à™ߘß—à–ߔޔޒݒÝÜ ÜŒ ÜŒ Ú‹Û‹ Ú‹ ډڇۇډډڈۉ܋܊݋ݎàâ䓿š ãšÜ’׋Ô†ÓƒÓÒӃ҂ттЃÏ‚Î΀ÏÏ΂σÑ„цÒˆ Ô‹Õ Ö ØÚ”Ú”Û•Û•Ú”Û•Û–Ü™ï î  îŸížî ïžîžïžîîŸ õµ8üÆYûËhúÑxøÏqõÊjñÃaê¸Qæ±Fã¬=ã¨7ߣ1Ý¡.Ûž+Ú,Úž-Ü 0Û 0Û .Ü£1Ý¥5Þ¦9Þ©<á©:âª;á­=ã¯Bæ±Fç³Dè³<é±;ë²8í³0î­ì§ëª"ë¬(ê­+ë°0ë¯3ì¯3ë±4í²9í²8ë±3ë¯2ë°5ì²6í°3ë®/ì­.ì«.ë©)ê§"é¥ è¢çŸçç˜æ”å‘æææ™ æ è¥ è¨)è¬/é®3ê¯:ê±;ì±;í²<ì³=í²:í²7í³9î²:î²9ì°5í¬-ì«*í«*îª(ì§#ì¢ë¡ëžëšê™ é—é“éä~àmàlÞmÞkÞjÝiÜhÜhÛgÛgÚfÛfÙeÙeÚeÚfÚgÚfÛgÚhÚhÚiÛiÚjÜmÜmÜnÝnÞoÞqÞrÞsÞtÞvßuàzãŽã–ãœã#ãœ"á›"á› áš ášá˜ß—Þ•Þ”Þ’Þ‘ÝŽÝ݋܋ۉۉۊډو؈؆؅ن؆ׅنهڈۊ܋ތáŽã‘ã•à”ÜŽ׈҃рÑ}Ñ~Ó€ÒÑ€ÑЀÐÐÏÎÎÎ̂ς҄Ӆԉ ÔŒ ÕŒ ØÙٓړۑړەݙܚ"îŸï  îžíîžîžïŸ ïžïŸ ôµ6ûÈ]úÉ_úÍnúÑx÷ÍpôÈhïÀ\é´Hä«<â©:à£3Üž-Ûœ&Úš$Ø›)Ù-Ú-ÚŸ/ÛŸ-Ü .Ý£2ݦ6à©;â©9âª;â­=ä¯Aæ²Cè´Eêµ@ë´:í²0ï­ì¦ê¨è¬)é®0ê­1ê¯3ë°5ë°6ê°6ì±;ë²;ë±5ë°1ê®2ë®5ê°4ë¬,ë«*ëª+ë§&é¥"ç¢èç›æ˜ å“æçæŒç“æžè£é§$è«-é­2é°9é±>ê±>ë±<ì²=ì³?î³:î´6ï³6ï³7î²8î°4î­+ì«,íª*íª'ì§!ì£ì¡ëžêš ëš ê™ è•è‘åßlßjÝjÝhÜgÛgÚfÚeÚeÚdÙdÙcÙcÙcÙbÙcÙdÙdÚdØeÚeÚgÚgÚhÛjÛkÜlÝnÞoÞoÞqÞrÞtÞußuâä’ â—ã› ãœ#✠á™à—à™á™à˜ß”Þ’Þ’Þ‘ÝÜŒ ÜŠ ÛˆÚ‡Ú‡Ú†Ú†؆؆Ø„׃׃ׂØØ‚؄؅ڈۈۈ݋àäã’Þ‘ÚÖ‡ÒƒЀÑ}Ñ|Ò|Ò}Ò~Ò~Ð}Ñ~ÐÐÏ΀ÏÏÏ€ÑÓƒÔ†Õ‰׌×ÙÚ“Ú”Ú”Û–Ü—Û˜Ú™í î î íŸíŸîžîîŸ õµ6ûÇXüÉ[üÊbúÎrúÏoöËjñÃaì»Rç°=ã¨3á¦3ÝŸ+Ûœ&Û™"Ø–×—!ؘ&ך'Ø›)Ù,Ûž+ÜŸ+Þ¤1à§7âª;â«:ã­<æ®;ç°;é³=ì³;í´6ï®ì§ê©!ê­*ê­+ë¯0ë±3ë°4ê°5ê°6ë¯8ê°8ê°8ë±7ê¯1é¬+éª,é«/ê«*ê¨#ê§%é¥#è¢ ç çœç™ å”呿æŒåæ™ è¢é§$é«,ê­2ë¯5ê±;ê³@ê±>ì²>í±:í²<î³:í²5ï³5ï±5î²5î°3ï®0î®0í¬-í©%ì§ì¤ì¡ëžë› ëšé˜ è“è‘ä€ÞjÝgÜfÚeÛdÚdÙcÙcØb×bØb×a×`Ö_Ö`×a×a×a×cØcÙdÙeÚdÚcÚbÙdÙeÚfÛhÜjÝmÝoÞqÞrÞsá†á‘ â”â—ã™â™â™à—ß–à•à”ß‘ߎ Ý Ý Ý‹ Ý‹ ܉ۈمم؄ڃل؂×××€××~ØÖ‚׃Ú„Ú…܈ÝŠà‹ãŒâŽÞÛŠÖ„ÓÓÒ}Ñ}Ò|Ð|Ò|Ò|Ñ}Ò~ÐÐ~Ð~ÏЀÏÐ҂ԃԆֈ،٠ړٔٔڕەۗژژí¡í íŸ î  íŸîîŸ ô·<úÊbûÊaüÉ[ûËfüÐtúÎlõÈfñÁ]ë·Käª5â¦1à£.Üž&Ú›#Ù˜!Ø— Ø—ו×– ט"×™#Ùœ&ÛŸ)Þ¢0á¥4â©7ãª7ä¬6ç®5é¯3ë±5í±.î¬í§é¨"è«+è¬-é­-ê¯/ê±6ê±8ê¯4é®3è­2è­4é®5ê­2è¬0éª)è¨$è§%é¦#é¥ é¤è£ç çžçšå•ä‘ååæŠåç è§"é«,é­2ë°9ë²;ë³=ì´>ì³<í³>í³:í´:î³:í²6î²5î±2í±0î°0î¯2î®0ï¬-í©%ì§í£ì ëžëœêš é–è“é’åÜhÚbÙbØaØ`×_×^×^Ö^×^Ö^Ö^Ö\Ö[Ö\Õ]Õ^Ö^Ö_Õ]Õ]ØaØgÜq Þ{à†ãŒ"ä$æ”'è™+ê 0ê¤5ë¦9ë¥5ë£1ê¦0è¥.å )㜠ã™á–ß”à’à’à‘àŽ Þ݋݋ދ܉܉Ú‡Ú†Ù…Ú„ÚƒÙـ؀×Ö~Ö~×~×~ØØ€ØÚ‚Û„ڇ܈ވá‹àŒ݉Ú†ÙƒÕÓÒ}Ó~Ó}Ñ{Ô{Ô~ÓÒ~Ñ}Ñ}Ñ}ÑÐ~Ð~ÑӄԆֈ؋ێۑܓړڒړړڕږژï îŸ íŸ íŸ îí õ¹CûËdûËeûÊbúÇXùËgúÐu÷ËióÅbî½Wç±Bã¨4â¥4Þ¡,Ü&Ûš#ؘٖٗؖؖؗÙ™Ù›!Û%Ý¢,à¥1â¨3ä«4æ­1é®0ê¯,í®%ï¬î©ì¬"ë®-é®0è­/è¬.è¬.ç¬3è®8ê¯4é­2ç«0æª1è¬3è«.éª,é©*é§$é¥ç£ç£ç¢æ æå™å•å‘äŽå‹æŒåŠæ™é©'é­.ë¯4ë±6ì²>ë´Bê³Cì´Aìµ?íµAî´;í³8í³8í³5î±6î±4í°1î°.í°0ï®1î¬+íª%ì¨#ì¥í¡ìŸëêš é–é”è’å‚ÜfØ_×^×]×\Ö[Ö[Ö[ÖZÖZÖ[Õ[Ö[Ö[Ö[ÖYÓWÓY×eÜvá.ç Aë°Oï»\ï¾\ñÁ^óÃ_òÄ_óÅ]óÄ[óÃXóÃWôÂ]óÂ]ñÂ]óÁ\òÀ[ñ½Xð¹QîµIê¯=æ¦.â™ß ߌßÞތ܊݉܇Ú†Û…Û…Û„Ú‚ÙÙØØ×~×}×~×~×~ØØÙÚ‚Û„Ú„Û„݆à‰ߊ܇كقՀÓ~Ó}Ó}Ó~Ó|Ó}Ô~Ô€Ò~Ò~Ò~Ñ}Ò~Ò~ÒÒ€Ô„Ö†؉ÚŒ ۑەܔܒڒؒٔڕڕڗí¡í î íží  õ¸>ýË`ýÊ^ýÉ[üÈVúÆQúÉeøÌlõÇaòÁYì¸Mæ°@â¨5à¢0Ýž*Û›$Ú™"٘ؖٗ٘ڙ!Ûš#Ú›!Ü› Ü"Ý 'à¤)â¦-æ«0é­+ì­$î­î¬î®$í²-í³2ì³3ì³4ê°5é®1è¬.æ¨,ç©/è­0èª-æ¨,å¨.ç©/ç©-é¨,é¨+é¦$飿¡æ¡æŸæœå˜ ä“ããŽã‹äŠå‰åè¢è¬0ê¯7ë²:ì´>ìµAì´DìµGì¶FìµEí¶Díµ@î³<í³;î²7î±4î²4í°3í±2í°/î®0í«+í©&ì¨#ì¦"ì£ì¡ëëš é˜ é•鑿…Úf×]×\Ö[ÖZÖYÕXÕXÖWÕXÕYÔXÔUÓTÓUÖe Ü€%å›Bë°YðÀiñÆoñÇnñÈlñÆjïÄfïÂ`ðÁ`ñÁ^ð¿Yð¿Xð¿Xð¾Tð¼Tð¼Uï¼Uð½Uñ½Uð½Tð¾Vð¾Vñ¿Yñ¿Yî»Sê°Bäœ"ß Þ‰ÝŠ݈݆܅Ü„Ü„ÚƒÚ‚Ù€ØØØ~Ø~Ø~Ù~Ø~Ø~ØØ€Ù€ÚÛ‚ÛƒÛ„Ú„Ü…߇Þ…Û‚Ú×Õ~Ó}Ó}Ó~Ó}Ó}Ò|Ô~Ô€Ò~Ô€Ó€Ò€Ó€Ó‚Ô‚Õƒ׆ÙˆÚ‹ÛŽÛڑےڑؑؒڔەܖܙî¢î¡ îŸî¡ õ¶8üÉYýÉUüÈRûÇSûÅSúÄRúÊdøÉdôÄ^ð¾TêµGç¯>á§6Þ¡.Û&Ú™!ؘ٘ٗÙ™ Øš"Ú›$Ûœ%Û#Üž$Þž#ß &á¤'ä¦(é«)í¬!í«í¯%í²1ì³6ë³7ë´7ì²4ë²4ì²6ë°4é®2èª-æ§+æ§,æ¨)æ¦#å¤#å¤%æ§*æ¦'è¥%è¤"è¢æŸçæœå— ã’ããŽâ‹ãŠä‰ä‡å” æ¦%é¬1ê±8ë³;í´>íµ@íµ>íµ?í¶CìµEìµCí¶Cíµ?î³>í±5ì±4í±5í±4î°2í¯*í«'îª&ì©#ì¨ ì¦ ì¢ì¡ëžë› ê™ é–ê“ç†Ûf×ZÖYÕXÔWÔVÓUÔVÔWÓUÑPÒRÔ_Ùwã˜=í»dðÇtðËvïÈtïÆqïÅlïÅkïÅkîÅkîÄiïÀ_îÀ]ï¾\ï½Wî½Vî¼XîºTí¸Mì¸Jí¸MíºOï»Rî¼QîºOî»Oí¼Wí½Yí½Yî¿_î½[ì¯Aãš܉܃݃݃Ü‚ÛــØÙ~Ù~Ù~Ú~ÙØ~ÙÙÙــÙÚڃڂڃ܅݆܄ÚÙ€×~Ö|Õ|Ó|Ô~Ô}Ó~Ó}Ô~Ô€Ó€ÔÔÔ‚ÕƒÕ…Ö†Ö†؈ڌ܎ÜÜ‘ ÛÜ‘ÙØÙ“Ü–Û•ݘÝšï¡ ï¢ î¡ ôµ7ýÉ]ýÉ]üÈWûÇUûÇYúÆXøÄTùÊcøÊcôÃ[ï¼Pê´Eç­:á¦0ÞŸ&Û› ژٗٗ٘ Ú™"Ûš$Üœ&Üž'ÝŸ#ß 'á¡&â£'ä§%è§ë©í®#í².ì³4ì´:ëµ=ê³:ê±6ë°4é¯4é®2é­1ç®1è¬,ç©)æ¦*å§)ç¤"å äžä  å¢ æ¢ æ¡å çç™å• ã’âŽáŒâ‹ã‰ä‰äˆäˆæšéª(ê°3ë³:íµ=ìµ@í´@íµ<ì´:ìµ<í´?í´?ì´>ë²9í²9ì±5í±4í°3í¯2î¯-ì­)í«(î©"í§í¦ì¤í¡ì¡ëžìœëš é˜ ê“ç…ÛdÕVÓVÓUÒTÒSÒUÓRÐOÓ^Û|$ä™Cì¸aïÅoñÊpïÇoîÅoíÄkïÅoîÅrïÅlïÅhîÃfîÃdíÂfí¾^ì»UîºTí¹Së¶Oë¶Pë·QêµLê³Eé³FêµGëµJê¶Iê¶Jë·Lë·Oê¸Qì¹RëºXë¼Yí½Xî¼Vê¯Câ–܄܀ÝÜÛÛÚ~Ù}Ù}Ù}Ù~ÙÚÚØÙ€Ø~ÙÙ€ØÙ€Ù€Ú‚ÚƒÛƒ܃Ù×Ö~Õ|Õ{Õ|Ö}Ö~Ô~ÔÔÔ€Ô‚Õ‚Õ‚Õ„Ö„Ö…ׇ׈ÙŠÝÝ‘ Ý“ Þ’ Ý’ Û’Û’Ù“Û•Ü–ܘݚܛ ï¢ î¡ ò´5üÊ_üËaüÉ_ûÉ[úÇWúÆXøÅW÷ÃSùÈ`÷É`óÁTï»Kê³?åª5â¤*Þ"ۙٗٗٗٗڙ Ûš!Ú›!Üž#ß $â¡$㢠å£é¥ìªì°-í³7íµ;ì´;é´?é´Aé±<é®4è¬1è¬0è¬1ç«/ç«-ç©-è¨+ç§)æ¥&å¢ åŸâ›ãšã›ãœäžæžå›æ• ã‘ââ‹á‰â‰ãˆãˆä†åŠè ê¬*ë±4ì´<í¶?ì¶Bì¶BëµAìµ?í´?ì´<î³<í²:ì±6í±6í±6í°4ì±1í¯0í®+ì­,í¬-í©%í§!ì¤ì£í¢ì ëŸìëšê˜ é“ç†ÛfÓSÓSÑQÒQÒRÐNÏU݈2ì¸bðÈsðËxïÇsîÃjîÁcîÃfíÃhíÂhíÂgíÁhîÁeîÁdíÁcí¿_ê½ZëºWë·PéµKéµNè³Lè°Gç°Gæ°Eè¯@è®;ç°Bæ±Dç¯Bç±Hæ±Iç²Gè²Gé´Kè´Nê·Oì¸Qì¹Tî»Wí¼Vê®@á‘Û}Ü}Û~Û~Ú}Ù}Ú~Û~Û~Ú~Ù~Ú~Ú}Ù|Ø~Ù~Ù~Ù}Ù}Ù~Ù€Ú‚Û‚Û‚ÙØ×~Ö|Õ{Õ|×~×~ÕÖՀՀՀւփׅ׆׆Ù‡ÚŠÛÝ Ý’ ݔݔݓ Û“ Û“Ü”Ü—Þ˜Þ™Þ™Ý™í  ò®+üÉZýÌ_ûË_üÉ]úÈYøÄU÷ÄVöÂTõÀQùÈ_öÇ\ò¿Rî¹Hê±;ç©/á $Þš ܙۗژٗٗڙښܛ Þ"à #ä¡!å¡è¤í¬#í²2ì´9ë³<ê³=é²:è±;æ¯;ç¯;ç¬5ç«.æ«,æ©-å¨.å¨,å¨,æ¥*ç¥&æ£ å¡å ä›á˜â– â– â˜ã™ä– ä’âŽá‹â‰âˆâˆâ†â‡ã…åŽé¥ ê®/í²5í´<ìµAëµBë·Bë¶Cëµ?ì´?ì´<î³9í²9ì±8ì±8ì±4ì°2ì¯/ì°.í®(î¬)í«-ì©"ì§ ì¤ì¢ì¡ëŸëŸëžëšê™ é”è‰ÝjÒQÒPÐOÑPÏJÔeè¬VðÊ{îÇwíÄsëÄpìÃlìÁgì¿aì¿aë¾cë¿bì¿`ë¾`ê¾_ê½^ë¾_ê¼]ê¹Té¶Oé´Kå¯Aã¬Aä­Dåª>åª<äª<ã¦4ä¥1åª;ä«>ä¬?å®Bå­@ä¬>ä¯Aå°Dæ°Fæ±Gè³JéµMê¶Lì¹Rî½XïºLäž$Û€Û{Ü}Û~Ú~Û~ÚÛÚ|Ú{Ù{Ù{Ù{Ù{Ù|Ù}Ø}Ù}Ù}ÚÚÚÚÙ€Ø×~×|Õ|Ö}Ö~ÖÖÖ‚ׂÖƒÖ‚׃ׄ؆؇و܊ÝÝÝ‘ Ý’ Ü“ ܔܔܓܓܕޗݙݚۙۖïª%ûÇZþÎeüÌ_ûÉZúÇUøÄNöÁKöÂQõÁTôÀNùÇ]øÆ\ó¿Pî¹Gë±;å¦-á &ßœ"Ý› Üš Ûš"ۘۘݚݚݜ àž"ä¡ æ¡è¤í°+î´7ë³8ë²7ê°5ç®6ç¬5æ«5å¬6äª5æ©4æ©.å¨,å¦'ä¥(å¥*å¥'ä£&ä¢!å¡åŸäžã›á— á•á• à“â’ ä’ãá‹àˆá‡á†á†â„â…ãƒå‘ê«.ë³:íµ9íµ=íµ@ìµ@ë¶Cê¶BëµAì´@ì´;í´8ì²5ì²6ì²9ì²5í¯0í®0ì¯/î­*í¬)ìª)ì¨"í¦ì£ë¡ì¡ë ëŸëžëšê™ é•é‹ànÑPÐMÐOÎHÖlì½iïÈuëÀoêÀpêÀoéÀlé¿hé»bè¹ZéºXèº[éºZéºYé»\èº^è¹Xè¸Uè¸Vé¸Rè´Må®Cã«<ãª;ã¦8â¦5ä¦7â¤4à¢1ß +á¤3â§<â©<â©9ä¨8ä¨7ã©9ã©;ãª<ä¬@å®Bæ¯Cè²EéµJì¸LíºKî½Pé«8݆ Û{ÜÛ}Û|Ù|Ú|Ú{ÚzÚzÙzÙzÙ{ÙzÙ{Ù|Ù|Ù|Ú~Ù€Û€ÚÙ~Ø}Ø~×~Ö}×~×~Ö×€×€ׂׂ׃؄؄نÙ‡ÛŠÝŒÜÝ Þ‘ Ý’ Þ’ ܓܔݔܖܗޘݙܙۗۖúÆYþÏjýÍfûË`úÇVùÂKø¿B÷¾C÷ÀMö¾Kô½GøÈZ÷Ç[óÁPî¸Bê®9æ¨3â£+àŸ%Þ"Üœ"Ü›$ۙܚ ܛݛßáŸåŸé¤ï³4î¸Aí¶?ì´<ë±8é­2æª0å¨0ã¦.ã§0ä§/ã¥,ã¥*ä¤*ã£$â¢#ã¡'å£$ä¢#ä¡ åŸããœâ™á• à’ ß ßŽàŽàŽáŒã‰á†á†á…á„áƒâƒãå ë¯5ì´>í¶=î·@í·Bë¶Bë¶Bë¶?êµCêµEìµ@ì³;î³9ì²8ì±6ì±5î¯2î®0í­/ì­)í¬(ì©#ì¦í¤ì¡ë ìžìžì ìŸìœëš ê•éàsÐOÏKÎGÒbë¼gëÂoé»eé¼gè»fç»fçºcç¹aæ¶Zæ³QèµRç¶Sç´PçµPç¶Tç¶XæµSæ³Mæ³Mç³Næ±Hã¬@â§7à£/à¢1à¢3à¡0à¡/ß¡0Ýž)ß¡/à¦9ߦ8á¦7á¦7á¦3â¤2â¦6â¨7ä©7ã¨6å©:æ¬;ç°Bê´Fì¶HíºNï¾Uë²Fß‹ÚyÚ{ÛzÛxÙyÙyÚzÚyÙyÙyÙyÙxÙzÙyÙyÙ{Ú}Ù}Û~ÛÙ}Ù|Ø~×}×}××~×~ØØÖ׃؄؄منڈ܋݋ݎܑ Ý Þ’ Ý’ Ü“ ܓݔܕݗݗܖۖەەþÎiýÏjüÍfùÉ]ùÄR÷¿G÷½@÷½?÷¼Cõº>ôº@ùÇYøÈ]ôÁRí¸Fé°=çª4â¤+ßž$Ý"Üœ!Û› ۘݙݙޚáãžè£ï´7ïºFì·Dì´@ì²<ê±:è®5æ«2å¨-ä¥*ã£*á¤,á¢(á "â¢#â¢&â &â $â¡!ä¡!ä  ä ãâšâ–áÞÜ‹݉ߊ߈߇á‡á†á…â„â„áƒáƒâå ë°7ë´=ì¶@ì·Eì·Hë¶FêµBì¶AìµDë´Fë´Aí³=í²;í±8ì±3ë¯0ì®0í®0ì­+í¬(í©"ì§ì¤ì£ì ìžìœ ìëŸëžë›ê™ é”èŒâtÐNÍHÎNè­ZíÅqç¶[æ¶[ä¶]äµ^ä¶\äµXä³Tã²Tã®Må°Jæ³Næ²Nä±Kä°Jå±Næ²Nã®Fâ­Cä­Eä¬@ãª>á¦9ß¡.ÝŸ+ÞŸ/ß .ߟ+ßž(Ý›$Ýœ*Þ¡2Þ£6ߣ6à¥7ߣ1à¢.à¢/à£0â¥4á£2â¤2ä¦4åª7ç®;ê²Bê·Jì¹Oí½Xí¶Nâ”ÙzÛxÜyÛxÚxÚxÙwÚwÙwÙvÙvÚwÚwØwÚxÙzÙ{Ù|Ú}Ú|Ø{Ø{Ø{Øz×{Ø}Ø}Ø~ØÖØÙقكÙ…ڈ܋݌ގÝÜÝÜ’ ܒܑݓܖݗܖەږۖڕþÎküÍiûËeùÆ\÷ÁKö¼@õ¼Cô»Bô¸<òµ3òµ5ùÇXùÈ\ôÀRí¸Iê²?å¨1â¡'ޜݛ ܛܙܘÝ—ß›à›áœç ï³4ðºEí¶@ë´Cé°<é®6ç®6ç­7æ«6åª3ä§.â¢'á %á %áŸ#â !â¡$ã $ã¡#â  âžãã›ãšã—â‘àŽÞ‹݈܆ޅ߄ބރà„á„àƒáƒáƒá‚ã€ä‹ê­2ê³;ìµ?ì·Dë·Gë·Hë¶EëµDìµAì´Aí³>í²;í²8ì²5í°3ì¯1ì®.í­,ì¬(îª&í© ì¦ì¤ì¢ìŸëœ ì› ëœ ìíìš ê˜ é”èŽàtÏLÊEá•BðËyé½få´Wâ¯Pà¯Tá°Sà­Ká¬Gà«Cà«GàªGߪCã­Iä¯Kã®Jâ¬Eá¬Dâ­Gá«Aáª;â©;á¨9á¦5à£2ß¡.Ý(Ýž*Þ)Ý›&Üš$Û˜!Ûš%Ü-Ýž/Ýž,ÝŸ-ÞŸ,Þ *ÞŸ*Þ ,ß¡/ß¡,à¡,á£,ã¦2å©6ç¬:é²Aê¶IëºVí¾Yï½Uæ¡.Û{ÜvÛxÚuÚvÚuÛuÛuÚvÚuÚvÙvÙvÚwÙxÙyÙzÙzØyØyØyØy×y×xØzØ|Ø}Ù~Ù~ØØÙÙۄڈۉ܊ÝÝŒÜŒÜŽÜ ÚÛܑۓۓ۔ٔٓٔؔüÏlûËgùÉböÂTõ½Gô»Có»Dó¹Bò·<ð²2ñ³4úÉ^øÈ]ó¿Pí·Eê°<ä¥.á¡&ß ÞšÝ—Ü—ݘÝšà›â›åí±/ò¼Fî·>ë³<ê±=è¬6åª0å¨/ä§.å§1ä¨1å¨0ä¤+â %â %â %á !â¡!ã¡!ã¡ ä äœãšâ™ã˜ã– â‘àŽ݉Û†ÛƒÜßß߃ރ߂ßá€á€á€ã€á€çœëµ>ë·Eì·Hì·Gë¶Cë¶AêµCë´@ë´@í³:ì²7ì²7ì±3í°4ì°3ì®/ì¬%ìª"í©!í¨í¤ì¤ë¢ëžì ë› ëšì› ë›ê™ ê— ê’éàrËEÜ„2íÆoé¼eè¼eåµWà­Lß«KÞ©Gܦ=ݦ8Ý¥;ܤ;Ü£:ܤ<ß©BàªAàªCà¨@à§;à¨=á¨<á¨:à§6à¤3ß¡1à¡1Ýž+Üœ&Ýœ(Ýœ&Ýš%Üš%Û—Û™"Ü*Üœ)Üœ)Ûœ'Ýœ%Ý$Þž'Þ *ÞŸ+ߟ*ߟ'á %â¡,â¦2äª7æ­:è²Dé¸OëºUí»Sï½Tè¥4ÛzÚtÛvÜtÜtÜtÛtÚuÚvÙvÙvÙuÚvÚvÙvÙwÙvÙvÚwÙwÙyØy×yØ{×zØzÙ{Ù|Ø|Ù~Ù€Ùۂڇۈۈ܊܋܌ێێ Û ÜŽ Ü ÚÚ‘Ù‘Ø Ø ××üËhùÊd÷ÆYô¿Mô¼Gó»Cò·Añ·?ð´8ï¯1ñ±5úÉ`ùÈ_óÁTî·Gè®<ä¥.áŸ%Þ#ݛݙݘÞšàšâšä í±2ò¿Lî¹Bì³8é®5è¬4å¨1ä¥)â£'â¢'ã£(â£'ä£(ä¤*â¢'á $â "ã #ä¡#â¡!â ãžâ›â™á— â–ã“ áߊ܆ۄ܂Ý€Þ€Þ€ßރ߂à€à~á~áâ€â}ä†ê¬2êµEë´Aê´Aë³Cê´Cé´Bë³?ê²=ì³:í²6í±4ì±1ì¯1í®0í­.íª#ì¨ì¨ì¦ì£ì£ë¡ížìœ ë›ëš ëšë™ ë˜ê•é‘è‹Ýl݆1íÄnå·Yå´UäµZâ³W߬LݧCÜ¥@Û¢8Û¡2Û¡5Ú 7ÚŸ4Ú2Û 3ݤ7ߥ:Þ¦:Þ¤7Þ¥9Þ£4Þ£3à¤4à£1Þ¡/Þ¡2ÝŸ-Ü›&Üš%Üœ'Ýš'Ü™"ܘÜ—!Ü™#Ûš$Üš!Ûš Û˜ܘݙܛ"Ýœ#Þž&ߟ(à %áž#â¡)ã¥2å¨5æ­;ç²Fé¶Kì¹LíºNï¿Vê¨7Ü|ÛtÜuÜtÜtÜtÛuÙuÙuÙsÙtÙtÙuÙuÙuÙvÙvÙvÙvÙwØwØx×yØx×xØyÙzÙ}Ú~ÚÛ€Û‚܆ۇۈ܊܊ۋۋێ ÛŽ ÜŽ ÛŽ ÛŽ ÙŽ Ù ØŽ × Ø ØûÉdøÅ]öÂUò½Mó¼Jñ¸Bñ¶@ð´:ï®.í©$ï®/úÉ^ùÉ^ó¿RìµDè¯>ã¦1áŸ%Þ"Ý› Þ™ݘÞ˜á™âš ë¬,ôÂWï¼Më³;é®3æª1ä¨/ã§.ä¤*â¢&á %á¡'â %âŸ$á $âŸ!áž âž!âž#ãŸ"ãžâœâšâ™â—á” âàދއ݄ÜÜ€ÝÞ€Þ€Þ€ÞÝàááà~áâá{æ–ë²:ë°9ê±;ê±Aë³Dê³Bê³@ê³=ë³:í²8í²5í°1í¯0í®-ì¬'ì¨!ì¨ ì¦ì£ì¢ë¢ìŸí ë› ë› êšëšëš ê— ê”é‘ä…æ–*ðÇoé¼[ä±Lá¬Eß«GÞ­NÞ¬LÛ¦AÛ¢:ÜŸ2Ùœ+Ø›+Øš-×™-ט.Øš)Û-Ý 5Ý¢6Ý¢6Ý¢6Ý¡0Ü¡0ߣ3Þ¡1ÝŸ-ÜŸ.Üž+Üš&Ü™$Û™"Ú—Ú•Ú•Ú•Ù•Ú—Ü—Û–Û—Ü–Ü•ݘÝ› Ý›"Þœ#Þ"ß›à› â 'â¤,ä¨1æ¬8é°=ê³@êµFí¹Qð¾Sê«5Û{ÚsÜuÚtÚtÚtÚtÚrÙqØrÙqÙqØsØsÙuÙuØuØuÙuØuÙvØvØwØyØyÙ{Ú~Ú~Ú}ÛÛ܄ۅۆ܉܉ÚŠÚ‹Ú‹ ÚŠÚ‰ÙŠÙ‹Ø ØŽ Ø Ö ÖŽ×øÇ_öÂVó¿Qñ¼KòºHð¶@ï³;î®1í©%ì¦ï¬*úÈZùÇ[ò¼Oë³Bç®<ä¥/á &Þ#ß› ޙܗà™â™ æ¢òÀRñÀUì¶Gé°:ç¬4æ©2ä§/ã¤+ã£(â¡%áŸ$á %â %áŸ%âŸ"áœà›àœß›ß™à›á™à—á• á’ßàŠ߉݇܄܂ÜÜ~ÝÝÝ€ÝÝÞ~à~àà}à}á}ã|â{âé¦(ê°7ê¯8ë°:ê¯9é°;ê±=ê²9ë³8í³7î²7í±2î¯/í®+í­'í©$ì¨"ì¦ì£ì¡ì ëŸìœ ë› ë› êšêš ê˜ ê– ê”æŒèš"ðÆjíÁ_è·Oã®EÞ¦9Û£5Û£9ܧBÚ¥@Û¡7Ùœ,Ö˜%Ö–$Ö–%Ö–(Ö—+Ö–&Ù™'Û2Ý 5Ý 4Ü¡2ÜŸ.Üž/Þ¢3Þ¡0ÜŸ+Ûœ)Û›'Ú™"ڗږٕٔڔڕؓڔڕڕۖܘەܖܙݙܘÜ—ݘޙߚà %â¥,ä§-æª1è­5é°<ê´Eì¸Hï¼Ké¨2ÚxÜqÛrÚrÛqÛpÚqÙpÙoÙoØoØqØrØrØrØsØtØtØtÙuÙvØwØxØwØyÙ{Ù|Ù}Ú~Û€ÛÛƒÛ„Û†Ú‡ÚˆÚ‰Ú‰Ù‡؆؇؈׉׋Ö‹ÔŠ ÔŠ ÕŒ ÷ÁUô¾Qò»Kñ¹Gð´=î²8î¯4î«*í¨#ë¢î«)úÈYøÇYñ½Lê³>è­9å¦.âŸ$à!à›Þ˜à—ᘠãšï¹FôÄ]íºKê²>è®6æª1ä§,ã¦-ä£(ã£'â¡&â %áŸ$â %áž#âž âßšÞ˜à˜ß•ß”à“ à’àßàŠàŠÞ‰Ý…Ü‚ÝÜÜÜÜ~Ü}Ý~ß~à~ß}à}à}à|á}ã|ã|âyåë¯1ê°6ê¯8ê®6é­7ê¯:ê¯7ê±8ì²5í±4ë°/ì¯,í®,î­)íª%ì©$í¦ì£ë¡ìž ì ì› êšëšê™ é˜ ê— ê”éŽé›!ðÄkïÆgì¿WèµIâ«=ݤ6Û 0Úž,ÙŸ/ÚŸ3Ùž/×™'Õ–$ו$Ö”#Ô”%Õ•%Õ”!Ö•#Øš.Ûž3ÜŸ3ÜŸ0Ûœ+Úœ,ÝŸ0Ý¢1ÝŸ,Û+Ûœ*Ú—!Ú“Ø‘Ø“Ù•Ú•Ú”Ø“Ø“Ú”Ù”Ú”Û•Û•Ü—Ü—Ü—Ü—Ü–Ü–Ü–Þ˜ßšàž â£'ä§/å¨1æ«3é°;ëµBì·Dî½Nç¥0ÚuÛoÛpÚoÙoÙpÙoØoØmØnØnÙoØoØnØoØpØoÙqØrØuØuØvØuÙvÙzÚ{Ù{Ú|Û~Ü€Üۂۄڅنن؆؄؄Ö†׆Ö…Ö‡Ö‰ÕˆÔ‰ ÓŠ õ»CóºGñ¸Fð¶Bî³:í°5î«,ì¨#ì¦ê¡î®.úÉ\øÆZðºIë²>ç«3ä£(âŸ$â"àœà™á˜ã— ê©)õÅ^ð½UëµFè°:æ«3ä§/ã¥+á£,â¢(â¡&â¡&â #àŸ!áŸ#á á áà™Þ•ޔߒޑà‘ààŽßà‹ßˆ߆݂܀Ü~Ü~Ü}Ü}Ü}Ý~Ý~Þ~à~à}à|à|à|à{á{âzâyâ{ê£"ê¯4ê®3ê°7ê¯7é¯8é®6ê¯4ë±4ì±3ë°0ì®*î¬)í«#íª!ì¨í¥í£ì¡ìž ì›ë› ëš ë™ é— é— ê•êéšñÅjðÈjíÂZíÀWéµFã«8Þ¤5Û /Ùœ&Ù™"ט$Øš(Ö—$Ô” Ô” Õ’!Ô“$Õ“#Ô’Ó’Ö–#ؘ'Ù™*Úœ*Ú›$Úš%Ú›&Úœ%Ü™#Ûš$Ûš%Ù—!Ù”Öבٕؒٔٔٓړڔڕۓەۖܕܔܖݗݗܗޘà›à›áž â¢(ã¥+ä¥+çª3é°<ë´?ì¸Iî¾Såœ)ÙoÚoÙnÙnÙmØl×lØl×m×k×k×l×l×k×mÖl×mØoÙqØrØr×sØvÙvÚxØxÙzÛ|Û~Û€ÚÛ‚Ú‚ڃقׂ׃ÖƒÕƒÖƒÔ„Õ„Õ†Ö‡Õ‰Õ‰ó¶:ò¶:ñµ>ï³;í®2í«.ì¨'ë¥ë¢ë î«)ûÈ[÷ÅYðºGí²;æ©0ä£+ä¡'âž$áœá™☠åœó½OóÂ[ì¶Ié°?æ«5å¨2ä§2â¥0ã£-â¢*â¡'â #â  áŸ!ážáߛߙߗޔݒ ß‘ à“ ß’ßßߌ߉݂݅܀ۀÜ~Ú}Û|Ü}Ý~Ý~Ý~Þ}ß}à|à}ß{ß{àzâzâyáyâvåé¬1è«1ê¯6ë°7ê°5ê¯7ë°4ë±1ë°2ì¯.í¬(î«&í«"í©ì¨í¥ì£ì¡í ëšëš ê™ ê˜ ê–é–ê“èðºXòÉkïÃ]íÂ[î¿Vê¸Jã®:ߦ3ÜŸ+Ù™"Ø—×–×—!Õ”!Õ‘ÔÓÔ‘Ô’ ÓÒŽÕÖ“Ø”×–Ú˜ Ú˜ Ù˜Ùš"ٗؖڗٖؔؑؓٔؔؔڔܓےړۓے Û’ Û’ Û’ ܓܕݖܖܔܕޙà›áž%áŸ$á "â¡"ä¤'æª2é¯8ê´BìºMí»MáŽØiÚmÙkÙiÙjØiØjØj×hØi×i×iØhÖiÖjÖkÖk×mØnØoØqÙsÙtÙvÚvØxÚ{Û}ÛÚÚ‚Ú‚Ø‚ÙØ×Õ€Ô€ÔÔƒÕƒÔ„Õ‡ÕˆÕˆó¶<ñ´;ð´=í°7ì«.í©(ê¤ê êŸêî§#ùÆWöÃQñ»Dí²7è«2æ¥,ä¢)ã $âãšã— ì­2öÆ_ð¼Pë³Dç¬;å©7ã¦4á¤0â£+â¡*á¢+à£,â¢)ã %âŸ$⟠ââšß— à–à“ ß’ß‘àߎߎÞ‹ÞˆÞ†܃Ü€ÜÛ~Ú|Ú|Ú|Ü|Ü}Ü}Þ}ß|ß{ß{ß{à{àzáyàxâyâyàtâ„é¨)ç¨.è¬3ê¯7ë±8ê²;ì²:ì°3ì°2ì®,ì­(í«%î«%ì©ì¨í¦ì£ë¡ëœ ë™ë˜ê˜ é— ê•é”èŒì¤3óËqðÅ`ïÄ[ïÂYîÀVëºSå±Cá©6Ü¡,Ú›#Ù•דÖ“Ö’ÔÓŒÓÒÔÔŽÓÔŽÕבהؗڗږٗږڕٕڕٓבّٓٓٔړےۑےےܒ Ü‘ ÝÜ’ Ü’ Ü’ ܔޚߢ5à¦?á¨Iá¬Rá®Tá«Pâ¨Gâ¦<ã¥3ä¥,æª/é¯;ë·Gí»Pí·IÞƒØiÙkØiÙjØjØiØi×gØfÖf×fÖfÕfÖgÕgÔiÔiÖkÖl×nÚpÙsÙuÚwÙwÙyÙ{Û}Û€ÛÚÚ‚Ø€×Ö~ÔÔ€ÔÔ‚ÕƒÕ„Õ†Ô…Ô…ñµ>ð³:î°5ì¬1íª-ë§(ê£!ë¡ë ëží§"úÇXøÄSò»Fî´;ê®6æ©/å¢(ä #ä噿 ôÁWóÁYí·Iè°@æ«:ä¨7ã¥4à£.á¡)áŸ%áŸ)à¡*â£,â¡$㟠ãŸãâšá˜á—à•ß‘ Þ ÞŽߋފ݈݆Ü„ÛÛÚ}Ú|Ù{Ú{Ú{ÚzÛ{Û{Ý{ßzß{ßzßzßzàyàwàxáxâwàtà|è !ç¦)æ§,è¬2ê¯6ê±<ì²<í±5ì°/í®)í­%î¬$î«$í¨!ì§ì¥ì£ì ëœ ë˜ë—é–é–é•éèï¼^ñÊmòÇdðÅ^îÃXïÁXë»Qç±Aãª6ߣ)ÛšÙ”×’×ÕӎҌӌÓÔÓÓ‹Ó‹ÔÕØ“ؕٗڕْٕٕٕٔٓ××ٓؓړܓܓ Û’ Û“ Ü” Ü” Ü’ Ý’ Ý‘ Þ’Þž)ߨD߬QÛªPÙ¥D× ;Õž7Ø¢<Ú¤CܦFÞªNá­Vã¬Qå«Dè­<ê³?ì·Hí¼Rê²CÛy ØhÙjØgØgØh×g×f×e×e×eÖe×dÖeÕfÖfÔgÕhÖj×lØoØpØsÙvÚwÚwÚyÚ{Û}Û~ÚÙØ×~Ö~Õ~ÔÕÕ‚Ö‚Õ„Õ…ÔƒÔ‚ñ´>ï±7î¯5í«2ë¨+ê¥$é£ê¡ë¡ëží§ úÆW÷ÅVò½Mï·Fë°9è©1æ¤)å !äžåžñ¹JôÄ^î¹Nè²Fåª8á¤.à£1á£1á¢/á¡,á (à 'áž$â¡)ã¡'㟠âžâœâ›â™á˜ß“ßߎߌÞ‰Þ†݆܃ÜÛÚ}Ù{ÙzÚzÚzÚzÚzÛyÛyÜyÞyÞyÞyÞyÞxÞwßvßvßvàußsÞtæ˜ç¤%å¡$æ§,è¬1ê¯6ë°7í²4ë°1ì®)ï­#î¬$î«"ì¨í¦î¢í¢ì ëš ë™ê—ê–é•ê“èè•ñÇpðÈiòÈfòÆ_ðÄ[ïÂXí½RèµDå­9à¥-Ýœ Ú•Ø‘ Ø ÕŽ ÔŽÔӌӌԌӌ ÔŠ ÒŠÓŒ ÔÖ‘×”Ø–Ú•Ù”Ù”Ø“Ù’Ù‘ØØÚ‘Û“Û“Ü“Ü’ Ü‘ Ý‘ Ý’ Ü’ ޔݒÝÝ”à£8ܪMÖ¢CÔ5Ó›0Ò˜,Ñ—(Ò—*Ó™,Ô›.×›*Ø.Ú¢:ݨFà¬Rã¯Uç±Sé´Lë¶Fî¼Oé§7ØoØfØg×fØf×e×eÖdØdÖdÖeÖdÖdÖdÕeÖe×fÖhÖj×mØnÙqÙuÚuÚvÛxÚyÚ{Ú|Ú|Ù|Ù}Ö~Ö~Ö}Õ~Õ€Õ‚ÕƒÕ„Ô„ÔƒÓƒñ´@ì®5ë«3ë©0ê¥&é£ è¢!é¢"êŸêš î¤úÆUøÅVô¿Pð¸Hí±<è©1æ£%åŸäî´?öÇdð¼Rê±Aæª;â¤/ß¡(Þž(ÝŸ(ÞŸ*ߟ'ß (àŸ%àŸ&âž#âž ââœâœâšà˜á•à’ ßŽߌމ݇Ü…܃Ü€Û~Ú|Ù{ÙyÚxÛyÙyØxÚwÛwÛxÜzÝzÝxÝxÝxÞwÞvÞvßvÞtÞsÞrÞoäç¥#å¡#å¤)æ©/è«1ê­1ì¯1ì¯1ì®,î¬&î­ íªì§í¥í¢í ì ë™ë˜é–é“è“è“ç‰è™!ñÈoðÆdñÈeòÆ_ñÆ]ïÅ]î¿Të¸Hæ±<ã¨2àŸ#Û—Ù’ Ù Ø ×Ž ÕÕŒ ÕŒ Ô‹ ÕŠÕ‰Ô‰ÓŠÔŒ ÔØ’ٕؓڕٓڒÙÙ ØÙŽ Úۓݔܔ Ü’ ݑޒ ݒݑݑߗá¢1Þ¦@Ø¢>Ò˜/Ñ–+Ò–)Ñ—,Ò—*Ó–'Ò˜+Ó˜)Ó™+Ô™(ך(Øž0Ú 2Û¢5Ü¥?à«Oã¯]ç²YëµOî½Tã™)Öf×e×eØeØdÕdÖc×c×cÕcÕcÕcÖdÖdÖfÕgÕgÕh×j×mØpÙrØuÙuÚwÜyÛ{Ú{Ù{Ú{Ù{×|Õ}Õ}Õ~Õ€Õ‚Õ‚Ô‚ÔƒÔ‚Òí°8ê¬1êª/é¦(è£"é£#é¢"é¡ éžë™ î¦ úÇWùÅVô¿Oð¹Iì²;è©.ç¢"æë©.÷ÆaóÀYë´Dç«5ä¥1à¡*Þž$Ý›!Üš!Ýœ#ßœ!àœ àœ"ß›àšàšáœââšã—à– à“ ß ÞŒ܉܆܄܃Ü€Ü~Ú|ÙzÙyÙwÚwÚxÙwÚvÚuÚuÚwÛwÝvÝwÝwÝvÞvÞvÞuÞtÞrÞràqÞlã€ é¤ æ¡"æ£(æ§-çª0è­0é­-ë®,ì­*ì­'î¬ ì©ì§ì¤ì¡ë ë› ê˜ ê— é•è’èèæ†éœ'òÉoðÅ_ñÆcòÆaòÆ\ñÄ\ïÀTìºJé³<æª-á¢#ޚܔ Ú‘ ÚÙ×׌×׌׊Պ։ԉԊ֌֎ Ù Ù“Ù•Û’Ú‘Ú‘Ù Ø ÙŽ ÚÛ’ Ý” ܕݒ Þ“Þ“Þ’Ýà™â¨<ݧCÕœ1Ó—%Ò•#Ñ”#Ñ”$Ñ–&Ó–&Ô—$Ó˜(Ô˜(Ô˜%Ô˜%Õ˜'ל.Ù 4Ù¡7Ú¤9ݧAÞ¨Fà¬Vä®Zç²Rì·KÜÕaÖd×c×cÖb×bÖaÖbÕbÕbÕbÕcÖcÕeÕfÔgÔg×hØk×nØpÙrÚtÚvÛxÛyÚzÙzØ{ØzØ|Ö}Õ}Ö}ÖÕƒÔÔÔ€Ò€Òí­5ì¬3é©,ê¦&é£"è£#é è êžêší§$úÇ[øÅUó½Jð·Bí²:ê©-ç¢"æ¡ô¿SõÅaí·Ké°=å©6â¤0àž'Þœ"Ý›!ܙݛ!àœ!àšß™ߘß™à˜àšâšãšá—à’ßÞŽÜŠ݆݅Ü‚ÚÛ~Ú|ÙzÙyØwØvÚwÚvØvÛvÚuÜuÛtÜtÛvÜvÝuÜuÞtÝtÝtÝrÞqÞpÞnÝlßséžæ£!å£%æ§+ç©.è¬/ê¬,ë¬(ë¬$í«"íªì§ì¦ì£ëŸ ì ê™é˜ é–ê“è‘èŽçŒæ„è– ñÆmðÄañÆ_òÇcñÆ^ñÄWðÀRî¼Më·Bç­0ä¥$áÞ—Ý” Ü‘ÛÚÙۋڋي؊׊Ö‰ÖŠ׋׌ØŽ Ú‘ Ù“Û“Û‘Ú Ù Ù Ú Ü’ Ý“ ß“ à” Þ“Þ”ß” ß“áœà£-Ú›$Ö–Ô•Ò”Ò•!Ò” Ò”Ò”Ó–Ó— Ô—$Õ˜$Öš%×›(Õ›,ÖŸ2Ù£<Û¤?ܨBÞªEàªDÞ©FߪOà©Oå¯På£5ÖjÖaÖbÖaÖ`ÖbÖaÕ`Õ`Õ`Õ`ÕaÔbÕcÖdÕeÕgÕh×i×k×lÙnÚqØsÙuÚvÚvÙwØzØ|Ø{×{Ö}Ö}ÖÕÔÓ}Ò~Ñ}Ñ~í«4ë«2ê©,ê¥$é£!è¡ è èŸêžéšî¨%ûÆYøÄRô¾Fò¸@î²:ë©*ç í°:÷Èfñ½Wê³Dè­;ä§4á£-ߟ&ßž#Þœ ߛݜ"ßœ ßšßšßšà›ášá˜á˜á˜à– à‘ߎÜŠ܈܆܂ÛÜÚ|ÙzÙwØwØwÙvÚvÚuØuÚuÚuÜtÜtÛuÛuÛtÜtÝtÝsÜsÞrßqßpÞnÝmÞkÝiæ’ç¦$å£#æ§'çª+ç«.é­-ê­)ë«$í©!ì©ë§ì¥í¡ëž ë› ê˜ê—ê”é‘èèŒå‰䀿ŒðÂeñÆcñÅ]òÆ^ñÆ^ðÄWñÀQï½Kí·@ê±3æ©)ã¡á›Þ– Þ”Þ’ÝÝ܋ۋۋۊڋى׈׉ØŒÚÚÛ‘ÜÜ‘ÛÛÛ ÛÞ‘ Þ“ß’ß’Þ“ß“à”ߜݠ*Ø—Ö“Ö’Õ“Ó“Ó“Ó“Ò” Ò“Ó”Ô—#Õ˜#×™$Ù+ÙŸ-ÙŸ0Ù¢9Û§AÝ©C߬Eá¬Gâ­Iã®Iá¯Lá®Râ­Wç±X݇Ó]Ö`Õ_Õ_Õ`Ö_Õ^Ö_Ö_Ô_Õ`Ô`ÖbÖcÖcÔeÕgÕhÖi×j×l×nØqÚsÙtÙtÙvØw×z×{×{Ö{Ô|Ö}Õ}Ô|Ó|Ò{ÐzÏ{ì«4ëª1é¨)é¦%è£"è¡!é èŸéžç˜ ì¥úÅUøÄTó¿MñºFî³:ê«-é¦&óÀZôÃaí·Mé¯@æª;â£-à¡'ߟ'àž&ß!ß›!Þ›!ߛߜ à#àœ!à›àšá˜à—á– á’ àß݉܇܆Ü‚ÛÙ|ÙzÙwØvØvØvÚtÙuÛuÙuÙtÚtÚtÛtÛsÚrÜsÛrÜqÜqÜpÝpÞoÝnÝmÝjÝhÛbá é§$æ¤$æ§&æ«+è­/è­.ê­+ìª#ì¨ë¨ì¦ì¤íŸ í êš é–é”é’èèŒæŠä†å〠îºYñÈiñÆbñÅ\òÆ]òÄZðÀNï½Hí·?ë³4è¬*æ¥ ä á™ á–à”àÞÝ݋܋݌܊܉Û‰ÚŠÚ‹ÜŒÝÛÜÛÛŽÜŽÜÝÞ’ß“à“ ß‘à‘à“à™Üœ#Ö”Õ“Ô’Ô‘Ó’Ô’Ó’Ò“Ò”Ó”Ò•Ô—$Õ˜%Öš&Ø*Ú 2Û£5ܦ<ݨBÞªAà­Dà®Hã¯Hã¯Iä°Nã°Tå²Xè·cè°[ØvÓYÔ^Ô]Ô]Ô]Ô]Ô^Õ_ÖaÖ`Õ`ÕaÔbÕcÕcÖdÕeÖgÖgÖj×l×nÚqÙsØtÙuÙuØvØx×{ÖzÕ{Õ}Õ}Õ{ÓzÒxÐzÐ{ë¬5ë«2ê§*è£#ç¡ ç¡ è  èžè›è– ë¡øÂPøÄSöÂUò¼Mïµ@ê¬1ì²>õÆcñ½VìµGè¬:ä§5à¢*ß (ߟ)ßž(ßž$Þœ"ßšßšàœá"áœàšá™á—à” á“ à‘ßÞ݈Ü…Û„Ü€Ú{ÚyÙxÙvÙuÙtÙtÚsÙtÚsÚsÙrÛrÚrÚqÚqÙpÛqÛpÛoÛpÜnÜnÝmÜlÜiÜfÛeÙ`ÜlèŸç£#æ¤$çª+é¬,ê¬-ë«(ì©ë©ë§ì¥ì¢ìŸ ëœê—é•è’èèæ‰å‡ä‚ã{Ýrê°NðÊlðÅdñÆ]òÅXñÄWóÁRñ½Fï¸<í¶8é¯,ç¨!æ¢äœ ã™â–â“á‘àߎÞŒ݌݋݊܋܊܋܌ÝÜÜŒÝÜÜÝßà“á“á’á‘á’á–Ý›×–ÕÔÓÓŽÓÒÒÓ’Ô“Ô’Ô•!Ô—$Õ˜%Ö™%Ù)Û¡/ܤ4ܧ:ݨ=ß©?à¬Cá­Bâ®Cã°Iå±Næ²QçµVè·]ê¹aè®R×rÑYÒ]Ó]Ó[ÓYÓYÓZÔ\Õ]Õ^Ö_ÕaÕaÔbÕcÕcÔdÕeÕg×i×kØmÙpÚqÙsØtØuØu×xÖzÖyÕzÔ|ÔyÒxÑvÑwÑyì«5éª3é¦+è¢#ç æ¡ ç èèšè—êø¿JøÅUöÂUó½RîµAé«0ï¶GöÇfñ¿Wì¶Hè®<å¨5á£,à¡*àž$Þ"Þ"ßœ!à› àœáœáœâœá™ß—á• á” à‘àŽßދވ܄ۀÛ}ÙzÙxØvØuÙuÙuÙtÙsÙrÚrÚqÛpÚpÚpÙpÙoÙoÙoÚoÚnÛnÛmÛkÜkÝiÜfÛdÚaÙ^×[äŽè¥"æ¡æ¦$éª'ê«'ë©#ì¨ì©ë¦í¤í¡ìž êšé–ç”è‘èæŠä†ä„â}átÕbæ¤CñÊhðÄ^ñÆ]óÄUòÂRòÁQñ¾Iï¹=í·;ë±-é«"è¤æŸ å›ä˜ã•â’áàŽßÞßތ݌݊Ý‹ÝÝÝÝÞŽÝÝߎáâ’á”â’â’á’Þ—Ù•ÔÔŽÒŒ Ó ÔŽÔŽÒŽÒÓ‘Ô’Õ”Ö•Ö–"Õ–!ט#Úž*ܤ6ܦ7ܦ:ܧ:Þ©@à­Bá¬?ã­Eå²Mæ´Qæ³Nç³Mè³Oè³Oé·Uè¯QÖpÐVÑXÑ\ÕgÙpÙpÖjÔeÓaÔ]Ó\Õ_Õ`ÔaÕbÔbÕcÕeÔgÖi×kÙnÚoÙqØsØt×t×vÕwÔwÕwÔvÓuÓtÒvÑvÐvë«4è¨-è¥*è£$ç¡æ çžè›è™ç•ç— õ·=øÂUôÀRñ¼Lí²;êª-ñ»MøÉiñ½RëµHè°Cæ¬<ã¦4â£/â¡*á¡+ßž$àœ áž"ááœàœâ›ã™á—á• â“ á‘ߎދމކ܄܀Ú}Ø{ØwØuØtÙtÚtÙuÙsÚrÚqÚpÚpÙnÙnÙnÙoÙmÙmÙmÚlÚkÚkÚjÜiÜfÛcÛ`Ú^Ø[ÕQÝs è¥"æ¢ æ¥!ç¨"éª#ì©ë¨ì¨í¥ì£ì¡ë ê˜ê•è’çæŠåˆäƒâ}àv×dËQâ—8óÊgðÄ_ñÆaòÆ\ñÂRñÁOñ¾Hð»?ï¶6í±-ì¬#ê§è¡çœå˜å–ã“ã‘áŽáŽâŽáŽßàŒß‹ÞŒÞßÞÞߎߎßßàŽâ‘ã“ã’ãá”Ü–ÕԌӌ Ô‹ Ó ÓŽÔŽÔŽ ÓŽÓÔ’Ö•ווÖ•ؘÚž(ܤ5ݦ7Þ§:ݨ>ÞªAà¬Câ­Bã¯Dæ³Jæ³Jè²Jé´Lé´LêµMé¶Ué»aæ«OÒf Út ç™"ìª0í¯2ì­.ë¨)é¢%çœ!ä‘ÙrÓ^Ô^Ô`ÔaÕbÕbÔcÕfÔgÖh×kØnØoØp×s×sÖtÕtÕtÔtÓsÑsÑsÑtÏuÐuêª2è¨.è¦,è£&è¡"è¡ çŸéœè˜ ç•ç“ñ¯0ö¾Jó¼Kò¹Eï°6ìª.ó¾RöÅbí·Jè¯=æ­:å©7ä¦6ã¦7â¥3â¤0â¢+á %áŸ$áŸ#àœàœáœãšâ˜á—â“ áßފއ܅ÛÜ~Ú}ØyØvÙuØtØsÙsÙsÙsÚrÚqÚoÙnÙnØnØmØlØkÙjÚkÚkÚiÚiÛgÜeÚdÙ`Ø\Ø[ÕUÒMÔWå™ç£!ç¤!ç¨"êª"ì©ì©í§î¤ì¡ìŸ ìœ ë˜è•è‘çåˆä‚â~àwÔ\ÇJÅEÛ„)ôÌkñÅcòÆdòÅ]òÃTòÀLñ½Dñ»<ð·2í²'í­ ë¨è£èžç›ç™å—ä“ãäŽäŽãŽâãŒá‹á‹à‹à‹àŒßààŽßà‹àâã‘ã‘ãá’Ù’ ÖՌՋ֋֌֎ ÖŽ ÖŽ ÕÔŽÖ‘ו×–ווؘÛŸ+Ý¥3Þ¦5Þ§6Þ¦8Þ©=à«Aâ­Dã¯Få²Gç³IèµKê¶Kê¶Në¸Qì¼Zê»_ëÀhç°Xë®9ï¸>ìµ>í³<ì³9ì²6ì²4ì²3ì±6ê©-߈ÓdÔ\Ô_Ô`ÓaÓbÕcÔeÔhÕi×kØm×o×r×rÖrÖs×rÔqÒrÒrÑrÐsÏtÏté¬;éª5é¨/è¤%è¢!è  çŸèéš è–æ’ï¨$õ¾HôºDò·?ï²7ìª,ñ»NõÇdì¶Gç«5ä§3á£0à¡.à¢1à¢0à¢-á¤,â¤-â£.ä¢(ã !ãžââœäšâ–á“ áß݆݉ۂÛ~Ù|ÚzÙwÙvÙuØuØuÙtÙrÚqÙpÙpÚpÚoØnØmØlØjÙiÙjÙiØiÙhÚeÚdÚbÙaØ]ØYÖTÓOÑJÏDß‚é¨#ç¤"è§#êª"ë©í¨í§ì£ì¡ ì ìšê—è“èæŠä„âàvÎU½7Â<Ä<ÕpóÍnïÆfñÅ`óÃYòÃTò¿Iñ½Cñº:ðµ1î±$í¬ê¨è£è  çžçšæ–唿’äääŽääâããâŒâŒàâŒááâŒâãää’ã‘à’ÙÖŒ׌׌׌ÖŒ×׎ÖŽÖŽÖ×’Ø”×–Ø–וÙ—ÜŸ(ߥ2à¨6Þ¨7Ý¥4Þ§8Þª<á¬Cã®Få°Dæ²DéµHê·Lì¸Oì¼Tí¿\îÀbíÀdëÃoè·[é¯:ê±:ê±:é²<ê±8ë°6ê°3é®3é¯7é®4ä—ÖlÒ\Ô_Ô`ÔaÔ`ÔbÔeÔfÕh×j×lÖp×r×s×qÕpÔpÔqÓrÒsÑrÐsÐté­:é©4è¦.è¤'è¢"ç  çŸçœè™ ç•æ’ì õ»BõºCò·>ð²7ìª)ò»NõÇeë³Bå§1à¢/Þ¡+ÝŸ(Ýž)Þž)ߟ)à (à¢-ã¥2å¤-å£(ã !ãžãžäœã—â” â‘ߌވ܄ÜÛ}Ú{ÙyØvÙvÙvØtÚsÚsÚqÚpÙoÙnÙoÙoÙlÙjØjØjØjØhØhØfÙdÙcØbØ_Ø\×XÕSÒMÐGÏDÉ<Õg é§#æ£ è¦!ê§ë¨ì¨í¦í¤ ì¡ ìž ë˜é“ç‘çå‡ã€àvÊO¸0½4Â<Ä:ÒbòÈiñÇfòÆ_òÃVòÁOò¾Eò¼<ñº5ð¶0î²%í­í¨ê¤ê  èœç™æ–å”å“ä‘åäŽåääŽääãŒâŒãŒãŒããŒãŒääŽäŽååߑڎًٌٌ،׌ØØØ Ø Ö ×’Ø”Ù•Ù–Ù•Ù—Ýž$ߤ+à§2à©4Þ¦0Ý¥1Ý©9ß«>á­@ä¯?è±Aè´Gê¸JìºOí¾VîÀYïÁ[íÀ^ëÀcé¿kæ°Hè®5ç¯:é±;ê°9ê¯9ê®6é¯6é°;ê¯:é®3æŸ#ØtÑ\Ô]Õ_Ô`ÓaÔaÔbÕfÕgÖjÖm×oØqÖpÕpÕqÒqÒsÒsÒsÑtÐtê«5è§0ç§0ç£'æ¡æŸæžçœç™ ç–æ’éš ó´6õ¹>ó¶<ð±4î°7öÅaòÁ[ç®=ã¦2à¡-ß¡+ÞŸ)ßœ&Þ'ß -à¢/á¢,â£*ä¤.å¤*ä¡!âŸââšâ– â“ áߋވ݄݀Û}ÚzÙwÙwÚvÙuÙtÙrÚqÚqÙpØoÙnÙmÙlÙjØiØh×h×g×fØeÙeÙcØ`×^×[ÖWÕRÑLÏGÎAÊ>Æ8ÈIåšæ¤ç¤ê¦ê§ì§í¥í£ì¡ ìœ ê—é’èæ‹äƒáyÉO²+»2À8Ã=Å=ÎV ï½^òÉdñÄ[ñÄUòÀIò½Cò»9ñ¹1ñ¶,ð³(í®ì¨ì¤ êŸé›è˜è–æ“å‘çæçŽåäåŽåääŽäŒåŒåŒäŒåŒå‹åŽååŽæåßÜڋۉۊٌیÚÙÙÙ‘ Ø Ø’Ù”Ù”Ø–Ú•Ú—Üà¡%á¦-à¦,ߣ(ݦ0ݨ9ß«?á­@ã¯Aæ±Cè³Aè·Fì½OïÀWðÁUïÂZìÀ_ë¾_é¿dçºeãªAåª4ç­7è­8é­7ç­7è¯;è¯<é¯8ç¬5ç«1è¤(Ü‚Ò_Ó\Ô_Ó_Ô`Ó`ÓbÔdÕfÕiÕlÖmÖnÕmÔoÓqÑrÒqÒrÑqÑséª4è¨0è¦.æ¡%åŸæžæžç›è™ ç–ç’è”ñ±.ô¹<òµ:ï²7ó¾RõÇdë³Fá¤/à¡.ß ,Þž,Þœ&Þ›%ÝŸ,Þ¡/à¢1â¢,ã¡'ã¡'ã¢&å !ââ›â—á“ á’ àߌވÝ„ÜÛ}ÚzÙyÚxÚvÙvÚuÛsÚqÙqÙpÙoØmØlÙkØiØhØe×e×e×dØdØd×aØ]ÖZÖVÓQÑLÐEÌ?É<Æ9Ã5¾3Ý‚ç¤æ è¥é§ë¦ë¦í¤í¡ ìœ ê–è‘ç‹ä†ãÏZ±,·.¾6Á9Ä?Æ@ËQì¶VóÊdñÃZñÃVòÁNò¾Có»9ò¹/ð¶(ð±#î®ì¨ë¢ëžêšè–è”ç’ææèççææŽåŽååäæŒæŒå‹å‹åææåçŽåà݌܊ۉۊۋ܋܋ÛÚÛ‘ Ú‘ Ú’ ٓٔڕڕۗܛߠ"á£%ߣ!Ü  Þ¥0ݨ9ß«?â¬@ä°Eå±Eè´Eë¹Jí½QïÁVðÂVïÃ[íÁ]ë½[æºYæ¹]ä³Zà¤3ã¦1ä¨2æª4æª5æ¬;æ­;æ­6æ«5æ©1æ©0è§)Þ†Ð^Ñ\Ò]Ó^Ò_Ó`ÓaÔbÔdÓgÔiÕjÓkÓlÓnÑoÒpÐpÐpÑqé©3è¨/ç¥*å "åžæžççšç˜ ç– ç“æ‘ïª'ô¹@ò·?ñ¸GöÅañ¾Wå©7àŸ)ߟ*Ü›&Ûš$Ü™!Üš$Ýž.ÞŸ/ß .â¢)ã£(ã¢'ã¡$ä  âãšâ—á” áߌÝŠ܆ÛƒÛÛÚ|Ù{ÚwÚvÙvÚuÙuÛsÚqÙpÙmÙlØlØiØiØfØd×dÖcÖb×aÖ_Õ\ÖYÕUÒPÐJÎDÍ?Ç;Ä8Á4¿1·)Îfé¦å ç¤é¥ë¦ë¦í¤ì ë›é–éåŠå„Ñ_°/°*¼2¾7Ã<Å@ÇCÊKì¯PóËdñÃWòÁOóÀLò¾Có¼7ò¹.ð·,ð±#î¬ì¦ë¡êŸé™é•ç‘æçåŽçŽççŒæŒæŒæŒæŒæŒå‹æ‹å‹åŠæ‹ç‹çŒæŒæŒæŒâàŽÞŒÞŒÜŠÝŠÝ‹Ü‹ÜÝÜݑܑܑۓ Û”Û•Û–Ý—Þ›ÞŸ!á¢$á¢Þ Ý¢-Þ§6à«?á­?ã¯Dæ²Gè¶Hë»Qí¾SðÀRðÂUïÂ[íÁ^ê¼Zæ·Sç¸Vè»cá§Bߟ)à¢.â¥.ã¦3ä©:ä«<æ©5å¨3å©2æª4æ§-ç¤%Þ†Ñ_ÑZÓ]Ò^Ò_Ò`Ó`ÓaÓbÓeÓhÔjÔkÒkÒlÒmÐmÑnÐoê¨0ç¦.æ¥+æ¡ åŸåœåšå˜å— 哿‘æŽí£ó¶<ñµ<ó¿YóÅgìµMã¥4Þœ'ܘ"Û–Ú–Û˜ Û™!Üœ&ßž*Þž(â %â¡#ä "å åŸâãšâ—à” àÞ‹܇܆܄Ü€ÛÚ|Ù{ÙzØwØuÚuÚuÛsÛpÚnØlÚlÙjØhÙfØd×c×cÖaÕ^Õ\Õ[ÕXÔTÓPÐIÏCË>È:Å6À3¾/»-³&ÂNé¢ç è£é¤ë¤í¤í¤ì ë›ê•çŽç‹Øl¯0ª&µ.¾4À9Ä=ÆAÉFÈGé¨FôÌdñÄXòÂNôÀHó½>ó»6ó¹0ñ¸-ï²%í¬ì¦ë¡ êž é˜è”ççŽçŽæŽçæ‹æŠæ‰æ‰æˆæŠå‰æ‰æŠæ‹æŠæ‰æŠçŒçŒç‹åáààŠÞ‹ދދ݌݌ÝÝÜÝޑݒܔݔ Ý• Ü–ݘÞ™Þá£'à£"ß¡!ߤ/ß©<â¬?ã®Aä±Dç³Gé·Hë¼Oî¾Pð¿PñÂWîÃaìÀaê»Zè¹Vç¸Vå¹^à¬KÛ™#Þ+Ýž(ß -à£4á¥6á£2â¥3ä§5åª6å§/å£(æ¡%Þ†Ð_ÑZÑ]Ò]Ó^Ó_Ó`ÒaÒbÓdÓgÔjÓkÑlÑkÑlÑlÑné§1ç¥,æ£(æ  åžå›ä™ä– å• ä“呿Œê›ñ±3ï³=òÂcð¿bç¯Gߟ.Ü—"Ù”Ù”Ù”Ù•Ü—Û™ Þœ%ßž'àŸ"âŸãžåžåžãœâ™â– à” àß‹܈Ý…Û‚Û€Û~Ú}Ù|Ø{ÚyÚwÚvÛuÛrÛoÙnÙlÚjÚiÙeÙe×cÖaÖ_Õ^Õ[ÕYÔWÓTÑNÐIÎCÌ=È8Ä5¿1¼.¸+´*°$ÀEèœç¡è£é¤ë¥î¤í£ì  ë›ê“çŽäƒºA¥#±,º2¿7Â;Å?ÇCÉGÈFæŸ>ôÌaòÃWòÃPò¿Bó½;ò¼8ñ¹5ñ·.ï²$î¬í¥ë êœè—æ’ççæŒæŠä†ä†å ç™ç"æ”剿‡å‡å‰æ‰åˆæˆæŠæ‰æ‰æˆå‹áŽáŒáŠâ‰áŠà‹ÞߎÞÞÞŽßߒߓݔ Þ• Þ• Ü— ܘޚޜߠà¢á á£*áª=â¯@ä°Bæ³Hç¶Ié¸Jì¼Mï¾NðÀTïÂZíÂ]ìÁ`ëÀaè¼_å¶Yã²Tá­QÚ—$Û–Û˜!Üš%Ý+Þ¡2Þ¢0ß¡-â£2â¥5â¥2ã¤-ä¢)ä !݈Ñ`ÐYÑ\Ò]Ó^Ó]Ò^Ñ`ÓbÓdÓgÓjÓjÒkÑlÒlÑlè§1ç¦-æ¢#äŸäžåœäš㘠㖠ä“äåŒè“ ïª)ð¶Hñ¿aë¶Rã§>Ý-Úš%Ú— ڔٕڕږۘݛ$ß%á ãžãŸääå›â™ã˜á” àߌ݈܄ۂۀÚ~Ú}Ù{Ø{ÚyÚxÛwÛuÛsÛpÙnÚkÙiÙgÙdØcÖ`Õ]Ö[ÕZÔYÕVÔSÒOÏHÎBÉ<Ç7Ã3¿0¼-¸*³(±(±'ÄDæ–è¡é¢ê¦ì¥ì£ì¢ ì  êšè‘êÔj¦'ª(·0¾6Á:Ä=Æ@ÇCÈHÈFâ“2óËaòÃUóÃPòÀAò¾=ñ»:ñ¹7ñ·/ð°ï©í¤ ë êœç•ææŒåŠã†âƒæ–è§7æ¯Fä±Lâ¯Fã«;å å‰çˆç‰æ‰ç‰æ‡äŒã–â›"â›!â‘ âˆá†á‡â‰âŠá‹ßàŽàŽàààá’à•ߖߕޕ Þ˜ ޚݜޞޠá¡à¡à¢"â©3ä¯=å°;å³Cæ·Jê¹Mí¼Mî½Nð¿RïÁWîÀZìÀ^é½^æ¸Zã³Rá®Iâ­KÚ™+בÙ”Ù•Ú˜#Üœ*Þž)Ý&ß .ß¡2à£/á¤0ã£,ãž$ãž݆Ð]ÐYÑ[Ð]Ð]Ñ\Ñ^Ñ`ÓaÒdÒfÓhÒiÒkÒlÑlé§2æ¤)äŸãä›âšã˜å— ã• ã’äåŽæŽë£ï¸PíºYç®Fà¤8Üœ*Ûš&Û˜%Ú—!Ú˜$Ú˜#Û™$Ûš!Ý› á!âžã !å äŸåžåä›â˜á” à ß݉Ü…ÛÛÙ}Ù{ÙzØzÙyÙyÚwÚtÜsÜqÚnÛjØgØcØbÖ_Õ\×[ÖXÔWÔUÓRÐNÐGÎAÈ<Æ7Â3¿/»,·*´(±'¯&¹/ÊDâ‹è£é¡ë¤ì¤ë¤ì£ ìž ë˜è’牾H¥$³-¼4À9Â<Ä>ÅBÇDËJÊH݆(óÊaòÄVóÄSòÀEò¼;ñº7ò¹4ñ¶,ð®î§ì£ ëžé™æ‘å‹ä‰âƒâ†è¥7è¶Qä±Eà©8Þ¤/Ý¢)Þ %á¡â ÚnÝsßxàxãˆàšÜž+ÛŸ0Ü¢4ߢ1àš á—á–â áˆâŠâŒâŒâŒàâŽâŽââ”à–á–à–ߙޛߜߞߟà¡à¢"á¥$â¦)åª/å®7ä±@æµIé¹Mì¼Oî¾Sï¾Pî¿Tî¿Xì¿[é»Wç¸UåµQã°Jä³Mݤ>ÔÖ‘Ù”Ù”Ù•Ú˜ Ü›$Þž+Üž*Ýž*Þ¡,â¡)â$àšâ›Û‚Î[ÏYÑZÑZÑ[Ñ\Ñ^Ò_ÒaÑcÒfÒhÒhÒjÒjå¥0å¡$ãã›ãšâ™ä— å” ä• ä“ä‘åŽå‹è›í¸Sé´Oä©Aߢ6Üœ*Û™'Û˜'Ú˜%Ú™%Û›&Üœ)Ýž'ßž#áŸ#â¡$ä¢"æ¡å åŸåå›ã˜â• ß‘ ß݉܆ÜÚ~Ù|ØzØzØxØxÙxÚvÚuÜtÛqÚnÛiØd×aÖ_Ö[ÖZÕYÔWÕUÔRÒOÏHÍBÉ<Ã7Â3¾/º+·)³(±'¯&²*Ä;ÍGÞ| é£è ë¤í¤í¤ì£ ì  ë™ë”Øsª-­(»3¿8Á:Ä>ÆAÆCÉFËKÊHÙyóÉ\ïÃWòÅWóÁIò¼6òº2ñ¸,ñ´$ð­î¦ í ë›è•åŒã†á€âŠë±IèµLâ§0ߣ&ß¡%ߟ"ÞžÞšݘ à™ÑoÄJÄHÎf ߔۙؗ!ؘ#Ø™'Ûž.Ü£5ß§;ß©=à¦5á˜á‰ã‰â‹áŒâãŽãã‘ã“á–â—â—ߘ Þšß›àžàžàœá à¤#ä©+ã§%åª0å¯<ç³Cé·Iì»Oí¾Tî¿Qî¿RîÁ\îÀ`ê¾Zé½\çºYæ¶QäµQä²Uד!Õבגؑڕܙ#Üš&Ûš$Ûœ&Þž)ßž%ßš àšà™ߘ×y ÏWÑYÐYÑZÑ[Ò\Ò]Ñ_ÑbÑdÒfÒfÒgÒiå¢*ä $ãä›ãšâ˜å•ä• â” ã‘äåå‰çšì¶Sç°Mâ§=Ý2Û›+Ú˜%Ú—&Û˜%Ù™'Ûš&Û›&ÝŸ&ß )á¢,â£)ã¢#å¢!æ¡åŸåžåœã˜â• ß à݉Ü…Û‚ÚÚ|ÙzØx×vØvÙvÚtÛtÛrÛqÚnÚjÙbÖ_Ö\ÖXÖWÖUÕTÓRÑNÐJÍCÉ=Å7Á1À.»+¸)³(±'¯&±(¾5ÍEÎHÙn é¡èŸ ì£ì¥ì¤ì¢ ì¡ ëšçÞyÔkÉT¾9À8Ã=Å>ÈBÉFÉIËLÉIÑfðÀUðÅZòÄUòÁHó»5ò¸,ñ¶#ñ°ð«ï¤ ìê—çä‡áᇠì·Rè·Kã¨+á¢!ߞߜޛޚݖܒݓߚݎڈݒٔגדÖ”Ô• ×—#Ø™&Úž/Ù¡7Û¢9Û 1Þ–âŠâ‰â‹âãŽãâã“ã–á˜☠á—à™ à›áœá›áœážâ¢ã§'ã§&ä¨,ä«4ç°<éµCêºNî½Pï¿QïÀXïÁ]íÁ`ëÀaêÀaé¼[æ·Tä¶Så¹]Ý¡=Ó‰ ÕÖŽ×Ù“Ú–"Ù—$Ú—#Ûš#Ý›%Ýš%Ü—ݘß™ ݘÞ’ÓhÏUÏXÐXÐYÐ[Ñ\Ð^Ñ`ÑbÑdÑdÑdÒfãŸ$â!á›â›âšá—ä• å”â‘ãäŽä‹䇿™ë¶Uç°Lá¤:Ûœ.Ú™&Û˜%Ú˜%Ù™'Ùš(Û›'Ý*ÞŸ(ß¡)á£0â£*ä£(å£%æ¢ æ æŸæãšâ—á’àŽÞŠ݆ÚƒÚ€Ú~Ù|Øz×wØvÙuÙtÚrÛrÛrÚnÚiØbÖ]×YÖVÔTÔRÓQÑOÐJÎDÉ=Æ8Ã2¿-»+¸)´(²'°&±'½2Ê?ÎHÏIÕ`æ›è  ê£ë¤ë¤ í£ ì¡ì›ä†ç‹îšë• ÝwÇGÃ<ÆAÈDÉHÉJÊLËMÎXí²HòÉ]ðÃRò¿Bóº0ò·"ò´ñ­ð§î¢ ìšê”æ‰ã‚ß|é¨<éºQå§)㣠áŸàœß™ Þ˜ Þ— ݒݎ܋ڋÛÚ׋Ö‹ÔÔŽ ÕÕ‘Ö‘Õ”×–!×™#Õ—$Õ•!Ù™"Þ˜á âŠä‹åãŽã‘ã’ä”ã–â—â–á—á™ áš âš à› ážã â¤"â§&ä©,å­3ç°7ç´=ë¸Iî»Kï¿PðÂXïÃ]îÂ`íÃdíÃbëÀ_ç»[å¹Yå¹Zå·bו(Ó‹ ÕÔÖבØ“!ؓۖ Û˜$Ü— Ü–Ü—ݘ!ܖݕڅ Ð]ÏVÎWÐXÐYÐ[Ð\Ñ^Ò`ÑbÑcÑcÑcâœ"àšßšà˜á–á• â• ã”ã’ââã‹â…æ›#ë¶Tæ¬Eâ¤;Üœ/Ú˜'Ú˜$Ú™#Úš&Ú›)Û›+Ü.Þ -á¡,á¤-â¥-ä¤*å£)å¢ æ åŸæã›â˜â“ áŽÞŒ܉Ü…Ú‚ÚÙ}ØyÖw×uØu×sÙrÙqÛpÙnÙiØaÖYÕVÔTÓRÑPÒMÐKÎFÊ?Æ9Â4À/¼+¸)µ(±'²&¯%¶,Æ:ÌBÎHÐKÑVã’è¡ é¢ë¤ì¥ì¤ í¡ ì™æŠë—ì ìžî ã… ÊNÆAÉHÉIÊJËLÎPÍQç¤:òË_ñÃQò¾@ó¹+óµò¯ð«ï¤ ížë˜èä„à|áˆì¹Nç®6ä¤ãžâ›à™à—à•ߔߑÞ܉Û‡ڇ؇ׇÖ‰Ö‹ÕŒÔŒÓ ÓŽ ÔÕÕÒŽÒŽÔ×–Ûšà“äŒåŠäŒää‘ã’ä”ä–ã•ã”ã•â–â—âš áâ ã¢ã¥"ä©*æ¬/ç°5é²9ê¶Dí¹Fð¾PðÃXïÄ^ïÅeïÄdîÄeëÁdé½`æº]æ¹\æ»gá¯[ԌԉӊӋÔÖ×בڔړڔڕ۔۔ܒݑÔsÍSÏVÏWÐWÐYÐ[Ï\Ñ_Ñ`ÒaÑbÐcášà™ß—à” à“ à” à“ à’á‘áŽâŒâŠâ…æž+é´Qä¬Fߢ8Ü›-Ù™)Ù˜$Ú—Ú™#Ú›-Üœ-Û,ß 0á¢/á£-ã¤+ä¤*å£)æ¢"æ¡äŸåžã›â˜â“ á‘ߌ݈Û‚ÛÚzÛyØvÖuÖtÖs×sØsÙrÚoÙnÙiØaÕVÔTÓRÒOÑNÐKÎFË@Ç:Ã5¿0¼-¹)µ'²&°&®%±'À3É>ËCÍIÑNÐSáŠ è¡ é  ê£ ë¤ ë¤ í¢ ë˜ì•ìŸì¡ í¡ì î¡æ‹ ÎUÉIÊKËKÌNÎSÌQá”,òË]ñÂLò¾=ô¸*ô³ò®ñ§ ï íšê“å‰â€Ýtæ›(ìºJæ§%ã äšã˜â–â“â‘à‘àߌ߉ÝŠÛˆÚ‡Ù‡׉ÖŠÖŠÕŠÔŠÔŠÔ‹ÓŠÓŠÑŠÒ‰ÒŠÓŽ Ô‘Ö•Ü—à‘ äåŒåŽå‘ä“ã”ä–ä•ä”ã•ã•â–âš âŸä¢ã£ã§&å«,æ®0è±4ëµ?í¹Cï¼KîÁVïÄ^ðÅbîÅgîÅmêÁjè½dæ¹]ä¶Yä·\ä¹j×—1Ð… цÒ‡ÓˆÓŒÕÕÕ×ْٓړْۑÛÙ† Í\ÎSÎVÎWÐXÏZÏ[Ð]Ð_Ñ_Ñ`Ðbá™Þ—Þ•ß“ ß’ß’àá‘àáà‹â‰â…çž*è³Mã©AÞŸ5Üœ1Ûš*Ù˜'Ú—$Ú—#Ûš'Üœ)Üœ(Ýž(ß¡+á¢(ã¢&ä£(ä¢&æ¢ æ¡åŸäžã›á–á’áß݈Ü€Ú|ÚxÙwØv×tØq×o×o×rØsÙpÙmØhÖ`ÒVÒRÒNÐLÐKÎHÌAÈ<Ã7¿2»,¹*¶(²&°%®$®$¹-Æ:É@ËEÎJÐPÐRß è¡ éŸ ê£ì¤ ì¤ í¢ ì™í›ì¢ ì£ì¤í¢ëŸí á‚ ËOÊLÌNÍRÏUÎT݃óÊZñÂOò½=ô¸+ô³ó¬ñ£ îœì–éâÞzበí³?é°7åœä—å–ã”â’âáááŠàˆßˆÞŠ݈Û†Ú‡Ùˆ؉Ö‰ÖˆÖ‡Õ‡Õ‡Ô‡ÒˆÒ‡Ò†Ó†ÒˆÓ‹ÓŒÕ ×“Ü•á•ã‘ ååä’ä“ä•ä—ä•ã—ä˜å™㜠ã ä£ä¥ ä©'ç¬*è®/é³6î¸>î¼Gï¿TïÂYïÄ`ïÄgìÃfé¿bçº_å·\ä·Xä¶[ä¸eÞ§NІÑ„ Ò†ÒˆÒŠÓÓ‹ÓŒÖØ’ّْْؑÚÛÒnÌRÎUÍVÎVÏXÐYÐ[Ð]Ñ]Ð_ÐaߘÝ–Ý“ Þ‘ Þ‘ÞߎàŽߎߌà‰à‰áƒä™#è²Pâ§@Þ¡8Û›1Ù˜)Ø—&Ø•%Ù–$Ú˜$Ûš&Ûš#Ü›$Ý$ß %â %â¡$ä¢$æ¡æ äžäã›â–à“ ß ÞŽ݉Û„Ú€Ú}Ø|ØyÖtÖoÖlÖkÖm×n×nØk×fÖbÑWÐPÑMÐKÏJÍDÊ=Ä9À4½.º+·(´'°%®$­$±'¿3Ç<ÊAÍFÏKÑPÏQÛy é  éžë£ë¤ ì¤ í ìœì¡ì¤ ì¦ì¦ì¥ì¡ìž ê™ ÖjÌMÎRÎSÏWÐX×r ñÁQòÅTò¾>ó¸*ó³ò«ñ¢ íšë“æˆãˆë ï¶-î¹Dçå’å’äãŽâã‹ã‹ã‰â†â…á…á†à‡Þ…Ý…Ú†Ú‡؇؇؆ׄքքÔ„ÓƒÓ„Ó„Ô„Ó†Õ‡ÔˆÔ‰Ôדؕܕᒠååä’å”ä”ä•ã™ä›åäžä å¢å¥ åª(é®1ê²3ì¸<îºEïÀSîÃ_îÃdîÄdìÁ_é¼[èº]æ¸\å¹]å¹^ä·^ä·dÕ•,Є Ñ…шЈщщÒ‹ÕŽÖ×Ù’Ú’Ù‘ÚÙŽ× ÍZÎRÎTÎVÏWÏXÐZÐ[Ð\Ð^Ïaß–Ý“Ý ÜÞŽߎÞŽßÞŒ݉߈Þ†ßã‘é²Nã©FÜ 8Ú˜*Ø”%Õ”!×”"Ø•#Ø–#Ú˜#Û˜#Üš&Ü›&Þž%á %ã¢'ä¢'ä¡#åŸåŸäâ™â– á” ß’ÞŽ Ü‹هلÙ€Ø×|ÖvÕoÔhÒfÔi×iØiØi×dÖ`ÑWÐPÐNÐLÍGÊ@Ç;Ã6¾0»*¸(´'°%¯$¬#¬#¶*Ã6Ç<ÉBÌGÏLÑPÐQÙsèŸ èž é¢ ê¤ ì¤ ëžëœì£ ë¦ë§ë§ë§ì£ìŸ ëœ ãˆÏXÎTÏWÒ[Ô]Ódí´CóÇUò¼>ò¸,ó³ó©ï¡ì—èåŒí©ð¶'ñ½Bë©'æŽåŽä‹äŒã‰ãˆã†á…â„âá‚áƒá„â…â…ß…߆܆ۆچÙ…ׄ׃փÖƒÕ‚ÕƒÔ‚Ô‚ÓƒÔƒÕ„Õ†Ô‡ÔˆÔŠÔ ×“Ý”â‘æå‘ä’ä“å™ä åž åŸäŸäŸä£ä¨$è®-ë³7ë¹Bí»IîÁXïÃaîÃdîÃaì¾\ê½\é¼_æ¹]å¹\ä¸]ä¸`å¼kÝ©RÏ„ у Є Ð… ЇшÑŠÓÕŽÕבØØØ×Ø‹ ÒlËQÍTÎUÎWÏXÐXÏZÏ[Ð^Ð_Þ•Ý’ Ý ÝÜÝÝÝŒ݈݉އ߅Þ~áŽè¯Jâ¥@Ûš0Ú—)Ø–&Ö”#Ö“$ו#Ù–#Ú—#Û™$Üš$Ý›$ßž#àž#áŸ&áŸ$â  ä äŸâœâ˜á• á“ ß‘ Þ܋ۈمׂØÖ|ÕwÓpÒhÐdÓgÔg×d×dØcÕ`ÏUÍOÏNÏKËCÇ=Å9Á3¼-¹)¶'±&®$­#¬#­$».Å8È=ÊAËGÏKÏPÐQ×læ› çé  ê£ í£ ìšë›ì£ ë§ë¨ì¨ì¦ë¥ì  ë› é–ØnÏUÐ[Ó]Ô_Ò`é£1óÉUò¼>ó¸.ô²ó©ïé’æŽï«ð¶,ð»?ñ·Aæå‰äˆä†ã„â‚â€áá~à|á{à|à|á}ß߀߀àÞ€ÞÜ€ÛÚØÖ€××~Ö~Ö}Ô~Õ~ÔԀւՄԄӆӇӉԎג Þåæ‘ä’å–åšå åž äŸäŸä¡ä§!ç¬)é´9ë¸Fì»MíÀ\îÂ_íÂ^íÁ^ìÀ_ì¿^è½\å¹Xä·XâµWã´Yã¸aâ´bыςЄ Є φ ІцчÓ‹ÔŽÕÕŽ׎ØŽ׌Ø‹ ×ÌXÌRÌTÍUÏWÏWÏXÐZÐ\Ï^Þ”Ý’Ý ÜŽÝŒÝŒÝ‹܉݈݇܆Ü„Ý~Þ… ç¨@á¢;Ûš0Ø™.Ø–)×”%ו%Ø–%Ù˜$Ú˜$Û™$Üœ(Ýž(ßž$àž"á"áážããâ›â–á“ ß’ Ý ÝŒÛŠÙˆØ…ׄ×ÖzÓsÑoÎgÎcÏcÓbÕ`Ö`Ö`Ô^ÌTËMÍMÎJÊAÆ:Â6¾0º+¶(²&¯%­$¬"ª!±'À4Å:È>ÉBËGÏKÐPÐRÔbã’æ›êëŸëŸ é™êê¥ê©ë«ìªë©ë¥ë¢ìž ê™áƒÑ\Ò\Ó_ÕbÔbãóÈTò¾Aò¸,ô³ò§ îšçŒí¡ð³î¶0òÀHéœä‚äƒãâ~á{àyàwàvà|à‚à…á†à†߆߇Þ…ß„݃ÜÛ€ÛÛ|ÛxÙvÙvØtØuØvØwØvØwØxÖyÖzÖÖ‚Ö„Õ…Ô…Õ‡Ô‹Õß‘æå’æ•å˜å›åœ åœ äŸâ ã£ç«&é´;ë¸Hë¼NìÀYîÁZîÁYíÁ\íÁ[ë½Zé½\æ¹Zä·ZãµUâ±MâµVã·bÔ“+Ì΃ Ï‚ ΂ Ï„ Ð…Ð… чӋҋӋՌ֋֊֊ى ÐfÊPÌSÌSÎVÏXÐXÏYÏ[Ï]Þ“Ü‘Û Û݌܋݋݊ۈ܆Ú„ÛÛ|Ü|åŸ1â¥?Û›0Ù˜*ו%Ö”$Ö”#×–%Ú˜&Û™%Üš$Ü+ÞŸ+àŸ'áž#áœ!áœâœâââšà—à• à’ Þ Ý܊ىن׃Õ~ÖxÒqÏjËcÊ_Ì_Ñ^Ô^Ô]Ô\ÓXÌPÈKÌJÍHÊDÇ?Ã9¾0¸)³'°&®$¬"©!«"¹+Â5Å:Ç=ÉDÍIÐLÑQÑTÒZáˆæšé›éžéœé—è ê«"ê°*ë°(ì®!ì¬ì©ì¤ ìžë˜çÖhÒ[ÔaÕeÕhÚwïºEòÃJñ¸,ô±ó¦ ì“éï­ì°ï¹5ï±0å†äâ|àxÞsÝrÜnÜtâ…ãááŒàŠà‰ߊÞˆ݇܇ڇن؅ׄ×Ö|ÖwÖrÖmÕjÖmÖp×qØrÙqØsÙuØwØ|Ú€Ú„؆ׇÖ‰Ô‰׎à‘ææ“ç—噿› æ› ã ãŸä¡ç§!è³8ê¸Gí»Lî¾RïÀTïÀXíÁ]íÀ^ëÀaè¾cå¹\ä·Xã¶Uã³Pâ´Tä¹bØš7ÌÍπς σ Ñ…ццÒ‡Ó‰ÓŠÓŠÓŠÖ‰ÕŠØŠ ÔuÊRËRÌSÍUÎWÏXÏWÏZÏ\Ý’Ý‘Û Û܋ۋ܊܉܈ۅÚ‚ÚÚ{Ùuà’ã§>Û›1Ø—,Ö•'Õ”%Ö“$Ø•%Ù—&Ú™%Û™#Þœ'Þž(áŸ%áž#á"â á ââœâšá˜à— à”ß’Ý ÜŒÚˆׂÖ}ÓxÒrÑkÎdÊ_ÈXÉXÎZÑ\ÒYÓUÑRËNÇHÊGÍNÐTÐWÐUÌMÃ<´*®#®!¬"©!¯$½.Â7Å;Æ=ÉCÍIÏMÐQÑUÐUÜ{æ™ç—èšè—ç–é§ì´3í¶7íµ2í³-ì¯"ì¬ë§ë  ê™ê”ÛrÓ^ÕdÕgØm×kçœ%óÈSñº8ô²ó¦ èì™ ï¯í°!ðº7è˜ãzáyßtÞoÜgØdÝtãˆá‡ÞÞ߃Ý€Ü{ÚyÚ{Û}ÚÙ~Ø~ØÖ€Ô€Ô~Õ|ÒzÒwÐuÏuÎuÌsÎrÎqÐqÕr×s×vÙ{Øׄ׈׉؇׊ÙŽáæ‘æ”æ–æ˜æ› åœ ãžãŸæ¥è°6ê¶AíºFî¼Jï¾MîÀUìÂ_íÂdêÁeæ½bæ¹ZåµRá±Lá°Ká±Nã¶YÖ˜4Í|΀΀ÏÏ Ï„ Ð…Ñ…Ñ…чщÒ‰Ó‹Õ‰Õ‰Õ‰ Ö‚Î]ËPËRÍSÎUÎVÏWÏYÎ[Ý‘Ý Û ÛŽÛŒÜ‹ÜŠÚˆÙ‡Ú„ÙÙ}ØyØsÝ„ã¦;ÝŸ7×—.Õ•(Õ”'Ö“%Ö“#Ø–$Ù˜$Ûš%Ý(Þ'àŸ'á %áŸ#á "âž!âââœã›â˜ß–ß’ÞŽÜŠÙ…×ÕzÒvÑoÐeÍ`Ì\ÇTÆSÌWÏWÐQÏIÍKÈHÇHÌRÒ_ÔeÕhÖg×gÔaËN¹3«!« ª!³'¾0Á6Ã;Æ>ÉDÌIÏMÑQÑUÐRØlæ–å•ç–ç“è™ í´3ï»Bï»Bïº>ï¸7íµ0î°$ìªë¤ë ê—ß~ÓaÕfÖjÙnÙlÝ ñ¾Jð¿Eó´#ó¥ æŠí ï¬í±#í±-ãƒásßoÜjÙcÖ_Þtã…à†å˜!ê¬<î¹Nð¾YíºUé­@æ /á‘Ú}ØvÚxÙ|Ø{ÖyÓyÓvÒuÒtÑsÎtÍsËoÉoÉoÉmÊmËpÏrÑtÓyÔ~Ԃֈ؎٠ۊڋÛã‘å‘啿–ç˜æšäœ 俤è°4éµ;ì¹Dî»Hð¾OîÂ[îÃcìÃdéÁcç¼^æ¹Wä¶Sâ±Oá¯Já¯Kã³TÕ•*ÌzÍ~΀΀ÎÍÏ‚ ЄÐ…цЇÒŠÑŠÓˆÔˆÕ‡ׇÒoÊRËQËRÌTÎTÎVÏWÏXÞ‘ ܎ۋييۉڈڇ؄؂ØØ{×wØtÚ{â¢4ß 8Ø–+Ô’$Ó#Ô‘#Ö“$ו%Ù—%Úš'Ý›&Þ›&ßž)àŸ$àž"àž$áŸ$ã"âáœãšâ˜á” áދۆڃ؀Õ{ÓxÓqÒhÐdÏ^ËUÇRËTÎSÎMËCÈDÉOÑ^Õi×nÙoØqÙqØo×nÙjÓ_½=©!«"µ*¾0Â6Ä;Æ?ÉDÍHÏMÏQÐTÐSÔbãä•å•å’è–î¶7ñ½Fï½Fî¼Dí»?î¹<îµ2ì®!ì§ë¡ êšã‰ÖhÖgØmÙoÚqØqç¢*óÅOñ¶.ò¥ å‡îž î«ë²%éŸàtßmÜgÖ]ÓZßxä‰åš"îºPòÉaòÈ_îÁUê·Gç±<è³@ë¹Lì¹Kë°BäŸ1ÖrÓfÖo×vÕuÒrÒpÐoÐnÎmÍmÌjËiÊiÊhÉgÉhÊkÍnÐsÒxÕ€Öˆ×Ù•Ü•ÜÛŠßåæ“ç–è—ç˜äšä› å ç¬/ëµ;ë¸BîºDï¾SîÂ]íÃbêÃdêÁfè¾bæ¹Yä¶Uá²Qâ®Má¯Mä´VÕ"ËyÎ|Î}Í~ÌÌÍ€ ΃΃цццшÒˆÓ‡Ô† Ô† Õ~ÍYÊOËRËRÌSÍTÍVÍWÞ’ÝŽ ڊهننن؃Ø××|×yÖv×tÙsà—%Þ 5ו'Ô‘#ÑŽ!Ó"Õ‘"Ö“#Ø–#Ù˜#Ü™$Ý›%Ýœ&ß"à"àž#âž#â#âœâšã—ã‘߇Ú}×y×{×}ØzÕtÓsÔtÕsÔqÒjÎ]ËVÌSÎNÌGÉEÍSÔfÖn×rÙuÙvÙvÚvÚvÚtÙqÙoÕe¾@±'¹+¾2Á7Å:Ç>ÉDÌIÏMÏPÐSÑSÑXà„ä”ä”å’åŽì«&ñ¿Jð¾Jï½Fî»Bîº@í·9ì²*ëªì¥ìŸè”ÚsÖjØoÙnÚrÚtÝ€ï¹Að¾>ò©ä„ì  ì«ë°%åŒßlÛdÖZÐTßtç’ë®4ñÄYí¾Ké®2ãŸß”Þ“Þ“Þ• Þ™á¡æ«/ë¹Fä§>ÔvÌ^ÆQÍ]ÒiÓjÒkÏjÎhÍgÌeËdËdÊbÉbËbÊeËhÍlÑrÔ~Ö…ØŒ Ú“Üœ#Þœ!ÜŽÜŠáæç”è–ç—å™ã™ äžçª'ì´;í¸AîºEîÀUíÃ_ëÃdëÃiéÂké¾hå¹[âµQâ²Pà¯Má°Oä´VÔ"ËvÎ{Ì{Ì}Í~Ì}Ì}Ì Í Ï‚ Є τфхӆ҅ Ô„Ö„ÏfÈNËQÌQÌQËQËRÍUÞ“Ûڊڇهن؄ׂ×€×}×zÖwÕtÖs×o܇Þž-Ø“#ÕŽ ьҌ Ò!Ô‘"×”"Ù–"Û˜!Üš$Ýœ#ßœ ßž$áŸ&â"áâšâ‘ ÝØwÖs×w×{ۃ܅ ÛwØm×oÖrÕrÔqÓnÐfÍ\ÍQÎLËHÊJÔdÕoÖtÙwÚyÙ{Ú{Ú{Û{ÚzÛxÚtÚqØgÇH»/¾1Â7Å:Æ?ÉDÍIÎMÏPÐQÐTÐTÚså“äæ‘åŒê£ñÀOïÀLï¾Hï½Dî»@í¸:í´1í®!ì§ì£ ìâ‚×kØmÙoÛrÜxÚtã–ñÂHñ°$ß~ê› ë©é§â{ÜeÖZÍJÕ_çŽê¬%íºAä¡!ÞÛ„Ú~Û~Úƒ܇Ýݑޖ ážå«,ë¹?ð¾Hð½TÜ=¶6·4ÀBÅMÉWË\Ë^Ë_Ê^Ë_Ë^Ê]Ë^ÌaÌcÌgÐlÓvÕ‚ÙŠÛ“Üœ#Ý¢0Þ"Û‹ÞŒæç‘è”ç–å—ã˜äç¨#ë³7ì·@í½PíÁ]îÃbëÄgìÄkêÂjè½`ä¸Xâ·Uà²Qß®Là¯Oã³WÕ$ËvÍ{ËzËzÌ{Ì|Ì}Ë}Í}Ì Í Îƒ ΃ Ï„ фх ÓƒÕ„ÓtÉQÊNËPËQËQÍSÍUÝ“ÛÚŠ؉؈ׄÖ‚Ö××}ÖzÕwÕuÕr×m×uݓْ!Ó‹ЈЈЊÓŽÔ×’Ú–Û˜ Ûš Üš Þœ"áž#áœá–݇ÙwÙx݃ã ä• ä— ã• á à„ Ý|ÚxÕtÓrÔqÕsÒpÐgÎYÎPÌNÌSÔjÔs×vÙzÙ|Û~Ý܀܀ÝÜ}Ü{ÜwÛs×iÉK¾4À7Ã;Æ?ÉDÌHÎMÐOÐQÐTÐTÔdääåäŠé¦#ñÁPïÁNðÀKð¾Gî»>î¹9îµ2ì°%ì«ë¥ì£ ç‘ØnØmÚrÜsÜwÚtÜ~í´4ò¼7Ù|æ‘ë§ æ™ÞpÙ_ÑPÊFàxê¦ë±0Þ‘ ØyØtÕnÔjÔl×pØxÚÛˆÜÝ•â¡ç¬/ê²4î¼GøÓlÒ~5¥­%°-ÀKÆWÄRÄOÉVÇWÇWÊWÉYÊ\Ì_ÍcÐiÒsÔ~Ù‡Ú Ú˜Ûž/ÜŸ/Ý—Úˆàææ“æ•å–å—ä› ç¦#é±3ì·Aë¾TìÁ[íÂ^ìÄfëÃkèÀdæ»[å¸Zä¶Uá°Mà­Jß­Iâ±PÕ#ËvÌzËzÌyËzÌzÌ{ËzË{Ë}Ë Ì€ Ï€ Ï‚ σÑ„ Ò‚Ó‚Õ|Ë[ÉMËPÊRÌSÍUÎXÝ•Û‘Ú ×‰Õ‡Õ„Ö‚Ö×Õ|ÔyÔwÔuÔpÖmÖlÖ~ÚÒŠІÏ…φÑŠÔŽ×Ø“Ú•Ü—Þ™Þ™à˜ߎ Ù{×yÞ‹ 囿 æŸææ›äœä˜㔠①ߊÛ…ØÔyÔwÔuÔtÓmÒfÑ`Ð]ÔnÕu×xÙ}ÚÛÝ‚݃܄߄ނ߂݀Ý|ÜxÚlÊKÁ8Ã<Ç@ÊEÌIÎMÏNÐPÐSÐVÐYßååŒåŠê¦#ñÂRñÂRñÂKð¾Dï»=î¹9í¶3í±'ì¬ì©ì¦ íŸÝyØmÛsÜuÚtÙqà|ì¡ñ¾>åœ#çì¡æŒÜgÖWËFÐSè–è®)à’×qÓgÎ[ËSÈPÉQÌVÏ_ÖoÚ}ۄ݋ߖ ã¤!è°0î¹@òÇ_ï¾b³= ¬+Õx âšãß“Ìi¼?ÁHÄMÆPÇSÉWÊ[Ì`ÏhÒrÕ}؆ٌܗڛ+Ú›+ÜšÛ‰܈ãæ‘æ”æ•å•ä˜ æ¥!é±4ê¸Dì½Së¿WíÁ^íÃfêÂièÀgç¾bç»\å¶Tâ°Nà®Jà®Iã³QÓŽ ÊsËvÊxÌxÍzËzËzË{ËzÍ|ÍÍ~ Ì~Í ΀ Ѐ Ñ€ÒÕÏhÈNÉPËQÌSÍTÍWߘÜ•ÚØŠÖ‡Ö„ÖƒÕÕ~Ö|ÔzÔvÓsÓoÔl×lÒqÔ~։х Є ІЈÓ×Ù’Ú”ܘߙޑڂÖtØ}äšå¢%ä£,ä¤.ä¤+ã¢&å  æŸåžäœãšâ—ᓠߌÚ„Ø}×yÖwÕuÔsÕoÔhÕp×vØ{ÚÚÛ„܆ÞˆÞŠ߉߉Þˆà‡àƒÞÞ|ØnÈKÃ;ÇAËFÍJÍLÎNÏPÐQÐUÐUÙqå‘åå‰é òÂSñÃVñÄVðÀPî¼Hì¹Bì·8ì³,ì®í«ë§î¥ å‹ÙnÛsÚsÚqØpàë—ð².ï¸7î ì”ç‡ÛfÑPÅ=×gé¥à”ØqÓbËRÅGÀ?¼7º6»:ÆOÖlÕnÙxÚ‚ÜŠà˜å§$ì·>ðÃWøÐpÏo$È\äšá› ã¡çªê±0Éj³0¼=ÂGÅNÇRÉVÌ]ÎhÑqÕ}ׄÙ‹Ú”Ù—!×—#Ú•Ûˆل݉äç’æ•å•ä–å£ é±5ê¸Fë»Mí½TíÀ[ìÄhêÃjêÀié¾aç¼Zå¶Tä´Pà±Jß®Iâ²RÓ‹ÉsËwËvËvÌwÊxÈxÊyËzÌ}Ì}Í~Í Í~Í}Ï~ÏÑ€ÓÑrÈQÊOÌRÌSÌTÍWÞš Ü–Ù’Ù Ö‰Ô†ÕƒÔ‚Õ}Õ|Ó{ÒwÒsÑnÔk×kÔoÐrÒyÔ€Ó„ Ò† ÒˆÔŒ×ڔݖݔۈ ×yÕrØ{ä"å¦.ã¤/â¦4ä¨6å¨4ä¦/ä¤(æ¢!æ¡å äžã›â˜á•ß Þ‹ÛƒÙØ|×x×u×sÖq×v×}ÙÙ„ÛˆÛ‹ Ý ÝŽßàߌߌà‰à‡߃ÞÛrÍRÆAËEÍIÎLÏMÎOÏQÐSÐTÖfææŒåˆç–ðÀOðÆ^ðÄ\ïÁUî½Lë»Eì¸>ì´2ë±&ì­ìªì¦ ížÞ{ÙpÙrØnØpá€èï¦ð¹6î¯'éŽèˆÚeËGÀ:ÛsåžÛÔeÊPÂ@º5º:¿JÈZÏhÙwÜ|ÑaÍ[×vÙ€܉á™è¯1ðÀQôÌjà›?ÖxÞŽà”âœä£æ­(é±2¿S ¯)¹:ÁEÆNÈTÊ[ÍeÑoÔyÖ‚Ùˆ׎ Ö‘Ô×’Ú†ÚÚ…à‹æå“å”ã”ä é±:é¸Jê¹Jì¼Pî¿WìÃeëÄiêÃiè¿dè¼]å¸Tã´Oà¯Ià®Gá°MÒˆÊsÊwÉuÉuÊuÈwÉxÊxÊyËzË}Ê{Ë}Ì}Ì|ÎππÒ~ÒwÉWÈNÊQËRÌTÌUÞš!Ý—Û”ØØŠ׆ÕƒÔ‚Ô€Õ~Ô{ÒwÒsÒnÓlÖjÔlÐpÏsÏtÐxÒ|ÓÖ… ׈ ×… Ö~ÔwÓrÔsÔtà’æ©7ä¦9ã§9â¨=ã©=å©9å¨2æ¥*å¤)æ£'å¡"å ãžã›â™á—à–ß Ý‰Û…Ü€Ú}Ù{×sØvÙ}لۈ܊ ÝŒ Þ ßá àáááŽáŒâ‰á‡à„ÝxÏVÊEÌIÍKÍLÎNÐQÐRÏUÒ[âƒåŒå‰äŒí¶BðÆ`ðÄ]îÃ[îÁVî½Mí¼Fê¸<ê´1ê°%ë¬ë¨í¤ ê•ÛsØn×mÚqáæŒìœ ð®%ï¸4ë£æ…ÛfÁ<¸6Ýsã–Ü€Ð\¾<¹8ÅU×xÜ„݆ß…Ü€Ü~Óf¿>ÂJÓmÙÛ‹ä¢ð¼GòÇjê´QØ€Û‡ߎá˜ã¡ä¦êµ1Û‘)ª*°,»:ÃHÆRÊYÍcÒoÕx×؆׋ÔŽÔÖ‘ÛƒÚق܆äæ‘å”ã“âžæ±<ç¸Jë¹HîºIì½SìÁaëÂeéÁfèÀeè¼\ã·Tâ´Rá±Ná°Kâ°MÒ†ÉqÊuÉtÉsÈrÈtÈvÉvÉvÈwÉzÈyÊyÌ|Ì}Ì~Î~Î}Ð|Ñ{Ì`ÇMÉPËQÌSÌUß› ݘÛ–ÙÙ‹׈Ö†ÕƒÔÔ~Ó{ÓxÒsÐoÓlÕjÕjÐmÐpÏsÏrÍsÍtÎsÎrÎqÐoÒpÒrÒq×}æ¢.æª@ã©>â¨>â©Aã©Bãª=å©7å§4ä§2å¥.å£(å¢$ä åœäšä™â˜á—áà‹߉Þ…ÛƒØwØvÚ€Ù†܉ÞŒß à‘ à“ á’ à“ â” ã” â” á’ ââà‰à…Ý{Ò]ËIÍJÎMÎNÐPÐQÐTÏUÝwåŽäˆâ…ê¥(ðÅ_ïÃaîÃ^íÁZîÀVí¿Pì»Fë·9ë´/ë° ë«ë§î¢äŠ×kÖlÚrâ~ä‡ê“î¢î¯&íµ0è›Þh¼6µ5Þjá‰àŽÍ`ÂMÒtÚˆÚˆÚ„ÚƒÛ‚Û~Û|ÖmÇJ·4¼?Ðg؀ߑî´6ðÄhê¶QÚ‚Û݉à”â ä¤å¯.á¤4ª4¦#°.¾@ÅOÊWÍaÒpÖ{ÖׄØ‹ÕŽÔŽÖ ÚÛ~Ú€ÛƒáŠæå’ã’âœå¯<è¶Gë¸DíºHì½SìÂ`ëÂdëÀcê¿aæºZã·Yâ³Sá°L߯Nà¬KÏ€ÉrÊsÈrÈqÇqÇqÈrÇsÈtÇtÈvÈxÉyÊ{Ê|Ë|Ì|ÍzÎzÑ{ÎiÇLÈNÊQËSÌUà#ߙܕڑ٠،ׇÖ…Õ‚Õ~Ô{ÒwÑsÑoÓmÕkÕhÒkÎnÏrÎsÍsÍsÍrÎpÏrÐqÐqÑpÑpÞç¬>ä¬Eã«Cã©AâªBäª@äª<ä¨:å©9ä¨7ã¦2ä¥/ä£(å¢%å "åäãšâ˜ã” âááŠ߈Ü}ÙvÛ܇Þ‹ߎ ß‘à• â– â—á™ãšã™â™â—ã–ã” âáŒà‡Þ}ÔdÌKÍLÎNÎOÐQÐRÐSÖiå‹ãˆã…áˆí³?ðÅ_îÃ_îÄ]îÄ_îÄ\íÀOí»@ë·5ë²,ë¯ ì«ì§í  ÝzÖiÚrà}âƒçŒì˜í¦ì¬!í°$扻7³/Ü]Ýnކك؄ىׅنڇ܆܄Û€Ú{×oÍV¿>µ2¸8ÐgÛ…è©*ðÅbæ«=ÓqÙ{Û…ßá›â£å®,ã¨4¦4 ™¤#¶7ÄKÈVÎbÓrÖ}׃؆،֎Ԍ ×…ÙzÙ|Ú~ÙÜ…ãå‘ã‘â›å­6èµDëºIí¼Kí¾RíÀZìÁ`ëÀ`ê¿^æº[â´Uá¯OÞ­IÝ«KܧFÎ} ÊrÊrÈqÈpÈqÇqÈpÇqÇrÇsÇvÇwÈxÈzÈzÊzÊyËwÍwÎyÎnÅMÆLÉOÊRÌSáŸ%ß›!Ý–Û“ÙØŒ׈׆ÕƒÔ~Ô}ÓyÒtÒpÒnÔlÕhÔiÏmÏpÍrÏrÎrÌqÎoÏoÎpÏpÐoÒtãž,è®Då®Eå«Bã«Cá©Bâ©?ã©=ä©>ãª<ã©;ä¦6ä¦0ã¥-ã¤*ã£)ä "ãžäœâ™â˜â“ âáŽá‹à†Ú{Ü€Þˆߎ ß‘à•á˜âšâœãäžäžääœãšã˜ã–ã‘ áŽàˆ߃ÔdËKÍMÏPÐQÐRÐSÒ]ã…äˆá„ßàˆì³AïÆbîÃaïÄbîÅaíÃXî¾JíºBì·7ë³,ë¯"ë«ë¥é™ØsÙoà{âä„èŽë›ì¤ë§í¯"Ù|ÉPásßyނڈ؇؇Ù‡ڇۇ݆܃ÜÙ{×rÑ`ÄG»:²/·<Òpéª2ñÅ[ç«3Ôm×rÙÝŒá˜ã¢ä­-ä«5¨9 “—©)ÃIÈVÎfÔtØ~Ø„؅׉ÕŠ Ó‰ׄØxÙ{Ú|ÙÚ‚à‰æäà— ä«1è·FéºKî»Kî¾OíÀXëÁ`êÀaé¾`å¹Zá³Q߯MÞ«FÝ©CÛ¤=Ï| ÌqÊrÉqÉqÉqÈpÇnÇpÇqÆqÆuÇvÇvÇxÈxÈxÊyÊwÌwÌxÍqÄNÄIÇMÊPËSã %ߜޗܔÚÙŒ ׉ׇÖƒÕÕ}ÒzÒuÒqÒnÔlÕiÕgÑlÏoÎpÍrÌrÍpÍnÍnÍnÏoÏlÔzå¤5ç­Eå­EãªEá©Eà©Dà©Bã©Aäª@ãª=ã©<ä§6ä§2ä§/ä¤,ä£)ä¡%äŸãœä›äšâ—ã“ â‘ âáރ܀ފßß”à—ášãžäŸå å¢ æ¢ ç¢ æ¡ä ãœã›ä˜ã” âߋ߂ÕdËKÎNÏPÏPÐSÐVÞxã‡àßß{Ý}è§9ïÄ[íÂbìÂaíÃ^íÁXì¾Në»Hë¹>ëµ/ë°$ë«ì§åØoÝwß{â€ä‡çŽêš ê é£ë©ç‘ ã‚á…Þ†Ú…Ù†Ú‡چ܆܅݄ÜÛ|Ùz×rÒfÈP½>¶7®-¿MðºNðÄSê°6ÒmÕlØ{܈à–â¢å¯/Üš/¢(™•›¾CÉVÏgÔuÖ~Ø„ׇևÓ†цÖ‡Ø}ÙxØ{Ø}ـ܅ãäà”ä«/ç¶Fé¹Kí»Kí¼Nì¿VëÀ^è¾`æ»^â·Uà²KÞ­Hܧ@Ú¤<Ú¢;Ï~ ÉqÉrÊqÉpÈqÈpÇpÇpÇrÇrÇsÆtÇuÇvÇwÈwÊwÉwÌvÌwÎqÂLÀDÅKÇNÊQäŸà›ߘÝ•ÚÛŒ Ù‹؇ÖƒÖ€Õ}ÔyÒtÒrÓoÓlÔiÔgÓjÏmÎoÍpÍoÎnÍnÍmÍmÎnÎlÖ ä¨=å¯Iä®Hâ¬Gà©Dà©Bá«Cá«DáªCã«@ãª?å¨8å¨6ä¨5å¥0ä¤*ã¢'ä "ãŸ"âœã›ãšã—â” â’â‘à‰Ü€ÞŠß‘à–á›ãžä å¢!æ¤$å¦%æ¦&æ§%ç¦$ç¥ ç£æ¡åžä›ã—â‘àŒàƒÓdÌMÎOÏPÐSÏRÖfâ…߀ß~Þ|ÛrÓ`ߎ&ì¾RìÂ^ìÀ_ìÂ_ìÁ\ìÀXì¾Mìº>ì¶3ì³)ë­ë¦äŽ ÜvÝwà|ää„ç‹é–è›çž é¡ã‹à{ßÝ܃܂݄݃Ý‚ÝÜ~Ú|ÙxÖqÓhÍXÂEº<±.ÂZðÅeî¿Iè­6ÍbÒgÖvÚ†Þ•á£ç²4ÆkŸžš˜µ;ÊZÏkÔwÕ€ׄÕˆÔˆÒ†цÒ‡׈Ø|ØyÙ}ØÚ߈äá“ å©.ç¶Bé¹IìºJí»Mì¾Rê¿Wè½\æºZãµPá±JݪEÚ¥>Ø¢9Ú¤=уÊnËrÊpÈqÉpÉpÇpÇqÇrÆsÆsÅsÅsÆtÆuÈvÉwÉwÌvËuÎrÁN½@ÂHÆLÈOå âߙߕݒ ÛÚ‹Ù‡׃Ö€Õ|ÔxÔuÓrÓpÓlÕjÖhÖhÑlÎnÎoÍnÌmÌmÍmÍlÎmÍkÖä¨@å®Iä­Iã­Iá¬Fâ«Fâ¬FáªDáªEâ«Eä«?å©9å©9å¨8ä§7ã¤.ä£(ä¢%ä¡#âŸâœãšâ™â– â• â’à݃މߑ à—âã¡ ä¤#å¦%æ©)æ©(çª,ç«.ç¬-çª*ç§&ç¦$ç¤æ¡æ åä—â‘à†ÓbÌMÏPÏQÏRÑ[à~߀Þ|ÝyÝuÓ[ÎOÚxç©8ì¾SëÀ_ëÁbìÁ`ë¿Xì¼Lí»@í·3ìµ,ë¯"í©é— ÞzÝuâ{ãã‚å‰ç“ç—çšçœã†ÞyÞ|Ý|Ü}Ý~ÝÜ€ÜÛ~Ù{ØvÖpÒhÎ\ÆM¾?·8ß›HíÂ\î¾Bå¦.ËXÑbÕrÚÞ”ã«+ߢ0³=¦$¢ Ÿš³8Ê^ÐnÔzÕׄÕ‡Òˆш Ї І ÔŠ؃ØxØ|Ù}ØÝ…äŽà“ä©.æ³=é¸FêºJë»Në½Së¾Té½YæºXä·Wá³PÝ«GÛ¦B×¢:ؤ=Ô‹ÊnÊpÉpÈpÉoÈpÇpÇpÇqÇrÅsÆsÅrÅsÆsÆuÈxÉxËwÊtÎtÁTº=ÀEÄJÇNå¢'ã !âœߘߔߑ Ûډ؅׀Ö}ÔyÓuÓqÒoÓlÔjÕi×hÔjÏmÎoÍnÍnÌmÌlÍlÍlÍkÓ| â¤6ã¬Fä®Kã®Lâ¬Iã­Iä­Iã­Fâ¬Eã«Cä«=åª8æª9å©7å¨5ä§1ã¥+å£*å¢$äŸãã›â™á—â• á“ àŽÜ…܆ßá—âä¡"å¥(å¨+ç¬.è­0è¯3é¯5é¯3é®2é­.è«+ç¨$ç¨%æ¨'æ¥$æ¢ äœâ•àˆÓbÌMÎPÏQÍSÚoàÜzÛwÛsÔ^ÏPÏQÑ[Þˆê²@ì¿WìÁ_ë¾]ê½Vë½Ní»Cíº<ï·6ì±'ë«é™ ß|Ýsàyá|âäˆåä“å–å–ßÜuÝxÜyÛ{Ü}Û}Û|Ú|ÙyØuÕpÑgÎ]ÉR¾=Ïq#é¿^ê¸Dî¾=ã› ÆPÍ]Ôo×}ßšå²4Ìv¯,­+¦%¡ ›³8ÍbÒqÔ{Ó~ÕƒÔ…чч φ φ ÒˆׄØwØzÙ|Ø~Û‚â‹à’ã§+æ±5é·Cê»Lê»Pë¼Sì¾Uè¿Zç¼]ä·Zà´TÝ­LÚ§D× :Ö¢;Õ“(ËoÊoÉoÉoÈnÈoÇpÇqÆpÆqÅrÅrÅrÄrÅsÅsÇuÈvÉuÊtÍtÂW·:¼@ÁGÅLä¤)ä¢%ã #áߙݖݑ Û‹Ú‡Ù‚Ö~ÕzÔtÑqÑnÓlÔjÔiÖgÖgÓkÎmÎnÌnËmÌkÌkÌkÌiÏsß›(ãª@å­Hã®Lä®Nä¯Lå¯Jä®Hã¬Eã¬Aå­@ä¬;å¬;å«7ä§2ä¨1ä¦.å¤+ã¡&㟠äžãâšá™â– á“ á݇Û‚Ýß•áœã¡"å¥)æª/è®1é°4é±9ê²8ê²5ê²6ê±5ê±6ê¯3é®1è¬0ç«-æ§&æ£#åŸ ãšáÖiËNÎOÏPÓaß|ÛxÚuÚrÒ_ÍNÐRÐSÏTÕhÞ‹æ©8ê¹Jê¿RéÀWë¾Vë¼Oì»Gí¹<ì³+ì­éž Þ|Ûpßwáyá|âƒâˆãä‘ä‘ß}ÛqÜtÛuÛwÛxÙwÚvØu×rÕnÒfÏ^ÆNÑoæ²Oæ·Fë¹8ì¸.ÞÄMÊWÐhÙ‡ å¬.ÝŸ,¹G²0®,¨)¤#²8ÏfÏsÓzÔ}Ó҃Ѕυ΅ ΃ Ñ…ÖØuØxØzÙ}Ú€á‰â‘ä§*ç±6é¶?êºKë¼Oì¼Nê½RéÀ\æ¼^â·Và²SÜ­PÙ¥CÖŸ9Ô7Ö™0ËrÉnÉnÈmÈmÈnÇoÇoÆpÅpÅpÆqÅqÄqÄrÆrÆtÇuÉtÊtÍtÄY¶9º=¿CÃIå¦*æ¥*ã¢(âŸ$àœÞ™Ý•ÜÜŠÙ†ÖÖ|ÖwÔtÔqÕmÕjÔiÕfÖdÖgÒkÎnÍoÌmÍlÌkÌkÌkÌlÙŽâ¦6å«@æ°Iç³Nå±Kå°Jä®Hã¬Eä­Eæ­Cå¬@å¬?æª9æ©5å§4ä¥.ä¤*ä£(ã¡'âŸ"âáá›á—à• ß‘ÝŠÙÛ†Þ’ à›â¡!ä¨*ç¬0é¯5è±:é²:ê³:ëµ:ë¶<êµ@ì´=ë´:ë³7ê±6ê±5é°5è¬1ç¨*æ¢ ãã• ØsÍRÍMÑXÜtÛwÜsÚpÓ`ÌLÎOÏSÐUÎTÏUÒbØyÞã¡/è±>ê¹Ië½Më¼Jëº>ìµ.ì°!ê¤Þ~ÚmÝrÝußzá~áƒãˆâäÝxÙlÚpÚqÚrÙsØr×qÕoÔkÑfËWÓqè´LæµBë¸:ë¶*é«×}ÄNÆOÐlá£%ä°5Ívµ9´6®.¬*§& ´<ÐjÏrÑyÒ}ӀтЄ΄ ̓ Í‚ Ñ…Õ~×tØwØyØ}Ú~à†áä§+æ²:èµ;ê¹GìºKì¼Në½Tè¾WæºWáµSÞ°OÛ«L×£AÓœ9Ó9× :Íz ÉlÊnÉlÇmÇmÈmÅmÄmÄnÅoÄoÅpÅpÆrÆqÇrÈtÈsÊsÍsÆ]¸;·9»@ÀEçª0æ¨.ä¥+ã¢&áž#àšß—Ý’ ݌ډׄÖ~Ö{ÕvÔsÕoÖmÕkÖgÖeÖdÔgÑlÎmÎlÌkÍlÍkÌkËjÐyâ *ç­@è³KèµNç³Kæ²Må°Lã¯Hä­Få¬Cå¬Aä«?åª;æ¨7ä§3ã¤-â¤+â¤+â¢'â $ââá›àšà–ß“ ÝŽÚ„×~܌ߖážå§*ç­3ç°9é²;ê´?ê¶Aê·?ë·Eë¹Dë·?ì¶=ì·<ì·?ì·Aë¶@ê³;ê°3é«)æ¤äžäšÞƒ ÑaÍPÖfÛuÙo×mÒ^ÌKÍNÏPÎRÎUÎVÏWÏVÎZÐcÓpÚƒà–ä¤(è®/é³2ê´1ë´/ê«!߇ ÙmÚlÜqÝuÞ{߀à„â‰ãŠÜvÖf×i×k×kÖlÔkÓjÒeÍ[Ôsè­Cæ¶?é¸8ê¶-é¬â™ ÒqÂLÅTßš ã°4Úš&½O¸;´7¯1¬,©(¢!ºFÏlÏrÐxÒ|Ò€ÐÏ„΃̂̂ цÖ{ÖrØvØyØ|Ú}ß‚áä§+æ±:è´;ê·Aë¹Fë½Qé¼UæºRä·Pá±MÝ­FÙ§@Ö¡<Ó:Ó<×£AщÉlÊnÈmÇmÈlÆkÅjÄkÃlÄmÃmÃmÄpÅrÄrÅrÇsÈsÉrËqÊb½Bµ8¸<½Aè®8æ«3æ§-ä¤&â¡!á›à—ޔݑ ÜÙ‡×Õ}ÔwÓsÕrÖoÖmÖk×h×f×dÕgÐlÎlÌjÌkÌjÌkÌkÍmàš#ç²Eè´Né¶Qæ´Pæ²Nå°Kä®Hä­Få«Aãª?ã©>ã¨<ã¥6â¤1ã¤+ä¤*â£.á¢'ã %âž!âá›àšÞ˜Þ”ÞÛ‰Ö{×|Þ áœä¥)ç­1ç±9è³<éµAê¶@ì¸Aì¸Gì¹Gì¹Eí¹Cí»Fî»Iî»Hí¹Eì¸Cë¶?ë³8ê°1é¬*ç¦%åŸã–ØuÒ_Ùp×mÕkÐ\ÉIËLÌNÍQÎRÍSÍVÏWÏZÎ]Î_ÑcÔl×wÚ܇ß’äžæ§!è¬ã•ÙpØfÙkÚpÜuÞzßà…âˆÛvÓaÔ`ÔcÓdÒcÏ]Ì\Û… èµEçµ;ë¸5ì·-è¬äžÛ†ÍcÅUÛ•"ä³7Þ§/Êt ¶?·>´8°2­.©*¦&ÀPÍkÌpÐwÑ|Ñ€Ð΃Í„ Ë‚ËшÖ}ÕqØu×wØzÚ}Üàã§*æ°8é³=é¶@ê¸DéºMçºRæ¹RâµQÞ¯IÜ«EÙ¥<Ôž6Ñ›4Óš5Ô >Õ–/ËoÊlÈlÇlÇlÄkÄkÅkÃkÃjÃkÃlÂmÃnÄpÅqÆrÇqÇqÊrÍkÁK´8¶:º>é¯;è­6çª1å¦(ã¢!âžà™ß—Ü“ Ü ÚŠׄÕÖyÔtÓsÕpÕoÖkÖh×gØfØeÓiÏlÍkÌkÌjÌkÍkÍkÝ“!è³Iè´Oè´Pæ³Næ±Nå°Lã­Gá¬Cã©?â¨=á§<â¦:â¤3â£1â£/â£,â¤/á£(â %á &áž%à›à™Þ™Ý–Ý Û‹ÙÔtØ€á™ã¢'å©1é®7è±;é´=ê¶?ë¸Aì¹DìºIì»Fí»Fî¼Mï¾Oï¿Pî¾Nî»JíºFì¸>í·:ìµ6ì²2èª'æ¤å߉ ÚzÕmÓfÏYÇGÉJËLËNÌPÌQÌSÍUÍWÍYÎ_ÏbÑhÔqØvÙyÚ{݆݀à” æ¥åžÝÕhÖeÙlÚpÝvÝ{Þ€â†ÝxÒ_ÐZÎXËUÑh ãš1ëºGè¶9é·1ê´'ê­åŸ ÝŒÔsÍkÞ›%æ´:Þ¦4Ô¿W·?·>¶9²2¯/¬,ª,ÄXÌlÌoÏvÏ{Ñ~ÐÍÌ‚Ì̃ ÒŠ Ö€ÕpÖs×v×xØ{Û}ߊã¨-å¯8è³<ê¶?ê·Cé¹Iæ¹Oä¸Oá²MÞ®JܪEÖ¢;Ôœ3Ñ—.ј/ÓŸ<Öž;ËsÉkÇlÇkÆkÅjÄiÃiÂiÃiÃjÂkÂkÂkÃmÄnÄlÅoÇoÊpÌmÀL²5³8·<é¯5è­3çª0çª.å¦.ã¡%âžß™Ý–Ü’Û‹×…Ö€ÖzÖxÕvÖrÕoÖkÖhÖg×fÙeÖdÑiÏkÍkÍkÌjÍjÌkß—%è³Lç²Må°Jå°Gä¯Jã®Hâ­Eá«Aá¨@â§<â¦:â¦7â¤4á£2â¢0á¢,à¤/á£+à¡'à¡*àŸ&à›ß™Þ˜Ý—ܑی Ú…ÖyÒrÜâŸ"ã¦+æ©.è®6é²9êµ=ë·BìºHí»HíºDî¼Hî¾PïÀTîÂWíÁSî¾Pî¼Mî¼Iî»GîºCî¸>ì³2é­+ç©)å¤â™݆ÔnÊPÆDÈIÉJËLËOÊPÊQËRÌTËVÌYÍ^ÎcÑiÔp×uØwÙzÛ}ÜÞ‹â›å£á×oÓ`ÔcÖhØpÛvÛxÝ~ÚuÎ\Òd á’+í·GêºBç´1êµ*é±è«æ¢ ߎÔvÓ{à¥+äµ?Þ§8ÒÊv»L¹@·=µ:²4¯0«,°3È_ËjÌqÍuÍwÏ{Î}Ì}Ë€Í΂Ò‰Õ}ÕnÖsÕuÖxØzÙ{ÞŠ ã¨-æ®2ç²9é¶Aê¸Gé¹Kæ¹Oä·Oá²KݬGÚ§BÔž6Ó›1З.Ï—0Óž:פCÍ|ÈiÈkÇjÆhÅhÄgÄfÃgÂiÂiÁjÁkÁjÁkÂlÂkÄmÅmÉnÉjºF°2³6µ:ë°3ê¯3é­4è­4æª2ä¥*ã $áߙݔ ÛŒ Ù†Ö‚Ö|ÖyÕvÕtÕpÖlÖjÖh×fØeØcÖeÑhÎjÍkÍjÍiÌmß,å±Iå°Jä¯Gä­Fã®Hâ¬Eâ¬Bá«Aâ©?á©<ã§8ã¥3à¢0à¡/à¡/á¢/à¢/ß¡-ß¡+à¡,àŸ&àœ!à›ß™Ý–Ü’Ú Ù‡ÖÔtÕ|Þ—áž#ã£(æª2è°7é³:ê¶?ë¹Fì¹EíºGí½NíÀXîÂYîÁWîÁTíÁQîÁRîÀSîÀQï¾Pî¼Jî¹=ëµ8ê´9é¯3ç©*ä¡à’ÒiÄEÅCÈIÉMÊMÊNÊOÊQÊQÊSÊVÌ[Ì^ÎbÐhÒoÕqÖu×wÙzÚ~Ý…à’ã› ä™ Û~ÕkÙv æ›!ê¦'é¢$èŸ è ê¥(ï¸=ïÀBéµ0é¯ è®ç«ç¦åÝŠÔzØŒã¯9å¶EÛ¤2ÐÍÅg¹F¹A¶>´:²4¯2­-·?ÉcÊiÌpÍtÌvÍzÌ{Ë~ˀ͂ЄÒˆÖ„ÕrÖqÕtÖuØyÙzÞŒä¨+å®0ç³9èµAê¸Hè¹Må¸Pä¶Oá±JÛªCÚ¤?Ôž5Ñš0Е-Ï—/Òœ7Ù¨Iш"ÉgÈiÇhÇgÄgÄgÄgÃhÃhÂiÁiÀiÀhÀiÂjÁiÃjÅjÇjÈf¹B¯0±3´8ì±4ì±3ë°8è®7æ¬4å§-ä¢(âž ßšÞ–Ü ÚˆׄÖÖ{ÖwÖuÖqÖo×lÕiÖfÖdØd×bÓdÑjÏjÍkÌiÌnáŸ.æ®Dä­Gã¬Eã«Câ«DáªBá©@à¨>á¨?â©>â¨;â¨8á¤6â¥6á¤5á¤4á¢0à¢/à¡-ß -ߟ*ß%ß›ß™Ý—Û’Û Úˆ؃ÖzÒrÖÝ–áž!ä¦,æª0è®3è²8êµ>ë¸DìºJí½Pí¿VíÀVíÁUìÁUíÁSîÂVîÃZïÃWïÁRð¿Nï½Gï¼Cí»Cí¸Aí·Aë³<è¬1æ£%܆Î`ÅHÅDÆHÈMÉOÈOÈQÉRÉSÊXÊZË^ÍbÐiÑmÔpÕsÕt×wØ{Ú݈ßá— á—äžê¬"ê°%íµ+ð¸0ï¹1îº/ë²"è¬èªç§ æ£äßلىá£.çºKä·LÙž+Ή ÌÊw¿Z¸D¸A¶>¶;²5°2¯1ÀNÉdÊjËpÌrÌvÍyÌ|ÌË€Ë΃І ÕŒ Ö€ÔpÕtÖuØxØzÞä©)æ®1ç²9ç¶Aê¸Hé¸Iæ·Lã´LÞ®GÛ¨@Ø¢;Ó4И.Е*Е+Ñ™0פ?×—/ÈiÈgÈgÇgÆgÅgÄgÃgÃgÁh¿hÀi¿hÀhÀhÀhÂhÅiÇiÊdºB­1¯3±7ë´=ë²8ê±4è®4ç¬5æ©0ä¥*ã !áœߘޒینÖÖ}Öy×u×t×qÖmÖi×fÖcÕc×cÖbÔgÐkÎkËiÍnàœ+ä«?áªCãªBã¨>à¤<ߣ8ߥ:Þ¥<ß§>à¦=â§;á§:á§;á¦;ã§8â¦6á£2á¢1ß¡-ÞŸ)ß)Ý'Ý›"Ü™ܘÚ’ÛÚŠØ…Ô~ÓvÐqÓ|Üßšä£%æ©-æ­6é±:ê³?ë¸Fì»Kì½Rí¿VëÀYìÀUíÁSíÂXîÃZïÃVîÃTïÃTïÃSðÃRðÁPïÀRï¿Rï¾Mì¹Dì·=ìµ:ê­3à“&ÖvË]ÆLÅHÆKÈNÈPÈQÈUÈXÈZÊ]ÍaÎhÐlÒnÓrÔsÕtÕvÖzÚÙ†ÛŠÝŽà“à“à”â–á—â›ãœãšâ—à“ߎÜÜ“ä¨6ë¾Ré¿Wà¯DÓ•!ÉËÊxÄi»N·E·B¶>µ;³7¯3³8ÅYÈdÊjËoÊsËvÌzË|ËÊ€Ë€Í΄ Ò‰ Õˆ ÕsÕqÕu×wØzÞ”äª+æ®4ç³=è¶Bé¸Gç¸Kç·Kâ²H߬CÛ§;Ø¡4Ôœ/Ñ—+Ï”&Ï–*ј.Õ¡;Ù¡>ËrÈgÇhÇgÆfÄgÃhÂfÁfÀf¿g¿h¿hÀhÁhÀhÂfÄgÆhÈc·@¬/®2±5ì·GëµBë²9ê¯0é®3æª0å§(ä¢!âžàšÞ•ÝŽÚ‡׃Ö~×zÖvØu×rÖoÖjÖg×dÖc×c×bÖdÐjÍjËiÊiÛ“ ã¨;ã§=á¦<á¤:ߢ8Þ¢9Ü¡8Ü¡9Ý¢:Þ£8à¤:à¦:á§;â¨9ä¨:â§9â¤1á¤1ß¡.ߟ&ßž$Þ(Ý›%Ü™ Þ—Û”Û‘ÛŽ Ù‰ׂÔ{ÒtÐpÑrÒwׂ à˜ä¥)ç¬2è°8è³@ê¶GêºOê¼Tê¼Uì½Sì¿TíÂYíÂVïÃUîÃWïÄZïÃYïÄVñÅYïÄZïÃVðÃRðÁPï¿Mï¼Iî¼Gð¿Hí¼Fé¯<à•%ÓqÉWÄKÃIÄMÇRÇWÈXÈZË]ÍbÎhÏjÑlÒoÔqÒqÓrÖvÕyØ}ÙÛ„Û‡܆Ú†܇ۆۇۋޒ âå©2è¸LêÁ]êÂ^â²J×›*͉ È~É{ÈxÃl¾Z¸H·D¶A¶?´;²9­4¸CÇ_ÇfÊkÊqÊtÍwËzË|Êʀʀ̂ Í„ ІÕˆÕvÕpÔtÖuØzÞ™äª-å®6ç³=è·Dç¸Iæ·Mä·Oá²J߬Aܦ:ס5Õ1ј,Ï”'Ζ(ј.Óž:ؤBÎzÈeÈhÈfÆfÆfÄfÃfÂeÀf¿h¿h¿hÀiÀiÀhÁgÂgÇhÇa³<¬/®2°5í¸Më¸KëµCë°3ê­-èª*æ§&ç£!äžâ›Þ—Ý‘ Û‰Ù„Ø×{×x×u×s×qÖlÖiÖe×c×c×cÕbÒiÎjÍjÊgÓá£0ߣ5á¤8ß¡7ÝŸ6Ü¡9Û :ÛŸ8ÝŸ8Þ¡7Ý¢;Þ¤:ߦ;á©=ã¨9â§8â¦6â¥1à¢,á¡*ߟ(ÞŸ+Þ%ߛߙܖےÛÙ‹׆Õ€ÓxÒtÑqÏnÎlÑqÕ{Ú‹âŸ#è®6è²?è¶Fé·Lê¹Më»Mí½Tí¾Uî¿VîÂXïÃUïÃWïÄYðÅWðÅYïÅYðÅVïÄWðÅ]ðÄ]ïÂTïÁPïÀOî½Lì½Ií¾Cí¹<ê«3ß“#ÓvÇ[ÂOÃNÃOÃRÄRÇWË_ÌcÍdÍhÐlÐlÑmÒoÒpÓqÔrÔtÔvÖ{×~Ø„ ß•å©6éµFìÀTìÄ[ëÃbå½_Ü«FÒ—%ʇ ÊÉ~ÆzÇvÂlÀa»Q¸G¶DµAµ>´;±8¯4¼KÇaÈgÉlÉrÊvÍyÌ{Ë}Ê€Ê€Ë ËË΂Ô…ÔuÕoÕsÕs×zàåª-æ¯5æ²;è¶Eè¸Jæ·Nã´Ná°JÞ«DÛ§?ס9Ôœ3И.Γ(Î’(Е,Óœ6Ù¤?ÍyÇdÈhÈfÈfÅfÄfÃeÃeÁgÀf¿g¿h¿h¿h¿hÀgÃgÇhÅ]²7«-®1°4ì¹Lì¹Më·Fé³;ê¯1ê¬)è©)é¦$æ¡åâ˜à“ Ý‹Ù…ØØ}Øz×wØtÖrÖo×kÖgÖd×dÖcÖaÔfÐjÎiÌhÍmÜ”ߣ3ߢ5Ý 5Üž4Ûž5Ú6Úœ3Û›4ÛŸ8Ý¢9Þ¢8ݦ=à¨@á§<á§:á§8â¥1á£/à¢,à¡,ß )ßž&áž"Þœ!ݘÜ•Ú’Ú Ø‰׃Ó{ÑvÒsÑqÐoÏmÍkÎiÐpÝæ­4å¯=ç³DéµFé¹Iê»Oì¼Sî¾VíÀUîÃSîÂRîÃXðÅZðÅWðÅ[ðÅ\ïÅ\ïÆaïÅ^ïÅXïÅWðÃTïÁOïÀOî¿Nî¿Lî¿Fï¿Eî¼Dê°<àš1Û‹%ÖÔ{ÒyÏoÌiÌiÍkÎjÎjÎkÎkÏnÐrÒw ր܎!à1åª?êµJì¾ZïÇgîÇeëÃ_æ»XÜ«HÕŸ7Α!Ç‚ Å|Ç}É{ÆxÅsÂlÀc½Z¸M¶EµBµ@´>´;³7±7ÀSÇaÈgÉmÊsËwÍyÌ|Ë€ËˀˀËË΀Ô‚ÓsÓnÕqÕrØ}âŸ!ä©.ç°7æ²<è¶Dç·Jå´Kâ±Iß®HܪBÙ¥=ÖŸ5Òš/Δ*Ì&Α'Γ)Ñ™2Öž7Ët ÈeÈgÈeÇeÅeÃfÃeÂeÁf¿f¾e¿e¾f¾g¿gÀfÃeÆgÂX°4«.¬0¯2íºLîºKì¹Ié·Fê²<ê¯2é®/èª*è¥"æ¢ãá—ÞÛˆÙ‚ÙÙ|ØvØu×sÖp×mÖiÖeÖdÕd×cÖcÑhÎiÍhËfÐxÞœ'Û/Ú›/Û›3Ùš1Ø™1Øš0Ùœ3Û 8Ý¡9Ý¢;ݤ=Þ¦>ߥ=ߥ:ߥ5á¤2á¤0à£-à£+à¢)à &ߟ)Þœ#Ý›!ܘÛ“Û‘ÙŒ ×…ÕÒzÑuÑsÐqÏnÎmÐlÎiÍjÝ‘æª3å¬7æ°=è´Cé¸Ië¹Oë¼Oí¾Uí¿Ví¿VîÁZíÂYíÂXìÂZíÃ[îÃ[ïÅ_îÅ_ïÅ_ðÅ]ïÄWðÂSïÂSîÃVïÂSîÁPíÀRîÁRðÄUòÈZóÈVñÅUðÄVïÃSî¿OìºLëºPê¹Rè´Pæ±Næ°Lä±Lç´RéºWë¾ZìÁ^îÆfîÉjíÈiìÆhèÀbä·XݬHØ¡7Ð’ɇ ÇÆ~Ç}ÅzÅvÃsÂoÁj¾d¼\»T¸JµD´B³@²?´<²7³=ÂYÆbÈiÊnËsÌwÌzÌ}Ë€ÊÊ~É~ÊÊ΀Ó€ÒoÒlÕpÔpÚ„ á¢#ä©/å±:ç³>èµDæ¶Jä´Kâ±Iß®GÚ¦>ס8Õœ2Ϙ*Í’%Í#Í#Í‘'Й0Ô—.ÉlÈdÈeÇeÇeÇeÅfÃeÂdÀf¿f¾e½e¾e¿fÀfÀeÂdÇfÀU®2¬-¬/¯1í»QíºOëºMë¸Kë´Bë³<ë±8é­/æ¨(å§%å£"âœß•ÝÚ†ÚÙÙyØvØt×r×p×l×gØeÖdÖcÖbÒeÐiÎhÌhÉeÒ~Ûš+Ù™0Ùš1Ùš.ט/Øš2Úœ6Ûž7ÚŸ7ÛŸ9Ü¡<Ü¢:Ý¡7Ý¡4Ý¡3Þ¢3ߢ1à£1à£-ߣ-ߢ*ß (áž%ßœ#Ýš!Û–Û”ÚÙ‰ׄÔÔyÑuÑtÐpÏnÏmÏmÏjÏmÙˆàœ"å§-ç°7æ²>è´Eè¶Gé¹Nê¹Oé»Qê½Vé¼Uê¼Tê½Sê¾VìÁ[îÄ_ìÅeíÅeîÄ\îÄTðÅWîÃXíÄ[ïÄUïÂUîÄXïÅXïÅ[ïÄ\îÃ[îÄ^îÄ^ìÅ^ìÆbìÇgìÈkìÇjìÆhëÈlëÉoìÈkìÆgëÅfêÁ`é½]æº[ãµWà¯OÙ£=Ó—(ÎŽˇÉ„È‚ÈÇÆ}ÆyÄuÃqÁnÀi¾d¼]»W¸N¶HµD´B³@²>³=±8·EÃ]ÆdÉjÊpËuÌxÌ{ÊʀˀʀʀÉÊ}Í~Ó|ÑlÒlÓoÔoÜŒâ£$ã©/å±<æ²?è´FåµIä³Jâ°GÞªCÚ¤<× 8Ôš.Ï•&Í‘$Ì!Í"Î&Ò™0Ó"ÇeÇcÆcÇdÇfÆfÄeÄeÁdÁeÁe¿f¾f¾f¾e¿eÀfÂeÇg¾R«0¬-­/®2ì½Wì¼Të»Qí¹Mì¶?ëµ>ê´@é°4è«/æ©+æ¦$ã¡ á™Þ‘ ܋ڄÛÚ~ØyÙvÙuØsØp×j×gØd×cÖaÕ`ÑgÏhÍhÌeËiÙ Ù˜,×—.ؘ,×–,ט0Ùš3Úœ5ÚŸ6Û 8Û¡:Ü¡8Þ 4Ý 5Ý 6Ý¡3Ý 1ß¡1ß¡1ß¡1Þ¡-á *à )ßž$Ý›!Û˜Û•Û’ÚŒ ÙˆÖƒÔ}ÒyÑuÐsÑrÐpÐoÏmÐjÍhÏoÔ{ Ü’â¤'æ­3èµ@æ´Dæ²Dæ³Gå´KæµNè·Oé¸OèºTé¾YêÀ]éÀaêÁ`ëÁ[ìÃ\íÅaíÃ`ìÂ\ìÂXïÅ]îÅ]íÄ]íÄaëÄdêÃgêÃfêÂcêÃhëÅjéÄièÂkæÀfæ½`ä¹[à±NÜ©?Ú¥8ÙŸ2Õš(Д"ÍËȈǃ È‚ÇÇÇÆ~Æ|ÆzÅxÅtÂpÁmÀi¼d»_¹ZºT¶K´F´C²A²?±=²<±9»KÄ`ÇfÇmÉsÌvÌyË{Ê~Ë€ËÌ€ Ë€ Ê€Ê|Ì}Ó{ÐiÑlÒnÓqÝ“á¤#â¨.å±?å±=æ³Cå³Eã±Fâ­Cܧ=Ø¢8מ3Òš-Ï”&Î’#ÌŽ!Í$Ï“'Óš2чÇbÇcÇdÇdÆeÇeÆeÃdÂcÁeÀeÀeÀf¿f¿f¾fÀfÃeÈf½Pª/«.­/®2ì½Wí½Vë»Qì¹Më¶?ì´>êµCê±9é¯2è­.ç¦$æ¤$ãžà–ÞÛ‰Û„Û‚Ù|ÙxÚvÙvØsØo×j×f×dÖbÖ`ÔcÐgÍgÌfÊcÐw Ú–&×–+Õ•)Ö–-ט0Ø™1Ù›1Ù›1Ùž7Úž6Úž5ÛŸ4Ü 6Ý 6Ü 5Ý 2Þ 0Ý 1Þ 0Þ -ß ,à +ßž'Ý›!Ü™ Û–Û”ÙÙŒ ؇Õ‚Ô}ÒyÑvÐtÏsÐqÐoÎnÎlÎhËdËcÊcËgÖ‚Þ™(ãª5ã°?á®@ã¯Dã°Hä±HäµMå¸QçºVå¹\åºZç½\æ¼^è¾`è¾`è¼[é¾\éÂbèÁbéÂféÁiæÀhæ¿hå½däº\â³Sà¯Jß­EÛ¥=מ1Ò—'ÍÉ… Ç‚ÆÅ€Æ€ÆÅ~ÅÅÄ~Ä~Ã|Ã{ÅzÄyÄwÄvÄtÄqÂm¿j¾e»_º[¹W¸P´H³E³C±A±>°>°;²<¿TÆbÆhÇnÉtÌxÍzÌ}ÌË€ËËÊ€ÊÊ}Ì~ÑyÐhÑjÒkÔuà›á£"ä¨.å±?ä±<ä±@ä±Dá¯Aß«>Ú¥8× 5מ1Ó›.Ï•(Í#Ë ÌŽ"Ï“(Òœ1΀ÇaÇcÆdÆdÇdÅdÃeÂdÂcÁeÁdÀd¿f¿f¾f¾f¿dÃdÈf¼P©.©.«0®1ì¼Wì»Uì¼Oí¹Ií·@ì¶>êµBê²;ë±5é®1è©)ç§(æ£$ãœá–Þ Û‡Û…ÚÙ{ÙxÙwØuÙqØm×j×f×cÖaÕ_ÒbÐeÎfËdÊcÔ†ו#Õ‘'Õ”.Õ–/Õ–,×—-ט/Ø™0Ø™2Ú›3Ù3Úœ3Û3ÜŸ4Ý 5Ý 5Ý 4ÝŸ1ÝŸ.Üž,Ý*Ýš'Û˜ Ú—Û•Ú”Ù‘׎׋ ׆ÕÔ}ÓzÒwÐuÐsÑrÏoÎnÎlÍiÍgË^ÂI½=ÁHÊg ֆݜ(à©3à«9á­?á®Fà¯Há±Kß±Pà³Rã¶TãµSä¹Xä¹[ã¸Wä»^ä¼`ä»]ä»^â¶Xà±SÚ©GÕ›3ÏŠÈ} Ç{É~È}Ç}Æ}Ä}Å~Å~Â|Ã|Ä}Ã|Ã{ÂzÄyÃzÄxÂwÂwÂvÂuÃtÂsÂqÂnÂk¾h»bº]ºY¸S¶K²F³D³B°@°>°>¯<µBÂZÆeÈjÊqÊtËxÌ|Ì~Ì€ËËÊ€ÉÉ~É{Ë|ÐzÏgÐiÑi×~à á¤#ã©/å±?ä°=ä±Bâ¯Aà¬?Ý©<Ù¤7ן1Õ0Óš.Д'Í$Ë Ì"Ï’(Ô›1ÌwÅ_ÇbÆbÆdÆeÅcÄcÂcÃcÂcÁdÀe¿e¿e¿e¿f¿eÄdÇf¾S©.ª.ª0¬1ì¼Wì¼Vê¼SíºLí·Aìµ:ì¶Bê³=ë²7é¯3éª*çª-æ¦)å¢#â›à–ÞŽ܇ۂÚÙ{ØyÙwÙtÙqØnØi×e×cÖ_Õ]Ó`ÏcÍcËaÌiÖŠÕ‘%Ó'Ô&Ô’*Ö•1Ö—2ט4ט3×™0×™.Ø™0Ù›2Ú›2Ú3Ûœ3Ú2Ûž3Ûž2Û.Ú›*Ù™(Ø—%Ú– Ù”Ø’Ù’ÙØŽ׉Ö„ÕÕ~ÔzÒxÒuÑsÐrÐqÏoÍlÌjÌiÍeÇTÀ@¼<ÀBÅTÍl Ñ|Ø!Ø—'ؘ+Ù™,Úœ/×”*ЄЃÒŠ!ÓŽ'Ö—/Ú 9ÙŸ8Õ™.ÏŽ$͆É~ÆvÃoÃmÄoÆqÅsÆuÅxÇzÆ{ÄyÄxÃxÅyÄyÁwÃvÃuÁuÂuÁtÀtÀrÁrÁrÀpÁpÂnÀl¿i½e»_ºZ¸UµO´I±E±E°B°?¯?°>¯<¹KÃ_ÅfÈmÉrËvÍyÍ|ÌÌ̃ Ì Ë€ ÉÇ|È{Ì|ÑxÎeÑhÑiÙ‡ à£"á¥(ãª3ä°>ä°=ã°Bâ¯A߬?Û§=Ú¤:ן4Õœ1Ò˜,Ï“%ËŽ Ë ÌŽ#Ï”)Ô˜.Ên Ç^ÈbÆbÆbÅbÅbÅdÄcÃcÂdÁdÀdÀdÀeÁdÀeÀdÄdÈeÁU«0ª-«0¬2ì¼Vë½Vê½Wì»Pì¸Fíµ>í¶@ëµ@ì²9ë±5é­/è«.è¨'æ¥#ä â›à’ ÝŠÜ…ÛƒÚ€Ú|ÙyÚxÙuÙq×m×g×dÖ`Õ]Ó\Ò]ÏaÎcË_ÍkÓ‡ÒŽ Ñ‹"Ò&Ó’+Ó’*Ó’-Ô’*Ô“)Õ•'Ö–)ט.Ø™2×™1Ø™.ט.Øš0Ùš0Ù™-Ù˜*Ø—'Ö•%×”!דØ‘Ø’Ø’ØØŒ ׉Ö…ÔÔ~Ô}ÒzÑwÒuÒsÑrÐqÎmÍkÌiÌeÇXÀFÀ@¿A¾AÀEÀMÂRÃVÂWÃZÂWÀRÁUÀX¿\¿_¾a¿b¾c½c½d¾eÀhÃlÃmÃmÄoÅqÄpÅqÆtÅtÄsÄtÄtÄtÃsÁsÀsÀsÀsÀqÀp¿p½nÀo¿n¾n¾mÁl¿h¼d»a»\ºW·R¶L²F±E¯D¯B®?¯?¯=±>½SÃaÆhÈnÉtÌxÍzÌ~̀͂̂ Ì Ë€Ê~Æ{ÇyÌ}ÏtÌcÏfÑlÝ”à£%â¥)â©/ä¯>ä°?ã°Câ®Dß«@ݨ?Û¥;Ø 4Ô›/Ñ–)Í‘#Ë É‹ËΔ(Ó•,ÈgÇ^ÈaÆaÅbÄbÄbÅcÄdÂdÁdÁdÀcÀc¿c¿cÀcÀbÂaÇcÁTª1ª-¬/¬1ì¼Vì½Vì¼Uë»RíºKì¸Iì¸Gì·Eì´@ì³:ë°1ê¬+ê©(è§%ç£åŸâ™à‘ ÞŠ܅܃ÚØzÙxÚvÙtÚoØjÖdÖbÕ_Ô]ÔZÓZÑ^ÎaÌ^ËeтҌы!Њ"Ћ#Њ!ыҎ#Ô%Ó’$Ó“(Õ–-Õ–-Ö—,ؘ.×™1ؘ0Ö–*Ö•&Õ”%Õ’"Ô‘!Ô‘Ö‘ב×ÖÖÕ‹ ÕˆÔƒÕ‚Ô€Ò|Ó{ÒyÑwÑvÐuÏrÏoÏmËiËfÉ]ÀI¾BÀEÀFÀE¿FÀHÀJÀMÁQÁSÁVÀWÀZ¾[½\¼[½^¼`ºb½e½g¿hÀiÀiÁlÃmÄnÅoÄoÄoÄoÂpÂpÂpÁpÁq¿p¾q¿o¿n¾m½l½l¾l¼j¼j¿j¾h¼eºb»_¹Y·TµN³H¯E°E®B®A­?®>®<´BÀZÃdÇkÉpÊtËyÍ|Ì~΀΂Ì‚ Ê€ É€Ç}ÆyÈxÍ{ÍlÌ`ÎdÓvßžá¤'ã§-â©1ä¯>ä±Aä±Dã¯Cà­?ߪ>Û¤8ן1Ó™+Д&Í"ˌʌÌ!Γ*Ò•+ÈdÆ\Ç_ÆaÅaÅbÅbÄcÄcÄdÃcÂcÁcÀd¾c¿c¿bÀaÂaÆc½P§.ª-«/¬2ì»Wì»Wê»Vë»SëºNì¹Lì¹Mê¸Jë¶Fì´?ë²8ë¯3ê¬1é©-é§'è¥'äŸ!á™à’ ß‹݆܃Ú}ÙxÚvÚuÚrØmÖhÖdÖaÕ_Ô[ÔXÒVÑZÍ`Ë]ÊcÐ{ Ñ…ΆÍ…̃φÏŠ!Ћ"ÑŽ$Ò$Ó'Ó“)Ô”)Õ•)Õ•+Ó“*Ó’'Ó“'Ó’$Ô’#Ó‘!ÔÔ‘ Ô‘ÕÖÕÕ‹Õ‰ Ô†Õ„ÖƒÔ€Ó~Ò|ÒzÒyÐvÏuÎrÎqÍoËjËhÈaÃP¿D¿C¿E¿G¿I¾K¾M¾O¿QÀR¿U¿W½Y¼Z¼Z¼\º]¹^ºa¼c¼d¼e¾gÀhÀiÂkÃlÂlÂmÃmÃnÁoÀn¿n¾m¾n¾n¾m½l¼l¼j»k»j»h»g»f¼e»cº`¹\¹V¶P´J±G°D®D®B®?®?®>­<¶HÃ_ÅgÇmÉrËvËzÌ}Ì̂̈́ Ì‚ ʀȀÇ|ÇyÉyÍyÄWË\Îb׃ ࢠà¥'ã©/ãª4ä¯=ä±Aä±Bã¯@á­?Þ¨;Ú¡3ן0Ò˜)Ï’%Íʌʌ ÍŽ$Ï•+Ð&Æ]ÆZÇ^Æ`ÄaÅbÅbÅbÅcÄbÂaÁbÂbÀb¿cÀb¿bÁaÃaÇb¹G¦-¨/ª0¬2ê¹UêºVêºTêºSê¹Rë¹Pë¸Nê·Jë¶Cë´;ì´>ì²?ë¯9è¬2è©-è©/å£(ââ˜ßÝŠ݇Ý„Û~ÚzÚvÙuÙq×k×fÖcÖ`Ô\ÔZÓWÒTÏZÍ_Ë\É]ÊfÍrÎ ΄Ë‚̄ͅ·ΉÐŒ"Ñ#Ñ&Ó’%Ò$Ò%Ó&Ò‘'Ò%Ó#Ò"Ò!ÓÑŽÓŽÔӌӋӉ Óˆ Õ†Ô…Ó‚Ó€ÒÒ|Ñ{ÏyÐwÏuÏtÍsÍoÌkÊiÉeÅW½E½B¾E½G¾I¾K½M¾O¿Q¾S½U»V»W¼Y»Z¸Z¹[º^º`»`»b¼d½e¿gÀiÀiÁjÁkÀk¿k¿k¾l½k¼j¼k¼l½j¼jºj¼i»h¹g»f»dºd»c»_º\¹Y·SµL±G®F®D¬B­@­?­>­>®<¸LÃcÆjÈqÊtÌwÌ{ËÌÍ‚̃ Ê‚ É€ÇÇ{ÇwÉyÉlµ<ÆTÏeÝà£!á¦'ä¨/ãª2ã®8å°=ä¯Bá®@à¬@ݨ;Ù¡4Õž2Ñ–)Î#ÍʋɊ̌#Ñ—-Í… ¿OÅYÆ]Å_ÄaÅaÅbÄcÄdÄbÃbÂbÁb¿b¿bÀaÀaÂaÄaÅ]¯;§+©.ª1­2ê·Pé¶Në¸Më¸Mê¸Oë¸Pë¸Kë·Gë¶Dì´?ë³<ë³>ë±;ê®7é­1è«1æ¨-å¡"ã›á• àÝŠ܉Û„ÛÙzÙvØtØo×j×fÕaÔ]Õ[ÕYÓUÑSÏZÌ]Ê\ÈYÇXÈ`ËqÍ} Ë‚È˂̈́͆·ΉÏŒ!ÏŒ ÏŒ!ÐŒ#ÐŒ"Ï‹ Ï‹ ÏŒ!ÏŒ!ÏŠщÑŠÑŠÒ‹ÑŠÒ‰Ó‡ Ó‡Ó†ÓƒÒ‚ЀÑ~Ð{Ï{ÏyÎxÏvÎuÎsÍpÌmËkÊhÆ\½G½A¾E½H¾J½K½N½O¾Q½R»T»UºW¹X¸W¹X¹[¹]º\¹_¹a»c¾f¿g¾g½i¾i½g¾i¾h½h»hºiºiºi»h¹gºhºg¹eºeºd¹b¹a¹_¸]¸Y¸TµP³J®E­D¯D­B¬?¬?¬>­>¯>¼UÄfÇmÈrÊuÌxÍ|Ì€Ì͂͂ É È Ç~ÆyÅuËyÂ\°1¿EÑmß›à£$ã¨*ã©-ãª2ä­9ä¯:â®Bâ­Cà¬DÛ¨?×¢9Ô3Ï•(Í#ÌŽ!ÌŒ!ʋʊ!Ñ™.Í ¹CÂSÅZÅ]Å_Ä`ÅaÄbÄbÄbÂcÁb¿bÀaÀ_À`ÂaÂ`Æb¿S§0¦-ª-ª0¬3è´Hé´FéµFê·Hë·Iê·Jë·FìµEìµBëµAë³=ë²:ê±8ë°6é­2è­4æª1æ£&åâ—á• à ݋ۈۄـÙzØw×q×m×kÖfÕaÖ^Ô\ÓWÒSÐTÎ[Ë\ÉZÇXÆUÆTÇ\ËrË~ ÈɀɀÉʃ̄ͅψÍŠ#Ί ΊÏŠÏŠΉχχЉÑ‹ÒŠщÒ‰ÒˆÒ‡ Ò† Ò„Ñ‚ÐÐ~Ï}Ï{ÎzÏzÎzÏxÎuÍtÍrÌoËlËiÇa¿M¼D¼F¼H¼I½L½N¼O¼Q¹S¹UºV¹U·V¶W·Y·X¶Z¶]¸^¹a»d¼d½e¼g»e¼d¼e½f¼eºf¹fºf¹e¸d¸e¸e¸e¸c¹b¸`¹^¸]·\¶Z¶VµQ³M°G®F®E¬B¬A¬?¬>­>­<²DÁ_ÅhÈoÉtÌwÌzÌ}Í€Ì̃Ë‚ Ê Æ~ Ä}ÅyÆvÌx»N¯0µ:Ôz à¢â¥)å¨-ä©0ãª1ã­8â­9á­>â®CÞ¬CÚ¦<Ö 9Ó›3Ï•)Í‘#Í$ÌŽ$Ê‹#Ê‹"ј.Ì~·<»EÄWÆ[Å\Å^Æ_Ä`Ã`Ã`ÃaÂaÂaÀaÀ`Á_Â_Ã_Ç`´C¤+§-©-©/«2è±Cè³FéµIéµHêµGë¶GìµCë´Cë´Bë¶GêµEê³?ë±4ì±4é¯4é®3è¬3æ§+å£#ãžâ™á•ß Ý‹Û‰Ú„Ù~Øz×u×pØn×jÖeÕaÔ^ÓYÒUÑSÐVÍ[ÌYÉWÇVÈSÆQÅSÇ`ÊqÉzÇ{ Åy ÄzÇ~ɀɂɃʂʄ̆ΈψψψχψЈЉψЇÐ… Ï„ ΃ ÏЀÏÍ}Ï|Ï|Ï{ÏzÏzÌwÍuÌuËrËpËnÊlÉgÂW»H»D½I¼J¼L¼M»NºQ¹R¹S¸U·T¶U¶UµV´W´Zµ[·]º_ºaºcºcºcºcºcºcºd¸c·c¹cºc·b·b·a¹b¸`·^¶]¶\¶\·Y¶VµS¶N²K¯F®E­D¬B«@«@¬?­=«:¶KÃfÇmÈqËvÍyÍ{Í~ÍÍ‚̃ Ê‚ É€Ç Å|ÅxÈyËsµ@°1¶?Ú‹á£"ã¦,ä©1ã«3ä¬5ã­9â­:á­?à®DÞ«DÙ£:Õœ3Ò˜.Ï•)Í&ÌŽ$ËŒ#ËŒ#Ë$Òš.Ê{¸=·=¾KÄXÃZÅ]Å^Ä_Ã_Ã_Ã`Â`Â`Â_Á_Á_Ã_Æ_¿T§3¥+¦.§/ª0­3è¯Aç²Gé´LéµHé´Dê³Cê´Bé´DêµFê·Ié·Lè´Fê²;ë°4ë°5ê¯5é­2ç«2å§-å¢%ãœâ˜à”Þ Ý‹Û‰Ù‚Ø}ØxÖtÖqÖmÕjÕfÕaÔ]ÑXÑUÐQÏVÍYÊVÇUÅSÆSÄOÃLÄNÅ[ÈmÈwÄvÃw Ãy ÃyÅ}Æ~ÆÇ€ÉË„͇Î…·Ì…Ì…ΆÌ„̃ Π΂ Ì Ì€Í€ÎÌ}Ì|Ì|Ì{ÍzÎzÌwÊtÉtÉsÊsËqËoÈmÉkÄ^¼KºF»I»K»KºM¹O¹P·Q·Q·R¶S·S´T³U´V³W´Xµ\·^¸^¸`¹`¸`·`¹b¸b·`·`¸a¶_·`·_·`¸_¸^¶]µ\µZµXµV¶SµPµL±I­E­D¬C¬A¬@«?¬>¬=¬;»UÅjÇoÉsÊwÌzÍ}ÌÍ͂̄ Ê‚ ÈÆ~ Ä{ÄwÉzÇh³8°0ÁVà›à¢%â§,â©1ã­5ã­8ã­8â®;á®BÞ¬EܨBÖ 7Ôš0Ò˜-Ï”*ÌŽ%ËŒ#ËŒ#Ì%Α'Ó2Í‚!º@¸=µ=½MÅYÄ\Ä^Ä^Ä_Ã_Â_Â_Â_Ã`Á^Â_Å^Æ]´A£,¥-¦-§.«0¬3æ®Cæ±Iè²Kè³Hè³Eé²Eé³Dê³@êµDê·Jê·Mê·KéµEê±9ë¯4é¯3é®3è®:ç¬5æ¦+å !ä›á—ß’ߎ ݋چ؀Ø|×xÕtÕoÖlÕjÔgÕaÒ[ÑWÑSÐQÎUËVÇSÇQÄPÃNÄNÄJÁD¿GÃVÇiÇrÆsÆvÃvÂw Ä{Ã{Ä|Å~ÇÉ‚ɃÉ‚ÉÉɂˀ Ë Ë‚Ê€ Ê~ ÊÊ}Ë|Ì|Ë{ÊyÌyÌyËvËuËuËtÌtËsÊqÊpÉnÉmÇe¿S¹H»JºK¹L¸N·O·N·P·O¶QµRµQ´R³S³T±V³Y´Z¶\·\¶[¶^¶^¶^·^¶^¶]¶^µ^µ]¶]¶]µ\µ\µZµYµWµU¶TµR³N³I°G¯E­D­C­A¬@­>­=­<¯AÂ`ÇlÇqËuÌxË{ËÌÍ̃ ˃ Ê È€ Æ}ÅyÄvË{Â[²5±6Ït áŸà¡#ã¨-ã«3â«7ã­9ä­7á®>à­AÞªAÚ¥=Ö 8Ôœ2Ò™/Γ)Í%ÌŽ$ËŽ$Ì’*Ï—1Ö ;Ô•3¼Hº<µ;³<¿OÄZÄ]Ä^Ã_Ã_Ã^Â]Â^Á^Â^Ä^Æ^ÄW«7¤+¥-¥-¨.©0¬4ä­Bä¯Fä¯Gæ°Eç°Cæ°Eè±Cé²Cé´Dé¶Hê·Kê¶JéµIé³Aé°7ê¯4é¯5é°9è­7æ¨.å£#åžãšà–à’ß܉ÛƒÚ€Ø~ØyÖtÖoÔkÔiÔeÓ`ÒZÑVÐRÏOÍRÊRÉQÅOÃMÃKÂHÁDÀ@½<·9¯:¥6¬DÅoÅwÃtÂsÁu Ãv Áx ÃzÃ{Ä|Æ~Å~Ç~È~ ÈÈ} Ç} Ç| È| È}È|É{ÈyÉxÊyËxÊvÊuÊvÊuËtÊuÉtÊrÉqÈoÉmÈjÀZ¸J¸J¸L·K·LµNµNµO´O³O´P´P³Q²S±S±U²V³X³W³W´Z³[´\µ[´[´[´[´\´[³Z´Y´Y´Y³X²V´T´T´Q³O³M±I¯F­D¬D¬B­A«?«>¬>«;´JÅhÈoÉtËwÍzÍ|ÌÎ΃ Í„ ˃ Ê È Å}ÅxÅvÍ{ÀU°2½NÝ’àŸá¤'ä©1ã«4â«9â­=â®;â®<à«Bݨ>Ù£:Ö 8Ó›4З.Í)Ì&Ê%ÈŒ#Ë‘*Ï—2Õ ?Ù£AÀY ¸:·=³7³;¿PÄZÃ\Ä^Å^Ã_Â^Á]Á\Ã\Ä]È]½K¥.£,¦-¥.§.©2­5ã­Dä­Eã®Eä®Då¯Aæ°Bç±Dç³EèµEèµGé¶LéµJé´Gé³Bê±:ê°5é¯8ê®6è­4ç¨.æ¤$æ¡äŸàšá–ß‘ Ý݉Ú…Ø€Ø|×xÕtÓoÔjÓhÒdÒ_ÐYÐUÎPÌNÌPÊQÇNÅKÂHÀEÁA¿>»9¯-“•§5½[ÅlÅrÄtÃtÀt¾rÀr¿tÀv Ãy Ãz Äy Ä{ Äy Äy Åy ÄxÅyÅz ÅyÆxÈwÇwÇvÇuÈuÉuÉuÉtÉtÉtÉsÈsÈqÈoÆnÇkÁ_¸L¸H¸KµK´M³M³M³N²M±N³O±P°P±P±R²S²T°S±U±V±V²V²V²W²X³Y²Y±X²W²V±V²V³T³S²R³Q²P²M±K¯H­D¬C¬EªC«A¬?­>¬=«=¼WÇlÉrÊtÍxÍ|Î~Ï΂̓ ̈́˂ Ç€ Å~Ä{ÅwÈxËt¸E²5Ìmážߟ â¥)åª1ä­7ã­;á­>á®?â­=Þª@ܨ@Ù¤=Ö 9Ñš3Ζ0Ì’*Ê%È‹$lj"ÈŽ$Ζ0Óž;Ú§BÃe¶8·=³9­4°9½OÃYÃ[Ä_Â_Â^Â]Ã]Ã\Æ[ÆX­:¢+¤,¦-¦-¦/©1¯7â¬Gâ­Eã­Få­Bä­Aå¯?ç°Cç²Gæ³GèµKé¶NçµJè³Aé²>ê±9ë±8é±=é¯7è­4ç©.è¦(ç¤"å¢!ãžá™à”ßߎ ܊܄ڀ×|ÖvÓrÑmÑjÐfÑbÏ_ÏZÎSÍOËJÉKÇIÅGÃFÀB¾?¼;´2§'œ–˜œ¤&®4·G¼U½\ÀdÁkÁp¿p¾p¿rÀsÀsÀs¿sÁtÁtÁsÁtÃu ÃvÄvÅuÅuÅtÅsÈsÈsÇsÇsÇrÈqÇqÇpÆpÆoÆnÄlÄiÁa¸NµIµK´L³L²L²L±M±M²M°N°O°P°P±P°R±S±R±R±R°S¯T°U°U°U°V±V±V±T°T²S²S²Q²Q³P²N±K°J®F«D¬C«CªB¬@¬>«>«=°CÃcÇoÉtÌwÍzÎ~Ï€΂σ Ï„ Í„É Ç Æ~ÅyÆvËyÂ\³8·BÙ‡à à¡"â¦)åª/ä­7ä­;â­=â­>á¬;Þ©=Û¦>Ú¥?ÖŸ9И2Í”/Ê‘)É‹$ÇŠ%Ň ȉÎ’)Óœ8Ú§BÄh¶9·<´9¯4¥,¥2¼MÃYÂ[Â]Â^Â\Ä\Å[É[¸I¤.£,¤-¦-¦/¦0©0²=á¨Aá©@âª?ä¬?ä¬?ä­?ä°Bæ±Iæ³Kæ´Lç´Kç³Eè²Bè²Bè²<ê²;é²@ê°:é®6è¬3çª/ç§)ç¥&ä  âœá™à” ß“ Þ ÜˆÚƒÙ€Ø|ÕvÓrÒmÐjÏfÏcÎ^ÎXÍRËKÉEÅ@ÄAÃBÀ?¼:·4ª) "™••œ £%©'ª(«,­.­1°;ºRÁgÁpÁqÀrÀqÀqÂqÂoÂoÂqÁrÀrÀrÂrÁpÁpÁpÂoÄpÅpÄpÃpÃoÃnÃmÄoÄoÃlÂjÂiÀhÀh¿`µK´I³K²K²K²L²L²L°M°M±M°N¯N¯N¯P°Q¯O®O°P°R¯S®R®R¯S¯T¯T°T±R°Q°R°Q±O°P²N±K°J¯H¬D¬E¬D«CªA¬@«?«?ª<¸QÇjÈrËvÌzÍ}ÎÏ‚ Ï… Ï… φ Í„ÉÇ Å|ÆwÉxÉl·B³8Ä]ßšà "à£%ã§*ä©1ä­9å®;ä¯=â­=à«<Þ©<Ú¤9ס8Ôœ3Δ*Α'Ê%ÇŠ#Ň"Â…LJÍ‘)Óœ7Ù¦CÁcµ8µ=´:­4¢+œ&¥0¹IÃXÂZÂ]Ã]Æ[È[»K¦0£,¤,¤-¥.¦.¨0´@Æ]ߤ9à¥9á¦9ã©<ãª;ä¬?ä±Hå²Lç²Jæ±Hæ²Gè³Eè´Eè³Eç²Bè²@é²Aè±>è°:ç¯9è­4æª0æ§+ä¤%äŸâœá™à–ß’ÞÛ‰Û„Ù€ÖzÕvÓrÑmÐjÐeÎ`Î\ÌVÉOÇGÅAÃ?¿=»9µ2­+¥%Ÿ!š––š£$©*ª+¬,¬-¬.¬.­.°9·L¼W¾\½]¼WºO¹I»J»SÀ_ÃlÃsÂrÁo¿o¿n¿nÁlÂlÁnÁmÁkÂiÁhÃiÄfÃeÃdÃeÁfÀfÁfºW³H³J±J°I±J±J¯K®L°K®L®M®M®M®M­M«O¬O¯O¯O®P¯P¯P°Q±Q±R²R¯Q®P¯P°O°N°N±L°K®I­F«D¬D¬CªB©A©?«?¬>¬@Á`ÈoÉsÌwÍ|ÐЀσ І І ΆÌ… É Ç}ÆxÆvÌv¾Qµ:¸BÖ€ àŸà¡$á¥(ã§*äª3ã®;ã®=ã­>á¬=à«>Þ©?Ú£5ן1Ó™,Γ'Î&ËŒ$LjÄ…ÄņÉ+Ñ›:ÕŸ?¿X¶:¶<´9«3 *('£.¶EÀVÃ[Ç[ÅW·F¥0¢+£,¥,¥.¥.ª4»JÌeÒsÞ¡7à¤7á¥9â§;ã©<å¬Bå°Hä°Iä°Eä¯Dæ±Fç³Eç³Fç³Dç²Cè³Fè³Dè±@è¯;è¯>ç¯<æ¬5æ§+å¥%ä£#å¡!âá˜à–ß’ Ýۉل؀×}ÖvÓqÑnÏjÏeÍ`ÌYÉQÇKÅCÁ=»7µ1¯+©(¦%¢"œ—”™ "¦(©)ª+ª-¬-­/®0®0®0¯2²4±5±4²5³5µ6´8¶=»HÀVÁ`ÄgÂiÀgÀf¿eÀdÁdÁcÁaÃ_Ä_Ä`Ä`ÄcÅcÃeÃfÄfÃh½_³I²G°I¯I¯I¯J®J­J­J®K®L®M­L¬K­L¬M«N®L­M­N¯M®N¯P°P°P°Q¯P­P®O®N®M¯L¯K¯I­F«CªD«D«CªA¨@©?ª?ª<³IÆjÈqËvÎzÍ}Ï€Ђ Є φ φ ΆË„È€ Ç{ÆwÉyÇe¸?¶;ÄZÞ•ß á£&â¦)ã¨+ãª1ã®:ã¯@á­>ß«;ߪ<Û§<Ø 3Ö/Ò™-Γ(Ì&É‹$ć„ƒĆ!ÈŒ)К:Е6¸I¶;µ<µ9ª2)œ(((¡,¬;»L½N¯<¢+¡+£+£,¤-¤-­7ÃUÏjÏpÑsÜž4Ý¥>à§Aá§=á¨=á©@â¬Dã­Aä®Aä¯Bå°Eæ²Hç³Iæ²Gç±Aç³Dæ³Eæ°?ç¯;ç°<ç°?ç­8æ©0æ¦*æ¥(å£#ä  ã›á™Þ—Ý‘ ÝÛˆÙ„×Ö{ÔvÒqÐnÐjÏeÍ_ËXÈPÆG¿?¹5¶0°+ª)¦&¢#ž ›•–!£'¦)©+«,«,«.­.®0°3°3±4±3²5³7´8µ8µ:·<¹<¹=º@¼H¾M½N¿P¿RÀSÁUÃVÂXÄ[Å]Ä_Ã`ÄcÄdÃeÃgÄgÃh¿c³I°G¯H°H¯G¯I¯I­I­J®J­J¬K¬K¬K¬K¬K¬K¬LªL«L­L®M®N®O¯O¯O­N®N®M­L®K¬J­I­G¬CªD«D«D©B¨A¨?ª?¬?ª<¼XÉpÉsÍxÍ|ÏÐ Ï„ І ІΆÍ…Ë‚ È~ ÆyÇwÉs¼K¸=¶@Ô| àžà !â¦'â§)ä©/ã«2ä¬9â­>á¬>ߪ:ß©;Û¤6Øž1Õ›,Ñ–(Í‘'Ë%Lj Ã…ÁƒÀÁƒÆŠ%Ι3͇(¶@·<´;³9ª0*š(›)›)œ))¢.¢/Ÿ+ *¡+¢,£,¤-­7ÄVÍjÎnÏqÑsÙš.Ú¡;ݤ@Þ£;ߤ:ߦ=à¨?â©<â¬=ä®Cå°Fæ±Hæ²Hç±Dè°Aæ°Aå±Cä°Dæ®>æ¯:ç°=è®8æª0æ¨/ç§,å¤'ã¢"âžâšâ˜à–Þ‘ ܌ۈم×ÕzÔuÒqÒnÐjÐfÎ`ÊXÆOÁE¼9¶2°-©)§'¤$ !œ••œ!¢&£(§*ª-«.«.«.¬/®1¯2±2²4²4³6´7´8´8µ;·>¸@»A»A¼F½I¾K¿OÁRÁTÂUÃVÄ[Ä]Ä_ÄaÄaÄdÃeÃfÄgÅiÀd³L±E¯G¯G¯G¯I®H­H¬H¬J­I¬K«J«J«JªKªKªK¬K¬L«K­K®M®N®N®M¬K¬K­K­J¬JªI¬G¬D«C«F«DªC©C©@©?©>©=®CÅfÉrËuÎzÎ~РЃ Ð… чЇχÌ„ Ê€Ç}ÆwÉxÅb¹@¶<ÃYà—ážâ£"â¦%ä¨+ä«3ä¬6ä¬7á¬9àª<Þ©<ܧ8Û¡2Øž0Ó˜+Г%Ì#ÈŠ!ĆÁ‚¿€À€ÃÈ'Óž6Év´<µ<´:°8¥.)›(œ(›)š*)ž*+Ÿ, , ,¢,¢+¨2ÁRÍgÌlÏpÐsÐuØ–'Ùš/Ù3ÚŸ2ÝŸ4Ý£9Þ¤;ß§>á¬Câ¬Cã®Eä®Cä®Bæ¯@æ°Cå°Eæ¯Bå¯Bæ¯@ç®;ç¯;ç­7æ­5æ«2æ©0æ¥,ä¢&ä !ãâ›á˜ß•ݑ݌ڈڃØ~Ö{ÕvÓsÒnÑjÏgÎ`ÊYÆO¿@·5±.«*¨(¥%¢!œ ––› ¡%¢&¦)©+«.«.«.«.­.®1¯2±3±4³5³7´8µ8µ:µ;·>»@¼B¼D¼H¾K½M¿PÁSÀV¿VÃYÄ]Å_ÃaÄbÅdÅeÄgÅhÆhÁd²K°D¯G®F®F®G¯I®H­H¬I¬H¬I«J«J«J«J©JªI«K«K«J­J«L«L¬L¬K«J«J«J¬H¬F«H«F©CªDªD¨C©C¨A¨>¨>ª=§:·QÉoÉtÌxÎ|ÏЂ Ð… чЇχΆ˃ È~ÇyÇvËv¿S·?¹DÕ á à¡"â¥(ä¨*ã¨.ã¬7ä®:ã¬8àª9Þ©:Þ§9Û£4ÙŸ0×.Ñ—(Α#ËŒ ȉ Ã…À€¿ÀÃ…Ì'Ö 8Âe²8³;²7­4£-)œ(œ)š*))ž*ž+Ÿ, ,Ÿ,¡+£.¸FÌbËhÍmÎqÏtÏwÕ“#Ö•$ؘ'Ùš+Ú›-ÛŸ5Ü£<Ý¥>Þ©Aà«Bâ¬Cã¬?ã¬=â­>ã­@ä®Cä¯Cä¯Bå¯@æ¯>æ®8ç®:æ¯<æ¬5å©.å§-å¦,ä£'ãžáœášà–Þ•Ý Ü‹ÛˆØ„××{ÕxÓsÑoÏlÎhÎaÊXÅMº=±1­,ª*¦&¢$ž"™•›¢%¢&£(§)«,«-ª-¬/¬/­0¯2°2°4²4³7´8´9µ9µ;¶>¹?¹B»C¼G½K¼L½NÀQ¿UÀWÂXÃ\Ä^Ã`ÅcÆdÆeÅhÅhÆj¾`°E¯C®E­E­E­F­H¬G«H«I«H¬H¬IªJ«JªIªIªIªJ©J©JªIªIªJ«JªJ«JªIªHªH«FªF©D©DªD©C¨B¨A§?¥=¥=§<ª>ÂbÉrËvÍzÏ}Ï Ï„ ч ЇχΆÍ„Ë È~ÆyÈwÉp»J¶>Å_ß–àŸ á¤'â¥*ä©-ä©/ã«6ã¬8â«9áª:ݨ8Ý¥6Û¢4ÙŸ1×/Ñ–'Ì"ËŒ"Ň„ÀÀÁ‚ƈΓ*×3¾\ ³8²:¯7«3¡,œ)œ(š)›)›))ž)ž+Ÿ,Ÿ,Ÿ,¡+«8ÅYËfÌkÎoÎrÏuÏwÓ’$Ô“%Õ•$Ö—'Øš+Úœ3Ú 7ܤ=ܦ?Þ§=à¨<âª<ä«@ã¬@â¬?ã­@ä¯Bä¯Cã¯Dä®?å­8ç®<æ®>å¬6å¨0æ¦*å§-å¤(ã¡"ážâœâ™à–Þ”Þ ÜŒÛ‰Ù„×Ö{ÕwÓrÐoÏlÎhÍaÊYÃM¸;¯.«+§(¢&Ÿ"›–˜ %¡& '¥)©,«.©-ª-ª.¬/®1°2±4±3²5³7´8µ9·;¸<¹>¹AºC»E¼I½K½N¿QÀTÁWÁXÂ[Ã^Ã`ÄbÆeÆgÅiÅiÅk¶T­A®C­B®E­D¬D­F­F¬F¬G¬H«H«I«JªI©I©I¨H©I¨I¨I©H©HªIªIªHªHªH©F¨F©F§C¦B¨DªC©B¨A§?¦>¦=§=§9³KÉnÊtÍxÍ|ÏÑ‚ Ñ„ ЇцφÍ…̃Ê€Æ{ÅwÉxÆh·B»JÕßœá !â¤'â¥*åª1ã«2â«5á«8á«;à¨:Ý¥6Ü£5Ú£7ØŸ3Öœ/Е%Í$ÉŠ Ä…ÁƒÁÁ„Ȉ Ж-Ø3½W ´9²:®5ª0Ÿ+™)œ(š)š*œ))ž*Ÿ+Ÿ-Ÿ, ,¢.¸GÉ`ÊhÍlÎpÍrÏuÏxÒ#Ó‘$Ó‘ Ô“!Ö—(Ùœ2ÙŸ7Ù¡9Û¢8Ý£9Þ¥8ß§:á¨=áª>âª>ã«?ã¬?ä­@ä¬?ã«:ä«8æ­;æ­8æ¬6åª5å§1å§0æ¤+ä¡$ãŸâãœá™à–ß“Ý Ý‹ÚˆØ„ØÖ{ÕwÓsÐoÎlÏhÍbË]ÃN¶7®,©*¥' $›!––Ÿ%¡% &£)¨+ª,¨,©-ª.«/­0®2¯3¯3²5²6³8µ9¶;¸<º?º@»B»D»H½K½M¾QÀSÀVÂXÃZÄ^Ä`ÄbÆdÆgÆjÆjÀd¯G­A­B­B¬D¬E«C¬D­F­F­G¬G«HªI©H©H©H©G¨H©H«HªH©G§H©G©H¨G¨GªGªE©E©C¦B¦C¨C©D¨A§?§?§=¦<§=©;¿]ÊrÊuÍyÏ~ЀуÒ… цЇΆÍ„Ë‚ É~ÆyÆvÈxÄ`·?ÊeÝ’àŸâ¢!â¤&ã¦+å«2ã¬5ã¬7á¬9ß«:Þ¨:Ý¥6Ü¢5Ú¡6Õœ1Óš/Ï”'ËŽ$LJÄ…‚ÀÀÄ…ÉŠ#Ò–+Øž3¾W ³8³:­4¦.*œ(›(›(š)œ)œ*ž*Ÿ+Ÿ,Ÿ,Ÿ,§4ÁSÉcÉiÌmÍpÍsÎvÏyÑŽ&Ñ"Ó Õ“#Õ–%Ö˜+Ùœ3Ùž5Û 4Ý 5Ý¢7ߤ6Þ¤8ߥ6à§:â©<â©;â©:ã«9ä«8ä¬<ä¬<å¬6ç«5ç«8å©7å§6å¤,ä¢#ä¢%ä #ââœá˜ß–Þ“ß Ý‹܉ل؀Ö|ÔvÔsÑqÐnÏhÎcÌ^ÄO´7«+¦(¢&"——$Ÿ%ž%¢(§+§+¨,ª,ª.¬/­0­0®2°4±6²7´8µ:¶;¶=¹>¹?»A»C¼G½K½M¿PÀRÁTÂXÃ\Ã]ÄaÅcÆdÆhÆjÇlºY¬@¯A­A®A­B«D¬C«C«D®E®G¬G«G«GªG©G¨G©GªG©G¨F¨F©G©G©G©G©G©F«EªE¨C¦A¥B¦C¨B¨A¦A§@¨?§=§=§:®DÇjÉtÌwÍ|Ï€Ђ І Їχχ·΄Ë€Ç|ÅxÇvËxÀX½Mׂà›à¡!â¢$ã¦(ä¨-ã«3ã«3â«:á¬<áª9Þ¨;Ü¥8Ú£5× 4Ôš.ј+Í‘%ÊŒ!ƈÄ…À¿€¿€ÄÈ‹#ј.Øž6¾V ³8²:¬5¡-œ)›)š)š)™*›*œ**+Ÿ, -¡-°>ÅZÉeÉiËnÌqÍtÎvÎzÒ"ÑŽÓ!Ô”&Õ•&Ö—)Ø™-Øš,Ú-ÜŸ1Ý¡2Ý¡1Þ¢0ߣ4Þ¤7ߦ6á¨6á¦5à§8ã¨9ã«<æª9åª7å«5æ«5æ©3å¨4ä¦0ä£'å£(ä¢(⟠âášà™à•Þ•Ý‘Ýۉ؄×Õ{ÕwÔuÒrÏmÏiÏdÍ`ÆS¶;¨)£&ž#™ —›"$›$¡&¦+¦+¥+§+©-ª.¬/­/®1±4±4°6´7µ:µ;·<¹=¹?»A»C¼F¼J½M¾PÀQÁTÁWÃ\Ä^ÄaÅcÇeÇiÇjÃg²L¬?®?­@­A­A¬C¬C¬C¬D¬E¬E«E«F«F«FªFªG©F©F¨F¨E¨F©G©F©E«FªE©D©D¨C¦@¤B§C§B¦B§A¦@§>¨=¦<¨<¥:¹UÉrÊuÍzÍ~Ð Ñ„ ЇЈχχΆ̃ ÉÇ{ÆwÈwÊsºLÊgÜ’à ࢠâ¥(ä¨+ä©/ã¬5ã«5âª9á«=ß©9ܧ7Ú£7Ø 3Ö1Ó™.Ñ•*Í$ÉŠņÀ‚½~¾À€Ä„ÈŠ#Ò™3Ø9»R ²8°9©3Ÿ+œ)š*™)™*š)œ*)ž*ž+Ÿ, ,¦0ºJÆ]ÉfÊjÌnÍrÎuÏvÏzÐ ÐŒÐ"Ó“)Õ”(Õ•'×—)Ù˜'Ùš'Ûœ-Üž.Üž-Ü+Þ¡0ߤ5Þ¥4ߦ5ߦ6à¦7â§5â©9ã©8ä©7ä¨6åª5å©3æ¨4ä¨6ã¤0ä¢(ä¢'ã¡&â %à$à›ß™Þ—ޔݒ܎و؃×€Ö}ÕzÔwÒrÏoÏkÎfÍaÉXºB§+ $™!—š!$›$ &¦*¨+¥,¦+©,«-«.¬/¯1°3¯5¯6²7´9µ;·;¸=¹?ºA¹C¼F»J¼M½OÀQÀSÀVÃ\Ä_ÅaÆdÈgÆjÆk»\¬A¬?«@¬@«@­A«C«C¬B¬C«C«DªE«F«E«EªE«EªEªE©EªEªEªE©DªD«E¨D¨D¦C¥A¤@¥B¥B§B¦A§@¦?¦>¦=¨;¨:«@ÄhÊtËxÍ|Ï€Ђ цЈЉψχÍ…Ê È}ÇzÆvÊxÂ_¾PÖß›á¢!à¤$ã§)ä§+ã«3ä­8ã«6áª8ߪ=Þ¨9Ü¥3Ù¡3Ö0Õ›.Ó˜-Ï“)Ì$Ȉľ~¼|½|ÂƇ#ËŽ)Òš7Õ˜6¸K²9¯8§0)š(™(™)š*š+š+**ž+ž+ ,¬8ÀRÇ`ÈfËlÌnÍsÎuÏwÏzόыÐ"Ñ’'Ô“'Õ“"Ö”$Ö–%ט'Ù˜'Úš(Úœ,Üœ*Ýž.ߢ2ߤ4ߣ3à¥4á¦2â¥-ã§3â¨8â¦5ã¥3ä¨5ä©5å©7ä¨5ã§2ã¤,ä£(ã¡&â 'á 'àž$àœ"ášÝ—Ü•Ý’Û Ú†Ù„Ø‚×Ö|ÔxÓtÑqÏmÎhÍdË`ÂO¯6›#–š!œ$›$ž%¥(§+¥,¦,©,ª,«.¬/®1¯2®5°5²6µ9¶:·;¶=¹?ºA¹C¼F¼I½L¾P¾Q¿SÀUÁZÂ_ÅbÆeÆhÆkÃh²M«=«@ªA¬@«@¬@ªCªC©CªBªC«D«EªE«D«DªE©EªE©E§D¨D©D©C§D¨D¦C§D¨C§A¤@¥B¦B¦A¦@¦@¦?¦>¦<¥<§<¥8³MÉqÊuÍzÏÑЃ цЈЈЈ·Ì„É€ Æ|ÅxÇvÌw¿TÉeÝ’áŸá¤!â¦'ä¨,ä¨,ä¬4ã­9â¬:â«:ß©<ܧ;ܤ2Ù /ל.Ôš,З*Í&É‹#Ň‚¾~¼|¼{À€ʼn$Ì‘/Ò8Ð0¶B²8¬5¡-™(˜(—(™)™)™*›+›+›++ž+¡-´AÃVÆaÉhÌlËoÍsÍuÎwÏ{ЋÑŽ Ñ$Ñ"Ó’#Ô’!Õ“"ו%ו&Ø–$Ù—%Ú™&Û›&Üœ*Ýž0ߢ3à¢0ߣ/á¥.â¥+â¥-â¦0â¥1ã¦4ä¨6ä©8ä¨9ä¨4ä§3ã§0â¥,ã¢'â¡&â %áŸ$áŸ$à!ߙߙޖܒی ÛˆÙ…؃×Ö~Õ{ÕvÓrÐoÏkÍgÍfÉ[·B&–š!›%ž&¤(¦+¥,¥+¦,©-©/ª0«1®2¯4°6±7´9¶;·;·=¸?º@¹C»F¼H¼K¼O¼Q½S¿VÂZÃ`ÄcÇeÇhÅk»[¬>ª=«>ª>«?«?«@ªBªB©A©B©D©C«DªD©D¨D©D©D¨C§C¦C§C¨D¨C¨C¦C§C¨B¦A¥?¥?¥B¦A¦@¦@¥?¥>¥<¥;¦;¥;¥:½\ËuÌwÎ|ÎÑ‚у цЈχΆÍ…˃ ÈÆzÇxÈwËsÄ\Õ}ßšá¡ â¦$ã§(ä«1å«3ä«3â®;â¬;àª9ݧ7ܤ6Ü¥4Ù 1Öš*Ó—'Γ$Ë!LjĆÁ¾~½|»{¾~ćÌ)Ôž6Í…*²<¯7§1œ+—(˜'—(˜(™)š*›+›+›++Ÿ+¥0¸FÄZÈcÊjÌnËqÍsÍuÍxÏ{Ќю"Ñ&Ò‘"Ó Ó‘!Ô Õ“"Ö“$Ö•%ט&Úš'Ûš'Ûœ*Ûž-Ýž.ß¡/ߣ-á£0á£1â¤0ã¥0ä§5ã§6â©:ã©9á¨8â§8ã§6â¥2á¤.â£)ã¢&á¢*á¡(â %à %à#ßšßšÞ–ÝÜŒ Û‰Ú‡Ù…׃Ö€Ö|ÕxÓuÓrÐoÍkÎiÎcÃU­:&˜"%¤*¦,¥,¥,¦+¨-ª.ª/¬0®1¯4°6²7µ9¶:·;¶=·?¹A¹C»F¼I½L½N¾Q¿TÀUÁ[ÄaÄdÇfÇjÂf¯F©;©=ª=«=ª?©?«?«@©B©A©B©CªCªC©D©C§C©D©B©B§B¦B§B¨D¦C¦B¦A§B¦A¥?¥?¤A¥A¦@¦?¥?¦>¥=¤;¥;¦;¥8¬AÅkËvÍzÎ~Ñ Ò„ц ЇЈχΆ̓ Ë€ È}ÇxÈwËxÊmËjÜ àžá¤$ã§'ä¨,ã¬4ä¬5ãª5â­<à«=Þ¨6ߨ5Ý¥4ܤ5מ3Ó—)Ò–(Ï’%ÊŒ Ȉlj Á‚½}¼|½{¿ŇÍ)Ö 7É|"¯8­5¦/œ*—(—(˜(™(š*›*š+›+*ž+¡-¬5¼KÅ\ÈfËjÌnÌrÍtÏuÎxÏ{ÓŽ!ÑŽ Ò#Ò"Ò!Ò‘$Ô‘!Õ“ Ö”#ו$×—'Ú›-Ûœ,Ú›*Úœ)Üš(Ü+Ý /ߢ0ߣ3à£3à¤4â¦8â§9á§9à¨:á©9â¨7â¦5â¥3á£/á£(ã£*ã£(â£(â¡'á¡%à )ß%à›Þ˜Ý•ܑ܎ی ÚˆÙ†؃×€×~Ö{ÕxÔuÑrÏoÍkÎiÍdÁS®:¤*£'¥+§-¦,¥,¨,«.«0¬1®2¯4±5³8´9µ;¶<·=¸?ºAºCºF»H½L¼N½PÀTÁTÁ[ÄaÆdÇgÅjµP©:¬<ª<©=ª>ª>¨?©?«?©A©A©B«B«B©C©C©C¨D©D¨C¦C¦A¥@¦B¦B¥B¥A¤A¥A¦@£>¥?¦A¦@¥?¥>¥>¥<¤;¤:¤:¤:¤6·SÉrÌxÎ|ÎÏ‚ цчшχΆ Í„Ë Ê~É{ÈwÉwÌwÊlÖߘà¡ â¦%ä§'ä§+â¬4ã¬6ãª6â«<߬?Þ©<Þ¨6Û£4Ú¢5Õ›/Ж(Ï”)Í&ÉŠ!ƈƈ"À¼}»}¾~ÄÉ‹%Ñ–2Ù¥>Ær®5¬5¤.š(—'—'™(˜)™)›*›+›++ž+£/±<¿PÆ^ÈfÌlÌpÌsÍtÍvÎyÏ{Ô’(Ò‘%Ò‘'Ñ'Ð&Ñ’&Ó’#Ô’ Õ“#Ø–&Ø–&ؘ+Ú›+Ù™&Ù›)Û-ÜŸ.ÜŸ1Ý£5ߤ4ߣ3ߤ6ߥ9à§;à§;à§:à§9á§6ã§5ã¥4â¤1â¤-â¥0á£,ã¡'â¢'â¢&á¡'á¡(ßž#ß› ޘݔݑÝÛŽÛ‹ ۉ؅؂ÖÖ}Õ|ÔxÓuÒrÏnÎlÏjÎeÅWµ@¨.¤*¦,¥-§-«.¬0­0°2¯4²5³7³9µ:¶=¶>·?¹A»D»E»J¼L¼O¾Q¿TÁWÄ]ÅbÆeÆj¹W¨:¨9ª;¨;¨;¨=©>©>¨@¨A¨?¨>©A©A¨A©B©B¨B¨B¨B§A¦B¥A¥@§A¦A¦A¦@¥@¤?£=¢>¥?¦?¥?¥>¥>¤;¤:¥:¤:¤9¢7¨>ÃfËvÍzÍ~ÐЃ цÒˆЈΆÎ… Í‚ Ì€É}ÇyÈvËvËqÒzß—à á¤#ã¦$â¦&ä¨-ã¬5ã­7ä«5áª8ߪ<ߪ?ܧ:Ø 3Ø¡2Õ0ј+Î’&Ì$LjŅý~»|»|¼}Á‚È‹&Ï–2Ø¡8¾]¯5¬5¡-—(–&—'˜(˜)™*š+›+œ,›+ -ª5´AÀSÆaÉgÌlËrÌtÍuÍxÎzÏ|Ô•1Ó”,Ó”.Ò“,Ð'Ð%Ò‘"Ó’ Ô‘!Ö”%ו%×”%Ú—%Úš'Úœ+Û.ÝŸ3ÛŸ2ÛŸ0Ý 3Þ£6Þ¤7ߥ:ߥ9à¦:à¦:à§:à¦8â¦6â¥4á¤3á¥4ã¦4á¤2á£-â£)â£)â¢'â¡%á %àœ!ß› ޘݔܑݑÜÛ ÚŠÙ†؃ÖÖ€Õ~ÔzÕwÓuÒrÐoÍmÎlÍhÃW´@§/¥*¨,«/¬0­1¯3°5±6²8³9´:¶<·>¹?¸BºC¼F¼I¼M½O¾RÀUÁXÄ_ÆcÇh½[©:¨7©9¨9§;¨;¨<¨=¨=¨>§?§>§=¨?¨B¨B§A§A¦B§A§A§A§A¥@¤@¦@¤@¤@¦@¤?¤>¢=£=¤?¤?¥>¤=£;¢:£:¤:£8¢9¡7´PÉpËtÎ{ÐÒ€ Ò„ чχχΆ΃ ËË~Ê|ÈxÈvËtÍpÛŽàŸà¢!â¦(â¦&á¦&ã©-ä¬4ä­7â«4á©5à©;ß©<Û¤9Ø¡5Ø 1Öž3З+Í&Ê‹!ņÃÀ¼|¹y¹y¹y¾~ćΔ+Ô“.³F®7©2›*“%•&—'—'˜(™*š+›,œ+ž,§1°:¸EÃWÇbÊiÊmËrÍtÍvÎzÏ{Ð|Ö—5Õ•2Ó–3Ó–2Ó”,Ò’'Ñ‘#Ó‘ Ô!Ô‘"Ö”#ו"Ù–$Ù™&Ù™(Ú›,Ûœ3Ûž3ÜŸ3Ý 4Ý¡8Ý¡6Ý¢5Þ£7Þ¤8Þ¤8Þ¤6Þ¤6à¥6à¦4â¥2á¤3ã¥4â¥0á¥/á¤/á¤-á¢+à %à %àŸ&ààšÞ˜Ý•ݔݒÜÛ ÚŠÚˆÙ…׃Ö‚×Ö|Õ{ÔxÓvÑrÐpÏnÏnÍgÂT²=©/©.¬1­3­4®5°6³7´:µ;µ=¸?¸@¸B»C¼G¼J¾M¾P¾SÁUÃYÄ`Çg¾]ª;§3¨8©8§9§:¨;¨<©;¨<©=§>§<§=¨?¨@§A§@¦A¦B¦B§@§A¦@¤?¥@¦@¤?¥@¥?¢>¢=¢>¤?¥?¤>¤>£<£:¢:¤:¢8¡8£8¥<¿_ÊrÌwÏ|ЀЂ Ñ„ Ò‡χΆÏ…΂ ËÊ|ÊzÊxËwÊpÔ~ߛߠâ¤'ã§+ã¦&â§'ä©-å¬3ã«4â©3â©9áª=Þ¦;Ú¢8Ø 5Øž0Ô™*Ï“$ÌŽ#ÈŠ!Ä…À‚¼~¹y¸x ¸xº{¿LJ Ñ—*Ë!°;¯7¡.’%’$•&—'˜(˜(™*œ**,£.«6²<ºHÄZÇdÉjÊnÌqÌtÍvÏ{Î{Ð|Õ•/Ó”.Ò”1Ò•3Ò–/Ó”)Ô”&Õ“$Õ’"Ö“!×”!Ö•"Ö—%Ù—%ؘ)Ù›.Ù›.Øœ/Ú.Úœ/Ú2Ü2Ûœ/ÝŸ4Þ£7Þ£4Ý£4ߥ7à¤5Þ£1á¥2â¥2â¤2á¥2á¤0á¤/â¥0á£0ß¡*á &áŸ&àŸ$ß#ߙޗݖݕݒÛÚ ÛŠ ډه؅ւ׀ÖÔ~Õ|ÔzÓvÓsÐqÎnÎmÌfÂU´>¬1¬2®5¯6¯6³8µ9µ;¶=·?¹A¹CºD¼G¼K¾N¾P¿SÀVÃ[ÆdÀ]«<¤1§4¨6¨6§6§8¨:¨;¨;¦<§<¦<¦<§=¨>§?¦?§?§@§A¥A£A¥@¦?£?¥?¥?¥?¥?£= =¢>¤>¤?¥>¤>£=£;¡:¢9¢8¡9¢9¢7¬EÅkÊtÍxÎ}Ï Ð„ Є цχφ΄ Í‚ Ë~ÊzÊwÌwÊqÍpÜ’àŸà¡!ã§,ä§(ã¨)åª-äª.ãª2ã«4á©2á©7à©;ܤ9ÙŸ6×2Ö›)Ó•%Ï‘"Ë"Lj‚¾~»y¹x·w¸x»|ƒÊŒ%Ôš.Ãj¯7ª5—("#“$•&•(˜(˜)š*ž+£.©3¯8´=½LÆ^ÈfÊkËnËqÌtÍwÏzÏ{Ð}Õ”,Ó’,Ò’.Ð’-Ñ•.Ó”+Ó”)Ô•(Ö•&×–'×–'Ö—*Ö˜)×—'ؘ+Ùš-Ù™)×™)ט'Øš+Ùš-Úœ2ÜŸ2ÜŸ2Ý 4Þ¡4Þ¢6Þ£4ߢ1ߢ0à£2á¤3â¦4â¦5á¤4á£3â¤2á¤2à¢/á¡(à¡*ß *ÞŸ'ßœ"ޙޗޗݕܑÜÜÚ ÚŠ Û‰؆Ø„ׄÕ‚Ö€Õ~Ô}ÓyÒwÓtÐrÏpÏnÌf¿Q²<®4¯5³7³9µ:µ=µ>·?¸AºB»E¼H¼L½N¿PÀTÁXÄaÀ^«=£/¥2¦2§5§5¨5¦7§8¦:§;§;¦<¥;¦;¦=¦=¦=§>¦>¦?¦@¦?¥@¥@¥?¤>¤>¥?¥?£= ;¢=¢>¤>¢>£>¤>£:¢;¡: 8¡9¢8¢8¢7¸VÇqÊuÍyÏ}Ï Ïƒ Ð… І Ï… ΄ Ì‚ËË{ÊxËvÌtÈh׃ àáŸá£#ä©,ã§&ã¨*äª1ä¬4äª2âª4â©3á§2ݤ5Ú¡2מ3×›/Ô™*Ñ•&Î$ÉŠ Ä„¿¼{ºx·w ·v ·wºzÀÊ$Ó•+ºR ®5£0’%Œ"#$”&–'˜(˜)š* -¨1­5²9µ?¾QÇaÉhËlÌoÌqÌsÍwÎzÏ{Ï~Ö—2Ó”1Ñ“-Ï‘)Г.Ñ‘)Ñ$Ñ‘$Ò‘"Ó“&Õ–.Ö—/ט-Ùš/Ùš/Ù›1Ùš,Ø™)Ù™(Úœ1ÛŸ3Ýž4Þ¡6ߢ7Þ¢2Þ¡3ߣ6ߣ4ߢ2Þ¤4ߥ5Þ¥5Þ¤4à¥4ߥ3à¦5á¤4à£3ß¡-ߢ)à¢-ß¡,ß +ߟ'Þ›"ߘÞ—Þ—Þ•Ý’Ý’ÜÜŽÜŒ ډهن؅ׄ׃ÕÕ~Õ|Ô{ÓyÓvÒsÑqÐoËeÁT¹D³8µ8µ;µ>¸?¹@ºC»D»G½K¼M½O¿QÀVÄ_¿[«=¢.¤0¤0¥2¦3¦5¨6¦6¦7§8§:§;§;¦:¦;¦<¥=¥=¥=¥=¦>¦?§?¥?¦?¥>¤>¤>¦>£=¢:¡<¡=¢>¤>¤>£>¤<£:¢:¡9¡:¢:¡8 5©@ÂeÈsËwÎzÎ~ÏЃ Ï… Ð… σ ÎÌÌÌ{ÊwËwËoÐvÞ•ážâ¡ã¦$ä§*ä§+å©.ãª3ä­:ã«6âª4áª2ߦ1Ú¡.ÙŸ-ל+Õ—'Ò”'Í#ÊŒ!LjÁ½}ºz¹x·w ·x¹y¼|Á‚Í%Éz°<­6›+Ž$"Ž$$’$—&—'˜*œ+¤.«4¯7²<¹CÂVÇcÉhËlËpÌqÌsÍwÏ{Ð}Ï~ך8Ó—6Ò“0Б+Ï‘-ÍŽ%ÎŒ"ÍŠ͈΋Ð&Ñ‘%Ó’$×–,Øš1Ù›3Ù›0Ùš*Úœ+Û3Ûž0Ü¡3Ü£8Ü¡5Ý¡0Þ¡1Þ¢4ߤ7ߣ4ݤ3Þ£2ߣ2à¤1ߤ5ߥ6ߥ6ߦ6à¤1ß¡,ߢ0à¡/à¡-à¢+àŸ)ßœ#Þš!ݘޗߗߕޕݒܑÛÛŽ Û‹ Û‰Ú‰Ù‡؆ׄÖ„ÕÖÖÔ}Ó{ÔxÒuÒsÐqÍiÃV¹Bµ;·<¹?ºBºD»F»I»K¼M¾O¿SÃ[¾W©9¡+£-£/£/¤1¥3¥4¥4§5¦6¦7§8¨9¦:¦:¥:¥;¤<¦<¥=¤>¥=¥=¥>¦?¦>¤>¤=¤=¤=£<¢:¢<¢=£>¤<¤<£;¢:¡:¡:¡:¢:¢8¡7Ÿ4±LÇmÉsÌyÍ{Í~Ï€Рσ ΄ ΂ Í€Ì}Í|ÍzËwÊrÍpÚŽ ß›áŸá£!â¦$ä§+åª-å«0å«4ä­:ã«9â«7á©3ݦ1Û¡/Ùž-Ö›-Ò—*Ï‘$ÉŠȉĆ¿€º{·x·v ¶w¹y»|¾ĆÐ’'¼Y ¯5¦3”(Ž$Ž$$$‘$“&—(™*ž-¦1¬7°:³=ºGÃ[ÇeÊjËmÌqÍtÍuÎwÏ{Ð|ÏÚž<Ö›9Ó–2Ò“0Î+Ì‹"̈ʆˆ̈Í‹!ÏŽ"ÐŽ Ò’'Ô•+Õ—,Ø™.Ù˜(Ûž-Þ¡7Þ¡4Û¡5Û¡7Ü¢7Ü¡4Ý¡1Þ¢5Ý¢4Þ¤3Þ¦5à¥4á¦6â¦5â¥4à¦4á¥6á¦3á¤0á£2á£3à£/à¢.à¢-ß *àž#àœ"ß› ߙߙߘޘߔޓޓܑÜÜ ÛŒ Ú‹؉ هن؆×…ÖƒÕ€Õ€Õ~Ô{ÔyÓvÒsÑqËhÅZÀN»G¸C¹C»H¼J¼L½NÀRÂW¹P¨6 +¡-¡-¢.¢.£/¤1¤2¥4¦4¥5¥6¦8§8¥9£8¦9¥:¦;¥;¤<¤<¤;¤=¥=¥>¥>¤>£;£:¢:¢:¢:£:£;£<¢:¢:¢9¡9 :¡:¢9¢7¢7¢6¢8»YÇoÊtÍzÌ|Í~΀ÏÐÏ΀ÍÊ{ËyËxËvËpÕ‚ßšàà¡ á¥$â¦'ã§)åª/åª1ä«6ã¬8ã«8âª8ß§6Ü£/Û .Ø.Ôš-Ñ•(ËŽ ȉƇÁ½}¹y¶v ¶t µu ¸x¼}¿€ÉŒ È|°>­8-%$$$‘&‘&“&˜)+£/ª4­7¯:²:»JÄ`ÈfËjËoÍsÍuÎuÎxÏ{Ð~Ï€Ý2Ø›3Ô–-Ò“+Î'Í‹!̆ʄʄˇ͈̈ΉÐŒ!Ñ&Ò’(Ô•(Ö˜'ؘ(×™,Ø›.Ú1Ú 4Û¡6ÜŸ4Ü£6Þ¢7Þ¡4Þ¢3ߦ8à§:á¨:á§8á§7â§8á¦5â¥2ã¦2â¥5â¤2á£1ߣ/à£-ß¡+ߟ&á#áž"à"àœ!à› ß™Þ–Þ•ß•Ý”Ý‘Þ ÜŽÛÚÛ‹ ÚŠ Ùˆ ؈ ؆Ø…×…Ö‚Ö€ÕÔ~ÔzÓvÒuÐtÏpÍgÆ\¾Q¼L½L¾NÀQÂU¶H /ž) + , -¢.¡.¡-£/¤1¤3¤3¤4¥5¤7¥7£7¤7¥9¥:¥:¥9£:¤9¥;¥;¥<¤=¥=¤=£;¢:¢9¡9¢9¢:¢:¢:¢9¡: ;¡:¢8¡9¡9 7¡7 5©@ÃdÇpÉuÍzÍ}Î~ÏÎ΀ÎÍ~Í|ÌzÌyÍyÌrÓ~ݕޜàŸ!à¡ á¤#â¥'ã§'ä¨/ä©1âª2ã«9ãª8á§7Ý¥7Ü£3ÚŸ.×›+Ò•'Α#ÉŠLjƒ¿~½{·wµu ´s ´u ¸x¾~ƒÌ‹ ¹T¯6¦4”(Ž$$‘&&’'”'š)Ÿ,¢/§0«6®:±;´=¾QÇbÉhËmÌqËtËuÌvÎyÍ|Ï~πݒۙ'ט+Ó•'Ñ#Ί̇ˆˆÊ…ʄ̅·ψÏŠÐ!Ò!Ô’"Ò“$Ó’"Ô“#Õ•'Õ™,Öš/Ù›1Ùœ0Ùž4Ûž2Üž1Ý 6Ý¢7ߣ6Þ¤4à¥5ß§;à§:á¦6â¦5á¦5à¥3á£0á¢0à¢.à¡,ß¡&á (à¡)à &ߟ(à$à› ßšÞ˜Þ•ß•Þ“Ý‘ÝÜÜÛŽ ÛŽÙڌڊ؈Ùˆ ׇ Ö„Ö„ÖƒÔ€Ó|ÓzÓxÑvÑuÑtÐqÌiÆ_ÃW¿Q­>*›')Ÿ*ž+ž,Ÿ, - -¡0¢1£2£3¤3§4¤5£5£5£6¤8£7¢8¤9¤9¤9¥:¤:¤:¥;¥<¤;¢9 7 8¡9¢9¢9¢9¢9¡:¢:¡;¡:¢9¢8¡8¡8¡7Ÿ5²LÅkÇqËvÍzÍ~ÍÍ~ÎÎ~Í}Í{ÌyÍyÏyÇgÌqÜ’ßšßß !ࢠâ¥%â§*ã¨-ä©/ä©0â©0â©6á§7Þ¥7Ü¥8Ú¡4Øœ+Õ—&Б#Í!ȉÄ…Á½|¸x¶u ³s ´r µu»z¿ÉÃo¯9®7-%$&’'’'”(›+¢-¤1¦0©2¬8®:±<·BÂXÈdÊiÌoÌsÍtÍvÍwÍxÏ|Ï~ÏÝÝ’ Ü–×–&Ô‘!ьϊΉ̆˅˄̅͆͆͆ÏŠÎŒÐÐŽ ÐŽ ÑŽ!Ñ‘$Ó‘%Ò’$Ó•'ט)ؘ,Ùš/Øš*Úš+Ûœ0Ý 4Ý 5Ý 0Þ¡3Ý¢7Ý¢6Þ¢7ߣ6à¤7à¤5à£0á¢0à¡.á 'â¡*á¡+á )á (ߟ%ß"à›ß™Þ˜Þ—ޖݔݒܓܑÜÜÜÜÚ Ù‹ÚŠÚ‹ ؉ ׇ׆ׄÖÕÕ~Ô|Ó{ÒyÓxÒwÑvÎqÉh·PŸ.˜%œ)*ž+Ÿ+ž,Ÿ- - .¡/¡1¢2¥2¥3¤3¢4¢3£6¤7£6£7£7¤7¤8¤9¥:£:¤:¥;¤:¡9Ÿ7¢8¢9¡8¡8¡9¡:£9£:¢9¢9¢8¡7¢8£7¢6£9»[ÅmÈrÌvÎzÌ~Ë} Í}Í|Î|Î{ÎzÎzÌtÁZÁ[Ù‹ ݙߛߟ à #â£"â¦'ã¨/äª2äª2ä©1â©2á©7Þ¦6ݤ4Û¡2Ùž-Øœ)Ô–#Ï‘"ÍŽ!Ȉÿº{¶v ´s ³r ³q µv »{ĆÈ€³D¯8©3—*%%%’'•(š*Ÿ,¤.¦1¨2ª5®9¯<²=ºFÆ]ÉgËlÌqÍtÍtÌvÎxÎzÎ|Ï~Ѐܔے ܑۑٕ"Õ’"ÓŽÓЉΆ͆Ì„ʃɂ̅ΊΊΉΊÏŒÐŒÏŒÏ Ð!ÑÔ’!Õ”%Õ•(Ö–'×—(Ù™,Úœ1Üž4Ûž2ÜŸ0ÛŸ2Ü3Ýž4Þ 6Ý¡6Þ¡4ß¡/ß¡.à -à ,à¢.ß¡/áŸ-àž+ßž&ßž$àœ!à™ß›Þ™ ޘݖݔޕޔݒݒݑÝÜÛ Û Ú ÚŒ ÚŠ ׈ ؇ ׆ÖƒÖ‚ÕÕ€ÔÔ~Ò|Ò{ÓzÓxÔ|Äf¢2™$)ž*ž*ž+Ÿ,ž+Ÿ,¡.¡/¡0¡1¢1¢2¢2¢2£4£5¢6¢7¢7£7£7¤8¥8£9¤9£:£9¡7 7¡8¡7¡8¡7¡8¡9£8¢8¢8¡8¡7¡7¡6¢6 5ªAÂdÅnÈsÌwÍyË{ É{ Î{Ï{Ï|ÏyÍtÅe¸K¼OÖƒ ܘßœàžá¡#à¢&â£%ã¦+ãª1ã«4â«3â©2á©4à§7ݤ7Û¢4Ùž.Ùœ,Öš)Ñ“#Α"ÌŒ!LJ‚½|¸yµu µt ¶t ·t ºx À€ɆºR°8°9¥/”%‘%“'”(™)œ*ž+ ,¤/§2¨4¬7¯;²<´=¼LÇbÊhËmÌrÎtÌuÌvÍyÎ{Î|Ð~Ñ€Û–Ú“Ûڌڎ ؔ֓"ÖÓŒЊΆÌ„ Ê‚ É͆Ήψ͈̈ωÏ‹ЉÏŠωÑ‹ÒÒ’%Ô”%Ö”%Õ“&Ö•+Ù›2Ûœ1Û1Ü 4Ü 4ÛŸ4Üž5Üž4Üž0Ûž.Ûž-Ü,Ýž*ÞŸ.ÞŸ.Þž-ßž,ßž*ß*ßœ&Þ#Þ› ޛݛ ݚޗޗޖޕݔݑݒݒܒۑۑÛÛڎً؊ ؉ ׈ Ö†Ö…Ö„ÕƒÔÔ€Ó€Ó~Ô|Ò{Ñ|Åh£5š%)œ)*ž+œ+ž, -¢-¡/ 0 0 0 1 0¡2¢4¡6¢6¡6¢6¢6£7£7¡7£8¢8 7Ÿ5 7 7 7¢7¢8¡8¡9¡9¡8¢9¡7¡7 7¡6¡7 4±JÄhÅoÉsÌvÍxÌxËwÍwÉmÄ`¾T¹J´@µDÒxܔݙáá !á¡%á£&â¥)ã¨-ä©2ãª3á©3à¨4ß§3Ý¥4Ü£6Ú 5Ø/Øœ.Ó–(Ï!Í!Ê‹ Ć¿€½z¹xµu µt ·v ¸x ½{ɇ½^ °:°<­6Ÿ,”%•&™)›*+ž+ž+¡-¤1§3¨4­8²:³=¶>¿QÈdÊiËmÌsÍuÌuÍvÎzÏ{Ð}Ñ~ÐÚ—!Ù“×ØÙŒÙŒÙ‘×’ÖÔЉχ΄˃·Έ·͇Ì…͈̆χЉÏŠЋÑÑ‘$Ó’&Ô“'Ó”(Õ–+Ö—,Ö—(Ø™)Ø™.Ùš0Ù›0Ú›.Ùš+Ù˜*Úš.Ú›-Ûš(Ú›(Ý›+Ýœ,Þœ)Þœ(Þž+Ýž-Ýœ*Ý›&Ý›$Þ›#Ý›!Üš"Ý™ Ýš Ü™ݘݖޕޔݓܕݔܔۓÛÚÚŽÛ ÚŒ Ù‹ ׋ ØŠ ׈ Ö† Ö„ Õ„ÕƒÔÔ€ÔÑ}Ð} Çm £4›&)))+›+Ÿ+ . /Ÿ/ 0Ÿ/Ÿ/ 0 2¢2¢3¡4¡4 5¡6 6¡6¡7¢7 6ž3Ÿ3 7¢8¡8¡7¡7¢8¢8¡8¢8¡8¡6¡6 6¢5¡6¡6¹TÅiÇoÉtËuÌwËvÎvÈf·HµB³@´A³?Éiܑܖߜàâ #â¢%â¥(â¥*ä¨.ãª1â©4á©3ߦ1Þ¤1ܤ2Ú¡2מ0Ö0Ò˜-Ï‘$Î!Ê‹ƆÁ¼{¹x¶v ·t·w»y½{ƆÄo±<±<¯9§3˜)”%™(+ž,Ÿ,Ÿ, +¢-¥0§3ª7­9²:µ=¸AÃWÉeÊjËoÍsÍuÌvÍwÏzÎ|Ð}ÐЂÚ›*Ù˜"ٓؑØ׉׈Ù‹ Ù׎ÓŒЊφÍ…··͆̅˄͇̅·ωϊόόϋÐÑ‘#Ò’$Ó“'Õ•)Ô”&Õ•(Õ—,ט.Ø™-Ùš,Ø™)ؘ(Ø—*Ú™+Ùš(Û›+Üœ,Û›*Ý›(Þœ)Ûœ+Úœ+Ûœ)Üš$Üš$Þ™%Ý™"Ûš!Ýš!Ý›!Ý›$Ýš%Þ™ ޗݖݕܖܖܕ۔ۓۑۑڎڎ ÙŽ ÙÙ׌ÖŠÖ‡ ÖˆÕ… Õƒ ÕƒÔ‚ÔÑ~ÔÂaœ)œ(œ(›)›+›++,-Ÿ/ /Ÿ/Ÿ.Ÿ/Ÿ1 1¡1¡2¡3¡3¢5¡6¡6¢6¡5ž3ž2 5¡7¡8¡7¢7¢7¢8¢7¡7¢6 5 5¡6¡6¢4¡3¦;¾^ÅiÈoÉtÊvËvÊuÍr½Q¶C¶CµB³>ÀYڌەߚàáŸã¢&â¤(â¥(â§.ã¨.â©/á¨6à¨7ߥ0ܤ0Û¢2Ùž-Ö›+Õ™+Г&Í"ÌŽ"LJÂÀ}»y¶v µt µs ·w½{ăÈ}µE³;²;­7¡.”&—&œ)ž+ - -Ÿ, ,¢.¦2¨5ª6®9±<´>¹GÆ^ÊhËlÌqÎtÍvÎvÍxÎzÎ}Ï}Ð~ÐÜž-Û›&Ú™#Ú–ØÕ‹Ö‰ׇوØŒ׎Ó‹ЈψЈχ͆̄̄͆̆Ά͇ΈЈψψЉÏ Ð!Ñ"Ó’(Ô•*Ó“'Ô“'Õ“&Ö”&Ö•(Ø—)Ù˜*Ù—)Ø–&Ø—'Ú—(Ø—)ؘ(Ø—&Ú™&Ú™'Û™(Ûš)Ü™%ܘ#ݘ#ݘ#Û˜#Ýš$Ýš$Þš'Ý›'Ýš&Þ™#Ý— Ü—ݘÝ—Ü–Û–Û•Ú“Û’Ú‘ÚÙÙÙŽØ׌׋׉ Öˆ Ö‡Ö„ Ö„Ô‚Ô‚ÔÒ|¨<™$›(›(š)™*š*œ+,ž-ž.ž--ž/Ÿ0 0 1 1 1 2¡2¡4¢4£3 4ž1¡3¡5¡7¡7¡6 6¡7£7¢6¡5 6¡5¡5 6¢4¢5Ÿ2¬DÂdÅjÉoÉsÊvÊtÌvÆd¶E¶CµB´>»Lׄ Û•ݘàœážâ  ã£%ã¥*ä¨-ã§-â§1á©3á§4ߦ6Þ¥3Ü¡-ÛŸ.Øœ*Õ—&Ô–(Ï‘$Í!ÌŠÅ„À~¾y¹u ¶sµs ³s ¸wÁÊ…ºQ´;´<°7©3š*“%–&œ* ,¢- - - -£/§2¨5ª6®9±=´>¾NÉbÊhÌoÍsÏvÏvÏvÎxÎzÎ}Î~Ïςޡ3Ü+Û+Û›)Ú”בÖ ÖˆÖƒÖ‚׆׉ Ó‰ÒˆщшφÏ…φΆË„Ë…Ì…Ì…͆ΈχЉЊÏŒÐŽ"ÑŽ#Ò$Ó#Ó‘#Ô’#Ô‘$Ô‘$Õ’$Ö”&×”&ד%Ø”%×”$ד$×”#Ø”#ו#Ù–&Ú˜)Ú—(Ú—&Ü—"ݘ$Þ˜&Ý™(Ü›'Üš'Ýš'Ýš%Ýš%Ýš%ݘ#Ý—ݘ"ܘ"Ý•!Û–Ü• Ú“Ú“Ú’ÙÚÙ‘ÙÙØŽØ׋ÖŠÕˆÖ†Õ† Ö„Ô‚Óׄ´O–#š'š'›(™'œ(+ž+Ÿ,ž-,Ÿ,Ÿ-Ÿ/ /Ÿ1 1 0¡1 1¢2¢3 1Ÿ1Ÿ2¡3¢5¢5£5¡6¢5¡5¢5¡6¢5¢4£5¡5 4¡4¡3 1³LÄfÆlÇoÉsÉtÊuÌq»OµA¶B´?¹IÒx Ý’Ü—ßšßž!á  â¤"ã¤&ä¦-ä¨/ã§/ã¨3â§5á¦3ߤ1Ü¢1Û .Úž-Ö™*Ô–%Ñ’!ÌËŠ"ɇÄ€¿{»w·r ²o²n¶qºwȈÀc ³;µ>²;®7£0—'•%—(ž+Ÿ, ,¡-¡-¡-£0¨3©6ª6­9±<¸AÄWÊfÌjÍpÍtÌuÎuÐxÎzÎzÏ|Î}ЀЃÞ£;Þ¡5Þ¢4ÝŸ1Ü›)Û˜ Û“ØŽÕ‰ ÕƒÔÖÖ„Õ† Ô‹Õ‹Ó‡ІχÎ…˃Ì‚ ʂʂ̄ͅΆψωЉÏ‹"ЌъЋÒŽ!Ó"Ó‘#Ô‘#Õ‘$Ö’$Ö“%ד$×’#ד$ד&×”&Ø”#Ø”"Ù”"Ù”%Ø”%Ù•%Ù–#Ú—$Û—(Û—(Û™&Ûš(Û™)Ü™&Ü™%Ü™(ݘ&Ý—"ݘ#Ý—$Ü–#Û•Û•Ú“Ú’Ú’Ù‘ÙÙ‘ÙØØØØÖ‹ÖŠÖ‡Ö† Ö† Ö„ Ó‚׆ ½\•"™%š&™&š&›')œ)œ+ž,+Ÿ+Ÿ.Ÿ/Ÿ/ / 0 0 1¡1Ÿ1 0 /Ÿ0 2¢2¢3£4£4¢3¢4 5¢4¢4¢4¡4¢4¢4¡4¢3 2¢3¹TÅgÅlÉoÊrÊtÎvÄ_¶C¶Bµ@ºHÒuÝÞ•àšáœáž!ã¢&ã£'ã¤)ã¨0ä©2ã¨2ã§5â¦4á¤2Þ¢0Ü /Ûž.ך+Õ•(Ó”%ÎŽ Ɉȇÿ|½x¸t ¶q³n³mµoÁ} Æsµ@µ>²<±8­4ž+”%”$˜' ,¥3ª8ª8¥2¡,¤/¨4«5¬4¯8³<ºFÇ^ÊiÍlÍpÎtÎvÍvÎxÎzÎ{Î{Ï~Ò€уà¤<á¥9á¥7ß¡2ÝŸ-Þ(Þ™"Û•Ù“ØŽÖ‡Õ‚ÕÕׇ ׊ ÖŠÔ‰ш΃ Ì Í€ Ì€ Ë‚̃̃̃Í…͇·ψЈщЉÑŠÒ‹Ó ÓŽ!Ó!Ó!Ö’$Ø’$ב"Ö’%Ö’'ב%ב#ב"Ø’"Ù“$Ø’$Ù“#Ú”$Ù”'Ú–)Û–(Û–&Ú—'Ú˜*Ú˜'Ú—%Û—*ܘ'Ü–$Û—%Ú–%Û–$Û–#Û• Ú“Ú’Ú’Û‘ÚÚÙØ×׎؎ՌՉֈ׆׆Õ†Ôƒ Õ„ Àa˜#™"™#™&š%š&›(œ(*ž*ž*+-Ÿ.Ÿ.¡/¡/ 0 /¡/Ÿ/ž.¡.¢0¡2£2£2¤3¤3£2£3£4¤3£3£4¢3¡4¤3¢3¡2¡1¥7½YÆgÈlÊnËqÍtËk»J¹B¶B¹EÐmÜ‹ Ý‘à˜á›âžãŸ"ã¢'ä£(ã¥,ä§3æ©6ä§3ã¥1á¥5ߢ2ÝŸ-Ûœ+Ùš*ט'Õ•&Ô”&ÏȆŃÂ|¾x ¼u ·q¶o¶o·o¿uÈyºLµ<µ=³:°6¨0›'•%š+¬>¾UÈfÏnÐmÆ_¸L±?®;«6­5±9¶=ÁNËcÌjÎmÏqÐsÏuÐxÏxÏzÐzÐ{Ñ~Ò~Òrmagick-2.13.2/doc/ex/images/duck14.gif0000644000004100000410000001463512147515547017500 0ustar www-datawww-dataGIF89a´´öp !+ ((%$9%::)($/0'2/)54,;:5B+L1W8A>7JJZYCD;iDuL~RgfxxIIDMQGSRJXYU^c[a^Wdc]jkfkqjlvrrojtslx{u}ƒ|}†††W™c§l®q¸w~zÿþþ((ü77Â~üGGø[[îzzüffúyy‡‡™™©©°¯¸¸ƒ‚|Ƀ׋Þè–óÿ¥ÇÇ××èèÿÿˆ‰…Œ–”Ž‹“’—™–š ž™¥¥ ¡ž¨ª©©¶¶·¹¹¬ÀÀ¹ÆÆ¼ÓÓíí™™ú‡‡ù——ê©©å¶¶÷¨¨ûººÆÈÈÇÖÖØÙÙÍááÖëëÝóóéÇÇåÕÕøÇÇþÚÚèééçööþææýþþÿÿÿ!ùp,´´þ€o‚ƒom„‚g‡…Š‹‡‰‡†ŽŠm‘„•ƒ–Š™ƒ—›“ ž„œ‚¤§¥šŒ’®–©¡¯˜²³¨¢¦“±¸´¼½·¶oª”À­Äºµ¾¹¿°ÊˆÆ¤ÅÍËÕÁÎÔÐÂÒÒ­ÛÉØÌâŸÙ…»ãמÓèÃÏ«¨çÖðæ£Þ¬¦ëŒÝågúÑï½ã—¯œ»r©þh/Ü<ë SEl(ãÈä8’ h¬bÀ6güÅ4#3æ3f`ÆÔ¹s&M›3aR𠔍Nž=Ûàì”éO 4y"Õ¹´hN§EoÖD*SéOžWkF…¶¦Ó§;Q—Ѥ[zþìRžl÷íZGYNd+×[I‰t[®ü¶-o?†;¦‹gL-b* |¼Ø.eÀ}éÝm‹ÙÛfÈ™ ǦÐgD¥a¥f|áÀÓ£çÕ¥çXrb½ØÄ(}ñÍbLQ@ˆáÀ¶9Ãvù±6çÙ½aOÓm¼÷ïà†r“ãø\ÙÞ+‹†>É&U©ZwRZ:´)X¡;£R‚9¶ç,fª(S¦Êü2W(cP’Wø“…fH€?iÐpi¤Ñlà„Æ^¤Á…a]ˆZþ<5{ï EWeÑgÞzòÙ"LŒ˜±‰'þ@òH%‰\’cA„|Àˆ°›» þ2Ü€¹À×Äbœá  :Äpƒ]È€% m¸!C]„!ƒ€qC4¬ò#&ëì8xÕi‰œž…„[h—0o°±À‘I¾¡” ˆ\7åÃh÷Æ1÷Æ `ÒÝ1p!ˆ 6ÒE›n´I˜k{DŠs²±*Þ3Œ „¦¦ßF©"’ŽI9¼áFm„ƒ‚ÌP,¥a¸aÃz¦YD³í3˜r” B$H²qE¡ÚMyÈo ø™F¤Ä½qƒÅ€1Ã]ÇE¨ÆÆàÅ9ÈÐ…kŒ÷×x|Uæê0 fY6|ɵ Âqþ¦&† ×½aAì "CŸÃ]bƒ§opAC"4ûÖ_äM^¶—ÅÌm66Á†ì¦oˆ1èˆz@|1Pцv”ºF$2ÜP1¨1) n°ìòë&÷ÝËÃ5ß|þœ­¢Úi£Ûj ¨öÛg«`4±ß%ôÌÞ1ÁÁ˜q ”01@¹nÑiumØL_Ä€Ã:ç1èÀmŸwè¢Ï=úéq§Nº!¬³žv=9·ð"®Ë¾Þ4Cµž»9µ³nï¹ÃM;L¹²ò|ltG mž¶`÷6ì¾c*ÒNg1Ù»÷þ‘8Ïýªš…מ¬)¬Ù&’2–³‚Рªt™/Ú›éçïWµ7_«~t“¨Â†Ì` ƒPC§à·0 ýï2¢¡`PB6keÆfœøKk¡©ÅÖ d`"œŒõ·¾S=°5Ï1ßÁ¸AÁØT††·YagfC0 ÒH‡8äL) a£Öͮܣ]´×"ovÕ *–èº&íD”"•H»Bñ_öÂWÅê}q9éâ"¿¡ ±+¥S‘|ÐF:õ¸-ntKÛÛƒ¶£8n¢ Ý•²:@®ÈtÁ¤ûøG<â‘t1âcðÆœþµª†#Œ!úlþÈɺðp‚!Ÿ õ÷I Ú” +%rB‰Ê—É0…0Ì &7éIÒ/3-|NÙDiIRÚR“9ô —s£Þ¯˜À¼'#˜ÉKêP:eƒ¦›yÿÌpfÔ|LQ¬RN•h,é SÒ#Ï®Üä*ðÁ§L¾"#ø,ü\‘=³røTž-¨XÜ©ŠefSá*Áþ¬æU¦Ü$EÌÇ˱ífücaoÚ@*t(M)Jð„A´’Äh-•‰Ñ`zÔšÍ|ZÏP*€ ì =Ø R'\¤9æ( V3mݲš2ÄPºþƒ$,áªXÍjz”ž 5átª0Ï÷JÌ›Lfu!«pë@”RÁ¡Ýé¶XhÖY>ó¡ J × ]õ&*R6æIX€Òž³d%Dë¬'A»R¨å&”`ØÒfuÀì Oq…)^1‹d©Ysš§>ïœç {SŽÃØi‡‹Õ ô¢æK}KÓ‘2—±¥Fh{@Üê.(å‘D{‰Wlu´ «_Åq‚àZ׺Øu€,½UUÑ4º/Ôe7‚¤ œ÷¼<Ð:YV¤ªõw4•Î/{Ë’6 ”´÷µ®@†þ\Æ×£0-a_٠ijÆB°HHðy•€·î‚Ó±ãíDQ97³øQú,‘:KĢȒ)oƒJ  ßwÀ$áøbÏÂØrãì‹ÌéÏ­ ÚÄ^*û™Qdb¶±u9ü$Çn›ŠØœJdOâÉ„õ1tgc†¶J«@ê,W RKE+Oø^“–Á|pæ%ÔU¥|–kЄÖ4„!ÎÓSo(Só•lÖp~UzàÂ`€ysxëŒÌǹ¬ªèYŸ)Ráʵ®Ûi,སu½ì+e“šÆ…íƒIèàC³p ¶øØfȵþÅñØ©“ä|˜ÆƒQßz…E¬€Èa;ouØv¤°ÏVì'vÏzÕ†œÜh»ïM’‘¾»rY÷žùÏ”Žr\9,#¾NmØ£"¹[woA¤Qvk\·Á’ËÊ¥F¸.º‘·m­RZË•ÃRsðlVœÓKíµ‡-ˆ„÷y J€w £}ë˜ 7⢠k0ƒ'Ñÿè¹ðÖ[×ÍEB 2®–ü('ƒì*LçV/Zã{ÓFnóá GˆºÔ`„"Ô +èù­`ò ³¡‡W&ÌN¹hq Ðnúp¥Ý‚©»ýíU×9Ï}Né¹l·ýÆqbþñŒÖ³bß¾µPûp+€"¼ýñF B X€l}ã}·E#’‘ŠÀË]±™ÇCr[|­%dè층…Vñ¦@àN„PÞò·J…+Œá*¥òP¾BÇà-2[þU7Ã>ˆ(@á°Ï*v_0ùÊ_¾(‚,ÅèŒ.DfÊýkø 1c DÿÔWé8€”s_æâ§°2Á>Ö¤o¸‘>?‡%p!àþ ÆL©ÖIÖKÊ×hƤÔu~Å5 uC (5€âCË÷M|…€«¦q« =“°·`FàvEp(µØÁqàUÍÑؤž– zþ–vúðxGP+€RP¾´\㇠íôY÷dPü´O,B„1â”…N®•"@s ˜_B€ƒQg,RP€J¸bôD[çÔZ°å"[1a-w*xiÑgkVèv-RL0¾_gÏ…ð'¿Á†Šo +àBP#øx/às(V†y¨hòeS¯Æ‚$‚RVW`°u ˆ/PˆR'€R"Pí%÷`v´‚IF%$Ï÷qJ@Tû5e@V"Оx,ð€RÔ_7fzUtxú hcÆEhï€dPNðƒ²uþ`wuxqF÷_d¥ŒÅ ZÐG\I°`o&M–€!c@Aà;u‹1gvåƒM[\H—5O¸e[²ÅYeÑ=ñzÓV?€‰qìˆ4ÁP$âŸÕ“cµ…NÉTÑ"GæjHgawÖ mà)¥=‘¦Iàðf«ˆt3)V/Ç|“h‡t!d MZ[—RPoñ‡Kîkw8Vøˆ†%Dm PÐt·uà A@v'^ªèŠ&AÞÇ]ÎUCf@Š£R@Ð?né<  RP@FˆSx„¸iÈrGå•R°Õ•þ8†RNð†&gG™”v'©øam0)%=ÀÄ…D•cÇ[®ˆÒ‘Ÿ¥zµUYI]¨N=Özö1)Řy_ØEhè1G*¶vÄ…d‘4[ÿ´bk£PhS#×ÐeN–e–?f(¥éH‹DU—„Àdþ–œH$b°X‘@„§d~78Žz8 l˜`U ¨ fJ‰Œ'’áx“ÍHŽÃ!ZèÉ€Wek1é‚zsØ\—’vÒ cÐ3ðœ÷å`~¦%m&ažyð ž™¶¤01ÐøqH0— J\uEqwMMUV¨‡Á@c±I\!‡R þjj¦5hPÐ}aVv†f6Ûv;lSGÅ–mÂVŸÑ(e‡©,¹gÕ<Ö†lÆ6|¨³¤:š£ÇE¦Em³}·oµ3<÷¦w)€R÷)͉žÒVs‹JjæÖyâ–oH´6jª;P$FH¤oÉkË '5Zg–›i¦×aZZºÆ0˜†~¹‡« y:f0(0ªaJàfÐlp¥k+Šfo6g5*–7ú]÷بnÁ]¤ ¦k³†‰¨•©W%mÁÁ”wÊ]àH¡âØL¤ î¦a³yºŒg]Ò)Ù”‘™†»ÕŸ›Ñ=“«÷µŽƒeZ f] €%ZBÃêeþbåDö¦Eêö;f´ ÿvŽL7e¨\™`]¨%=àj—ÝŠ;ã„;€·yÔ3FÁ@#ÕÃcr#G<¦H<Šzþ $¦Z]¨Ê§Ä…kÕETQ*ƒä¯}t|UmzTG«±gs¬8éP´BƒÀÚUz^³f]À1 s×Z€àוˤ5¶a6®ÃÅa[ZÒvWþ9¡ö‚ñI‰ˆ6•V]Jp˜k–`6°…åf Jt+ž š|e$€jZ Jcƒj]ƒµ…Åaгò©j‘ƒ÷`gOõ7\zfØÕ«Y¥kX²’x³0GIÇi ´h÷q Zµr…RõwVLiœÆÔþNühO$F Ãa´Y›¡µF©™ªkRàc©„&rbût¸¹…—kP×4’ã€Rç5hÌz_¨Z™ÊaP”ˆº˜(KŽ0¤€ç%mjkX»Z»XÅxp¡ÈZ­4c£ Z¬ŠUy۬쳶 #P¬Ä ¼â(·îå lСøå‡,Z®3kZ¶Æ‹E‡L…‡ 1¸ Wn6¼Sk°  º7%¢;K€zqR VW™é±å W¨5£\y†‡*µ)[ýhbGÑY2ˆ—`D¥½¦¸¦¥kpO—•š(6üH" uŒYêi†¤„ Ó›½N—x†…½Ã WÆþÕ¼ë@?Ⱥ;ÔPw‰BK—`¢UXÓ¨zK\Øv©´|ywq˼ç£Xët ªUg+¦…â• Ù½ÿ)v® ·aæ…UJÀx•zfºÅ3|Œý ÂÍ› ¿qÄ¥5h#7iDzf¨…ÔɘS íèr®tgÓëÀ$—a»ºÃÖUWPǰ괡ŠI#Ö°ÀÙÁý¤"UfeËÂʎ¥›`ƒ(ÐcçÑÁ1v‰Ô¯^(œý´%O¦¹ÉÙbes«]o@`º¥öq¨êƒ1\œÈY'•€­>b€ ™`é¶Øù ´’¿W…Z¨Ûgê °Ÿ&˨švC2–ˆ6½Ьþ°ŒRöXÆ- ¶N<ÄÐ\S&0‹øyXs9m«Íp›±ƒL¢Ÿ6^Ók½ø™≔œÄ\K£êƒ±ó)Hb ˜Z|É<›“ö÷µ9YǪó¤Pj±ÈF+ÂÀÊŽ tè¶Ð£§ÐJšlÑ Ëѽ:ÞfnÙƒ¥R´oæ°=¬““¼p“$P Áv YН­ƒÒU uB0mÔ.ȇ eרÓûQÝì…P…?u;øÅ®.ãŸý»J9“— „¾dl@c »X„°”€+Ð.PB@E`ˆcÞã&òá4á,/«„àšcpóV@O"à°SAii@MÀ&ð°SiØÀÂånâ³¶ŸŠJjÏS °,Ðþ¡¨ê0ARóXPX#àC ÕÜ®é$îãØKõ¹BpôI/îVXŠÿ«èUØîÌNÀF8OI†íNcЉ`ò';X¹#·y[ŸœG,Öä”åú–ëŸûO˜Èwô"Ä9 *®äÀV‚RúGð9 ÄŸéºí¨¦r¿<ýÐo'vyËK÷õÝžl”Cpò•~Í#ãñD ª~ â¹TŸ@ù8Èu=㌿×F¾ø„¬ù½ÀƒSòüNæÔNÖ€ð&Ø&XøFh8˜øv¶ˆhøXØ©¸¸Ø˜xF9™È™y šH€at„ššZDúé ¹IyèþHÛ[kˆ™{ k é(«[8,XÌèhæAZ£šjD*ö*üK݉+)+l]Ù‹m;)®)>I^~>nVnÎÞ–>¹ÎN^EzqªZ åß&®ÀqýÜ t§Î`Áyú›Åé]DBš 2ÂDÈÄxƒ2VÌÈHܬl>0K%@r?’ø’"¢ŒïbrÙŽ¦Äˆ!mÖœh¦ã͉=EVŒ¹Óf6c¼€M3Öí¥!+öŒ`€bÖSd¶–rÍÕ“¶°—š õålWpi¯íZ[ÈŒIR!¼ó*K«Ú½nDz½ûj`»hÛÆm+bGTæKXªb²pÏBþúدf´˜#þ‹í+øò¶j[ “n:sjˬ#>ÝÚ×ëÊ’QwÖ»ÙsÔÃfWãö7±hØ‘õ J³§VO4‹ÕÔ»®RtÌ5¢~]QP‹ÓGR¿iñßrdÉΜi=LF4Äb\ŽDV$îlªL &ÌÎÌ,6$ j4¬VTdÎd 6ärl*4>4dndl64,F,$V$~^¬®¬\.,Þl.>$4n4üz||~|N$®ÞÜjl^,þt¾\lÞlüzt.trt,V4>,>,N, N”JD\^\T*,N$> \N<ÌbdžLV,ªT*ÜÞÜn<¼^\ìrt,&ljl|><$^,<~$æž”FD * ”–”TVTT*$~,*,Òd4~<<>,læld24,j<<><>|þ|>.þ|,N,NN$¤RL D’DìîìâlâÌfd®T,*lnl$>$$N$ > V,,^,!þ0Creator: PolyView® Version 3.62 by Polybytes ,xÿÁ& *\Ȱ¡Ã‡#JœHQ!› rjèÂ@Š<$u9rä!’"OŠYòäÈ—/Svaér%Í™&cÒ”¹’'Ï.%Cö„)²¥Ð–)ÙÉ“‚ˆ‹ tt“'‰™)¯º4‰’hU«\±ªÔÚҤњ,¿ÂŒ‰Ò'N¬;Ò¸´ñ’!¶7ñöZt/Ú¬C_ò*gWÂúÕyòìJ¾IßZU‘„àš2Òº%©—³^²hsþÕÊx+×®5Ëþm{umÛ¬iâîÂņ@ zô`Æz6fО‹#6ërpΛH‡†Ûµ·Xá}K÷ê2D$?kPä^Ã…yäÂ*wŠÿF½µÖÆ¡“–ÕÉþ/[ίÛõ­~$$4…öäÎÝ‚KÉáGm¥Úo’­çÕcå-ÇÖ€©•§ÚLŠæ}/Ù‘ûi§ÇRs^I¸ÕfpIHáwH¥؇#ølDZ†ûíWF‡6ý„X`o!Öc‰6ù£DØc®ý¨z Bc†¹Ýx^ È•U\©% YnÉ%–^vÙ%˜^~¹¥˜e¦™æ˜lªyå š|áo†½è¤Ö¨[‡Äñ„ŠðG Š:(<J(¢‰"ªÈ¡‹šè ‹6h¢•*Š(¥Êi£–Nª)¡Š´A47á¹å©áŒÿÀ襌ÂÁ褎æª)¨¹ö*覆òꨭ—Òº©°¸vÊë¥ÄÚ*¨"#hl‡°ªç~8ìé¢Ü‚Z쳡Bê쨾’ é°¡vKë®~k,­;|ÓzÖ¶Ú* Œˆk±ãŽ»¯³è†Úé·–fú+¿îö›,Á?ªk¨Kh –hwæYcx+ð·’ªÛ«ÃîZ꬧w{.Ãͼo®$'ÚC'Ñ ‡É“ë!À¿ «ñ¶"—œrÃè:¼pÀín¬q¸™{Ç{XÕ %# ?ln°Ììé²Ïj´Áé‚Ë2¡oíènåtžw`ÚuØB‡Ì­Î•ÞZ²Ü*‹Šì×]‹üï·#œÿÇ«5ë°àv¬³Ú’‚Û­Ü0@€Áw`a Xh1y KìðFt¯|ëçx+~xÃƒŽ€ÓYN®]ÚQçÝvºþ2ÚXHüðC »ëλîd ˆ<Á9Áw³ŸËk;XâHî½—Ïûï¿÷Î;HHA ºŽàÈV<@ÿUØ-º·-kjºPÇ™™½ð´Öý `È{Ýá$ð„œ€|çóú$ˆ> öŽM˜¬e ê® Z Y²¢×¨êÅå$ØÛö¢·¸¢å #°@<8Aóén‚Œàш7¼Á 8Ü!üÿ×6R©\ÕËNRw­Õñ‹vãÖôxЃ;Ì0‚:<_mXà þÀ '(Ÿú( QígîêÛÄLb­š¥mc‡#ܯ>?Üð†éK÷˜Ç=ŠQ:Ü]þ¼7Ð+Y¦OHÎVÀœm]¡’ÀE.16 ä¹øH‚êd]#Ty“’Š]Kp š¸@U P‚^Œ%,-¹ÉJþÑ ÀÜ8&GIÁ0àIáê‚ö,èê %å%gÙÅfzуÔèÖ¶BzÌ„;ê#sƒˆÖ…Mq<@&›9Î-Ò™äŒà %6«U¦SO)18=¼‘\Ĥ27ÉÿÅ,êN'øà†ðA 'Ð,ûØÏ€@_ý; ëâé™yB©F¬ƒ;ÉÕ,ÐП›Ô60ÎYŠ# À#œðLvÑhGöøF€zÒÐÜù¹oIÍä,O ƒãéïR(Í®ĦþNPÐh;v©x’r$¦¼–öˆU,RéL 1x¥Pÿ8A(à Êz"·žP„02¤»Ã‚vUÌ–}2PV5Mdð¤ke´š‡$"0KsZX`ÀL‰y¨¡´¬á…½‹]M$|TR/ igp;ËÛþ`Ë–š±¹Œh s%‰hš…倶zu.kÿ~r”‰Ñ&·SØõŒ0˜laÁ+oÖ5 š6×sæž@‰[çjsMÂ!û¦LŸwžþÚ46áëEUØFaàXž:,ù /[Ïmh‡_¬¥Fcx¶¦&(d43ì± àXãX@κ÷N’­eµ5ÖF -®ü†‰{wz² qeÖRó¦'[GM×¹|¹žÃklbÂíÞþ\ —Ç1åçèeµÒüˆ%žûFeJÒÛÉúÍ ë\sAGö|[ eÊmHÐÍÝ,æ:ÿÙ-LÏS‚–m=Pƒa+éE:0_ošï¾üç?ÿ)вE=e·EØàC—™Vðn?#_Ô‡(00˜€ ¸€ Ø€8OÐb~SL÷Yh¦=pnU—g|¦u8V0‚$X?ös‚(˜‚*H?%hWWz¨çW›GE6`®Vu"–\ßÒve9ÆL^dK€^/çÐG@ös¸á…>ˆOïôy—ÒàRuW—d0XpKv_/!LöD}¥ •CX4…–JG„Ë´…BeKup„¹OôaQg'0²£î¥GS×#&_ß4(X(xDhAЏˆ¼ã…Æÿ¢,šuUL'}.×9ˆcMÅGð—uW„®7„®ö;FX`¿–M#yX8„"F|žU¶§.?xE‰8Š~$iŽ˜i×¥*¦¶[6è[<Àz¢T+t5€%4¸„ë—ˆ&FuÈB¥s¨±M¨”^Šp€NiØ[Ð#bWØid•c¸ˆC5`QÅ3/7ƒ¼13õeû²(`PØT„çƒWcxBÀ@fÿgZºã0PÅs‡¥·m%3W8ðZtÖO5МSkµ5pào0^0‡·¸;V`Ph¡upæ±2Çr¹Òƒ0NrøH0Mˆ'r·'K°vÿFC'p&%4¾T_CåÇ„ÛõcŽâQwIš¨i=f4-à ”xÍ$[“.ÔõK1ƒ_ª¸žˆ(Kð\ÈFK °.#Ö%wm`qøV¥\D0¸•K¨U¼¦(€“c%Trµx¾õK¶äèAE EóÕ|ÀtzCi1e•<Ðà‘®6Yävi|hD¢ç0QÐR™ExV€6V%Ø£SY7G‰2Œ(uÄt 7“V¯‰uú‘‘eA²òˆž„HÇñ)™dì´jDFN • qƒ{Ô•x<¯•‹ õnDˉöx¼—˜MXwÀ5ÐUKMðHè=`G8ç2ØÿÉ~9v›I†Y%$O8¡w9E‰™+2”äD%)k³è,#xY>7]ºTœ¶OÒyúe-¤(t0CiØPMa¬:Uè-®˜; æA·I[x³(ØÔ$CI”Ù§7ŽÒ|‡Eư÷sI#ŒU¥™NÅLýin† 2—OZ<ƒq ÷‡õ2IHèÅ6Ä"˜Alg>æÉ.l#(£ymæfÒç™Q$Ùzãˆð37~Ù( º™³äœucœŽ§Z1šÛE{в(&YZ”@¹Ä]ÆgWOðåÔ¢»s¡Êw0¡9'c‡FbiÉ…tVÐgæŸß¤1=` ¡ÿXgj8‡¦{ chC…DOËÙ¨¶ô@p¨Ú·8`G/iNV5^–D¢[ï˜j¼æ-€bõÈPW€;0WPćb°,ÚŒÊô›èUÉE,jdùG”E Žâ¢!@fåX¶ä0…w4‰òK äÃZ”IZ˜Éª¡a!3ŒFšVøq´" |Ðoˆ^åÓPY Òop 0mã(uÌé¥Åé}*!¦B!tmäÂiû¹©èÃŽð”C9 ¸ãŒäi}æùI?æ)¡ù{eoµx¸×(U¶¦dŠ9©©ˆXxj{¡â|G£ö²U»"w:VF²ÿùV{°ºó¢ qŽÒ71³HŠ6õ™O ²ØY¤*‡áÆf§(ëƒÕ%©ÏQoj£þBbH§€iºq7‡‰ä€—#»³—j|§X6¿è¤NT•bE0p9ºqaI¥ºãˆ 2 ‘Fj–[ ›e)ù ©’"ˆ ŽI)¨ÏXN`°diŠIüéqüfx¸.a6:+rG_+)Vv}°¨ˆuÀ# „Ò/à¬ËÄ;#€@é%ox7¦4S£"ä-1‹‘0” ^•vû¸¾ã°‡z(K­D˜²= ž¤¦D{¬'³}È™¸Q€„Ì©…7äJÿ0t]*Ê鬿KVý©’¶·§‹ÖDOJ[ýZ—F[*;J0°:^ÛjrZ Bm¶–B  \Àý›ÀZ +^f”IȹM8ƒã†`xƒoƒ+ @¯Ð¥Àý Ew°Q(\uu4€dy‡¢âbb»OÖhZ˜£7G—…„aöQ ÃC+´Kˆ‹eÃwó“ŒRa0A†÷äh+Cb‘J€^Ckõ‰¸¦(=3ù;pUl”»5 óeŽFÄ4‡t{#Gå N¸S³?šr«!´Æº 0­ÉhŸoGÅ*Ä\#ºíärF³ÕÚ…PªŽò~=v™V½•ÿR½Hs£¹×g‹¬Ž /¡••' ð< Ú”aÓgS\€ riõœöçÉÆWc@š‘Ūd°·ksÊàdœ¦ìŸFù±ÞyÁ™{T³Ì(b@ó|nl¬y‚}ðô—ÌʼÌÌÜÌÍÜ,°™v"yP‚kЈ@ØÍÞüÍàÎâÜ€€°9 Ó<MºwM„{Ïò<Ïô\Ïö|ÏøœÏú¼ÏüœÎD¹ubµªãÎ5SÐíÃíÎolÐ í¤ }Ð ­!»A¨÷Ž­|ÑѽѭÑ8@y°…úAÐíÐ Ñ'ýÐ ÍÒ*ÝÒ)9pT !+ЧÓ.Ò+ÍÓ@ýÓB ÓC )ðI ÝÑNýÔPÕmÔ$à ‘° ®}Le]ÍÕ^Ö`=Ö_]ÖbmÖd}ÖžeÔ˜!CàÏR=×t]×Q P1…°vý×€ØO@àP!.DÐŒÝØŽýØÙ’=Ù”]Ù–}Ù˜ ÙRO¡;rmagick-2.13.2/doc/ex/images/Apple.miff0000644000004100000410000015765012147515547017627 0ustar www-datawww-dataid=ImageMagick version=1.0 class=DirectClass colors=0 matte=False columns=143 rows=132 depth=8 type=TrueColor colorspace=RGB compression=None quality=75 units=PixelsPerInch resolution=300x300 page=174x173+19+30 create-date={2008-08-30T19:11:20-04:00} jpeg:colorspace={2} jpeg:sampling-factor={1x1,1x1,1x1} modify-date={2008-08-30T19:11:20-04:00} rdf:Alt={ } rdf:Bag={ } :ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþýýþüýþüýþüýþüÿÿÿÿÿÿÿÿÿÿÿþýþüýýüýýüýþýþþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþþþýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿûüùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþüþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿÿÿÿÿÿÿÿïõéãî×Ìß·Ëà´½ÕžÀrеX~«D’·b¶b Âz®ËÃØ©ÓãÄëóæþþÿÿÿÿÿÿÿþþýþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþþþÿÿÿ÷ûõèòà¸Ó“ižb˜\”MŠH…T‹SŒTŒ C€E€I„H…I„M‰ mž2‘¶lÑáÄîóëÿÿÿÿÿÿýýüþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿÿÿÿÿÿ½ÚŸl¡(fšL‰SŽ Q XŽP‰NˆWS‹YŽR‰ QŠ J† J„H‚Iƒ G€KZŒoœG˜¸‚åíàÿÿÿÿÿÿýþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþÿÿÿõûì¥ÇpUK‡M‡SŒ U QV RŒWM‡P‰V‹ QˆQŒL‰I„L…C€J„Tˆ MX‰W‹$k—A·Í©öù÷ÿÿÿÿÿÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿþÿÿÎå·s¨/CT‡ X TŒUŒ SUŽRV \Qˆ O‡U‰P‡PŠ PŠI†AJ…Q‰I HPƒVˆXŠU‡r›H¿Ò¯ýþÿÿÿÿþþþþþþÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿÿìõæ¼ÛŸi£%SŽRˆS… P…P‡S‰XŽ]“[’ Z ]Y‹XŠT‡ S‰N‡L†M† H‚ N„L„DI€ R„W‰WˆV‡M~ V……©dÙæÔÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿÿàîզ̃€³Q`—Y‘OˆTˆS† MƒR‡YŒb—^“`’e—\`Ž"[ŒPˆYVŠQ† I…RˆP…JO„VˆYŠ[‹R…R‚X†P„`:›¹‡âêÛÿÿÿÿÿÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþüÿÿÿÌ⾕Ào†·_uª;`™ \“\‘ZŽT‰P…a_a”b”f•h™g—#``X‰XŠYŒ UŒ RŠWVˆKU†NƒW‹[ŠV†RPT…]Œ(c7w O°Ëœîóëÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿÿ½×©°Qе_q¤;g `– [‘\‘ ZŽ_ \Œ^_]e–a’e”!k–*f”&d‘"`ŒZ‹`‘]Y\ \Œ)]Š)M~R„ T‡YŠX‡$Wƒ"NU…W†]‰'aŽ.f•7y¡WÁÓ´ÿÿÿÿÿÿýýüÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþüÿÿÿÂÛ¯kŸ+o 7s¤=g™)^’ZSˆZŒ ZŒZ‹g‘Y‡]Œ#^i—&b”#h–4h—2l›6h•5c2V‰d”_’]’ZŽYŒ\Š%Y†U†\ŒW‰WˆV„QRƒW†V‡S„W…[Š%bŒ2š·…îôìÿÿÿþÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþüÿÿÿ¿×­_”c”%d•%b–$e•e‘NPZ‡V…T†S„ J~ Tƒ#T„$[‹%a.a4m™Blš>g”9g“=_.a’_a‘^Ž _'h”6`‹*L W‰X‰\Œ Z‡"U‚W„[Š!YŠPƒM}U„V…V†(vžVÇ׺ÿÿÿÿÿÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþýýÿþþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþüÿÿÿÐâÍXŒZŠV‡^ŒY‡W† `ŠTƒ R]ˆe‡`„X…XƒZ†c+V‚)T/Z†3b=e’?a8`9f“;])a‘&_Ž"_Ž#c(d,^‰.OƒV‡^‹aŽ#[‡'[…(S€MX‰V† Q~W‚ P]‰)]ˆ-Y‡-Œ¬pêðæÿÿÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿÿåðék/Y‰ ^ŒS„V„Uƒ T‚ S‚ S…X‰X‰[‰[‰Wˆ_Š]_b‹+dŒ8e‹9d‹9`Š:]ˆ9\ˆ:`Œ?]‹7`9f’k“G^‰D[‡B^‰;^‹4aŽ2aŠ2c‹7Y‰^Ža!_ŠgŽ0e‹-RƒXŒWŒS†Y†/V„ Zˆ!]‹,^‰1f=aŽ8^Ž6¶Ê¢ÿÿÿýþýÿÿþÿÿÿÿÿÿýýýþÿÿêãߨ…W^<V*‹bÔ˶ÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ÷øûÒÐÂÓmÇÙÚæ¶æíÌêðÓÜç¾ÀÕ–§Äm…¬@e–YŒU‡T†W…U‚S„ \‹b#aŽ&`/`Š1`Š7Xƒ)d7n”7r˜7r˜AiB^†:Y‚8\†:V‚/Z„/aˆ:Zˆ$]Œ[‰ZŠ`‹+\…)V„^V‹[ˆ'Y„.X…(V‡a*g;fŽ>f>f‘9a‹-¯Ä–ÿÿÿýýüÿÿþÿÿÿþýüÿÿÿůŸb.vQ›v7§…F¥‰iêììô÷÷éíîáåçÙÝàÑÒÖÈÉÍÃÅÉÁÂÅÀÀÃþÂÏÄÆÔÊËÑÍÐ×ÙÛãçêòö÷üÿÿÿÿÿÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýüúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúýôØç¼ ÂekšUˆP‚ RƒR‚W…[‡]‰%\‡)e5\ˆ+]‰)cŽ2f‘1k–3h’2f=c‹:c‰7kŽ=`†7Yƒ.[„3\…/`Œ)Y‡Q‚[ˆ,^‡2W‚#S…VŠZ‰#Y„+^†2Z‡!a'e3e9d;c‹5_‰/L|»Í¥ÿÿÿüÿýþÿÿùúúúÿÿ­”Vª€?©~AtK*T £ˆ‰¹¥¥ž‹Ž’€…‘z|“tuŒlmkl‹gfdd—eg¤rr™uu‰pt‰x|‘…‹Ÿ˜œ²°µËÎÑãèëöûüÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþþüþþüþþýþþýþþýþþýþþýÿÿÿÿÿÿÿÿÿçñ×ÅÙš¼Wg—Tˆ [‹"\‰(`Š.f2[‡(Uƒ_Š(]‰)`Š-`)f’+c1^ˆ1[…0W0\‚2b†2c‰3s”8s•6\‰)N~R~*X1U€,S‚LU†^†-`…6]†,]Š%aŒ.h’=k”Eh‘Ah‘=a‹.U‚!³½«ÐÅÉ»±²¶§ªµ§«‘kk>G 4!I ’YR–_Y‘XO‰QGŽOD‘N@‹H;J@ŒG;“K@”NBŠL@NEƒUM‡_\ˆii‡pqˆvy„š•°¬±ÈÍÐâéë÷üüÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþþýþÿþÿÿÿÿÿÿÿÿûÁ׉}«&\‘ZŒ]Š$`‹,X‡ Z‡Z†Wƒ!\„(Xƒ#Z‡%Z‡%]ˆ*Vƒ#Nz"Kw Qz"Yƒ$dŽ&hŽ%cŠ%\†T|(Qz+Mw(Ly&L{TU~%a…8`‡5dŒ2c4j“@j’Cl“Fh>b‹5Vƒ#Zy*£}{¢wxžqp¤qr‘YW9[—QFB8Œ>6ƒ70…@:‰B=D?”HEŽ?=>:ŠB;I=“L?J<ŒNAŽTJXQ˜b^›ji”pr‘sx™}‚§—·¶ºÓØÛìòóýÿÿÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýýþüþþÿÿÿÿóøêÊÝœ¾Pe—YŽ V‰\Š[ˆX†ST€SLzP|R~GtCrHuDu M€T…P~ ]†\ƒ"Y€)W}'fˆ.LuEnAmLv-\ƒ:]†2g>iDhDk‘HfBbŒ9`‡1J||gA«]]«a[´a[–ID0*$!t/,œWVžST­adžad®yx®tuªop®oo¢[^“HKˆq:o8pDwJzTV~"S|&\€.[-X|%SxGpW|.W€2Yƒ<`†Be‹JfJiIhFaˆ9S€.fw8Âvjº^WÕt¥PL)+"7 ¨he¿„…̑ΚšÅ  É¢¡Ì¡¡ËŸŸÃ’‘²xx£bc±hi»QU°PQ·Z[½UVÉYYÐkd¿ZR¼WOÆ\QËsc¹la¥c` mn–ps•x|›‡©£¨ÀÂÅÞäåöùúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýþüÿÿÿÿÿÿÿÿÿÓ⥲Ít¯1\”Y‹J;rCtJwKu;j :l:l9m6m2j:n8oCw GxMwOx!Mx#Js%Tx-V{)[(^ƒ-^ƒ,V~*Y€7W€>]†E_†B_†>[ƒ8Ku-§kZÁa`ÓztÅhf<#NÁŒ×ª«Ù®¯×´³Ñµ³Ñ³±Ø¹·Ûµ´Ñ¥¥À‰‰ß‘‹ÕzzÓˆˆÙ…†Û‡ˆÖ~ÔsuË_bÇYW¼VM°QH«\W­st±‡‰·™½©¬Ã·¹ÈÀÂËÇÇÍÏÒÖÝàéïñùüüÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþüÿÿÿÿÿÿÿÿÿýþöäîÄÆÙ~—ºHe™G‚?z>s:n7l4i5j8n=p=m /g2k9o@o GrAo @mFoAk;hCp"U|*[‚*_„,e‹7[‚4T|0U3Dp%Ar(oa6¼Y[¿edÙm'('!9đຼݴ´à¼»×¸·Ú¼»ßÂÀ㺻޷·×²±àª©äš™á¨§é¬¬í°¯ê¬¬â”•ØqtÑZ\Í\WÈgaËΙ›Õ²µÛÃÄáÍÎãÑÑäÓÔåÙÚæàáåçêæìïæðòì÷ùøþÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþüþþýÿÿÿÿÿÿÿÿÿÿÿÿúüîÝè¿ӑ¤Àfš·Kp›K‚Cz8p@q =n :l6k1f9h8e1b6g9h>j9h 3f @mAo=lIv$S}*\…3_…5[€3Nw*>i~S8Âad߆†˜JK&%G Ñœœâ¼½à°°â¹¸Ô³²Ú¹¸ãÁÀá»»èÆÅ翾鶵쾼ð¼¹ó»ºõ¼¼ñ°¯åˆ‡ÚVYØRPØifÛæ»»íÏÏïÊËñ¿Áô¸¹ï¬®æ¡¥á¡¥à¨«Ü°²Ø¹¼ÛÇÊÞ×ÚãèëòøúÿÿÿÿÿÿÿþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýþþüþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáàØ±¦‡ŽAsNˆ7v6o9m9k;j 7g ,`3d6f9h 3e 2e7gBr=oDuFv"Ix+My2Y€:eˆFZ99^…]1á……·eg +S Д•á°±Þ££×¤¤Æ““ا¨å¹¹ã·¶ê¾½ç°¯æ«¨ï·³ö¾º÷ÃÁõÁÀí©¨åˆˆáå™—æ«©ëÊÉñÝÝóÙØôËÌô¾Àõ±³ô¤¦í–šæŒå‰ã‡ŒÜˆŒÓ‡‹ÎŽ’Ê›ŸË²¶×ÒÖðòõþÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþýýûÿÿýðóôÄ»Á¤ƒŒ‹\gvAOt81x\e} Nzm0f9k8l=l 9j ;k?l@p>r FxFwIy(U‚7Iy-Cv0:i!FgQSk>!„B?2.VË„…àÙʉ‰Æ„‚Ö•“ÞžœÞŸœÜŒÝ‹ã¢žì¼¹íÂÂë¼½ë»¾í¼¾í¸»î¾Áð¾Áðº½ì·ºçµ¸ç¶·ì´·ñ³µñ«®ð£¤î˜œêŽ’ã„‰ã}‚ãz~ßuzÓqvÄms¸qw²…¹Ÿ¤ÑËÏîðòÿÿÿÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿæëí¯¢©…[`j+/\QOZmr e= H\6r?r Bp NzHyFuGuIw!Nx$My$IzL~O}%Fw$J{.Bv&=s%1f5B™51l!)L¿kmÖŽË~ÂvtΊ€Ü—ŒÓŠƒÒ‹Ü¢Ÿâµ·ã³·é©ªé™—䈄䈄ꉄ퉄íŽì‘“쒔퓗ꔙ撘떚ð™›ñ—šî”—í’脊ä~ƒÜw{ÖntÏiqÃek¶`h­bj¤ho§}„¹¥«ÕÔÙõøúÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýÿÿÿÞãæœ…ˆl/1X]a]p }c]h i Z< ;j0u&o6u J{KzP}$X.Yƒ.J}Uƒ'R(Gz%Ey*7q!Hz*3a l&%¦'/³-0u();ªRRÆzw·gaÀlgтۦœá¯°è´¶é¬®ç›œåˆƒçvkêqcén_çm^êk]ôvhüŠóznçqgèuoêxwëy|ì|é~‚é‚…ñŠŽó‰î‰Žé†‹æ€…ßy}×syÊjqÁaf½^d²\b›X^•Yaªqw¬Ž”Á½ÂêíñþÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿÿØÚÞ‹ff`]ltu‚“ …torh l h$ FJ 0L&h:…LŠCHI|:r;r GyIzH{*N1E|*9Bi…§)'K1’;6ÁngÎ|x┓螞垟ꕔ쇀èynðrö…vóxhíqcêm`îmbíjaìoe÷Š~üwñmaécVéi_òqlðihé_dåafêosîy|ïz~ìz~æ}€ß{ÑotÇfm¿cj¸]d±W^¦U[˜U\”X^–agž}ƒ´«±ÝàäûýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýÿÿÿÕרƒPQ_hxwz„Œ‰‹‘‹ypsvu*zo Œr |i[r J ??~G…Q‹*W‹8Kw0OU&[\ q ‰•e ^¥Èß*,çC?è]Tçnbìrbïqaêl^éf]ìhbïohîkcëfbóolôroîqoêljíttðvrîj_ìbVûzpýwqíYWâJNäMTçW]é`fíjnîlríx}ÛtzÇipÁ^d¿]e±W_©SZ§QZ¤SZ‹OT‚W\pv­£ÔÕÚøúüÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÞàãŠTShq{y‰—˜– °³+­*¨+ž'•$Œ!&‹#”!œ$›$'’,&ˆO„xx#sp*id,^T,kM@ˆV[9=rmƒ‘&œD;µxy쉈áIEãC7õo`ù‚rõl^íg[çYSí[Vòecïjgìllïvuô{z÷€~ö‚ù‡†ùˆ†ö†„ì}ê||ìyvìofðh^òe\îaXêZTìWVîOUçKTæNVéT\ðbiõ€ƒ×uy¾`f¼W^µY`¦V\šKR°[`³\_‡IOSY‰hm¦•šÏÏÔøúûÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿîõ÷Z[lz€„“”–ž ¦ ¸½.»(7ÆCLÐMUÄ3?ÃDJ·AF²?C±@B§:<ž8:œ8;¡5<¨::¨81§5311…:?–RX´€€»‘’µ{}¨ab²qrĘšÔ¨ªêžœöŒïyjòobÿ„vúxoîMKéOPéOR÷uuþ™ý˜”÷“ö—•ú—–ü˜–÷Žû”“üš˜ýž›øš—ò”“î‘솄í{wëleëdZðcYî[Tú``÷X\æ>Lâ@NÞAQßOZßdkÉcj·X^½V^µV]œPW“MT¢RZžMT‰MR‚QW…ek–ÎÎÔúûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþýýøýý›uwcy‰‚–§›Ÿ¦§®¾ "É-=É?JÏT[ÚknÝopÔdiÓtvÕxzâ…„ØsuÈiiÄef½]^¸TU·NM´HF­IC¡JA£XS­igÂЖ—ÈšœÌŸ¢ÒŸ¡ËŠÂsmÇMKÖ05Û5;ìKLöb]òc`ômkóyvö‡ƒþ¦£þ½¶þ³°ü«©ù¬©ù«¨ü¨¥û¥¢ø¤¢ú¨¦ú¨¦ü«©ù¨¦ô¤£ñ¡ î“’톄êuqìlgóibùf_ÿzuönlæCIÙ@JÑA„57}8:{IO|[_kq¤¡¨ãéëÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýùþÿ‘afap}ˆ•Ž™¢¢®»À!Í1AÑ[`Û{}ÝŽŽé´³ëÁÁå½¾ëÁÂíÂÃéÀÁ罽껼巷䰰⫬⥦☛ֈ‹ÊsuÇhkÃ^bµMU±FN¿HQÀNW¿S]ÄhnÆ}ÏŽŽÓ—˜×©©â²²ð¼»õÂÁøÅÆúÊÊùÉÇúÊÈûËÉüÌÉþËÇüÿû¿¾þ¿½û½»ø¼»÷¼»ú½¼ý¿½þÀ¿ü½»ú¸¶ö³²ó¬«õ©¨òžëŽŒï…„ìyxæaeØKT¾4@µ/9±37®;5²@9µEAªB@¯HG»SWªEHž@@”>=‹66€)({45zKO{Z_ƒsz±³¹ó÷ùÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýÿÿÿÀ·ºgtt~‰‰‡Ž›Ÿ§±¶ Ã#Ç/ÒQXÛ៟軺èÅÄìÊÊìÉÉëÅÅìÅÅèÃÃåÁÁæÀÀç¼½ê»¹í³±æ¨©Ý›Ó‹ŒÏ~€Ëru¿lpÂorËwyÌ}~ÑŽÕšœÔŸ¡Õ¨¨×°±Ú¹ºáÀÀêÇÅíÉÈòËÊ÷ÌË÷ÌËöÌÌöÊÈúÊÇüËÈûÂÀû¼ºþ½»û½ºü¼»ù··ý»ºÿº¸ü¹·øµ³ö¯­ó«©ï¤¤ð¢¢ðššéŽáƒƒÝrsÕ^bÄIQ³;F«$3¨'¦!)¨7/±<3¯@:¦;6§<8¤GF¡AA”0+Œ/,„)$~*&x58yMPy]`‰~…ÈÎÔýÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþîõöu9;dquƒ„‚†™¤´´¹½Â$Í,@ÔekÜ‘‘ä²³ìÊÊòØÖíÐÏëÉÉêÇÇ䯯æÄÄëÅÅìÃÄ㴴ݥ¦ØœœÕ’”ғϘ˜ÒœÔ ¢Ø¥§Ü®¯Û±²ÚµµÙ¼»ÛÂÂßÇÈåÊÉêËÉìÊÉíÉÉñËËòÌËðÉÉôÇÆùÆÄûÂÀú»¹û·µý¸·þº·ý¸¶ù²°üµ²ù­ª÷®«ò«©ð¦¦îŸŸìœœè–˜äŽÜˆ‡Ï}Çqt»Z^¶DM¯9E¨$4Ÿ#ž œ¨0'­7.ª:3¡5-ž4. ?> ;:Ž+%†& €#z%$w>@zQTw_c–“™ãéíÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýÿÿÿ­™Uqy|†‰†›§®²´µ ¿Á"Ç5EÑorÞšœêµ·ðËËð×ÕëÎÍèÊÊæÉÈëÈÈìÅÄìÅÆìÂÄèÁÂཽබߴ´ß¸¸Û»ºØ¹¸Ú¹ºÝ¼»ÞÀ¿ãÄÃäÅÃãÈÇáÊÊßÊËßÊÉäÊÊìÊÉìÈÇìÊÈêÈÇëÇÆðÃÂò¿¾÷¼»ú¶³ø°­ø«¨ù©¥ü¯«øª¦õ¥¢÷©¥ö¦¤õ¦¥ïžë˜˜ç”“å܇ˆÑÌ}}Âsv¸di±Z`±AL¬/>¥/™ •”˜ ¥©.'Ÿ.%Ÿ*"£3,¡;9“/*‰#‚!‚z$${GK|QTyhm®²¹÷úüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþåêìg$'_qv~z~ˆœš¬´®³¼ ¼¾ %ÌEQÚ€å¢ä©©íÌÌèÌËãÄÄåÄÃèÄÄæÁÁçÄÃèÇÆêÌËèËÊæÇÅçÊÈäÊÉäÐÏâÌËêÎÍëÑÐèÓÑçÐÏéÒÑèÓÒâÐÐÞËËßÉÉáÈÉèÈÇ鯯æÃÃâÀ¿âººæ´³ë°®ò­ªó¥£õŸœö™ö™”õ•ñ•ñ–”ò–“ó•’ð•‘ëŽŠåˆ†à‚€Ø}|ÎstÅooÃpr¿nqµae¬W]©6Cª4#“•’ – §Ÿ&™#œ$›.%–0)Ž$~šB9™A8s10„LM}VW…~…ÓÙÞÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþýýÿÿÿ¡„‰Nhrvxy††ˆŸ¦¤°®«±¶ ³µ ¿*ØuwÝ’‹Ø‡ˆÜ££Ù¬¬Û¶µã½½â»»á¼¼á¾½èËÉêÍÌéËËéÊÉäÈÆåÍÍçÒÑçÍÊëÎÎìÕÕê×ÕêÖÕèÓÒè××âÐÐÞÈÉÝÅÆÞÃÂãÀÀ佽ܶ¶Ø«¬Ý¨¨ß¢¢æ›è“錇ðŠô‰ñ†€ñŠ…í‡ê}è|퇂é„ã}ß|zÖmlÊ^`Ä]_½__»aaº]`«NT§IN¤%7ž’Ž •’ˆ”¡™—•“,"Ž$‚†1/r!ƒEDTSv_c¥§®ñõ÷ÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿëîði"$Zirxx€‰†Œµ»¥¬ª°¶ °­®± Æ%:Ã*=ÉRVÌvuÒ““ܱ±ß³´Ü²²Ú´µß¿½äÁÀâÁÀãÇÆáÂÁ×¶µÜÆÆäÎÍæÊÉëÏÏæÎÍåÐÏèÓÒæÐÏâÌËàÊÉØ¼¼Ô°¯Õ««Ú©ªÙ¦¦Õ¢¢ÔœØ”’؉ˆÝ€~å‚}ç€|ê}yñzìwoéoiäheãlhàkgãieà_]ÖPPÑQQÍQR¿DI¿NR¸NQ¶MQ¹KP¯IN©=F– #˜ ™ ‰“³ ˆ†˜™ž ’ ‹&„ {z*%t.-~CDxSV†|‚ÌÓØÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüüÿÿÿ­˜Penz}uˆ•ª¡¨»­³·°®¶»·ºÄ$;ÆLQÌpqφ‡ÒÓ››Ò Ÿ×«ªØ©¨Ó¤¤Õ°°Ó®­Î®¬Ñ²±Ú¿½àÆÅâÆÅØ»ºÔ¹¸ÙÁÁÙ¾¾Ú½¼×µµÐ£¤ÐžžÍ““ÐÎŒŽË††ÆxxÅiiÆ``Ïddãzuâlhäkgæhaçc\å^XàTPÛPMÙDE×7:Ñ%+É'Ê"*È)5¹#1´!1¯1ª%5³7C­0<ž%’‘”ˆ…Â=<¼,.ˆˆ‰’§ –Œ !‹„ |v s-*r99pIKqad£¦­ò÷ùÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþþ÷ûüvAFXhŒ{u‚‘—•šÉ"'¾ ¤´´³²¾¾·´·&»-¾2¼=FÅceÉyzÎÒ™˜ÎÄ{zºpr´ik±km¸wzÁ‹‹È““ʘ—Ê™™ÃŒŒ¿ˆ‰Ã‘’ʜ˘˜Ç‹‹ÊЋɅ†É€ÆsuÃno¾ac»OSÀHMÅ27Ò<=ÖLGÖ>=Ú@<àHAàF?Ü<8Ò!%Ñ&,Î!ȼ »¸© ¤ Ÿ š • ’Œ‡‚— ªІ‰º%(«…Œ ‘„ ~vr'$q54mBDkTW†‡ÔÛßÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÿÿÑÍÑZ anŸ‹ w|†•˜ ¾¯ ¯´²²¾»µ± © ¨ ³µ %¸)7ºDK¼X\Ãln¿noº]^°AF¬:C¥1:¤ 0«8C±Z\¶abºjk¸kk¹nn·tu¶vv»wx¿suÂloÁegÁaeÁ[^ÁSV»AJ¹8@»08Òf_Ç"ÊÌÑÒ Õ$ÓÈÁ½ º·°¬Ÿ™—•š¨ •ˆŠŠ†‚ˆ•…‡~œ § „ˆ „} wpp-+m?=kOQvkr³»Áùüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüüÿÿÿ¢…‹Uhxˆx|€‰’—ž¥«¢ª²±µ»º¶®«¨«ª­¯)® 1®#3±3@²2B°%5©+¤ $ " ),¥3<ªAH­IO´RW¶fh¯]`¯NT²MR¸TXºLSºELºAH»9A·#5³(±"»'4»½¿ÂÁÄĺ·®§¬ª¨›“”•”´µ$'‡……‚ƒ€‡ |…”ƒ{€‚ ~{vjm96mKMp_dšž¤æíïÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿøþþzDIZny{xy—”•›¥¦¥œ£«­³¶´³®°°¨ªª œœ¢¡¦ª £™•’– !›)¢1£,¢/¢#4¨*8«#2¬2°'7¶!3²/³)®©© ­ ««¯°µ·´°­¦ž  ”‹œ£‹…}ƒ‡ƒ€||z{}‡vv|~w%'k n31oHHr^bˆ†ÏÖÛÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿãæèk elqw{~ž™•—¤§¨¤¥¦¥®¯¬¨«±ª«± &¤Ÿžš™œ ­ º, › •”‘—›œ"œ!¤ %¦"¬ &³ #°¹&­¦¨¢¥¤© ¦¨¬¨£¡ž˜—™–’ŽŒŠŽ‚€…„„‚€||}€ƒ€yr|~r}lk"oAAt`cƒ|ƒ»¾Ä÷úûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüüÿÿÿÁ´·orlru~€ƒ“Ÿ›–œ¥¥œ¦¤¤¦¦¦¢Ÿ£ª ¦®­¦¡šž™ ¬ ²& œ¢› ”¢ ! œ !§ $«&±&³!´¯ ™žžŸ¡ œ˜˜–”“’’Žˆ‹‘Œ‰‡Š€~~€€~{{‚‚ƒ€€z~|o`cc j32v^auz©¨®èíðÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýÿÿÿ¢{~ilvzu~€ƒ›•™¦¦ Ÿ©¤¡Ÿ¤¦™– ¬ ª¬ª»-¤• ž››š š — ¸,:¤“›© ª#¤'¢(  ,£ ,§*©%®"«¬£–•”——•”“•–—”‘Œ‡‰‰…•œˆƒ€€}|~}vw‚ƒ‚‹Œywo^Z`g*(rRS}pt—–œÖÝáÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿ÷üý‚CE\h€|z€‰•š—œ­¦££¦¥ž˜¢¡—–Ÿ® ®¥©´(¡• ™œ™˜“— ™¡ ˜  ­"¬(¥ )¥&0Ÿ(0¢'/¢)£¥£ ¢‘‘Œ‹’ŽŒ‘“†„„…„«Á40“ƒ|~~xz|{}}vv|€ˆ·=?Žql``bg%&lEF}jnŽŠ‘ÃËÐÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿààãm_o{{|‰•˜—Ÿ©¥¡¢¦¤š–˜——–š§©¢¥Ÿ˜—œ˜••• “– ™ —›£¨$¨'¦(§$+ž'• “šš˜–ŒˆŠ‰†„‡†‚‰‹‹ˆƒ„ƒ—±# ‘€|~|wz€~{~zvz~€€³,4œ#qgabfh%&lEGzchŠ‚‡²¸½ùýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýüüÿÿÿƹ¼_guxx|•𕙤£ ž £¥ž••–––™  ž  Ÿ ž—• — “‘“˜•’– “ ž¥ ¡#Ÿ%ª(¬(Ÿ ‰‚£ ¢‹Œ‰†ˆ†‚€„ˆˆˆ‰ˆ~‚ˆ‰„~~~zvx†~wxz€{‹‘ pc`_f i&&mCDx`c‡}¦©¯ïõöÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüüÿÿÿ°–—[r}|z}®!  †¤œ›£œ¡›••––—˜œ›œ™™•“‘ ‰‹‘”•Ž˜¢š#”!­/4·09 ‡‚‹  ¤ Œ‹‹…ƒ„€€}|‚ˆ“ Љ~{|~|{xz†„||v{€}„ldagpf%%qIJu]_„y}Ÿ¡¦åìîÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýÿÿÿ–np]v~†˜‘ˆŒ’›Ÿ—š¢ž™›•”–œ¡š—–˜––•ŽŠ‰ŒŠŒŒ ˜š“’£'ª&˜ƒŠ‘“•†€|}}||‚Š‹‹†{y||}~{zz~{{{€‡y{y€…| {mh`doj11tOPuZ[€uzšš¡ÝäçÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿøýþƒJKbu†ŠŒ‰•–˜’™˜•—”–š¢ÄI=ž “’‹‘ ŽŠˆˆ„Š ‚†Š Ž™™‘Ž•“ ‡}~†”•Ž„~€€}yyzz}…ŒŒˆ…|x{{|||yx~~~~‚yux~šŠ{{|rf` Zkq=?xSS|\^‚sx˜™ŸÔÝàÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿñ÷ùz8;dw‰ˆ†‹‰‰Œ“žœ‘•š——•–™™›© ™Šˆ‹Š‡Š†‡Ž ‰†ƒ‡ Ž˜™‘‰ ˆ ˆ~€‡•‘ˆ~|w{twyyŽ–‰…~xz~|{zxw€€~{|}zyut}¬%(€zvw qh\ k#{KLwUWˆfh‹tx””šÍÖÙÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿåèëo(*gz„€†‰ˆŽ”¼%© Œ‹’¤—˜–˜™•“•’Š““‹ŽŠŽŠ„ˆ‡„„ƒ† “ ” ’ Š„„|~ˆ•‘†‚|ytrrqsv– °,%‡€|zwtz{yxwy|vz|}}yxvsw„‰…‰ vy zq fq!(OQ{X[‹kn‘x{”“™ÇÏÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýÿÿÿÕÎÑhlz|{€ƒ‰Ž’¯ŸŽ˜˜“•’œ˜Œ‹ˆŒ¢¦’«.+“‚‰…ƒ‚ €„Š ‰…‚|||~‡ŽŒ‡{utssrs} Œƒyxwutx|}|{x{z|||}zxttrtz©+8~z‰),2{06u'y4=SV^`ˆgky˜—ÄÊÎþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýÿÿÿɱ´smw|z‚€…‰‰†”–—“•–‘‰…†ˆŽ–‹ŒŒ‹‡…„‚ƒ~ˆ‹Šˆ‡…ƒ{{|{†‰„zxutssss{„~xv{{xuv~€~}x{{z|{~zvvppopz•€ }†)3‹EKŠEI…9?€KO€Z\ƒceƒfjŽ€†œ› ÁÇËýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýÿÿÿǤ¥sn|€ƒ…ˆ†}~~‹Ž”‹’ˆ€ƒ…†Ї„††„Šƒ€‚„‡ˆ„…†ƒ‚{{|x€‡|vvrstqrqv{|wvz{{vuz~|{yzywz~|vtwknsuxw$Š&CJNSUW‰SVƒUW…_aˆhl‹ko”…Œœ¢ÀÅÉýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýÿÿÿ¾“”fu…„ˆ‡‰‚|†ŒŒŒŠ†‹ƒ||{z|‚‚€€…ƒ~€~}€‡†‡„ƒ„‡€„„~||xz~zwuruytstvzyuuxyzvtxyzxuxwwz}yuv|yy}‚~r˜&1—,6’QU”\`’`c^a…[^ˆadotuyœŠ‘ž›¢¿ÅÊýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿ¸‘k€„…‰ ‡ ‰ ‡„„zzŠ”‘‹ŒŒƒ~xuxw{~zy„„}|{wz‹‡‚€…ƒ{€ƒ|{{z}~yttsu{vtvutvrrwytxwx{yuqsutuywqu~‚ƒ ‚‚ˆ‘4>•]_›jm•dgae‰`cŒehot“x|œ–š¡ÂÇÍþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿ¸‘‘u~…Š ˆ ƒ ||…””ŽŽ†}|xx|y{|{vv†€}~~w}„€}{{|}yv|€~~~~y{voputtsvƒyrwury{suvv|sqnx}wx{qu|‚ƒ € €ƒ'*†6:DF–X\•dg™ln’df‹adŽegŽgjŒpu|‚›˜›—ÈÎÒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿº‘’|{}ƒŒ‚ {~|{ˆ“‘ƒ}{|{z{~~xw{€~|…„{zz|€{{€xsw€„ƒ~€{{wsptwrt~ptutxzsrrs}|qlky‰ƒz{{xz€ƒƒ‚"%‚-1†<@TXac’eg–km‘dfŒ_cŒcfŽko‘vz“ƒˆ˜Ž•ž—žÐÔØÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÀ˜˜… €~‚‰ƒ }y{x‰‘ŒŠŒŠ†~‚…~yw|xx~€‚|y‡ ƒ } … ’…us|……~}{{ˆŠ yssvsw|ƒ~vvttuurrqnpssoqx€|xzw{ƒ „ ‚(*…14…@D‹UZ†TW“`dšjm‘efŽ_bcenr—|™†Œ™”¨Ÿ§ØÙÝÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÅ¢¢‡„†‘„ € ~uw~ŒŠƒ‰Љ‰‚ƒ‚„‚‡ƒ}vzz{yy xw~ {†Šƒ ˆƒ snu€„||{Ž ”|svyquyz}~}uqsrpqpnlqrtvy{x|{vz‡ …‚!),…36ƒBCˆMPŒPSš`e™hk‘egŽacŽbdps–…£Šœ‰‘©¦­áåèÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýÿÿÿ̯¯Š…ŠŒ|yxvtƒ™ƒ}‡‹‰‡†ƒ†’•†ƒ€xuŒ xv{ ytx{ ˆ‡} ~ ~wmlp{~€|‚xqvurpz…ƒ~|wqsurrqpmtyx{}}z}|y} €…ƒ€!&).…58‰DFˆKNPU—\`–fi“gjŽ`bcg”uz–ƒˆ¥Œ‘‹‘¬­´êïñÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýýÿÿÿ×ÃÃ''ƒ…ˆxwuspv‡{{†‡‚ƒ„‡‰®C:‚€}zsx„ ~xy {yww~…‹‡~ xwvqrpr{…†z{|romklnx~}yvqlstrpnnuwx}}|{}}| z {€ {"(|+1…49ŠAF…FGKQ“UZ•fiŸlq_cgl•z–„ˆ›‰Ž›–¶¹Àñõ÷ÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿåÞß“@A€‚xustspoorx†ƒ…ƒ‡ˆˆŠ‘„~zxuwssw~|{wv w€ „ ˆ‡ ƒwwurspow…Š}{volkhgqxv}|uqpkmrsrqpruy{|zvz ˆ‚{|€!w"(z+1„4:†@y)-sn o r lv€sla^iqwqrqqslhl~{u|zqegrtplkoqqortqlkfbjuvohltmiy}ƒ©93‰uu y { ~ v Œ} ƒ | ~ } { ~  } x x { t{ wttj l!“CIŒGL\`—ho•t{–{€›„Ÿ‰¥–±«±ÈÍÑ÷ùûÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÈÅÉ•tvƒEG}15y %tuohioxzecotsmcgoqjjilnvxr„ fhrsifpwsnikrpjgbdinvtnqomqz „“!†…ˆ†~yxtrx } ‚ { | | ~ { y w ~¡,… ~ zxv k ip&‰‚MR’bgkq•szŸˆŽ¨‘–§–­¥­¼¹¿æìïÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿåç鱤¦š™fjQVŽDH„26q x|u}~qv~ylejcetbhl moso‚¨{kgmtrlij]bkljqqpv pyxy|x w { {‚ ƒ ~ | } |xqttswy~ ƒ ‚…€{|wx …{y‹ { q p&-y…PV¤}„¨–¨™ ¯œ¡°ž¤··½åëíÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÛÞ¯¢¤£‹–mq’SWIM‡6;…„™"Œ niv†yjiosŠ …qokebkllifoyuouekhf`^q|qihvwsy€Š “wq u z €‚zž#ž{qpwt tx z }~}}}usqv ¥+ˆnnrnd i&-u9@‘ah¨Ž”¨”𬥝™­¢¨ËÐÔúýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿôö÷ÅÁé“–ž{~™ei”UYŠDI†'*„ ’ wus~} mvu{{nr‰ Œ hciundp}~ukmgdc^akrsnjqtnt€~•¦,,wt~ „… {Šyjnxwx vxvxtuuqrrs z | vy’'pcf%,yEL ~…©”š®›Ÿ©•›ª¥¶¸½çíïÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿâå絪­¢†‰rv›_b’TXŠ@Œ79„ | } { Š{ j g g b ^h ohddfhqv mlihfs™x fs z|}‰ ¡„zpnrsy Ž€ pox z q k nŽ Ÿ'ojf luwsnq lez ˜&n ck!o15~SXš‚›ŠŽ§ ¥­¯³ÉÑÔúûüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿîññ¹µ¶¦’”¦‡‡Ÿwy•bd‰KO‹@A“67…€y v ‡~e g l g a _ t g e b ` dmpp hage_uƒ jrwjq z~ˆ zrmtplu }ƒ xlieidah v v g f vx… #qh n k_p o e {&}.4m=Bor„ˆž•®«®³¸ºæíïÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿãåæ±©ª¢‹Œ£‚ƒ¢xz–ad„EH…59‰&+€v vt rogf n _ Q ] g a c a ^ f u p ` ^ h „ g b ‚k fq ek txvx x m js s o| s k dX \ abd d f d i ‡#x•(’)i o l i | o hm ~*0m/3{Y\”‚…•ƒ†§¡¤­¯²ÇÍÐüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿ×ØÚ«ž ƒ…Ÿ€ yy—ab†DGƒ03#|{shpfc~ kKN X Y W Y Z Y v m V X \ j c [ Y ^ c m n n qv puxpbzŒ w ~ u g i c b cy}``b _ d kkuv…#sh r€ji hf(-oDIŒvy‘‚…ž“—©¨¬®³¶êîïÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþüýýÊÅÆ£’’š }~¡vx‘^`†DGƒ*1‚ |yijkg•™%#T GP Y W N P T P i g M S h € ^ h u e k †€nv o p v Z` k z  e ` b b l ‘ ‚k[ ] a b c jkjoy hfa[^de#(f59}df˜‚…™ˆŒ§£©¤£§ÆËÍþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿö÷÷½¶· ŠŠz{£z|˜mo[]‡DG…#*||s_[u|\EV {gPK S K rW U [ o ] l — q c d k k n e m•‡XY j } x ba d b d zc a i _ a h jmkl%lk] SUfk$)e,1qPS‰z|š†ˆ¦šœ¢Ÿ¢§§©êîïÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿìïï°¢¢š€ts¢tu•de–\]†BE{!&vwˆ&!cO\maLJVRF K J I N ] [ TS Q T Q ` g ` kpe j e t x c V [ e k u ~ e i p {b V jt ] b f d fghl  vWXp$p%g*-hAE}jmƒ† ˜š¢Ÿ“‘•ÈÌÍÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿãææ¡–—st–no’dd™]\’WW|:>s"&h_`ZTnkQVW?B H G E M W V T U U Q N O XU h q _ q v o l ` X y p] n lc g r †k] Y Z ] _ m x e``^i^V^x#+|-3q:>t]^€”” ›œŽ‡ˆ¡¢¦öøùÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÚÚÛ™ŒŒŠmmŠefƒY[‡RSGHy/3s$&d cj\ojT\jP N N O I N V U Q O e \ S V ]s ][` q Šk c c `b i j d W _ qgV^ c^ \ _ `y…$a]bj iY][ g#*o58oNP‡xy ”•¡––‘‚ƒˆ~€ÜßáÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÐÏÑ‘€†jj€\\UW~HJ{69}.1r%&i"liml_q`` ` L T R L ] w Z J X [ U [ [i cgy ig c e ^ \ a g p c ^ d k f la ] ] ] \ \b ] __^n o pd![%d/6hDG~noœ”•–—~yhi±²´ÿÿÿüþýþÿþþÿþþÿþþÿþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýÿÿÁ¿¿Šxy~bbzOP€QQw?Aw.2t'*i!$`hhlh kZ g_ M _S I V s[ I H M U Yg a ] j Žsc g e ] ^ mg k c a e an†d _\[[ZZg d Z \bf eX"f.5lBG|ghš‘‘““‰y{taaŠ„†ïõöüþþûþþûÿþûÿþüÿþûÿþüþþüÿþüÿþýÿþýþþþÿþþÿþýÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþúüü³¬¬„kjwVVsEEuBDo67l*,q'(m"c[em j R JG H j X E I M Q J J V X\]a b d nk h i ] X ^ f g c \ b f ] [ \]tf [\Yj q _ n \^_TX"+f:?€ehœœ““pqp[]paaÎÖ×þÿÿöüýöþÿ÷ýþ÷þÿ÷ÿÿøþÿùþþøÿÿùÿÿûþþúþýüþþýÿþýÿþýÿþþÿþýÿþýÿþþÿÿþÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿö÷ö¦™™w^^oKKr>@l79g,.f))a#$XRcmg T J L6 L P >C R jOH k l YV Z ] sod d ^ S R a c h f uj ^ V UXX_ZXXX\UX e\ U V[(`16s\]—ŠŠ—ŠŠyffgUUgTU¨§ªöÿÿòûüòüýòüýóüþòýþóýþôýþôýþõýþöþÿ÷þþøþÿúþþùþþúÿþûþþûþþüÿþýÿþýÿþýÿþýÿþýÿþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿóõõ“ˆ‡jLJjBCd46a+.i()_%&NL^jZ V K L :I A <B :H N GS Z Q P Q X qu` ` e R Unnbc ~d ] b k _PHP_VPNOTaRU_ e.4qVY‹€€‹}}vZ[eLM_LKˆæïñòùüð÷ùðøúðøúðùûñúüñúûñûýñüýòüýóýþôýÿõýÿöýþ÷þþ÷þÿøþþùþÿúþÿúþÿüþþüÿþüþýýÿþýÿþýÿþþÿÿþÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿýÿþýÿþþÿÿýýýÿÿÿìíîŒxwc;;`47[*-]&&X#$QKOL I JE<:7?O A1.>NYMQNIio Zb a hW a Y a [TUV_^ b OIERZKLKJQLI Zd+/oQSyhiyccfDF_:>\ADynnÒÚÚðúûëóôìõöìõ÷ìõöîö÷ï÷øïøúðùûñúûòûûòüüñûýòýýóþþôýÿõýþöýþøýþøþÿ÷ÿÿøþþùþÿûþÿûþþüþþýÿþýÿþýÿþýÿþþÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿþÿÿþÿþýÿþýÿþüÿþûþþûþýûþþúþÿùÿÿ÷ýýüÿÿèìí„ppV%([&(Q!"KNLJC 8:9?C2;C40DF@_ LIIFX g [_]QM X n_RPPOKJ] [QGAAOO@PR ?JV"']8:Y47Y04Q$'J"P56uwÒØÙíø÷çñòèòôéóóêòóêóôëôöìõ÷íö÷îöøî÷ùïøúðùûñúûñûýñûýòüþóýþóýþôýþöýÿ÷ýÿøþþ÷ÿÿøÿÿùþÿúþþüþþýÿþýÿþýÿþýÿþþÿþþÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿþýÿþýÿþüÿþûþþúþþúÿÿùÿÿøÿÿ÷þÿöþÿõþÿôýþòüýðùúöÿÿæðò‡tuJ@@;<84 5523:1&(:3;B14AUHDIRSQRP JTjUOMIS RLX YXJ6BF97F@?K8' )+/P9<™›œßèééòòäîìæîîæïðèîðéîñéðòéñóêòõêóõêôõìôöíõøî÷ùïúûðúüñûýñûýòüýòüýóýþóýþõýÿöýþøþþøÿþ÷ÿÿùÿÿùþÿúþþýÿýýÿþýÿþýÿþýÿþþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿþÿÿýÿþýÿþüþÿûÿÿùþÿùþÿøþÿ÷ÿþöÿþôýþóýþòüýñúüðùûî÷ùìõ÷ëóõèññìôõèðñ•‹‹C** ) . 1 / +),++&%0-,593M MA?BLQHDEBEIHIFKPT FIE:B//:<158-$ mbeÀÆÊåíïáçéÞæçáéêâëìâëìãëìæìîæìïçïñèñòèñòéòôêóõëõöíõ÷îöøïøúðùúðúûðúüñûüòüýòüþóýþôýÿ÷ýþøþþøÿÿøÿÿùÿÿúÿþüþþüþýýÿþýÿþýÿþýÿþþÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿýÿþýÿþýÿþüþþûþþúÿÿùþÿøþþ÷ÿþöþþôýþóüýñúüñùûð÷úíöøëôöéóóçððçîïäìëâééßæåÞããàéé±®¬\==!).767BAKHKW @::8AKC<<D65??5'1-233"  NGIŸ¡¤Ï×ÛÓÛÝÐÚÛÖßàÛãäÛäæÞæèßèéàèêàêëãìíäìïåíïæîðèðòéñóéóõêõöìõöíöøîøúïùúðùûñûýñûüòýýóýþóýþõýÿ÷ýþøþþ÷þþøÿÿùÿÿúþÿûþýýþþýÿþýÿþýÿþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿýÿþýÿþýÿþüþþúþÿúþÿøþÿøþþ÷þþôþÿòýþòüýñúûðøúîöøìõ÷êóôèòòçîîåëëáéèßååÛââÖÝÜÒØØÌÑÑÇËÊÉÍ̺¼º|ml5    *# & *-8?AC7;<9A?=R <64/..50&#&##`aa–œœ£«ª§°°µ¾¿ÀËÌÊÕÖÐÛÜÔßàÖáâÛäåÞæèÞèéàëìâëìäëîäìïçîðéñóèòôéõõëõöìõöîöùîùûðúûñûüñûýòüþòýþóþþõýÿ÷ýþøþþøþþùþþúþÿûþþüþýýÿþýÿþýÿþýÿþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿþÿþýÿþýÿþüÿþûþþúÿÿùÿÿøþþ÷þþõþþóýþòûýñúüòùúï÷øëôöêóõèðòçíïäëëáêéßæåÙâáÔÜÜÐ××ÉÐÐÃÇȽÀ¿·¹¸­®­ªª§¬®«š™•mgc>64 "/##/"!&#!"&. 4333363680340,+*&""  "*    /#$KEF_^^wyzŒ’“ž¨ª°º»¼ÆÇÅÏÑËÖ×ÐÚÜÔÞáÙãäÜåæÞèêàêìâëìäíïåîðçðòéòõêôõëõöíõøîöùîøúðúüñûüòüýóýþóþþôýÿõýÿøýþ÷þþ÷ÿþùÿÿúþÿýÿýýÿþýÿþýÿþýÿþþÿþþÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿýÿþýÿþýÿþûþþúþÿùÿÿùÿÿøþþ÷þþôýþñüýñúüñúüð÷ùíõøëõõèòóçîðçìíâëëÞçæÞåäÙááÓÛÚÎÔÔÇÏÏÂÇȺ½½±³²©«©£¤ ›–’’ŒŽˆ‡‡urmSLH,     &3*)0$$, )&$$$'/2 0.//-)*/,)'"$)! %4!C14OCG\WZonp‚„“— ©«¬¶¸¶À¾ÉÊÆÐÒÌÖØÐÛÝÖàâÚåæÞçéßéëàëìãìîæîïèðòéòõéööëõ÷íöùîøúïùúñûýòûþòüýòþþóýþõþÿ÷þþ÷þþ÷ÿþùÿÿùþÿûþþýÿþýÿþýÿþýÿþþþþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿþÿÿþÿÿýÿþýÿþýÿþüþýúþÿùÿÿøÿÿøþþ÷þþôþþòüþñûýðúüðøúïöùìôõéòôèðòçìïäììßééÝåäÙáâÓÜÞÐÖ×ÊÒÒÄË˾Ãö»º®¯®¥¦¤š™•Žˆƒ}yumie[WXKHO>;G40D0,B.*?-(=+%:($:*'<,(9)&6%!2"0"/!/ /"!/%#0"/*&'(!#   %)++-2 =+,I;R?=O=:L:7I87H87G54E64D65E86C648*'+     $'*.3&%;--A55H==LACRHKYRUa^akilttw~ƒ‡‹’–𛤦£­¯«´¶³¾¿»ÅÇÀÊÌÆÑÓËÖ×ÒÜÞÕàâØãåÝçèàêëâìîåîðæïòèòôêôöëõ÷ìöùîøúïùûðúüòûýóýþóýþôýþõþþöÿþ÷ÿþùþÿúþÿûþþûþþþÿþþÿþþÿþþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿþÿÿýÿþýÿþýÿþýÿþûþþùþÿùÿÿøþþøýþöýÿóýÿòüýòûýñùûðøúîõøëôöéóõèðòæíðäëíáéëÞçéÙãå×àâÓÜÞÏ×ÚÊÒÔÄÌÍ½ÄÆµ»»¬°±££¥˜˜™ŒŒ‡‚€xxxoothhqedoaal^]k\\iZYhYXiYXgXWfVUdTSbRRaRQ`QP_QP]PP\PNZMLTKJKB@:/..$"*!+!/&$5,*8/-:10;43?65B88H>>LBDPGHVNO\UWc_`hghmlnssuy{~€‚‡…‰Œ•’™œ™¡¤¡©¯¨²µ±»¾·ÁļÇÉÀËÎÅÐÒÊÓÖÍØÚÓÝߨãåÛåçÞèêáëìãìïæðòèòôéóõêõöìöùî÷úïùûðúüðüýòýþóþÿõýÿöþþöÿÿùþÿùþÿúþþüÿþüÿþüÿþýÿþýÿþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿþýÿþýÿþýÿþüÿþüþþúþÿùþÿøÿÿøþþöýþôýþóüþòüýñúüðøûï÷ùíö÷ëô÷éóõèðòçïðäíîâêìßèêÜåçÙãäÕßàÒÛÝÍÕ×ÇÏÑÁÈʼÁĶ»¿°´¸«­°¥¦©ŸŸ£š˜›—–˜”‘’ŽŒ‰Š‰…‡ˆƒ…†€‚ƒ}}|z}ww|uv{ut{ssysrwsqwspuqpsoookjlihkihjhiifgheeiffkhjkiklkmonpqqsuuwwy||}‚„„ˆ‹‰ŒŒ‘––š”›Ÿ— £›¤©£¬¯©²¶­¸¼³½Á¸ÂƽÇÌÀËÏÄÏÓÉÓÖÌ×ÛÏÛÝÔßáÙãåÛåèßéëâìîäîðæðòçñóéóõêôöìöøîøúïùûðûüñüýòýþóþÿõþþöþþøþþøþþúþþüþþýÿþýÿþýÿþþÿÿþÿþÿþþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿþÿÿþÿþýÿþýÿþýþþüþþûþþùþþ÷ÿþøþÿ÷þÿõþþôüþòüýòûüñûûðøûï÷ùí÷øëõöêôõéòóçðòåîðãëíáêìÞçéÛäåØâäÔÝßÑÚÜÍÖØÉÒÕÇÏÑÄËÎÁÉ̾ÇʽÃǺÁͽÀ´»¾²¸»°µ¹­²¶ª®²¨¬¯¥ª­¥¨¬£§ªŸ£§ž£¦ž¢¥¡¤œ¢¤šŸ¡—Ÿ–Ÿ•œ•œŸ–Ÿ–Ÿ–Ÿ—ž¡˜ ¢™¡¤š¡¦›£¦œ¥§ž¨ª¢«®¤®±§±´ª³¶­·º°º¿³¾Â·ÁźÅȾÈÌÁÌÐÅÐÔÈÓ×Ì×ÚÎÚÝÑÜàÔßá×áäÙäæÜçéÞèêâëíãíïæðòèòôéóõêôöëö÷î÷úïùûðûýñüþòýþôþþõþþ÷þÿøþÿùþþüþþûþþýþþýÿþþÿþþÿÿþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿÿÿÿþÿþþÿþýÿþýÿþüþþûþþúþÿùþÿøÿþøþÿöþþöþþõþþôýþóüþñüýñûýðùüîùûîøùìöøëõöéòôçïòåîðãìîâìîàéìÞèêÜæèÛåçÙãåØâã×áãÔÞàÓÝßÒÜßÏÚÜÎØÚÍØÚÍ×ÙÊÔÖÈÓÕÈÒÔÇÑÓÅÐÒÄÏÑÄÎÑÃÍÏÃÍÏÂÍÏÁÌÎÀËÍ¿Ê̾É˽ÈʽÈ˾É˾ÉÊ¿ÉÌ¿ÊÌ¿ËξËÎÁÌÎÁÍÏÂÎÑÄÐÓÆÑÔÇÒÕÈÓ×ÊÖÚÌÖÚÎÙÝÐÜßÒÞáÕàã×âåÙãæÛæèÝçéßêëàëíâìîäîïåïñæðóèñôéóõëõ÷ìöøí÷ùïùûðúüðûýñüþôþÿõþÿöþþøþþøþþúþþúÿþüÿþýþýýÿþþÿÿþÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿþÿÿþþþýþþüÿþüþýüþýûþþûþþúþþùþþ÷þþ÷ýþöþþôþþõþÿôüþóýþñûýñûüïúüîùúì÷ùëõ÷ëõ÷êôöèóõèòôçñôåðòåïñãîðäîðãíïäîðâìîâìíâìîàëíßéëßéëÞèêÞèêÞèêÞèêÝçéÝæèÝçèÜæèÜæèÛæèÚåçÚåæÚäæÚåæÚäçÛåçÚåæÚåçÚåçÙæèÜæéÜæèÝèéÜçéÞéëßéìàêìáëíâìîãìîãíïãîðäïñæðòæðóèóõéóõéôöëõ÷ëöøì÷úìøùîùûïúüðûýñüýòýþôýþõþÿöþÿ÷þþøÿþúþÿûþþüþþýÿþýÿþþÿþþÿþþÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿþÿÿþÿÿýÿþþÿþþÿþýÿþüÿþûþþûþþúþþúþþúþþøÿÿ÷ÿÿöþÿôþþôþþôþþôýþòüþñûýðûýðúüðúüïùûîùûîøúîøûí÷ùí÷ùí÷ùìöøëöøìöøêõ÷ëõøìöøëö÷ëõ÷ëõ÷êôöêôöêõöëôöêôöêôöéóöéôõéóõéôõêôöêõöêôöéôöëõ÷êõöêõ÷ëöøêö÷ëöøëõ÷ëöøìöøìöøìøúíøúîùúîúûîùûïúûðûüðûüñüýñýýñýþòýþóýþóþþóþÿõÿÿõþÿöþÿ÷ÿþøþþùþÿûþþûÿþüÿþýþþþÿÿýÿþþÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿþÿÿþÿÿþÿÿýÿÿþÿþþÿþýÿþýÿþüÿýûþþûþþûÿþúþþùþÿùþÿøÿÿ÷ÿþöþÿõþÿöþÿõþþôþþõþþõþþõþþõþþôþþòüþòýþóýþóýþóýþòþþòþþòýþòýþñýþñüýòýþòýþòýþòýþòýþòýþóýþóýþòýþòýþòýþóþþóýþòýþòýþôýþóýþóþþóþþóþþõþÿôþþõþþôÿÿôÿÿõÿÿõÿÿöþÿöþÿ÷ÿÿøÿÿøÿÿøÿÿùÿÿùþþùþþúÿþûþþûþþüÿþýþþýþýýþþþÿþþÿþþÿþþÿÿÿÿÿÿÿÿüþþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿþÿþþÿþþÿþýÿþýþþüþÿûÿþûþþûþþúþþûÿþúþÿúþÿúþÿúÿÿùþþúþÿùþÿøþþøÿÿøÿþøþÿùþÿøþÿøÿÿøÿþøÿÿ÷ÿþøÿÿøÿÿøÿÿøÿþøÿÿøþþøþþùþÿùÿÿùþÿøÿÿùþþûþþúþÿùþÿùþÿúÿþúþþúÿþúþþûþþûþýûþþüþþûÿþûþþüþþûþþûþþüþþüþþýÿþýÿþýÿþýþþýÿþýÿþýÿþþÿÿþÿþþÿþÿÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿþÿþýÿþþÿþýÿþýÿþýÿþýþþýÿþýÿþýÿþüþþüÿþûþþüþþýþþýþþýÿþýþþüþþýÿþýþþüÿþüÿþýÿþýþþýÿþýþþüþþýþþýþýýþþýþþþþÿþÿþýþþýÿþýÿþþÿÿþÿþþÿþýÿþýÿþþÿþýÿþýÿþýÿþýÿþþÿþýÿþþÿþþÿþþÿþþÿÿþÿþþÿÿþÿÿþÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿþÿÿÿÿÿþÿÿþÿÿþþþþÿÿþÿþþÿþýÿþþÿÿþÿÿþÿþþÿþþÿÿýÿþþÿþþÿÿÿÿÿþÿþþÿÿþÿþþÿÿþÿÿþþþþÿþþÿÿÿÿÿþÿÿþÿÿþÿÿÿÿÿÿÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿþÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿþÿÿþÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrmagick-2.13.2/doc/ex/images/duck0.gif0000644000004100000410000001437112147515547017410 0ustar www-datawww-dataGIF89a´´öRñÿýûÿï==“““š››¼½½ºÀÀй¹ÿ££ÿ¸¸ÉÊÊÊËËËËËÈÌÌÌÌÌÏ×רÙÙÜÜÜÕïïÕððÖðð×ððØññÙññÚññÚòòÛòòÜòòÝòòÝóóÞóóßóóßôôÿÇÇêëëàóóàôôáôôâôôãôôãõõäõõåõõæööçööèööè÷÷é÷÷ê÷÷ëøøìøøíøøîøøîùùïùùðùùñùùñúúòúúòûûóúúôûûõûûõüüöüü÷üüøüüøýýùüüùýýúýýûýýüþþýþþýÿÿÿýýþþþþÿÿÿÿÿÿÿÿ!ùS,´´þ€% RR"‹&R*‹R3R>-—‹RJ#ž‡‰‘‘“•žšœ£ ¢˜¤ˆŠŒŽ‹«–˜®³±°µ§¸ª”¼™›¿Ÿ¡Â¦·©ºÇ­Êƒƒ¥ÛŽÜ ” ÜÊܱèÚÜÞ*àÛâ3äÛæœë¡ëˆèîðòôØko„>ü¾…Wî7u÷µSa=‡Û ¸&€¢&‡¤DqD$äÈ7D†ä¤òP¨–¥@©¢äLJ)Gb©3Ì&IE “gÈ—=Þ¬94çÊ0‘†Tª’éM¢=†4À±Uš6Ub}uÄO2«†=ét'ÔžþRC¢ jUl[eeϦÛ´èÛ£f“Î]º§ßŸ  *ðä«Ð«wµú¼÷±ÝÃpO¬¶oÖ¿.5Ë­\—-fÀzéëöç!^cªöL6sj´[Û¦<òéз;ûþœ—7îáµ§*—}ü2ñÝ›I¯Ž zrôÞΓ7.<»nÔÜù"ÿ.W„ùóBœ1ƒ‡çIhØßüˆH¬q¡>zõçµ÷^|óùw_~ûõ·žé­' òÑ ~úÇŸæ5 {8!‚*¸ž†öqH „öQ¸ 4ábQ„°Ä‹LH‘BR¸Xc 5HÁ„‹RðÕM@„>¾þãŒ:Úˆc“<& ’R‰$‘0ÊH£“96±cD9¤‹VJ™%“^r %˜@RId™X.¹å]~)¥˜f6A:×5gÚsàõÙÝŸÚY7v„’g(sƒèv‚Šç^Ií©g’&Ji ‡úéh¡q1šé§Š†êXi¤n i§²¦ê!–Fj™¦’™Šé¬©Ö*š¨¸ºªkp£úZ­Òåöª&TŲ#‰À³NØ8„HQD;ƒ R8±¬=@¥íH/}Ûì³ËF›Â´åR‚í·Üz»m¸Ì"BnµÒRkíºÛv›í»f‰+/´õ¦{í¾#éË.¼Û: ð¹öªKp»o»Ü­¨þ [œ¬Sw1«Áj ǽzÌ)¯ÿvˆ (§¼)¤¬B Œ°BÊ-pàA *ƒ Î)Ÿ€ÁÌ*³ì2Ì2Ól3Ï*¬ 3Ò*ø 4Ê+·LsÌO×|sÎ;»ì´ËQMµÑWC½´Ö?s-ôÔE£l5ÒJgír!7Ex ÄÜC(!BGÈw 0$1„ÜIØ‚ƒÓýÃG$N·ÝxëÍ·ßJ.8á†#.w‹7>wÝwS¾wßDüxâ…ž8çŒ;zä£Sn9꙯޹ë‹>yé•ŸŽ¹ês+È%?ºè©Ó™L,¢¹»+òÆþ^È&K1<ÉÉ¿¼§Œ}ôþÎK½öÏSœ}¡ÖóIüù¥–_ìx¯nߪȫ~¿ô³, 0;îÂè¢×ÀØe0~Eì_éb˜ÀðU0w«_ñRXx¯‡ð” ½(@Bì`LؼÌEA‡Ð»Ôû&…¿õocöcaø¦W FðþÔ êÀA€ª„ªU£"U©>`ªS¡*UªBWÍ*P¹ZÔ£&u©BhjU£:Õ¹¢«Ze+\¿ W¹’µ®gMk^‡ÚV¾†5®cýiYçúÓ8ö±.À Û‚h.xì <ð@vðìcUÌBV²”µ,f5ËYѶÀ u-ÎJKÙÈNV³—5me[ûÙÐR–´º}-jq»ZÇn¶³½•-pk;\ãæ–µÈu,l}KÙ‡Î4‡õ›(vSz]”ʯc:¥¡þ$#u²³ž­à õB~ºÓŸ aÊAõÆ“½ó |×+_zÒ÷ÿD¡CÕSšfW¥Ûýîøl¸Óþñš³ÀÛMŸ mJ¾GôÀÝ oH5ZÓœï¥Úõ.Nç§ásrÃf°x/ì%¸ØÅK^œ(œÀLpq¢ð@! .nBT +a DAŒ|dÓØÆ8Ö1}ld!ÙÈHV2“c[ðÿ0߯ñÁsœà‹Çüåád÷¿û%÷¶Í­Ðq§»Ü"Ķ}O?úÔ‹{õD½{Kû ¦ñ€Gpâq_ñÈC>ð=uÔΦ¶¯©íhXcÚÖ‚&µâ§íeÈ›ÛP¶üá7ÿeƇ~Ø’6¶ž•ù^{þÚ’O¶§%øØô¹?}”Á-x¯ÓéLw9"¤NsŠkÝçrÇ»Øñnv¿ƒ¬ã9›ÃyãôG;À“ø8¡Ó»“€h;úW€x€Ø;õwŽ#<ú¦{¹Gq¿‚½| Ç{è3yõ6‚"Xy¾ç‚&èw1þX‡gy»gƒ!(o2H‚,¨ƒ4È?Ÿ§z&$zåzçfz±×z³—^CÈzE¸„õÕ„Iø„ Å„ø”„·‡ƒ%ȃ0È…'¨…=Øw4Fp4Fu„E‚”FkÔF]G}FtEf¤EjÄEoEoXE€„†t¸††„‡`¤‡rxGƒT‡zÔ†€èGfH}h‡tT ‰dKÑÔKÓtI¿dMÍJÅ$‰¸¤KªDM—x°$LšXKÃ4‰žÈK–èJ¢xMδ‰§Ø‰©¤Š¾ÄŠ£(KÏĉÈô‰«ÈL¤¨H*˜q_ø‚Ã8ƒÕ‚Åè…ämFH{RP…^Qx…ÐØ^U8†_Üv„þµwPÖ(_þŒ÷`Æèx+؅ȸƒëHƒÅn”—ŒíxŒ>HbhñH^/¥ŒæÈø˜ŽòXè(ŒäTkEX{õV‡åWŠXV…WÙUnVb5W‹XTyX†U‘eV©V)‘‰Xé[%XYX é‘ ’@EYÒÕ\•õ\ÆÅ[Ò[¿E[§u[ÎU\»]¯¥“£Å“3é“5 ”ÇåZÓ¥\F)\H©Zºµ”ɵ“Áe[©e“AÉ”DùXäØx–ý8YŽÿH4ÈŒPŽÚF…àzN ‡nS(—BHÞ˜_¯÷Œö•,Vxð˜ÇxIþ˜ðVƒÄÈŽ–©˜÷X–`ipçȘhy–f ™…©y.õbvÖeaöezgJ`egvdi¶ewö™yfSFf£Ùgt¦f0–š5¶šp暤‰e§Ù™me¬¹grVšY&›M晵雷Égsöb£k—6§¶iªÖi­jºfi¦FkÒlÕ h¯6j¼Úùk¶Âæ×éœÙék#lÔùiè k¤öœÑIžÓykÝ h~˜†9˜š™ƒI™—9jylI„v¹—x©¤g…ÙnÍè â¨„ —X¸n(¨Ž‹él9–ºpbùû韜wƒ‰é¡Ê¡•™ûH–þ™ Ú¡– £‚Yp æ˜ÉŸÿ¹….ª¢Z5ÇrI÷r(BtLGs#"¤A§s1Çs"€¤?·!8ǤFê¤Pr@7¥Cw VêsX*¥R¤\º"-BwQW'R@uyW%ag¦d‡¦jwlªv.¢umWvi wxò&mZ§lgwx§{zut uoÚug—'#zq;†!š£$š¡Ç²¨™W¢ú¨/š™–*yØ£1º¢™ª£›ê¨2šž× Ø8¡n9—HXzÉ|É šªm™ °º êÖ¢Z£•*©Ž‰©> £Ž |]ƒ6U³~m£|ßg}áw¬Û—¬åg6×G4ÎÊ6ÝG}þËz~Óš}ã'}Êj~Åê|ÕJ~o7ûw’3¨€x;ç ;€öW;›ã®¯ê*¯X¯è€ø*;¾3¯ 8€¸ƒ®¸®<”ºy¾Š¢Àú©? ±Âº°&:™Áª© ;£†G±—Zª¡©`¨¡)z@ˆª—ßȪÝ(«ki¡®ºÎˆ«²W¡ti{,z¢+ª ©Œ:ª=E†s4ˆiHHlx‡q‡‹È‡xdˆ…„ˆG+ˆd¤´…è‡N›‡e¸‡s¸´Tk´V´Q›µS눇‰±¸‹´XM­˜‰ÄdЦ$‹•X‹¾ˆ‹°Ø¶f«L¡x‹¯È¶Ç$M¼·˜HŠk þMnÛ·h‹·‹Ä±<º«ýÙ³;û±6Z oY³y ³Z«){—:³‘Ûª“k².Û—ª¸*²Ë« ²ÇòŽ{±:‹º¿ê±¬‹o7ꩦ[±8긽êº4h#É’i’iW*Ù» ù» IW0yW"¹UéU- ¼/)¼ɼ$ù¼Ç{‘!9XÕk¼‰…¼ŒÅ 2‰•Ä5•89”ÔåXËÕ“Y©”åÛ”VÉ\Q©•T™“ç;[WI“R ]\Y¿é{”ëK¾Bé¾Õº#[» ª±Ë¸º›Në乒˲4˹¼¹+ ¡-ûÀÁ<Ž\º‹›»8˳ l±ù°+±»À"þ|º!,™$lÀ‰[ÀÌÂ$ œYœ½ùf­©œÂ¹›³iœ ù›¢™›±‰š@l›;œºYg?œÃ¡‰›°išLŒÃx†œIüšËébÍ9ŸëYk÷ižùù»FŸãÙžåÉjð9iòžõiÆ_ŒÆ¹¶Æd̞i,ÆØ9kt|Æç©Ÿ|Â0LªŒÂ­ÛÂ!¹*«LÁЬ¹‰,³Êȼª˜;¡Ë‚¸‚±Lº€<Ã.…Éœ<È›2<ºÇ¢«¥ì³¤ìÁ¦üºƒ<»¢«Ê®¬Éž|À‹ ‡tKº¥E÷¤^ºrY¦K×¥G§¤Z*¦½|¥À ¦J·s RÌÁÜÌMJ¦þOg§€ §zúusç§u§&oçur×§†z§Ø ÎsšuêÍx'§|Z¨Ö¬ÎyjÎX¢',ʵì,Ë{ˆùÂ÷œÉ4úÏ¡|Ë ¼ÊÜÊûlÏý§:«'[——« ™É<Ñ”,Ѫj«1;ÑYhÈ„ ²=ʳ,¬Â§­Í 6ÖÚ~ÕgÒÆŠÒ䊭àŠ~ÔêÒÞ­à×ÒÇ÷¬×Ú4Ù®é7®5]®ðg€é °H¯ X°ÿú»¯Iý®ògÔìJ ˜¯MÔ ÕW-Õ ;7=Ò)ÒmЯÖ MË ½Â¶ë©ý|» <ÂpýÑ ìÑRP²ý¹\ÑþÑ·jÑ]¹ê×mÉ7ëÏk»4<×"=†d‡_Kˆj(¶‰ˆ´X+ÙDû‡O{µBÛˆ‡ÈµÈÙ‘=´L[´|Ú^{†`;ÙŸýˆˆ$¸u Š¶èŠ¥Û|{¶wKÛ«‹·m·³­¶¹X¶½-Ûq›·¶M‰„›Û™Œõ¬Öúœ³ ØÏˆ\É–ûª…}Ý”K«ƒÝ‚²ÞÍݬwÉÍЉ׋M»eM^ª«ÂŠÝÖ±¼ºt­p°œÊòÝØÐ]×5Ì»Ôë»}ս؛’Ó«Wi½Ž’Ê«½þ½ž¼ÃÛßÅûß'éàÞ¼)áÁ«Uà ¿ÿ«¿UY”÷¿ìÀ]i¿þ>¾N¿Nâ~“$οO)¾? Àû+[PÞc-Ý÷½Þi-¬ÕÑÚíÀ¼È|äyÁŽlÝ¢GÞ&¬ÐÓýÞ¶lÞOhßr­Þç=߆Êù¼ãYŽßl]=7LŪiÅÀ‰Å=<ÅlVÅ:|æD,ÅĹæeÞæCÅÃiÄN,ÄP¼œwΛlþÄ<ìg[ÌÆe\Ç`|ÇéÉÅzìÅ܉èrÜÅÛùžq žsÌè’n¾è‘nÇ£VåaŽÏ=åZîR?þ×}Þý²B¾Á­äà½Ý©ºMîÜ^.ê`åœ:ëR^ë¼îÞèíR\ê½NÖ_Îã§ë9ÎØÆþémx ·Ìþ#'ÌΜrAÍD:ÌÏ\íÌ|íÓntÚíÒ\¥Ùž¤Ö.tÈÌt‰P¦Ü|¦ˆº¦íŒÎÝ|wñœ¨ï.vñ¨ÙÎîœÎò.¨Ú,ÎïÜïù®¨8^È:îë£å[ðÑ­ìÅþð¢þÖXnëËŽëÍ~˜ }ÁCžä@Þݰ®×Dîêê ÏNßë¿®ð‡YÒ>=Ó9Òß*­'ó/ÍÓ1½­ê§Ó*ÝÓ2ͭȺÓ+ýò@ÏóLóæz¯QÍÔG=°öê¯K/Û®ýjÕˆÕMOõUMÔ«¯ZýôV_ÔL?Õ Ëðúíðñò-ñ(Oìiÿökïé?лžòx­þñ¬~ѦnäzßÈ­Þñ¯¾ê€ßÑïöÃ~ø5 ´­Ú˜]ښݵψZKÙ›Ú”¶­í†¨=ùRËÚM ÚŠxÙ¤½µ®M¶t;ܽø·r«·¨8‹¾]ܵÍÛÈÛ¿ ¸Áúµû¬oÜ´ŸŠ¼Ÿ¶¿˜Mfåm¯øh¿ö¥žÝOø“Øâ=òäß÷KŽ¡v¯öÙ÷/íøÛŸøÉßýÁîäâ?ñçÿ¡>eî¼Ü;áÒ»¼íá ÿ)ÿ^’׋à>ÿúßà€ Ôãã¤ã4HÄ¡èÓ#RD©â"H43’IèÓ*ê‚Á"Úò¢â"úâññ2:²þ+ª’Á:ZzšºÚúZÛâ2Ür›JjÚªŠì +K{z|ªÌÛü L<[½Ëìú<,}  µ¾.ÒÄ%¥B/5s#¿šÏ®4Ò»zóêÝ (…Ÿ>)ÿJ¸.^Áˆöð-Tèà‡ï(Nìwðb „ 7Bì÷1^HvÙ=%f<Ld:‘’bH¾(7gØâ$¦”#ƒÆkhtf͘7sîìùÓèТB‘Ê|¸”'NLíEJhU€I±ÚÜúÔ«Øxa¥ZJó¬Ó®>×N]3»vQÒ£¸rßÈ…%÷ž”ø¤E–ƒ3:<,/±ÊÅ‚Ij4ܱAÊ m¯+,0säÍ[®Ó‹™ äŠ¥=3¼Z5i‘–‹NÉš6aØ|eælto«wv¸76ñÙŒk›¼]¸ká}+ní<õòߨwÛ¶>¹{òñqλúöëº?Ÿ»¹÷÷ë÷ÿœ¾|tñì;rmagick-2.13.2/doc/ex/images/Button_H.gif0000644000004100000410000001105312147515547020116 0ustar www-datawww-dataGIF89ax÷”–”FŒLFDŒ D,*,L $ŒD¬VTL$<ÌdbÌ\.,lfdL$ÌÎÌÌÜjl2d<64L,, V¬¬Td4ìtŒFDL&$rììêìNœ¬<\l,|~|ìüzt¼¾¼*T<<œLÌbdT,, älrä\>|L 4¼\|<ü|œNLL.,üþü¬®¬&L”D¼Z\T$< ÜlfÌl64ljlL$ÔÖÔ6l<><\< ^¼\<üt”JDT*$züìîìR¤¼|<üüz|ÄÆÄ.\¤LÌfd\,< ìl|>)j¨ÝvÛÄ‘ƒÚ±¦A–KjUÄÕj£°æpï”}ÛòË.ÇŒç¤ÆÊl3Ì-êæ±YŽÑ[³cv—ƒÃwþyçÑH'­ôÒºRËôÓP/Í+•L¬·è³¯åPé Qwíõ¾u~-¶Ô’2!_L@Ãú¢ÊöÎÀÀ-wÜtÏmwÝxß-7€ÿJÆÛy®·à„¿Ý7–f“ö Â)ÛKFpˆ!ùä”Wnùå˜OÇóyæ ‡Žy …à‹£ÏY¥­pC“ÛÁgÄ.ûì´×nûí±ÓpD¤ÂŽûïÀß¾»ÀHš½×ÕŒ§²·ÃNCðÐçÙúýõ´?ÆîæV³.ªõ®w.a=öèË>ü­¾kŸ>öë‹kü\‹¯žÛT¾.»ûïÿ®=÷ÕëöþWˆZ(-QÚZG¾BœO€ÑÞ”Ž ‚ÜAzÕü„‚¼F10Rú›ÿ ¨=÷MÏW<ÃßWÂÙP`HPêîiMcú« /(¼X*…ä¡ìÿ*˜ABUm/'[ò@ö£%ÀáBÜßí°9R=1ŠR¬—€±Ï* ”ÐЬD†Ä È€ĀŨ‰Á}@ªà€€5ahìÃÛx1rŒätª#V¥ƒ6$µ ±„ŒÏ[aðJ‡1¼` œû§:ÐÈGF2}Ú\pÉÃM N2¼IïözuêKØ€$¯—%Šc˜:e !„!@0|å´~ôEùÔÏ~7—ËvTˆðu,U¼Øä©9l5¬j¢N.4<·ÙÍpåˆ xæ0MšilX@šÔɵSƒ©I"ãXÇÿ³~ÁëG3bðHðRI‹`öü@¤ð>DËtÔJ“ ©F¡ÝiTðÄCѧ;Þ™³HÓ<Ú-ɰ„t\£æE´Á£ ?c ˜9eRì‘£¶¢¦.¯T¼¯ù*Ö’&º•p:ë~"ë”ÃL BôI†‘ú¨·hÖ4{&à¦"©:?¤è³† Ô—µt†÷…[+'ŸŽeÕôé!—£Ú’PÆ„­î†9啚rð>\­Ö°ÚŠ>0$4¯JêjM®VP¥õ¯(ëÏ` ,®Ka±×:­^l¨qQ´6V2B‰¯³Ä_fºÎ HVMííÀÀ<ÿFuH†tÌ1QÆ6¹bËG’E_eé¥I©âk³Ð{^+ö¯&³'ÍÚ;‰fN¾¦Ï¯"VÆ.KäF ÙR$§®”[—Beü´“.3Üè=¯²Ì%¸>Æ#ïB¯·"ÓäcÔ»27¾K²®p &×z+¶…¥*dC•Ê¢è3y¬«˜¨ÕÞëUÖXŽûl9züêõc1üYø‚Ö& ó´Wµ0©ÈõÎüÚ7xà«csuD« ò8Éä“ÑâZáIR6fÁ ò €Ì£`ñ@¶·»!­v–Ë 2¦¿ÎZž+ù•#cLÚ˜–·¼±,sYËx1ð ËÚ[A‰¨:ypò:;.€í¨ÿÇÐè†9×™ÎvÎ3ž÷|gðá}%æÏÈp@Ò@9‘iýÔGQËÇF׎¶[.k53Š´òôàìh,*7³'–šVC‹ZK¼p²r§ ^ir“R;K,ã,åÔ^‘]µ®¥,h7à«!LkØI©Z×mŒñJýöÑëäÆYÛÖŒ©ÄéÉ^µ…Ž)í¹£ýÎpÄìꬿ^‹+Fƒ2¹AÄvÿȼ݋lÔ³>ï]m{-xâ¨Úþ‹"’q§m{s+ÄÖ±É*¥{,ïèØèӡ‡èÞô)ÛŽÊt.on¼DbÝúRø¶Ý¾‘;ÒN ®† -¸1?íìNÿP…T¡å-g€ËaNó™»\æ-óïZÝ9&ÚI±4Ù­w êeüvÕ«Éí™Yk¼Ã¶žY® —³N‘mr3’R¼ÕÂÚŽ W$‚±§l„º;RÏ ´Ó+V¸†ëèÙûqiqê8Í:ѵÕRymrhVŠ×qA2·Š§ v\vÊé³-gDm•ÊšÐZºd¬à^;ìºý¶—Š(âãÎ륳ì×a±z+§&1qýwð=õxë=ª±_Ý`_¼³a²vL‹Õä@¢¼-_MTwI›¯¶A<­o:fà*Ú0ÿJ¨Ó«ÖÕƒ,sƒO;eû ó^Œ‹Ðm¸mŒ1Q÷³@ÿ^››iBQß‚øu³Ùÿ¦ѬŸÍïëT¥ÅdÖw7Åß¹iwµ÷—Ô>óEm–tÄgbSlç';4h]$T§J#çw·5/%ׂ=«•' UrEƒy ;†e4Ã’R’v>±}BÃ|£/à';©GU¸¶zÀh‚T1}GpÌ·tCâ|H§`Ëw-¹âzù÷-*ufŠAkqÌׂïE<̆Y÷Pgoê§)†ô‡–‚Q'„F⃶ƒeñ¥L3&'TH·¦tEon`i~—1½Æ$t QU‡v¢i?B…dæO*5%˜[m¿õO¡¢ï£ÌCN…/D=.ÿÐM+%)ç¤0¡„W×{_‡$&°q´ÓÛ…aÓ¶$<ð>&0Sã,ýÇÑuuû§T@RS׃R¯e‡m*àSéc¥§xQ2{.ñR÷³|І#u€Méó¼ãŠLDl;Ò°=]°Mb[ð²_]±Š˜†wã8†+c*MÀœ˜=2P¢Â|áÒ 4r¦†jÔÂæ<àîf…–5$ °¿ó‰4™ˆ#ÅDÀ˜|uR'"8pAŽG³2R“# A%9+#˜yhamÇSS 2ÿðýx;4@ €SÀ;©S?r%qp“9¹“ç“U0…@‰u‡@–¸\C² Gp0Om„°•-€3pJY¹•]ÉGX@[)M—Òxg+æD«ÖQø‰E„/åõlïhCB·=¥/}ÉCÏsB–²‘4‘ƒÉ'^†Ùi&”ŒæÔ>–©>¼£HYè`ƒÉ…ùã<éVš×fšêæBÒ'çƒm©É?©)<ÁdrT‡îç0”—A?>²˜ø'I®©šJ5•‡š‚8'•‰lG0›CBAGDOÉ/Î&ȧ|Yr—g°p±£CÙÉpÛùÝ ž´ÿ“A@ò@Üyž³Ãᩞ=d‡I{Æau˜œºvB¹ä›<Ä=§d‚)l:B€Z* 8@ š  Š j жt)ê  Z¡Ú Š  z¡ª¶ä0©èw‰ò¸1ö·m‰Xz–wI_Jå1Ö}B™Ôi×0³BYWo(‚ê’X4C/]^;*/–…[‚7e˜G<Æu1|˜a’7~¬·^qáœauVPlÞ7‹¹;¹’[¹”{¹•Ë(EÐPDP®‘¶T;º¤[º¦{º¨›º¥{°ŠûPyж{»¸›»º»»¼Û»¾û»À¼Â›»(NA;rmagick-2.13.2/doc/ex/images/Button_Z.gif0000644000004100000410000000770612147515547020152 0ustar www-datawww-dataGIF89ax÷ŒŽDœ|ÜÞl|~<6d.,ljÜ\^¼>L DF”<¼¾\ìêìì\^,,tzü<>|~|<ÔÖÔäæl46< ”’D¬LN$L&,¼¾¼fÌ\^\6lÌÒd*4,dfÌ\f<^¼ 6T,>4.\ìîtäTV,|zü<>|”–”,6$¤ªLÌÌÎÌ,.<ÄÆ\<><>|,trt2L ,.\R¤räLR¤…9µ©Õ¨Lw¾ÔÑÄÌÆ]ÞÄ •eYªd޵)SíX¬f«æ”áU Ô(=É·íR“Uå¦]û÷iÚÀZybEkgh@€äUjRlá‘d /¶Š8nÌÌpÑf›’¤€¨¦c)n¥’~Ikš°ÚÎ:EߦíÒÂ?5€LQMÀ’ˆ×#‘ fí³ŸÃf®yºm™KÌ£º»½œwöÿEN~|ù—棜¾½{õäÿ• €ðûÃ'OÍ¿¿ÿÿ(à€h r˜‘$ÕJ&Ø×݃“%gÁJü‘„…^¨a†nèa‡ ~(bˆ$Žhâ|"Ã^bYg’%ö 'ã}“=R†Ô¡ãŽ<öèã@)äD©# Iäo&¥áàƒÒ‘ÃFViå•Xfé‚ :#~`J†BŽY–iæ™WNðˆg > %r\@&štÖi§Ž-¬!ß—3Î(@!w*h–eâ¢H ¾Ù]sŠe£Ž^™Ãž1‚9‘êH榚ò)§uÌ j¨™:Ð¥J‰* „‘B ¤«‚ÂÿZ¥©ñÄg˜@\é  èØk¿ú*¬¦Z†’“o·ª Ál³Î;¬´AB;­™¦Zu«²ªMB *¸ î¸ä–kî¹è¦[îã:B*–ÙÞ”êƒÊ²j§!bD¡ï¾üö«/þ,ðÀþŠ‘eŽ´¶µí}ªéj§ 4üÇŠL¬È_ŒñÅwLñÆÇ¡±ÈcLrÈSLEeÆë²É.‹&™Npü±Í(Wl³ÎS¬óÍ@4ÎcàB˱-Ì­ÃtÆB›¬1Ô&GMõÕ%ßl±ÄB[<ñŒ|›¥ËÍY³¢ö҉ ^£ òÎ!ýóÜíqÏDc}âXçA^tÇúyp®Hé#wžò0*JG(ëJ›gͧ^AªVBØYÀZ¦64Á€h­Ržö¾ –ìd?ˆ@d·9×γ;x- i¤9µ ¤_«Ýè¬öƒ(ð3RfLÐH^È]ÿý(°ócgᮇXái¥®ô´­Ú@ݵmK¥mYřΨ¦ÂÕQl°€^SÂ.ÙŒ©*FwGTÝ ÝzÊ-hS»XaltÉt†>tìŽyÔTßYª¹rJ9üîŽzº;Ñg í®bëʙں» /0O©ÛÖ3ºÛõlGC[§9Á¡y\^Üž*CýzU%ên!xøBå]Sh` ïr­ œ7ú5ÂÔ T`þÀ DÕo*Y`Ku§¶ƒ"“ yEu>TÇ:а<»Ká:i ¬µ|¯5¶ÃêX±h¡mt °Ý‘qW#(’“\¹’¼8©™"“ŒXA·¶ÿ¢cÞqz{ªu›†«÷‚¨ÆYÎV9³wå(w®Íλ‚Š=l™÷éÇ»jà §çÎ%WÀº\e™—Œ_4ÇÊWxÈç†ï¶µ¯©îN½ÝчmeànÙ™NnàœøBWJ1ä2P©&0w;=è;µ!R5£ƒÉ™É(P€ ŒÁ„ø^xðšÅ…ài¡/ð.`f÷ñTŽY“ë÷¦´Í"ÌfªÁ«£0Bh¢n]$ZQåÙÇÖ‘ÙÖc6Åhâ¯Ö.vzÓÅgü¬§ïdwtðY#r|¦µ]ñ‚VŠíé< ›‰8]g¥'´(ä€Neÿè/6ñŒË¶9h\x@Mã":c¼¥$(º  ·‰7éD¦†;âþÀÑÄÆNÒàÁFúð}Ñf§2 €¼oCwv# ¬œ@Ô?B®û¶qw¼N,p@u!Žu½ ®w5Wz±·ÃK¶ÇRx¯ù·£ÍÑíáúü ^¦}÷®ÆvyLÆ0[É>µqÞîˆøLó¨ -ÀÀ‚K6Éoo“÷9— :øF ãg’@òÌÖÖZûÛ‹¯”];x&C¤!¤z¶]jq†¿êœb¨ùx/æDßÊôÁ5f™ÕRmb¦c\õ+(`•e3Å:{›0^YŽ·gÿ$Ðå¶Ò08š«¢éˆðû…˜}:ÒZ„ªcrKôb‚>¨wcà‘$Én€6Žf‰ JëV’ŽÂ¤ñ%ªÂpà#¢"}8ÿÉ‘Ù(7ù.=Ù)@” ò“;9}r–bi“3 '•a Ò”2R)@DX’Y‚—w™—…PßÑhü!SÝÕr@€ì¢.й˜ŒÙ˜Žé˜p€a‘¡+Ñbà r™’›Ù™œù™žš 9š2!q!ƒ™šª¹š¬Ùš®ùš’¡K  ˆÁ1{¢™›¤¹›ºÙ›¼I#&!#áå›Ê¹œÌÙœ©ÉÐ7L€R@1ã›Øù›Ù¹»©‹°v€=w`Ð-Îyžè™ž®95°"°\ @ z€›ÚyŸÜ™Ÿø™’@àj°¡ƒðêY z Ý¡°‘~àõ‰ :¡®©ÀJ=€f€Eð¡ ¢":¢$Z¢&z¢(š¢*º¢#: f ž;rmagick-2.13.2/doc/ex/images/duck15.gif0000644000004100000410000000637012147515547017476 0ustar www-datawww-dataGIF89a´´öW + (($$9%::)($2/)54,;94B+L1W8A=6JJZYEC;iDuL~RgfxxKJERNGTRJ[ZUa^Wfd\kjeroitsl|zvÿOOÿ†W™c§l®q¸w~zÿÿÿ((ÿ77Â~ÿGGÿ\\ÿffÿzz‡‡™™©©°¯¸¸ƒƒ|Ƀ׋Þè–óÿ¥ÇÇ××èèÿÿЉ…‘Œ“’™™–¢¡žª©¨¹¹¹ÿˆˆÿ——ÿ§§ÿ¹¹ÈÈÈØØØÿÈÈÿÚÚèèèÿééÿÿÿÿÿÿ!ùX,´´þ€$‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’ŠW•–—˜™š›œžŸ ¡¢£¤¥š%$¦ª«¬­®¯®¨°³´µ¶·§©¸»¼½¾¹¿ÁÂñºÄÇÈÉ™²ÊÍÎÂÌÏÒÓµÑÔר¦ÖÙÜÝœÛÝU¤â™äÞ·àÙQæŸRQ˜Kç¸éØëížïñ—ó–VfÔƒuOZ•(Ù´´Ð’)•ªÀ«ôðÊ¿+T^È b…J%+V®LyòÄJ'™8´TмLHî"“8<œ˜d@¼‹4XÈpÒ¤EH/®Xi1à ”4,=™%éÊ+-•™XE;&ì*½ReÀˆJ4HŒ‚dD‹þô0²yÅÅ“J¯°hR)FŒJN\(|5k2 ,%a—¯Ò¿‹d£¼ëÀˆ¥‹N¬^™!C)J(s+¹h…”+1N6v­ÀK`«ÄvL¯-¦w ¶¾½(#j¥'‚Q^iòW)‹»3X8¡áñ*VÖÔ(t°„„qØ+[¯Ì¾¿+4ЮÔBµq*Â_ðnõE^ç• #›—Döë–£x­4`ÃÃÞMôÎpÉeÅ–´ ], H… t¹W‰J«usD4°˜8#ܧÁbi“U|wÅTñ{]Ã]"±@Ã4Ðu‹44c…ð­òæ)åÛHm2’<öþh d—Ì`c C* Œ”¥0¡À%S¸àBs1ÖHå”_²Ò’4Ì0‚a^"_šl²²f›p’òfœt~2gx‚™çž£ÜÉçž~þ‰g ‚ÒIh¡pŠ(›Š.f£TV!©>ƒBǧŠ é¦š6€Ä[†ZŠçl*À5ÜpC À©”~ é9ÕiZÃEäªë®CÜ€¦"Īä¬Ü¬€:ìªì²E!¦¦I,6#hš³Ø*+įH+jš Ù–»k ìJÓNÃ5˜+¯®9hºn=í>î óö[„öJ™o3"À믿3 ð·J‚5ÁÁÛPÙ° þÃg…¦Cœ &æ$›±¿D 0|#Q#C\ÃDÎ¥LÌVB´|pÉ  \ñUÇÚ¬«­f@.¶\ÇîέïÏÏrжCDÌH׳C·,1§šf­,Wz,å}>Áõ¦ñ2;A\G§ ÀÃ6—|6,3{Çb÷(‘ eÏ @Ø ó@2óεLÏ]3³%GKxÕÞ¬³xÜgÃÍ80!ŽÒþ‹äeADÓ<­àg7 Bšs>Œç¾¬#rèýý(\ðÀ¯s«ž„d®£y8¥Óî/¡üòAq{ &ìîw!ü¾y/°÷"àÆË+8 þ̇/¾ó¸GÏ;×W3|7н¼kÿ þü?øÃ  à÷jí’}/"zŸ¹€€ñù@øsÀþ4°‚% $xÅHÓ<&'@eL÷ËßGà@I)ã¼*Ȭgý€Süãà±B^¼Ëk$,‚Àb.},\_7”FÂ]Õ Ëë4E~d£…¼¸ ¸1 „ïД˜pDîðo=*0¿ üÀš ©D^P†‚ï{º¸¼lÊqÎ(ã.$‚5jŠáCÁ¦`G+F®k$] `‚ðàNœŸ x7 N` Àmö,„ ~#! þ)?åÁ€šú€#i!Ç^€¸*\e™K”ˆ HøÀ2Y¨àšò1JÙ cñÍfõ’Z(^i„Ào&áÿü8®¤ óÂÆ§Šƒ,a¸ÏÄ‚ÁË_ÌãX9˜ä²t0Í´©›ÁØŠ¦pƒ!xCÀÁÚ4‚QžÚ+Q’.dvj öÄ3¹q$pà|~;(ð,A™ç(5¤`m†Q¸AtÀQØ¥ c}ø„OVH¡`›Â@R)¯!¼LS¯ÉSIKQ…ÅhÊ7缄à*j&J¢*C)l SˆŽ½J>°Nh†n•ÂŒÓL=Qþ”N€¥$tÕ“zŽoJ«=”[@»1UMHá>pªQ0Bs .?í†:—æ3!„´­æzÖX«˜*3Eæy·´™+jHà*5NIW›½ð,Þ¼pÅJd¨,[0JÁÍÎ\k³¬325.Ÿ ¡§ŸX³u·½^c¦Î4ìȈP´¡.ënýÞ¼õŒ*üª±»ÛÛ&‰®ÜæJpF”P]á[ ndkŸZ‹°6!—QËeEYœÛ2iZË\óvû¨ì®Â+Ͻºà•ÛÀ_èr-Ík Ê·_Â-ídë6/W‰VÕáÞÁ¶õ̃½íxøïçè±þÑiÊt$ÃâN€T*•ý"ÂK…–±’Ý—hF+ï1^òYs—n«íWÔJŒ­’Q ®ÃX‡åä…ZŸlº»º[rE< %fXÂ>oŠ—¥)©Ò`ùp‹ ä ×6·wÛ*v‡1E-½îr[²„J<´.pœ­è€ÌºZÛŽyŒpWWB†˜w%;/€%æË¿!Ä$öfÑ­WÀ‚-r@8AˆíÍ'Ö¯¿6¶æ)ÿ"S{ÖN•ÖŒ¡+±• Fû2æ*s9˜É#»ÛtdzdNl/c›ÎÖŸûìC“‘´Ô›x„'lmvÈòXŠ^½`Ë‹­Ë:­¦|ݯ`þÊ÷q F³²J&ÛÁjê—-»›ºõ?ÙÉ™Î[ƒ¬ÏÐ¥€c·ÍiràÆü¯›âº_ÏJ0¢@xàƒ©všXÎXÔ`ÎEð˜YF[è„+åBp1ÊÖº¶¬Ê¢¼Î³¸ä¼oMµÒQñ5'B@î,j«Tn¸š$¾ :²º»MS‚Æ1D°¸/‹C˜g°FNrŽsb1øøN§)J–/ÃåœPÂwiG„­ Þ622Œuæ¸Ý §R :ž‘¡Nx›W9¨-°ns–àü5å”0PpT9¸A$€Ða®zË ¢„Lù3ø9$rµw¢¬WàÇCöîÁMÀþÄîw¿:)¶2JŠ+=ÓÔÀ)ÖÑoÀ[ñÀ8 yÇßœŒ/…â-¿öi, „çüÆ©‘.S H#è ?LÔ½xñâ7%‚ÕO,iÿ&IÒ 1¦ƒf=(8À¶Rèœê—0:©¿ ;ú`[Å;€ß Š Ì¯roaáïÔ‡}e;¡üN2ï„äUð1ƒ|OPÆÔ/€ ØØƒ€ÁØ»gî5¡üD²Ñ‡÷ 3â¡]P{®ÄTò‡GË£@K§ ëà|¤ hb¡)à }Bç ãmÕ"Uàš2 ¸<'ôzê×cÅ· ŒwJX‚ÌÃþÐx<¦ qg®ÄkƒÌF(€Þ· ™ ’òQÀ#e Çt6@P`(0Ð>ðˆú|.Á1R„K€#ðÀå7˜FKF  €Pþ à…ÍP‡š"`'€*Àõ'{Ãt„b˜+Ш\ÎðM&p…Y¸…%J¢wyÎP.=èƒA„™8zÒðMŠA >%zeUýÔ>xB7Šx`ÈF2Ї U "šÂ}vW‹™à‚¹J4ÈyÔX`”ÏC45ËÈŒaàzãqαT›Ryé¸9“ŽêHh݇ù¨Ãýè:)yCdE% ¹ Ùù‘9‘Y‘y‘™‘;rmagick-2.13.2/doc/ex/images/duck12.gif0000644000004100000410000001505012147515547017466 0ustar www-datawww-dataGIF89a´´öj !+#((%$9%::*)"/0'1.(54,;;4B+L1W8A>7JJNNZYCD;iDuL~RgfxxLJCMPGSSJYYS^b[b_Zdc]mlglqjnwqrojtrl~~}ƒ|‹:7†W™c§l®q¸w~zÝíÿòÂ~‡‡™™ŽŽ*©©°¯¸¸¯¯=„„z˜˜e¨¨W¹¹EɃ׋Þè–óÿ¥ÇÇ××ÊÊ5ØØ'æÊèèééÿÿˆ‰‡†Ž‹˜–Ž‹“’—˜—š ž›¥¥ ¡ž§¨¨ªµµ¸¤¤·¹¹ºÅÅÿ‰‰ÆÈÈÉÖÖØÙÙÎââ×ëëÝóóñÝÝçééçööýþþÿÿÿ!ùj,´´þ€i‚ƒih„‚e‡…Š‹‡‰‡†ŽŠh‘„•ƒ–Š™ƒ—›“ ž„œ‚¤§¥šŒ’®–©Š]T¯˜¡¢¬¦¸±»ˆ·µ¨¿iª”ČƓ¤¤a)—Ê£Á¶Â«¨ÌÄѰÓÀÕÌØ­º¾ÒÛ‡d)b⹟äêÔë×íïóÃãåîÝð…žÇáì¦ü1‹ÑEŸ6|Ö– È-a/}ŦbhÏßÁx÷0…9ƒÐ¿‡ô~ÌF¬/’1žô—ïßJƒ(3Öë(Mo6C^Ü×paŸeÈý)ÍÏ¡@Éýi4èѦK:mÚôéB¥L’¡J4kתU“FÕj”RW©S½ZEƒuèV¯þE¥ÆU+-©ˆòx¦Œ¨EKÈo=³Ü«ªð`˜8ó&X³d0)t6öVò°dÊŠw®–lÅ—¶Î¤àˆ¡I—-S;\µ^} }Viq2â`fþå·SsNÕ¿v¬ønkÚ¯©‰‰;¹nà•f=½šGÅ÷ž~^ú²ÌíÝU_·Ô;ºL…¶]ƒ%º>*%¶E«¾-ËöýB¶÷ÍÎ5{_®Y¨e15ÖUOŸ]n …ŸT æ‡Aýg`XZå%ÊG•QŒá™#¼}¡!R´ˆ"†XJ"Ьrâw*ê'/vòH%ªxˆ"@ÜX[bÕ¥±E Yæ\xHþ·šu -yDÆ1¹W’ƒˆ•S7\^àmiZs^î†DÔ!V:š•éÝ_ŒI ›–dÇ’x³ÉI:¾É$hG6x` ^voÆ ›šÜù‰(–Oò‰d˜‰þùž}“JXi~úUJߤ˜b¨é§L]ªi§õ‰zéV¦NŠªª£~ºê{¯ZJé§­VºÈ1ôñtâ{Åâk!ùíƒê>)xá묺þê+‹¸îº³ÿícÈ‹Ç2»¬²eIÛë­ÅÜx­²:6‹ë´Ç’{„GrW#rN bEæ9 i’pî‰\—= ¥™ŽÆY¼®Í«$˜ž§(fSg'7g‰p¿ÒWÞÃìþÎ;ž£„ªW¯i‹n,¦½ŒB òf£Ég¦ðvøj‡(‡n¦œå'»-O¸ÞÊâ­5³•¶ÐêÅÜÎË6bH¸‹ü!Ãþ@'üñ“Sä •/{ºÊ\Î"« •ðQ‹‘·ÄW Am†pPúRŠ<ð  Ã¥8ʆsþðÓç@’‚.Hj›ÌÁ/§ÉFaJŽ‹˜ ݯÉÂZtá¹T xIMjö@"2‰HGîüËL¢u‹.Àå,'à°4­3ˆ,S…ç¹Bvhð 'óIM Êࣦ§BUpvaÜ#JM' s¢)Ìf8mÄ ½ágC¡êOÿNúŸô-ä›–:YÂB†1@Íç à“ÆEnóCþZʽ M%@úãÕîŽ9ŒœÝ‹‘8Å9°–þ¹ÂDÍé4=úÜ9ë^ÃiÑŠå£pXT¢ªHAnÚYŒQj˜<¼ÁB׸°u -¤éætÖ1êà Vø§°ƒ·BÁ ,ì•)(oŽ&t'ÊÜi¸;žÇ˜+G÷ B…ú È#ZÓcÖ¥f²‰ZÔ`ØÎ:Ñ@5çÀ>U”´ChpîùVºö¦~ÌÁC¡wÈâBn©š§F…6R5W Q Ý&%à µ¿å€“g†m¹uã›ra%^òÚÊf¹’š²ºÕÔ‰KZé5‹3vÆ4f" èã[ÛÙ¬¦Ñ£W°Ù}àËœ¢•˾èŠÄÏx55þ`)õ.Ä4Ød÷…tÜËeô/G}  üÑ£ Ãr0xB ¾îxï4(0R°…ƒfذPp»Ýß>€V1Õe}Ý–¸¶5±LðÛ—³®F‚ 4+þv(Èñrh /–vud«'ªKc#û@‚˜ÇŒ„#$Ù,hòoð€dAÄg ¤:%<§gúuμÄ ]/û’». ³ mf%§Ùɵ07÷JŽiál[¿¢*2á+¬9š9Û¢˜:4œ%ô~öel0èR¡6hA °æ\ jP㤵f´¦•‹Rw³¥"´©WÎA ñÂ36„TMþm2Ô @jU³ú·è€ ¬à…0  ožü¦ÛR¥X·xLƒh8"»C\«Èöã9_êU·º)ÀÎPàpÓوͻ°½£›å)¦N·ÝxÞÔ¦÷AóÙAMÂbì¦%v©Y{TH³A€'Üj)ž|%-•-+ÇI”Qš&l0f"HÀƒðÂHU î¹ ýv"V[qd;”Ôd6<¸€µêÅ!Å7Œw»JDÁ»*lŸ- ”ºÌ,ð`Z|ZŒ–üz\$Qì· °SHìGÕÞQ ëýt{*Ô°Ÿw:„«‹ù-øàöó•øíþï)ðë6J;šû[Èi°Rá{‘ÐÌ Üƒv´ >Ý,7hvK1fþĸ§F= & d|ç‚~§®ÔƒØÃ dQ ±÷OÎ'.$qÿ€TðA J YN ;[t (ÿÄ…šõ…¹EWrgõPbS°IèA€4²~†7[˜ÇpÊGs¸s€MUàˆ¶fà? †Z®c†¹¥‡W†H›ggŽB¤ÃZG<К¸;DCZgõ62MÒ|>fsZ&‡” €« ãôAÀPôKJ°SD #—„Jd‡‰¨t gLôÒzñ€YðA5øKIÐC<•|$·€7 AXT©!î# æ³m}×m1°þ%ðA8pŒùdS H¸Æƒâ?o#?õ“Ri·7m70c3‘‡d¥rÆT¼P9‰¤ÓgXÕ Hùkùöh“ P%)i IO¦ˆg¹ˆh@:hЊ‹)×CQ[3aX‡¸x‹1ŒœÄ‘)cT ^øu·3Š*„ˆ(a°ZhX;÷IÜuµEPÌHK< מpUódž•žØ“ŸäFZ4[‹2{ØÄ‹w˜[qàOOSN€…;y]¾ÄXDB)O3G`²’mœ¢kÉ—›}ó'E?°E‹P…„5M@véþ\å5!u¹)æU—fÃ+è-›²’æ5Ž ™¦^h ¤’@ãø±È]EöK±e)ÏR.³6-V™¦- †š fkƒ‚‹8÷ ÔIi´ž9MJ Œ£E礒Ÿ$\äæua0™LV›øøS·aue]j$\â8Eçd@H¢5‘$–yôp4D%\÷„{¢TRÄ]¹á‹gyG‡•»èŒƒpW¤_~ô|©ntÂ9E±EMÜe@V¹pêzðI”Ôƒ«eŸ~ÄQ°XØekäPÔ´“õpe€1’ GCkY_Ü«°` _¾–L)EN J¼„žþÔ$JôFUPSoLƒiôÔ"ŠiQ-žv†«Y>Ùl½Æ6sék'yùK) RDž¸ùKÀ5M=$—àÓ)&e6ÛÓ73+YŠ)2)G(†Ãa|FMBltEŸ…O‚ùsˆ„:&¯Çt:QF8UN2æAêKõœ> ~¡‹#AG¹MYÙdàY1êA€žjäQâùIu5•H§ˆþdhðB• 3𛾴“PNÊQŒEª ŸdZ§åÐ1U0Poé ø§¿ä›K9uNn:EÂu~ºˆ £ÕgÐQP¨؈ðTL¿Às[u¦P–þcÉP;ÙŸkäA1™tA9‘ZpW¦€=„wRù#xôS„F¡KúK”ª—ùÙQщžÂÅ‚3•0hTýs‚­´!g yãZV€®ùÓžxjPTNŒeŸ@ªÓDž€ž5"E§QP=e§zÕu¯pråÄ]ÃúGç²R[抇Xì ¼¸ ®Ã°g\ûe –F@¢[û³iLé$³ iL»±Oûm´4Q\ÆPœäGö§ÜúKç4¤a’{¡}¥ãópUùc#+;D¾TËF¾©Uö7LëW«Ûˆe ¹(IK§/Ƨ䤢±õ:ðVÂ%@”s–`°¥# §ˆaƹDõ ±Eœµ©U;…ù¨¾ƒP«U €‡þ÷­bX¼O›{ƺ „²P°²ü ¿ºanôŒg0$‘¡g_û'µÂ$xX*x²»Ê«ÓœhŸØ*´d( ñ¸7)дôq!,5Tîª=£ÄoÇ>‘iZöØ#õ(p¸ÔDžü¶ÙÚºÀuUa€]lžq yÜ"3R½*²/šZi`¦åëG¢t±éP°…#¡hQ@ó†”VV“™ìÂÉÙ {FB c䙳¤àRp¹í‡¬ÚÛÉP{sqèæeBPÇk䔃i¬Ÿpƒ@®ªxÈ=ÌžJ¿œÓxÐ JMêGJ€XW‹Ê‚ë‹*Ìç1¦þL¨ö´¼0·j¤X˜E×°¬ƒ^ðÀsŠ¢Ø…‡I*Љ˜ßE 2xÅÜ ÀšžSfTP«ÑU˜w“ÎÒ•˜†™˜´âmyk&™˜F™Ç.¾"ƒ£ cNêœ%`m`€¨‚-éi í`ð,æ¢,˜ÒÕ2.½"¦õ•3 YXF,˶~Ô5@3pEY`]Œ°˜«ˆ÷ÌEb¼­lÎ7ñ„ôD[Åu54ÐÔ4ðC‚Ðܽxû–À|b3qfZC€; ‰=À9Àð‡àÔMÍ=½h¹xÁª¹"+׬apÔ†ðU`þ1 jMFé–´—¬Ï‡Á#“¡›S]`@` b Ø›cgðNýƒmÁ³UÎy&‘ÒUMu3ê¤"B4®‰ÐipUž—£û`+ wi°`´f4§à^Ic£8 ‘(M™µýh±I5¶v.D…)_ºkýœ˜¨²Z2ÍjmìüXpÇDUÆ›¢¥ìœIp“Ä`Ú6Ķ˜àÓÝáE6B•-²ZÍI²ÇèÔoŸÓ¨#HB}ÕîŸé’Á¿\%QZË…Úà *[tM …V‰ †n6‹¹a㔾Z¢ÚnÝÒsúÂé=AY½:ˆ']`ˆ  ÐÙÅP]·J'ÒþrúÖۙʸÅÉqZ€¹ÿ› {Ĺ˜Í…0XX„Ȯ޴y¶„üÙdÐë ã< ¯FgÄÀà}nýð/Wó®óB/Œ®×8ew6|ÜÅ[P!-µ°d`¸óÁwúCWå¿æH>!t >ð¸J'¸®×xvyÞå§´°{Þ.ΘÞ%#†‡ÐÞ¨´RéA/@fGpEùãï”oIÍ×@«{·Ìˆ_%¾éõ0-@tÔËZÎʾü9G¸¬ÍjÏzœŠ ƒx½Ðž#$àA0`wE`M.“™ÊÊ:‡`þÛ¸èçL»Ä±ðÚà‡°ê­~uyDˆàù{ p‘[BÝÐÚ {&¥¢ ÅybÆjËž(ìÙâ à ”MÕÇ_…Jà‚à­Àã°í‘Z«üâÇ¿ 2ÌŠ³;H!Hº³IY‘h‚Š”?Q!ªcPSJºrôîê&»¦‚o§ [„„ÂÛHõ¤cˆ„›ß°Z¹:e´ðZuOïCÐ]÷®³Îðžnß!“P 0³ïÀôÄr%/hY7ÕrØðu}ßwÊÊ 1X\÷dpb`°Y0„`¿,à0`CPF@ç>þ²‡ª8>Ô©É‚0ìa@ö^10ð”¸f×× Q€"0 ð‡zÍö&ðóKëÌœƒ ×f”€,Ðr?D` Q¸xabï>oø$ào˜ù¦n¨ú®¡l¼'?Ï6@vA_jÅw,æô7¾â˜«ÑȹsCxkIóã6aÐ{PwS?fYç»Mán.°ÓH6|.v ’I,¿òÿJ‚kN°â>™b„øˆ¶‚"g Õ °ýbÔ²ñíH-0Ÿ¢½©2%Ä¥anDhožÄDT3UMTèjÖªeÈ\µªõ«×°h¶ÀRWXÄ‚›.Õ­såbýJ7î×½]Åâý»pÕPÀ"[8*TM£2ŽKøQbC[:âg. ¦þ@*,‰*²J¢A5þ\˜ôèÂwA«ž+ò㬇I72 »ñCk3ñÙüý”¦ .µÐfpðÔà u.OU)o©8k.mÈR:¥Þ‚Èd®%"ú+*^.½¾ÓeuíÏO=Ìézpuæå£!.8¤-¿Ä'¥ïß|ÚßsÜÑÓzõ¥7|bÄ s¾ H!vÔ™—à…V”¡pÿé_v.ƒÀA'_‡îVà„cÈ$!Õ%§YòY'Œt7sŒä8JŽ¡È†" X™c“Éh”íè#"@.Âä„=Õ‘£%Y]cmEÆb\ÙÕ×]]mUH˜W© –˜s• Ö—TÉ•f—ojE×bpeeOnb•g™`ú–Ÿkf…h^9çᆠ¨a…;‰ø¨tJÚ B§0ºÞ‡˜Zê£)„A!ŠÊ)eas9(ߦñ¹ªjK-ªcE9Z:úéŠ È途Bsj§¸öZꥂ‘Ü®)†ªì¯*új]®JKí¢Ìò“¬¦ÏVëÞ¬vk]°žþ:]£èµ©¸Õ^êl³‘;rmagick-2.13.2/doc/ex/images/Button_8.gif0000644000004100000410000001176612147515547020111 0ustar www-datawww-dataGIF89ax÷”–”FŒLNLŒ,D,&$L $ŒDL$¬VT,\&,*T,Ìdl4bÌÌd4 ÌÎÌljl<64\Üjl, DL&$,4ìtV¬ŒFDŒ$,¬Tl,6l<rì ¼¾¼¬l,$Ìbdìl4ìîìlüztL, Nœ<.,œLT,, l64 .d<älrä|~|4¬ª¬\^\Œ ,*,¼^\ 4jÜÜT <ÜÞÜtrt<>|zü|><ÄÆÄ|<,TR¤<,|,,<¼|ü|üz|<<*,\2d Ìfd, ¬®¬ ¤L\,ìl<4äìrl!þ0Creator: PolyView® Version 3.62 by Polybytes ,xÿó¸¢K[*\ȰáB„BŒ¨p"Å‹3RLâ¦ÍÀ!E¡d ¢5N¦\©²åÊ—'c¢t9³&Ì›,kºÜiSfNœ B•Wf¥–NFù¤•X~¹å˜Rzi¦˜bvIÇ•`f‰f”h(Àç±” ƒ @VöY¦“k6¹æ—JYf¡‡ºÉ& ‹º¨ nB ©£„²i¨ ƒj…UœÅ^ BÖWäk,øÑ§ Pv©é—Zú¨«‡ÿJ¥¥³ž«­oªzj«`¶IÇ$W·Ò®uç ¯ö𫲅¢Ú¬¯©¦‰i•©Vë+­Žž)¢V.àÈz Yl‘^àq(”†*Šå¬µ¢[kšÒzí™—"Êî³íþ¹«—˜±Æ—´®R[p¶ç k­´¶ºîÁZúj¤\Rûj#U…êݸ‹4L(«è¢ ò¶Ê¢z¥™ò¦ënÃóZ%®^êŠåS!¨ ‘8R ™c&‹.—"[»²—Üj4™½öŒ&ÅC<ò¦Ò…p‘R°imÒªž­É¬úy4” öØæR"«¼jöê±¶H_¥ìÅpÎ:ãê§³(;›4ÈFSÿR‚~À‘@gèaøá†1”`éŸÎZ­æÏÌI‡|›«Ú®&)í-Ìh ƒ$»²ðu'P¹Ô7¨i­†ì“Ü>…ˆælgúJà³ÿÚ72:à9`a]غ%²P Ø£·¿ÈU.|RÀ8·¯Z‘dtP@˜8?2¾°ŒPËø–/ÊÑ!€l ¨Î§,–e-Vè’€$hÆÖ¥‚/<ƒþ7¹*ÚÊRÄ )líxûÒ•”Äp†3Zr‚,d½~WC{ŽRñ¡ùdÕµ»mLxˆýغ ä@†¤ œ€ —l]"P­5n¯Y;\Ë"DG7*ЀQ"Aé'6Œ¡h–+P @ÏuË|]z@ÊC¾Ë ÂbSäX¤f°Ý”öX?Ö~ˆæñ$‡‡PA~/Ôƒ¹"vÿ¯;j)˜?æqªfE}©ï^AÁ¹ÄöIÒd¨„›ØÎ€f“;(uBNú‘{ÓzD†` óå™&ËLF3fl ""3§E<¯w#„ä pF€ }+C ›€Ï `]$AéQ ˆ4Þœ‡k¶sudϾé²@V¤bÐ&pž‹dP‚#Uú¦/SK;O³ ;=”àV8$ ¥¤€ÒµupøXSÆ5zJ=m+ú,Ö,'‰a…ŒÓ›<¥UR‚–Ð^òþ×Xµæ„­Äkl‘·&œ1­[•jHle*[Ä2I/o6ã¾~uá1µ??‘>=üz9»YÂÊ5 $°=ÿä%x^²o椹[4ïÆ«-0maÇ„‰Fè7@ëùïXaÂ3ÒðEçi·&&àa/Ä?~€g .ôG¥gm9°bÅcHj3x2ñl$ã&¦„*;pY|¤k€l;°q Xl—K À?ñ‚2­g[›ãé…Só(hAj` x€<&8@ÐnwŽso¤d5ýç_L÷T26âç:u ©Gq 8@Äö|Údž4q[òFÓqs¡IGç$©t\LðxÀ4k%`g·—KÀFöÒ,êwÐU7–Ç5í#Bða@gUXV;ÿÀg0Ö[¾“/_Rs9‘X:ãOhF4ÀS”1Ð6]µ7 €“òGQJ´Œ‡Æ3U N(*ÞáH W|Õ"F8?/uÚ¥T[ p`Ø:z0bÑrPÒ-qnüt~¤=¸L@Vôâ6BE(; TÇBɈLI%rp!civ7ÅGaЂÓcW ³*Š¢Y('(x ×ôsÉèO(×÷´6cË(aRrqõƒZ¤Ø6óåIº¶?Ç:Ɉkòx6åwSÓHz34YŒðZäoé¶2’pvõ“Òæ=åçæ9eØoö@¬[“Â3QvN Ó–¤ÿDEÖòvgñüFb÷$-é[Iðc|ã2`uO«H~[£niRnÙ÷ôn­ÒiQÒ’„Zó2>CJôßH?sx.Ö$]G‘6¥R ·%h‚#ItX³7á¥+Wj«¤&ÐUR%xÂ2•…qý4]½Bô¦¢g ã=§ô%RP…®Ã’ŒvY%‰d 03n‘ô'®ÅŠóS”›„<}èvtŠ™ô”êF&iù÷¶Y!3 ¹\`*ƒ6—8å=xÀNô³Dk°„M>4e‹Ç"Ixiõ3t)ó¨u¿Äeù´OWÓEÀ#>(ANOå5•#D†Ù›@=Áÿ)DÝ©k`÷Çj}XVs™Ÿ%.C<'³g1øI>×NgÐ1&D%dH)k²S³Ù: YJ8`—ø€i‹—.8)„°‚.Y s&”6iæ%A0Ià’Ú4 ã}ÌõI‡šŸÐ¦šÛ£*&à@è[Bp `3¤W7´&[h0–ó“LÀ¹S2y圆5sc,‚9n] :`MùB!p@@R ‚àb# &Ð@9 jLDæ7ˆ‰%îé“ð9.‚(3ú5U°,øBT³c8ªÃ£OÔX‡Ž+¹]ƒg'7£ )Šo9x(%ÇÈrLÿ_99YõÕ0ΘiiƒÉg Ö$x` ’ø¢ ‰vÌ×:\à”b23(<¶Èiº%\v×$AÐzªm–MŒPÒ–ãÈ&iJ©tÃEñÒ5Iæ2A°¼™KÙD«¯3@s°y•¹Ö6©úp83wœ‰‘-ƒ.%°%%¡¥'¦Ó³‚L@•ðR!j9 –71 UJ¹ˆJjËc ö÷GÞÊŠ¤'jup“ppmÉb¯ÉYM8,Ú×EÐI»¥4EwG%0zð¤¹âª`eÊ,:W4]ZñlB³-²ƒµò7pxøB÷j'ÐÏþ㪫äF‹rC­Tÿuéê{3&ÃX“…c§UXu g°•Я‹*Ù (\iÕ±5¥™ÕG4H)Œ‚C±"Iº&<°ETe[¶b •ðLX'4$¬ˆN¤=ëuxR•¸.dg0%YŠB†€¸_y”•ƇWiŠP±$7µ r¢µ’ÓW™›½¤W@•S|›uè'¬oZ 4k·wk-à²g¶p4Öo4 {k„û&ò¸^Ã%Кc‹M@";YÑÈYé“>û˜S3y–|s@°FWP[wR©0€º³ ƒoœ³ˆ‹dÒ4:†+aí-pÒBr^ ÿr ›9BûrgÕ˜E¼P)ŽÙEèó'@uRò15£B4М6†WÝÄ}x•$æ¿ÀÀ¤&PšÁß[ 8 (Á\Á|ÁœÁ~€Á¬ÁüÁ¬Á"|Á#@Ð $€8‘ ö« ¿ZxÿÃñ9ÃlJÃrÃ6\©2\Ã(ü Nñ½£²ÃA<Ä.Œ¤9SÄ5¾JLÄGÜÄFüÄ3ì Ø—]PT™Ä9ŒÃ<|ÃB¬ÃYÜÅZÌÅEÂ= þh„°Å/ ÅKŒÄmìÄXìÆLÌÆsŒÅ†Ð=À'áP>C,Æ[ìŃÆ„,Ȉ|È-§ìpzÌGÀ‹LÇr|ÉpüÆ–œÉu¬ÉvlŒ 1pœȆ¼Ê`ÜÊ_üÊ…|ÅŒ|XÐÑ*ÀWìÀ×˼ü˾ÌÀ<ÌÂ\ÌÄ ÌÓ p ñÐ`¿x2ÍÔ\ÍÖ|ÍØœÍÚ¬ÍÆÑ ¶ŒypP epÎèœÎê¼ÎìÜÎîüÎðÏò<ÏëLGÉ;rmagick-2.13.2/doc/ex/images/Rocks_On_Beach.miff0000644000004100000410000026252012147515547021356 0ustar www-datawww-dataid=ImageMagick version=1.0 class=DirectClass colors=0 matte=False columns=213 rows=141 depth=8 type=TrueColor colorspace=RGB compression=None quality=100 units=PixelsPerInch resolution=72x72 page=213x141+0+0 orientation=TopLeft create-date={2008-08-30T18:50:13-04:00} dc:format={image/jpeg} exif:ApertureValue={589824/65536} exif:ColorSpace={4294967295} exif:CustomRendered={0} exif:DateTimeDigitized={2007-06-05T14:42:38+02:00} exif:DateTimeOriginal={2007-06-05T14:42:38+02:00} exif:ExifVersion={0221} exif:ExposureBiasValue={0/1} exif:ExposureMode={1} exif:ExposureProgram={1} exif:ExposureTime={1/125} exif:Fired={False} exif:FlashpixVersion={0100} exif:FNumber={22/1} exif:FocalLength={235/1} exif:FocalPlaneResolutionUnit={2} exif:FocalPlaneXResolution={5008000/1420} exif:FocalPlaneYResolution={3334000/945} exif:Function={False} exif:MeteringMode={5} exif:Mode={2} exif:NativeDigest={36864,40960,40961,37121,37122,40962,40963,37510,40964,36867,36868,33434,33437,34850,34852,34855,34856,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37396,41483,41484,41486,41487,41488,41492,41493,41495,41728,41729,41730,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,42016,0,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,22,23,24,25,26,27,28,30;7AD598D41637E206DB912772CCF59D25} exif:Return={0} modify-date={2008-08-30T18:50:13-04:00} :=|>|?~A€B‚CƒD†F†G‰H‹JKŽLŽMN‘N’P“Q“R”R–S˜U˜UšWœWœW›XœYZž[Ÿ\ [¡\¡\¢]£^¤^¤_¥_§`¦a§a¨b§b¦c§c§c§d¨d¨e©d«f«fªf«f«g«f«h«h¬i¬i­i­j®j­k¯k¯k®k®l®l®m¯m¯n¯n°n¯n¯n¯n°n²o±o±o²o²p²p²p²p²p²p³p²p³p²qµq´q´q³q³q´q¶pµp´p²p³p³p²p³p´p²p²p³p²p²p²p²o±o²o±o±o±n°n±m±l°l°l±l°l¯l¯l°k¯k®j°j°j¯k¯k¯i®i®h®i­i¬h¬h­h¬h¬g«h«h«gªg«f«f¬h¬h«f«fªfªf©eªd©d¨d§d§d§c§c§c¦a¥b¦d¦ g¦&p¨U†°‰¤½²¾ËÅËÔÍÐ×ÒÓÙÕÖÛØÙÝØØÛÒÒ×ÁÅΧ±ÁŒŸ·t‘®Y¥8n^—W•V“V‘ U U U SŽSŒR‹Q‡ Q…R…S…S…QƒM€ J I{ Iz Ix IxKy)Oz6U{=}>~?€AB„C„E‡F‰G‰IŒJKLNNO‘P“Q”R•S–T™T™U›W›WœWšYœYž[ž[ž[ \¡\¢]¢^£^¤^¤_¥_§`¦`¦`§b¦a¦b§c§c¨d¨d¨e©d«eªfªf¬f¬g«g«g«h¬i¬i¬i­j­j­k®k®k®k®l¯l¯n¯n¯n¯n°n°n°n°o²o²o²o²o²o²p²p²p²p²p²p²p²p³p´qµq³q´qµq¶qµqµqµqµqµqµqµq´qµq´q³q³qµq²p²p³p²p²o²o²o²o²o±o±n±m°m°l°m°l°l°l°l¯l¯k°k°j¯k¯k¯k¯j®i®i­i­i­i¬i¬h¬h«h¬h«g«g«h« l­q®p®m­m¬ m¬m¬n­n­ j«hªe¨d¨c§c¨b¦b¦b¦e¦k§6wª`³Ž¨À³¿ÍÈÍÕÐÓÙÓÕÛ××ÜÙÚÝÚÛÜÓÔÙÃÇϪ´Ã ·r®`…§My¢1kœ^—Z”[‘[YWŽ SŽRŒPˆP†P„ P„R…QƒQQ€P€P~O|L{LzMy(Qz3U{>~?@A‚B„D„E†FˆHŠJ‹JKŽMNN‘O’Q“Q“R”S—T™T›VšWšWšWšYœZ[Ÿ\Ÿ[¡\¡]¢]¢^£_£^¤_¥_¥`¥a¦a§b¦b§c§c§d¨d¨d¨e«eªf©e«f«gªh«h¬g«h¬i¬h¬i­j­j­k¯j®k®l¯l¯n¯n¯n¯n¯o¯o±o²o²o²o±p±p²p²p²p²p±p²q³q´q´q´qµq´qµq´q³q´q´q´q´qµq´qµqµqµqµqµq´q´q´qµq´q³qµqµq²p±p²p²p²p²o²o±o²n±n±n°m°m°m°l°l¯l¯l¯k¯k¯k¯k¯l°k®i­i­i­i­i­h­h¬h¬h¬h¬h­i­r®4~²9²9³<€´>‚³H…µR‰¸Qˆ·Dƒ´5|±(v®n« h©f¨d§e§j§+s«I€°f¶‚¡½ ³Å»ÄÏÌÐ×Ö×ÜÚÚÝÛÜÞÝÞÞÝÝÞÕÖÚÆÈЯ·Å—¦»™´z•±w“±jŠ®T}§>rŸ3k™0h˜(b“Z URPŠO‡P…P„Nƒ OSƒ(X„/Z„.Y‚(V€"Q~N|N{)P{1Sz>~?~A€BƒCƒE„E†GˆH‹J‹KŽKMNN‘P’P“R”R•S—T™U™WšWšWšX›Y[ž[Ÿ\ \¢\¡]¢]£_£_£^¤_¥`¥`¥`¥b§b§c§c§c§c§d¨d©eªfªe«f«gªg«h«h¬h¬i¬h¬i­i­i­j­k®k®l®l®m®n¯n¯n¯o±o±o±o²o²o±o±p°p²p²p²p²p²q³q´q´q´q³qµqµq¶r¶rµqµrµr³q³r³q´rµr¶r¶rµr¶rµqµq´q´qµqµqµq´q´q´p´p³q³q²p²p±o±o²o±o±o±o±o°n°n°m¯l°m¯l®l¯l¯l¯k®j­j­j­j­j­j­i¬j¬ k­ k­j¬ m­4{²QŠ·Z¹d•¼qœ¿y Á¤Ã†¦Ä€£Ây ¿tœ¾m–½^޹Hƒ³3y®%s«4y®Uˆµyœ¾”¬Æ§¸Ë³ÀͽÆÐÉÎÖÕ×ÛÝÞàààààààßàßÞÞÞØØÚÊËÑ·½Ç¤¯¿˜§»™©½¢±Â¦´Æš­Á…·p®a…¨NwŸ/d”XSŽQ‹Q‰P‡P…O„ OƒT„*Z†5_‡7^…4[ƒ,V€%R}$P},Q|2T{>@}B€CƒDƒF„E†H‰J‹J‹JŽLMMO’P“Q“R”S–T—U™V™WšWšXšYœZž[ž\ž\ \¡\¡]¢^£_£_¤^¤`¥a¥`¥a¦a¦c§c¨c§d¨d¨d¨eªfªf©f¬gªgªg¬g«i¬h¬h¬i¬i­i­j­j­l®l®l®m®n¯n¯n¯o°o±o±p°p°p°p°q±p²p±q³q²q²q³q³q³q³q´rµr¶r¶r¶rµrµr¶r¶r¶r¶r¶r·rµr¶r¶r¶rµs¶rµq´rµqµrµrµr¶rµqµqµqµq³q³p³p²q²p²p²o²o±p²o±o°n±n¯n°m°m°l°l°l°l¯k®k¯l®k®k®j®l®o®$v±4|³3|³9~³VŒ¸tœ¿…§Ä“°ÈŸ¶Ì£¹Î¤ºÏ ·Ì–±É”¯Ç›³ÈŸµÊ™°É„¤Ãm–»f’¸}Ÿ¿Ÿ¶Ë¾ÉÖÏÔÜÔ×ÝÓ×ÜÖ×ÜÛÛÞàááæåäçæääãäààßÝÝÝØØÚÎÎÓ¿Ã˰·Ã§°À¨´Â·ÁËÆÍÔËÐÕ¿ÆÐ«·Ç˜ª½|”°OxŸ#^“ URQŒQ‰Qˆ Q‡ Q„Q„U„+Z†5^†8_…4[ƒ/V-T~0T}3V|?ABCƒE„F„G†IŠJ‹JŒKŽMNN‘P“Q“R”R•T—T˜U˜V™WšWšX›YZŸ[ž\ž\ \¡]¢]¢_£_£_¤_¤`¥`¦a¦a¦b¦c¦c§d§d¨e¨e©e«fªfªg«g«g«g«g«i«h¬i¬j¬j­j­k­l­l®m®m®n¯n¯n¯n°p°p°p°p±p±p°p±p±q²q²q³q³q²q³q³q´rµrµr¶r¶r¶r¶sµr¶r·rµrµrµrµrµr´rµs·s¶s·s¶rµr¶s¶r¶r¶r¶r¶rµr¶rµr¶qµr´q´q´q´q³q³q³p²p²p±p±o±o°o±n±o°m°m°m¯m¯m¯m¯l®m®n¯p¯ r¯$z±MЏn›ÀxŸÂvŸÁ…¦ÅµÌ­¿ÐºÈÕ¾ÊØ»ÈÖ¸ÆÕ³ÃÓ¯ÀÒ¯ÀзÅÓ¾ÉÕ¼ÈÔ­¾Ï¡µÊ£¸ÌºÈÕÕÙßããåæææããäãâäåääéèåíëèðìéíëèèçäáááÜÜÜ××ÙÐÐÔÆÈλ¿È³¸Ã¯·Âµ¿ÈÂÉÐÐÒØÔÕÛËÎÕ»ÂÌŸ­½sŽ«?mšYRQŽQ‹Q‰ Rˆ Q… Q…S…!X†.]‡6`†:_†<^…;\‚9[€;\€@€A€BƒCƒE…F…H†IŠJ‹JŒLŽNNO’P’Q“R”R–S—U˜V™WšWšWšYœZZž[ž\Ÿ\¡\¡]¢]£_£_£_¤_¥`¥`¥a¦a¦b¦b¦c§d¨d¨e¨e©e©eªfªg«g«h«g«h¬i¬i¬j¬j¬j¬k­l­l­m®m®n®n®n¯n¯o°p°o°p±p±p±q±q²q±q²p³q³q³q³q³q´r¶r¶rµr¶rµrµs´sµrµrµrµsµs¶sµsµs¶s·s¶s·s·s·s¶s·s¶s¶s·s¶s¶sµs¶r¶r¶r·r¶q³q´q²q´r´r´q³q³q³q²p²p²p±o±o±n°o°n¯n¯n¯n¯n¯p° s±w±&|³F‰¸rŸÂ›¶Î©½Ñ¥¼Ïª¾Ñ¸ÇÕÄÏÙÉÒÜÊÓÝÉÑÛÈÒÛËÓÝÍÔÝÎÔÜÑÖÞÓÙßÒ×ÞËÒÛÈÐÙÐ×ÞàâåêéêììêìëéêéçëéçðìéôñìöòìöñìòïéëéåäâáÜÜÜÕÕ×ÏÐÒÉÊÏÃÃÊ»½Å²¸Á¯·À³»Å¾ÃÌËÍÔÎÏÕÂÈϱºÆ¡·]€¤)d•TRRQŠQ‰ Tˆ$\Š3bŽ6bŒ7b‹=e‹HiŒRmRlŒPiŠPh‰@€AC‚D„E…G…H‡IŠJ‹KLŽNM‘O’Q’Q”S”S–T˜U™V™WšWšW™YœZžZ[ž\ \ ]¡^¢_£^¤^¤`¥a¥a¦a¦a¦b¦b¦c¦d§d§d¨e©f©f©fªg«g«g«h«h«h¬i¬j¬j­j¬k­k®l¬m®m®m®n®n¯o¯p¯p°p°p°q±q²q³q²p²q±q³q³q³q³r´r´rµrµr¶rµr´s´s¶s·s¸s¶s·s·s¶t¶s¶t¶s¶s¶s¶s¶t¶t¶t¶s·s·t·t·s¶s¶t·s·s·s·sµrµrµq³r´r¶r´r³q³q³q³q³q²p²q²p±p°p°o°o°o¯p°r° t±y²5ƒ¶I‹ºZ“¼t¡Ã—µÏ¶ÈؼÌÙºÉ×¿ÌØÈÒÛÍÖÞÐ×ßÓÙßÕÚߨÜáÜßåàâæâãæããæãåæäåæääåääæçççíìêòïìñîëïîêñîêôñìøôîùõîúöîùôíõñëïëçæäáÝÜÜÔÔÕÎÎÑÈÉÎÃÃɺ½Äµ¸À®³¾ª²¼®µÀ·½Ç¾ÂÌ»Áʲ¹Åžª»x‘¬Mvž/f–#_“[‘ZYŽ/bSt˜jžje}še}™k€˜r‚˜q€–m}“l{“@€BCƒD„F…G†HˆJŠKŒLŒMŽNO‘P’Q“Q“S•T—U˜U˜W™WšWšXšYœZž[[ž] ]¡^¡_£_£^¤_¤`¥a¥a¦a¦b§b§c§c§d§d¨e©e©fªeªg«gªg«h«h«h¬i¬i¬j¬j­k­k­l­l­m¯n®n®o¯p®p°p°p°q±r±q±q²q²q²r±r²q´r´r´r´r´r´r´s¶s·r·s´s¶s·sµt¶t¶t¶t·sµtµtµt¶tµt·t·t·t¶tµtµt¶t¶t·t·t·t·t¶tµs·s·sµsµrµrµrµrµrµrµrµr´r´q³q³q³q²q²q²p±p°p°q±w±/€µ@†·T»pžÂ†«È—´Í¨¿Ò»ËÙÉÓßÇÒÜÄÏÙÈÒÛÐ×ÝÖÚàÙÝâÝßäáâæåæèèèéêéêëëëìëëîìëïíëîíêîìêîíëóðíõòíõòíõòíöôîúöïü÷ðüùñüøñúõîöðêðëæçäáÝÜÛÓÔÕËËÐÆÆËÀÀȸ¼Ã³¶¾¬±»§­¹¥­¸§®ºª±¼ª²½¤®»š¦¶Š›¯w§j†£d¢]} Z{Ÿ]{ j„¡„”¨š¡°¢±–Ÿ­•œ¬”›©‘˜¦Œ”¢‡Ÿƒ‹œAB‚DƒE…F…H†IˆJŠLLMNO‘P’Q“R•T˜T˜U˜W™W›W›XšZœZ[[ž\ ] ]¢^¢_£_£_¤`¤a¥a¦b§b§c¦c§c§c§d¨d¨e©e©fªfªg«gªg«g«h«i¬j¬i¬j¬k­l­l­l­m®n®o¯p¯p¯o°p°q±q±q²q²q³q²q±r²s³r´r´r´r´r´s´s´s·s·sµs¶sµtµt¶t¶t·t¸u¶t·t·t·t¶t¶u¸t·u¸t·u·u¶t·t·u·t¸t¸t¸t·t¶t·t¶tµtµt¶t¶tµr´r´r´s´sµs´sµr´r´r´q´q³r³q³r±s²z´B‡·d—¼y¢ÁŠ¬Ç¢ºÍ¸ÇÕÅÑÛÎ×ßÕÛã×ÜäÑ×ÞÉÑÙÍÓÚÕØÞÝÞââãæææèëêêïîìñðíñðíñðîòðíôñíóñíóðíòðìóðëöòîøôïøôïùôïûöðüùñýúóýúòüøðúõíöðéíêäæãàÜÛÛÓÓÔËÌÐÅÅËÀ¿È¹ºÂ°³½¨­¸£«´¡¨²ž¦³¦²š¥°–¢°’Ÿ¯­œ¬“Ÿ®—¢²—¡²—¢³œ¥´¤«¸­±¹³´»²³º°²¹®°¸«¬´¥§° £­š©”˜¤B‚C‚E„F†G…H‡IˆK‹LMNOP’Q“S•S—T—U˜V™V›X›XšX›YœZœ[ž\ \¡]¡]¢_£_£_£_¤a¥a¦a¦b¦c¦c¦c§d§d¨e©e©eªfªfªgªg«g«g«h«i«j«j¬j¬j­k­l®m­n®n¯n¯o¯p¯p°p±q±q±r²r³r³r³r´r´r´r´r´r´sµs´rµs´sµt¶tµt·t·t¶t¶t¶u·u·u¶u¶u·u·u·u·u¸u·u·u·u¸u¸u¸u¸u¸v·u¸u·u·u·u¶u¸u·u¶u¶tµt¶tµtµsµtµtµsµs´r´s´r´r´r´r´r´r³t´{µD‰¹l›¿Ž­Æ£ºË³ÄÑÂÏØÏÖÞØÝâÞâåáãçÜßäÓØÝÍÒØÐÔÚÚÛàáâäæççìëëòñî÷öñø÷ò÷õðõòîôñîôñîôñíôñìóñëóðìõòí÷óíùôîúõîü÷ïüùðüùðûøïûöíùóëòíçêçââàÝÚÙÙÒÒÓËÌÏÅÅÌ¿ÀƸºÃ¯³½¦¬· ¨²¥°˜¢­” ¬’Ÿ«ž«ªœ«– ­ ¦²©¬·®°º²´¼ººÀÁÀÄÄÃÆÀ¿Ä¼»Àº¹¿º¹¾¶µ»±±·¬¬´¦¦°¡¡¬C‚D‚F„F…H‡I‡K‰LŒMMŽN‘P’P’Q“R”S–T˜U˜VšW›XšYšY›ZœZœ[ž\Ÿ] ]¡^¢_£_£_¤`¥`¥a¦b¦c¦b¦c§d§d¨d©e©fªfªfªgªg«g«hªh¬i¬j¬j¬j¬k­k­l­n­n®n®o¯o¯p¯p°q±q²q±r±s³r´r´r³r³r³r´r´r´sµsµsµsµsµtµtµt¶u·u·u¶u·u¸u¶u¶u·u¸u·u·u¶u¶u¸u¹u¸u¹u¸v¸v¹u¹u¸u¸u¸v¸v·u·u·u·u·u¶u·u¶u·t¶t¶t¶u¶tµtµtµsµtµsµsµsµsµr´s´xµ:„·d–¼ˆ©Ä§ºÌ¹ÆÓÇÐØÒ×ÝÙÜàÝßãßáäÜßãÖÙÞÑÕÛÑÔÚÖØÝÞÞáääåééèííêóòîø÷òúùóøöñôòíñðìñîëïîêðïêñîëòïêóñëõòìöñìùóìüõíûöîúõíúôëøòëõïèíéååâßÞÜÚÖÖÖÐÐÑÈÊÎÄÅËÀÁƹ¼Ã±µ¾¨®¹¡©²™£®”Ÿ«œ©œªœªœ©‘ª˜¡¬Ÿ¦±¦ªµ¬¯¸²´»ºº¿ÂÀÅÆÅÇÄÄÆÀÀþ¾Á½¼Àº¹¾µ´º±±·««²¥¥®DƒEƒF„G…H†J‡KŒLMŽNO‘P’Q“R”S•S•U—V™WšWšXšY›Z[\ž\Ÿ]Ÿ]¡^¢_£_¤^¤_¥`¦a¦a¦b¦b¦c¦c§d¨e¨e©fªfªfªg«g«g«h«i¬h«i¬j¬k¬k­l­m­n­n­o®p¯p¯p°p±p°q±q±s²r³s´r´r´r´sµsµsµs´sµtµsµt¶t¶t¶t¶u¶u·u·v¸u·u·u·v·v·v¸v¹v¸v¸v·v·v¸v¸v·v¸w¸v¹vºvºv¹v¹v¹v¹v¹v¸v¹v¸v¸v¸v¸u·u¶u·u·v·u¶u¶u¶u¶t¶u¶u¶tµsµsµsµuµ{¶G‰¸oœ¾­Æ¬¾ÎÁËÕÌÓÚÕÙÞÛÝáÜßâÛÝàÖÙÝÒÕÛÓÕÛØÙÞÛÝàààáåååééèíìéðïëóóíõõðõóîñðìíëéêéçééæêéæìêéðíéòïêóñëõñê÷ðë÷ñë÷ñë÷ñêöðèòîçïêåèåàáÞÜÚÙØÔÓÓÍÍÐÇÈÍÂÄɾÀǹ½Ã³¶¿¬°º£©´›£­“ªš¨Œ™¨‹™§Œ™¨Ž›¨”Ÿ©œ¤®¤¨³¬¯·µ¶¼»¼ÁÀ¿ÄÃÃÅÄÄÆÃÂÅÁÁý½Àºº¾¸·¼´´¹¬¬³¥¥®D„F„G…H†I†K‰LMŽNO‘O‘P’Q“S”T–T—U™W™W™X›Y›ZœZž\Ÿ\Ÿ] ]¡]£_£_£`£`¤`¥a¦a¦b¦b¦c¦c§d¨d©e©f©fªg«g«g«i«i«h¬i¬j¬j«j¬k­l­m®n­o®o®o¯p¯p°p°q±q²r±s³r³r³sµs´sµsµsµtµtµtµt¶u¶u¶u¶u¶u¶u·u·v·v¸v¹v¹v·v¸v¸v¹v¸v¹w¹w¸w¸v¸v¹w¹w¹v¹vºwºv»wºvºvºvºv¹v¹v¹v¹v¹v¸v¸v¸v¸v¸v¸v¸v¸v¶v·v·v·u·u·u¶u¶t¶tµt¶u¶{¶<‡¹d˜½ˆªÅ¨¼Í¿ÊÔÊÒÙÔØÝÚÜàÚÞáØÛßÖ×ÝÔ×ÜØÛßÞÞáààââãäåååèçæêéçëêèííéîîéîíéëêççæääåäâãâãäãççåëêçîíèñîéòïéòîéñîèòíèñíçïìæìéãèåááàÝÛÚØÕÕÕÐÏÑÊÊÎÄÅÊ¿Áǹ½Ä¶ºÁ±µ¾«¯¹¤©³›£®“ªš§Š—§ˆ—¦Š˜¦›¨–Ÿªœ¤®¤©³®±¸ººÀÁÀÅÃÃÇÄÄÆÅÄÇÄÄÆÂÂÿ¿À»»½¹¸¼µ´¹¬¬²¤¥­E„F„H†I†J‡K‹LNOO‘P’Q“R”T•T—T˜W™WšWšX›Y›Zœ[[Ÿ\¡]¢^£^£`£_£_¤`¥a¥a¦b¦b¦b¦c§e§e¨e©eªfªg«h¬h«h«h¬i¬i¬j¬j¬k¬k¬l¬m­n®n®o®p¯p¯p¯q°q±r±r²s²r³s´s´sµt¶tµtµsµtµu¶t¶uµu¶v·u¶v·v·w·v¸v¸v¹wºw¸v¹w¹w¹wºwºx»xºwºwºx»wºwºwºw»wºxºwºwºxºwºwºwºx»wºwºwºwºwºwºvºv¹w¹v¹v¹v¸v¸w·w·w·v·v¶v·v¶v¶u·vµw¶#·NŽ»w¡Á¶Ë¸ÆÓÇÑÙÒØÝÙÜàÚÞáÚÝáØÛàÙÜßÜÞâààãââããäääåäææççææææåççåèèåççäääãããäáââàááàááââáæåãéèäìêåìêåìéäëèãìèãêæâèæáåãßàßÝÜÜÙÖ×ÖÑÒÒÍÍÏÇÈÌÀÂȹ¼Äµ¸Á±µ½«±»¦­·¡¨²›£®•Ÿªœ¨Œ™¨Œ™§œ¨˜¡¬¡§±¨¬µª®·°²º¹º¿ÁÀÄÄÃÆÅÃÆÅÄÆÄÄÅÂÂÿ¾À»»½··»²²·«¬²¥¦®EƒG„H†I†K‰L‹MŽNOO‘Q’R”S•T–U—V™WšXšXšX›Zœ[œ\ž\Ÿ] ]¡_£_£_£_¤a¤a¦b¦b¦b¦b§c§c¨e¨e©f©fªhªi«i«i¬j¬j«k¬k«k«l¬k«l¬m¬n®o®o¯p¯p¯p°q±q²r²r±s²s´s³t´t´t´tµtµuµt¶u¶u¶v¶v·u·v·w¸w¸x¹x¸x·x¹x¹xºx¹xºx»x»xºx»y»yºy»x»w»wºx»xºx¼w¼x¼x½x½x¼x»y»x»x»x»wºx»x»x»w»wºw»wºw¹x¹w¹wºw¹x¸x¸w¸w¸v·v·v·v·v¶v¶z·7†ºb˜¾‹­Ç¬ÀÏÃÏØÐØÝØÝàÛÞãÛÞáÚÞáÜÞâÜßâÝßâàáâáâãââãáâäáâäáâãáâãâãäãäããäãâãäááãßàâÞÞßÝÞÞßßÞáàÞãâáåãàäâàäáÞâàÝãßÝáÞÝÞÞÛÛÛÙר×ÓÓÔÎÎÐÉÊÎÃÅʼ¿Æµ¹Á°´¾¬²¼©¯º¤«¶¡©³Ÿ§±¤¯š£®š¢­š¡­£¯¦«´¯³º´¶½³¶½´µ¼¸¹½¼¼¿½½Á¼¼À¾½À¿¾Á¼½¿¹¸»³²¸¯¯µ¬¬²©ª±¦§®F„G…H‡J‡L‹LŒNN‘O‘P’Q“R”S•T—V˜WšXšYšY›YœZ\œ\Ÿ] ]Ÿ] _£`¤_¤a¥a¥a¥b¥b¦b¦d§d¨f¨f©f©fªeªdªc«dªd«e«f«f©gªh¬i¬k¬l¬o­q®q®p¯q°q°r°r±s²s²s²s³s´t´t´t¶uµu¶u¶u¶u¶v·v·w·w¸w¹w¹w¹x¹yºyºy¹yºy¹y»y¼yºx»y»y¼z¼y¼y¼y»x»y»yºz»y¼y¼y½y¼z¼y½y¼y¼y¼y¼y¼y¼y¼y¼y»y»x»x»x»x¼yºx¹xºyºy¸x¸x¹x¹x¹w¸w¸w¸w¸w·w· z·*‚¹U“½§Å¦¼ÎÀÌØÍÖÞÔÚà×ÜàØÝáØÞáØÝáÙÞáÙÝáÚÝàÛÝàÛÝáÚÝàÛÝàÞßáàáäãäæäååäåäáããÞßâÛÜß×ÚÝרÛ××Ú×ÙÚÚÛÜÜÝÜÜÜÛÜÛÚÚÚÙÙÙØÙÙרØ×ÖÖÖÔÔÖÑÑÓÍÎÐÉÉÍÂÄɼ¾Ä´·À¯´½®²¼«°º¨®¹«°¹®³»®±º«¯¹ª®¸©­·«®¸±³»ºº¿½½Â»»Á¹º¾¹º¾»»½¸¹¼µ¶º¶µº¶¶º´´¸®®´©©±¦§®¥¥­¤¤­¢£¬H†H†I‡K‰LŒMŽOŽPP‘Q’R”S•T–U—W™W™X™YšY›[[\] ]¡^¡^¢`¤`¤`¥a¦a¦b¦c¦c¦d§e¨d¨b¨a©eªiªq«/{­?‚®K†®TŒ¯VŒ­U‰«T‹¬J‡«?„­-|«v¬ r­o®n°o±q±q°r±s²s²s³s³t´t³t´u´uµvµw·v¶w¶v·w¸w·w¸w¸x¹x¹xºxºyºzºz¹zºzºz¼z»zºz¼y¼y¼y¼z½z¼z¼z½z½z¼{»z¼z½z½{¾z½{½z¼z¼{¼z½{½{½z¼z¼z¼z¼z¼z¼z¼z»z¼zºzºz»z»zºy¹y»y»yºx¹x¹x¹x¸x·z¸¹>‰ºb™¿‰¬Çª¾Ð½ËׯÑÛÊÔÜÎ×ÞÒÛàÔÜàÖÝá×ÝáÕÛßÕÙÞÕÙÞÕÙÝÔÙÞ×ÛßßáäçèèëëêçéèàâãÛÜßÕ×ÜÑÕÙÏÓ×ÎÑÖÎÐÔÎÑÕÑÒÖÔÔÖÓÔÖÒÓÖÑÒÔÐÑÔÑÑÓÑÒÔÑÒÕÑÑÔÏÑÒÎÎÐÊËÎÄÅʾ¿Å·ºÂ²·¿³¶¾´·¿·¹Á¾¿ÄÃÂÇ¿¿Åº»Â·¹¿µ·½¶¸½¹º¿½¾Ã¾À½½Á»¼À¼¼¿¼¼¾¸·»²²¸°°¶°°µ¬­³¨©¯¥¥®££¬¡¢ªžŸ¨œž¨G‡I‡JŠLŒMNOP‘R“R“S•T–U—V—WšX›Y›Zœ[œ[\ž]Ÿ^¡^¡_£`¤a¤a¥a¥b¦c§c¦e§f¨b§`§gª.y¬X°w›°“¨³ªµº¯¶¸ª±°±µ´³¶·±µ´­±²®²²¯³´¨¯°¡«®’ §Šžªo“§O‡¦"z«q±p³s³s²s³t´t³u´uµvµuµv¶w¶w¶w·w¸x¹x¸x¸x¹yºzºzºyºyºzº{º{º{»{»{¼|»{»{¼{¼{¼{¼{¼{¼|¼|¼|¼|»|¼{¼|½|¼|¼|½|½{¼{¼|¼|¼|½|¼{½{½|½{¼{¼{½{½{»{º|º{»|»{¼z»{»y»z»z¼z¹yºyºy¸z¹~¹9ˆ»\–¾y¤Ä–²É¬¿ÏµÆÔ¸ÈÕ¼ËØÃÑÛË×ßÓÜâØàãÚßãÕÜßÒÙÝÒÙÝÓÚÞ×ÛßÜßãäçèíïíññïçèéØÜßÏÔÙËÐÕÊÏÕÉÎÓÈÌÑÆÊÐÅÉÐÆÊÏÈËÑÈÊÐÈÊÏÇÉÎÆÈÎÉÊÐËÍÑÌÍÑËËÐËÌÐÌÌÐÉÉÎÆÆËÁÃȼ¿Æº½Ã½¾ÄÁÁÆÆÆÊÌËÌÍËÎÇÆÊÀÁƾ¾Ã¼¼Á½½Á¿¿ÁÀÁÃÀÀ¾¾Á¼½¿¼¼¾»»½µ¶¹±°¶¯¯´®®³­¬²©©°§§®¤¥«Ÿ¡©›ž¨˜š¦IˆJ‰K‹MŽNOP‘Q’R“S”T–T—U™WšXšY›ZœZœ[\]Ÿ^ ^¢_£`¤a¥a¥a¦b¦b¦c§d§a¦^¥q«a•¸™°½²º»´¸¶¨®®¦®®©²³¦®²¢­±®¸¼¯¹½¢®±¡­±• ¤©­ž©­–¡¤œŸš’šž™Ÿ¢‹—œh‹Ÿ1|¥s²t·t³u³u´u´vµv¶v¶v·x¸x¸x¸y¸x¸yºyºz¹yºz»zº{»{»{»|»|º|º|»}º}»}»}º|¼}¼}»}¼}¼}¼|»}¼~¼|»}»}»}¼}¼}¼~½}¼}¼}¼}¼~¼}¼|¼|¼|½}¼}¼|¼|¼|¼|»}º|»}¼}»|»|¼{»{»z»{º{ºz¹z¹ |¹!‚ºH޽gœÁ}¦ÄŽ¯É¸Í¢»Ï¢¼Ð§À񵃯ÅÓÞÓÜäÝãçàåèÝáåÙßãØÞâÛàäÞãæãçèéììðñððñïâæçÑÖÛÆÎÔÃËÒÄÊÑÂÉÏÁÇοÆÎ¿ÅË¿ÄʾÃʾÂɽÁÈ¿ÂÉ¿ÃÉÀÄËÄÇÍÅÇÍÃÅËÃÅËÅÆÊÃÄÉÂÃÊÂÃÊÂÃÊÂÄÉÅÆÊÈÈÌËËÍÌÌÏÉÊËÄÄÇ¿ÀĽ¾Â½½Â¾¾ÂÀÁÃÁÂÄÂÂÂÁÁ¿¿Â¾¾À¼¼¾¸¹¼¶µ¹´³¸³²·±°µ¬¬±ª©¯¥¦­¡¢©›ž§˜š¦JˆL‰LŒNOO‘Q’R“S”T–T–V—W™X›YšZ›Z[ž\ž] ^ ^¡`£`£a¥b¦b¦c¦c¥c§d§_§p­z¦Â·ÂÇÀÁ¿´¸¹¦¯±¥¯²¡¬¯¡«¯§±´¤­¯­´·±¸»£¬®¨ª¦«›¤¨¤¬® ©¬š‰”™ƒ•z‰Ž{Š‘zˆ‡‹zƒ‡Rs…p u·t³uµvµw¶w¶w·x¸x¸y¹y¹y¸zºz»z»zº{»{»|»|»|º|»}»}»}º}º~»~»~º~º~¼~¼~»~»~»~»}»~»~¼~»~»~¼~»~¼½½~½~»~¼~¼¼~»~¼}¼~¾~½}¼~»~¼~»~¼~º}º}º}º}»|¼}»}»|»{»|º|º |»~º$ƒ»D½Y–ÀeœÁq¢Ä~©Æ…¬ÉŠ¯Ë–¸Ï«ÃÖ¿ÐÜÏÛäßåêçêìéìïéìïéìíëííìîííîíðñïôôñòóðåèçÔØÝÇÍÔÀÉоÆÎ¼ÄÌ»ÂË»ÁÉ»ÁɹÀÇ·¿Æ·½Å·½Å·½Å¸¾Ä¼ÁǾÂɾÁȽ¿Æ½¾Æ¾¿Å¾¿Å¾¿ÅÀÁÆÃÄÊÅÅËÅÆËÆÆÊÄÅÈÃÂÇÁÁÆ¿ÀĽ¾Â¼½Á¼¼Á¾¾Á¿ÁÁÀÂÂÃÃÂÃÃÂÂÃÃÂÂÃÁÁÁ¾¿¾¼»¼º¸º¶¶¸±±µ®­³©©®¤¤«Ÿ ©šœ¥–™£KŠLŠMŽOOP’Q”S•S–T–U—W˜X™XšYœZœ[\] ]¡_¡`£a¤a¤b¥b¥c¦c¥d¦e§`§>‚±°¾ÃÎÍɵºº¯·º¬¶·š¤§¢«­¬´µ§¯±£¬¯›¥§–Ÿ¢œ¤§š£¤•Ÿ¡•Ÿ¡‘›œŽ˜›Ž™œ‡“–…”~ŠŽt‚‡u„‰uƒˆ`ov^ow\jpQ^d'jŽx¹v¶w¸w·x¸x·y¸y¸yºz¹z¹z»{»{º{¼|¼|º|º|º}» ~» ~¼~»~»~» ~½~¼}» ~¼~¼~»¼ ~½½ ~½ ~¼ ~¼ ¼ ½~½ ½ ½ ½ €½ ½¼ ¼ ~½ ~½ ½ ~½¼¼½~¼¼~¼ ~¼ ~¼~»~¼~»~»}¼~º~»~»}»}º}»}»}» ~ºº,†¼D¾O“¿R“¿V–À_šÂiŸÄv¦Æˆ°ËŸ½Ó¸ÌÚÌÙãßçëíðñõöõøø÷øøöøøô÷÷ô÷÷ô÷÷ôùúõøùôîïíÝáãÎÓØÂÊÒ»Ä͸ÂʹÁɺÀȸ¾Ç¶½Å´¼Ã³ºÂ³ºÂ±ºÁ³»Ã·½Ä»¾Åº½Åº½Äº¼Ã¹¼Ãº»Â¼½Ã½¿Ä¿ÀÅÀÀÆ¿ÀŽ¾Ã»¼Áº»Àº¼À¼½Á¼¼À¼½Á½½Á¾¿ÁÀÀÂÀÀÃÁÁÂÃÃÃÃÃÃÃÃÂÁÁÁ¿¾¿½»¼¹¸¹³³¶¯®³ªª¯¥¦« ¢§š¥–™¢’• LŒMOOP‘R“R”T•T–U—W™X™Y™Y›[œ[œ]^Ÿ^¡^¢`¤a¥a¥c¤b¤c¤d¥e¦e§a§K‰³ÇÊÉÀÁ¿±·¹·½½ÁÅį´³ž¥¦¥­­ž¥§œ¥¥˜¡¢™››ž•Ÿ¢‘šœˆ’”Ž˜š‚Œ€‹ŽƒŽ’{‡‹yƒ‡z„‰ky~kw{frwZjrOaiI[dDU^LVY#iy¼w·x¸y¹z¹y¸z¹{º{º{»{¼|»{º}»}»}»}» ~¼ ~» ¼ ~¼ ¼ ½ ~¼¼ ¼ ½ ¼ ¼ ½ €¾ €¾ €½€¾¾€½€¾ ¾ €¾€¾¾€¾¿€¿€¿¾ €¾ €¾ €¾ €¾ ¾ €½ ¾ €½ ½ ½ €½ ½ €½ ¼ ~¼ ~¼~¼~¼~»~¼~»~»~»~» ~¼~»"ƒ»D޾Y˜Á]šÂ[˜ÁW–ÁV—ÁZ˜ÂdžÄv§È‘µÎ¯ÇØÊØâáèìïòò÷øöúúøúûøúû÷ûüøûûøûü÷üýøüýøööòèéè×ÛÞÆÌÓºÄ̹Á˹ÂʹÁÉ·¿Ç´½Ä²»Â±ºÂ±ºÂ±ºÀ²ºÁµ»Â¸¼Ä¸¼Ã·»Â·»Á·ºÁ¸»Á¹ºÂ¹»Â¹»Â¹»Á·¸¿µ¸¾µ¶½´¶¼µ·½·¸½¹º¾»»¿½½Á¾¿À¿¿À¾¿À¾¿À¿¿ÀÀ¿¿À¿¿½¼½ºº»·¶¹³²¶­­²©ª¯¥¦« ¢¨›¥•™¢‘” Ž‘MŽNO‘P’R“S•T•T–U—V˜X™YšZ›[\œ\^Ÿ^¡_¢`£`¥b¥b¤c¤d¥d¥e¦g§a§/z®ÅÉÆÊÍʽ¿ÃÁ¸¼¹¶»¸¦¬««±° ¦¦œ¤¥—ŸŸŒ•–„Ž…‘ˆ‘’z„†x‚…ƒŽ{…ˆ|‡Š‰‹r|u€ƒjvw^lo[ioR`gJZaEU]HW_;MT>MSESXq£{½y¸z¹z¹{º|º|»|»|º}º}»~»~»}¼ ~» » ~½½ ½½€½€¾€½€¾€¾€¾€½€¾€¾¾À€¿¾¾€¾¾¿¿¿¿¿‚¿‚À‚À‚¿‚¿¿€ÀÀ¿À¿ ¾ €¾€¿€¾ €¾€¾ €½ €½ ½ ½ €¼ ~¼ ¼ ~»~¼~» » ~¼»9‹½^›Âs¤Æu¥Åt¤Än¡ÄcœÃ[™Ã_›Ãs¥ÆŽ³Í¬ÄÖÂÓßÑÞæàçìêïððóóôõóøøôûüöüýøüýøüüúüüùúúõððìÞàâÊÏÖ¼ÆÎºÄ̼ÅͽÄÌ»ÂɸÀÇ´½Å³¼Ã´»Ã³ºÂ³»Ã¶»Ä·¼Ã¶ºÂ´¹ÀµºÀ¶¹Àµ¹¿´¸¿µ¸¿´¸À³¸¾³¶½³¶½²µ»²µ¼±µ¼±´»´¶»¸¸½ºº¾»¼¿»»¾ºº½¹º¼¹¹¼¹º¼¸¸»µµ¸³²¶¯¯´¬¬±§¨­¢¤ª¡¨™¦–™¢‘• Œ‘œ‹Ž›O‘NP‘R“S”S•T–V—W˜X™YšZ›[œ\\]Ÿ^Ÿ_¡`¤a¤b¤c£c¤d¥d¥d§f¨f©d©’®¼ÒÐÈÅÈÅÂÅÁº½¹»¿»±µ²¬®«§«¨’šš—–Œ”•ƒ‹Œ{„†|††x‚…t~‚t}€r|€y‚ƒp{~t~gru_kn[hmSagIW\FTZ4EK=LSAPU9IL6HMDLK6_q|¼{¹{º{¹|º}»}» ~»}» ~» }¼ ~» ¼ ~¼ ~½ ½¼½¿½€¾½¾€¿¾¿¿¿‚ÀÀ‚¿‚À‚À‚¿‚¿‚¿ƒ¿‚À‚Àƒ¿ƒ¿ƒÀƒ¿ƒ¿ƒ¿‚À‚À‚À‚À‚¿À‚À‚À‚¿¿À¿¿¿€¾€¾€¾€¿ ½ €½ ½ ½ ~¼ ~»»!„¼J¿p¢Å«È…­É‰¯É„¬Èw¥Æo¢Åw§ÇŠ°Ë»Ð­ÄÕ±ÇØ³ËÚÃÔßÖàåáæëèëíòòðøøôûü÷üýøüýøüýùûûöõõðåæåÓÖÚÇÍÒÄËÒÇÌÓÊÍÓÈÌÑÅÉÏÀÆÌ½ÃÊ»Àǹ¿Æ¼ÀǽÀÇ»¾Æ·»Â¶ºÁµ¹Àµ¸¿´·¾³¸¾´·¾³·¾³¶½²µ¼²µ¼²µ¼±µ»°´»¯²º¯²º³´º¶·»··ºµ¶º´´¹³³¸³³·²³·°±¶®¯´¬­±©©¯¥¦¬ £©œŸ§˜œ¥•˜¢‘• “žŒ›‰Ž™O‘P‘R“S”S•T–U—W˜X˜YšZ›[[œ]Ÿ_Ÿ^¡_¡`£a¥b¤c¤c¥d¥e¦e§e¨g©d©)x¬ÂÅÁÈÊÅÈÉÃÆÈÁº¼¶¹º´¬­ª¦¨¤šžššŸ‹ˆŽ€ˆ‰s||r{~yƒ„hrtirubmnamofrt`ko]hjQ]`FU[ESX5EK>LQ:GL:IN5DG5CD2?A7BCFPQv©}½}¹}»}» ~» ~¼ ~¼ ~¼ ~¼ ½½¼€¼€½½¾¾¾¿¿‚¿‚¾‚¿‚¿‚¿‚¿‚¿ƒ¿‚¿‚¿‚ÀƒÀƒÀ„¿„À„À„À„À„Á„Á„À„À„ÀƒÀƒÀƒÁƒÀƒÁƒ¿ƒ¾‚À‚Á‚À‚¿‚À‚¿‚À‚À¿À‚¿€¿€¾€¾€¾¾€½¼€¼+…½T•Áv¥Ç…­ÊŽ±Ë’³Ì±Ë‚«É}©È‡¯Ê™¸Î¤¾Ò¥ÀÓœºÒ•¸Ð¥ÁÕ¿ÐÜÑÛâÞãçêìíõöñúûöüý÷üýøûýøûü÷øøòîíéàááÕØÜÒÖÙÔÖÚÖ×ÚÖ×ÙÕÖØÑÓÖÌÏÒÉËÏÈÊÏÉËÐÈÊÎÄÆÊÀÂȼ¾Ä¹¼Â¸ºÀµ¹Àµ¹À·¸¿¶¸¿´·¾²¶½²µ¼±´»°³¹°²¹¯²¹¯°¸®±¸°²·±±¶¯°µ®®´­®³­­²¬¬±ª«°¨©®¥¦¬¡¤« ¨™œ¥•˜¢“•¡’žœ›‹™ˆŒ˜P‘Q’R“T”U•U—V—X˜Y™Z›[›\›]^Ÿ_ _¡a£b¥b¤c¤d¥e¥e¦e§f¨f¨h©c©H†«Ä¹ÂÄ¿ÀÁ»ÁÁ¹»»²µ¶®·º³¤¨¢“—’Œ‹{y€€{‚‚owwmwwissWac\fhVaeLY\ZeiGTXCNRHUYBPU?MS>JP5BF>JL7DF2>@9EE7AA?FFDIEpœÁ }º ~» ~¼ ~¼ ½ ½½½€½€½½½½¾¿‚¿‚¿ƒÀƒ¿ƒÀ„¿ƒÀƒÀƒ¿ƒ¾ƒ¿ƒ¿ƒÀ„À…Á„À„À…Á„Á…Á…¿†Á†Á†À…À†À…¿…À„À„À„Á„Á„ÀƒÀ„Á„ÁƒÀƒÁƒÀƒ¿‚ÀƒÀÀ‚¿‚¿‚¿¾¿¾€¾€¾½¾1ˆ¾T–Án¢Å}ªÉˆ¯ËŒ±Ìˆ¯Ë}ªÉp¤Çp¤Ç«Ê‰±Ì‰²Ì­Ë€«Ê‘µÎ«ÃÕÃÐÜÖÝãæèéòòî÷øòúúôûûõûûöûüõúúõôóïìëçâââÝßßÝÞÞÝÝÝÝÝÜÞÞÝÜÜÛØÙØÖ××ÕÖÖÔÕÕÒÒÓÎÎÐÉÉÌÅÅÊÀÂÆ¼¿Äº»Â¸»À¹º¿¸º¾¶¸½³µ¼°²¹¯±¸®°·­¯¶¬®µª¬´¨«²§ª±§©°¦§°¥§®¥§¯¥¥®¤¦¬¢¤« £ªœ ¨˜œ¥“˜¢”žŒœŠŽ™‰™ˆŒ˜‡Š–…Š–ƒˆ”Q“R“T”T–U–V˜X˜Y™Zš[›\œ]]Ÿ^¡_¢a£b¤c¤c¤c¦d¥e§e¨g¨g©h© jªc¨V¯Â¾´µ¸°°±§­®¥œ“¡£›™œ•Ÿ¢›’Ž{‚€„Šˆv~}bjiXac[dfVaaHTVFSUBOR7EKGTX;IK9HK9FI2?A0=?9EHBHG@FCIOKu¥ À~º»~¼ €º½€½€½€½¾¾¾¿¿‚¿‚¿‚Àƒ¿„¿„À„À„Á„Á„À„À„À„À…À…À…Á…À…À…À…À…À†Á‡Á†À†À‡À‡Á†Á†Á†Á†Á…Á…Á…Á…Á …À…Á…Á„À„Á„Àƒ¿ƒ¿ƒÁƒÀƒÀƒ¿‚¿‚¿ƒ¿‚¿‚¿‚¿¿‚¾.‰¿J’Á\šÃj¡Æy¨È~ªÉ~«Êv§È]›ÃG’ÁK”ÁU˜ÂZ›Ã`Äo¢Æ…­Ê›ºÏ±ÆÖÈÔÝÛáäçéëïðíóôï÷÷ñùøóûúôüûôúùòôòìêêæääâààßßßÝßÞÜàßÝßßÛÝÜÛÜÜÙÜÛØÛÛר×ÖÓÒÒÍÎÎÈÉÌÄÄÉÀÁƽ½Â¹»¿·¹¾´·¼²´¹¯±¸«­µ©«²¦©°¦©±¥¨°¢¦­¡£¬ž¢«œŸ¨šœ¨™œ¦˜œ¦™œ¦™¥—œ¤”™¢‘• Œ’œ†˜ƒŠ•‡“†’…‘~†‘~„‘|ƒ{‚ŽR“T•U•U—V˜X™Y™Zš[›\›]œ]Ÿ^ _¢a£b¤b¤c¤d¥d¦e§f§g¨g©h©i© j©e©?ƒ­½¼³©¬£¥¦œœ“–™‘Š™›•’”ƒ‡swruys]c`V]\Xab^ef_hiOY[CNQJK(695BD5>>0==5@?4==1;9/655:7<@<8>9396394@PR}´¾¼¼€¼€½€¾¾¾¾‚¾‚¿ƒÀ„Á„À„¿„¿„¿„À…À…Á„¿…À†À…À†À†À†¿†¿†Á†Á†Á‡À‡Á‡Â‡Á‡Á‡À†Á‡Â‡ÁˆÂ‡Á‡Â‡Á‡Á†Á‡Â†Â†À†Á…†Á†À…Á…À…¿…Á„Á„Á„À„ÀƒÀƒ¾ƒ¿‚¿ƒ¿‚¾¿ƒ¿$‡À6ŒÀBÂS—ÂfŸÅp¤Æw¨Èu§È[šÃ6Œ¿(‡¼,‰½6‹¾F’ÀcÄ|©ÉŒ±Ëš¹Ï¯ÅÕÅÒÛÖÜââäçëëêîîëòñíõôïúøñúùñøôîïíèçæäâáààßÝßÞÜÞÞÛÞÞÙÜÝØÛÛØÜÜÙÞÜØÛÙÖÕÓÒÏÎÎÈÉËÂÃȾ¿Ã»¼Á·¸½²´º®°·ª­¶§ª²¤§°¡¤­ž£«¡«›Ÿ©˜ž§—›¥•™¤’–¡”ŸŒ’‹‘‹‘œŠ‘›Šš‡˜ƒ‹–ˆ”|„wu€Œt€‹s~‹s~Šs}Šs{‰r|‰S•T•V–W—W˜X™[š[›\›]œ^Ÿ_ ` a£b¤b£c£d¥e¦e¦f§g¨h©hªi©j© jªjªoªœž  —Ÿ”“•ŠŒŽ„†ˆ€†ˆ€‚{}xfjfhlgSYV]baFOMJSREML1<<)44/9:3=<6@@7BC5?>/895==0973:8.64/64384-2-593.4177.,WkƒÂ»€¼½¾¾¿ƒÀ„¿)ˆÀ4ŒÁ*‰Â$‡Á(‰Á%‰Â†À…¿…À†À‡À†À†À†À†Â†Á‡À‡À‡Á‡À‡À‡Á‡ÁˆÁ‡ÁˆÁˆÂˆÂˆÁˆÂˆÁˆÂˆÂˆÂˆÃˆÁˆÂ‡ÃˆÂˆÂ‡Á†À‡Á‡Á‡Á‡Á†À†À‡Á†À…À…À„À„À„À„Àƒ¿„¿ƒ¿ƒ¿ƒÀ…¿!‡¿)ˆÀ9ŽÀQ–ÂaÃn£Æp¤Æ[šÄ7Œ¿$†½$‡¾)ˆ½7Œ¾P•ÁfŸÄp¤Æy§È‰°Ë§ÀÒÄÑÛÕÜáßâåäæçéêèîîêóòì÷ôíöóìñîèéèåäãáááÝßßÜÝÞÚÛÜÙÙÙ×Ö×Õ××ÔÙØÕ×ÕÒÒÑÏÌÌÍÆÆÈÀÀĺ¼À¶¶¼±³¹¬¯·¨«´¥§±¡¥­ž¢«›Ÿ©˜œ§–š¥’˜¢–¡Ž” Œ’žŠœ†™ƒ‹–‚Š•€‰”€ˆ“}†’{…yƒvŽs~Šo|‰n{‡nz‡mz‡mx†mv…ku…iu„T–U–W˜X˜X˜Z™[š\š]œ^_ ` a¢a¤c¤c£e¤e¥f§f¨g¨h©iªi© j© j© k© l©j¬@~Ÿš—І‹ƒˆŠ‚†ˆz|unpkjlehibimfbgbKPM(2/0989@?4==097,53-77.768?=7=;8@?5:77;7>B>;?:361&+%360*0+13,.:8u¦ƒÁ€¼½¿‚¾‚¿ƒ¿„¿+‰ÀP—Åd¡É]žÉR™ÇR™ÆG–Å3ŽÃ'ŠÁ%ŠÁ‰À‡Á‡ÀˆÁˆÁˆÂˆÁ‡Á‡À‡Á‰ÂˆÁˆÂˆÂˆÂˆÁˆÂ‰ÂˆÂ‰Â‰ÂˆÂ‰Â‰ÂˆÃ‰ÃˆÂˆÂ‰ÃˆÂˆÂˆÂˆÂˆÁˆÂ‡Á‡Á‡Á‡Á‡Á‡À‡À†À†À†À†Á…Á„À„À„À„À„À„¾„¿…¿#‡¿:ÀK”ÀZšÃ_œÄQ—Á6Œ¿'ˆ½%‡¾$‡½+ˆ½7Œ¾D¾J’¿M”Á^›Ãƒ­Ê­ÃÓÈÓÜÕÛàÛàãàãäççæëëèïîéðîéîìçéçäåäáâáÞÞÞÜÛÜÙØØ×ÔÔÓÐÐÑÐÏÐÑÐÐÏÏÎËËËÆÇÈÁÂÅ»¼Áµ·»¯²¸ª®µ§ª³¤¦° ¤­› ª—ž§”𥓗¢• Ž’žŠœˆ›†™„‹–‰•ˆ“|†’y„x‚ŽutŒr}‰o|‰m{‡ky†kw…kv…ju„itƒhs‚eqeqU—V—X˜Y˜Y™[š[›\œ]œ_ž_ a¡a£b¤d¤e£e¥f¦f§g©h¨h©i© j© jª kª l© l©nªo«_†”‰zsukqunfha]`WJMEILGgh`WZT@D@:?=(.+*2/0756<94:6*0+8<9*0.+0+1522618;47;5BD=CE>+-'#)#+.'('3<:!o—„‚¾‚¿ƒÀ„¿…À‡¿7ŽÁe¢É‹µÒ“ºÕŽ¸ÕŠ¶Ô{¯Ðj¥Ì`¡ÊV›ÈC”Å-ŒÃ‰Â‰Â‰Â‰Â‰Â‰Á‰Á‰Â‰Â‰Â‰Ã‰ÂˆÂ‰Ã‰Â‰ÂŠÃŠÃ‰Ã‰ÃŠÂ‰Â‰Â‰Ã‰Ã‰Ã‰Ã‰Â‰Â‰Ã‰ÂˆÂˆÂ‰ÂˆÂ‰ÂˆÁˆÂ‡ÂˆÀ‡À‡Á†À†À†À…À„À…Á…À†À…À…¾…¿…¿!ˆÀ1ŒÀ=ÀE’Á>Á/ŠÀ(‡¾#‡½†½ ‡½%‡½)‡½*ˆ½+ˆ½;¾cѴ̳ÇÕÆÓÛÑÚßÚßâáãåæææééæêéæèçãääááàÞÝÝÛÚÙØÖÖÕÓÓÓÍÎÏÊÊÍÈÊÌÉÉËÈÈÊÄÄÈÀÀû¼Àµ·¼¯²¸ª­¶¥©²¡¥®¢«š ª–œ§“𤖢”ŸŒ’‰›†Ž™ƒŒ—ƒŠ•€‰•}†’z„w‚uŽsŒq}‹o|ˆm{‡ly†kw…iv…htƒhsƒgr‚fpdpcnbm~V˜X—Y˜Z™Zš[›\œ]^`ža b¢b¢c¤e¤e¥f¦f¦g§h¨i¨ i© j© kª k© lª l©m«o«p¬q¬FvmnfecWUWOFLF>A•È:“ÇQ›ÊrªÏ•¼Ö¸ÑâÝéðõøùûüüöùûãìóÅÙæ¥ÅÛˆµÓf¥ÍB—É-Æ$ŽÆÆ Æ ŽÆ!ŽÆÅÅŌŌŌČŌŌŠŒÅ‹Ä‹Ã‹Ä‹Ä‹Ã‹ÃŠÃ‰ÂŠÂŠÂŠÁŠÁŠÁ‰À ‰À ‰Á!‰À ‰¿ ˆ¿ ‰¾#‰¾&‰½'‰¾'‰½/оD¾S•¿Y–¿T•¿Q”¾[™¿o¢Ã‚ªÅ“³Ç¥ºË²Á͸ÆÎ¼ÇϼÆÍ¼Ä͹Âʵ¾Ç±ºÃ­¶¿¨²¼¥®¹¡«¶œ§³–¥²’¢±Œž¯„š®}•­y”¬|”¬}”ª|’§z‘¥w£u‹¡uŠŸu‰tˆœq…›l™j€–j~”g|’_yZuUsŽQpMnElŒ=hŒ7eŒ2bŒ.`‹+_‰*]ˆ)\‡)Y…%X…#V†]œ^œ_œ`žaŸc¡d¢e£e¤ g¥ h§ i§ j¨ k¨ l©lª mª mª nªoªp«q«q«r¬r­s®q¬ÅÝæýþüùøìù÷êøöçùôäðìÞäáÓõõéçæÙÕÑÃÍɺĿ³Â¾±¨§œžŸ–™˜Ž›”–—ŽŒŽ‹|~zƒ~|}s}}txxn|{q€z~w€€u€s‹ƒƒ‚u}}s~€z††‚ƒyˆ‰–‚m‘Ÿ%‹Æ2Ã=’ÅNšÇe£Ëv¬Ï€±Ð‘¹Ô´ÌÞÙåëòõ÷ûüüùûûôøøðôöïóôëðòÝçëÉØâ´ËÙ¡ÀÓ’·Ð†²Ï}¯ÎrªÌe¥Ì_£Ìb¤Ìg¦Ík§Î`¢ÌQœÊSËm¨ÏŒ·ÓªÇÛÉÛçèðôùûûúüûó÷ùãìòËÜçµÎÞ£ÄÙŒ·Ôo©ÏSÊ7”È&Ç"ŽÇ ŽÇ!ŽÆŽÅŽÅŽÅ ŽÆÆŽÆÆÆÅŒÅŒÅ‹Ä‹Ä‹Ä ‹Ä ‹Ä ‹Ä!‹Ä ŠÃ ŠÃ ŠÂ ‰Â ŠÂ ŠÂ"ŠÁ!‰À"‰À#‰À#‰¾$‰¿%‰¿&ˆ¾&‰½&‰½(‰½1‹½;¾?Ž¿?Ž¿B¾K’¾U•¿_šÀo¡Á„ªÄ•²È·É¢¹Ê¦ºÉªºÈ«ºÇ«¸Å©¶Á¦³¿¤°¼ ¬º›©¶”¥´ ±†œ°˜¯v“­mŽªj©k©jŒ©j‹§i‰¦d‡¤a…¢b„¡c„ŸdƒŸ`€ž\}œZ|™[{˜Vx–Ou•Hq’FpDnŽ?lŽ7i.e&b!^]Ž\ŒZŒY‹WŠV‰T‰]›^›_aŸb d¡e¢f¤ g¥ h¦ i§ k§ k¨ l¨ l© mª nª nª o« q« r¬r¬r¬s­s­r®w¯ÞêéÿýîúøêøôæôðàðëÜåáÑæßÌêäÖÙÕÈÆÂµÃÁ³º¹­¤¤š˜˜‘‘ˆŽŠ’“Œ‚ƒ|~€z€}€‚|rsl‡†}{{pzzq„…}€w{wkvrdŠ…x…‚vzzn|{s€€w€xƒ…{‰y\ާ+Ç9ÃF•ÆVÉj¦Ì~¯Ï¸Ó£ÂؽÒàÛæëðôõøúùøúùñõõìðóëïòéíñÝæëÌÚâ¶ÌÙ ¿ÔŒµÏ‚¯Î~­Ìz­Ìw¬Íz®Ï‚²Ñ‚²Ð|¯ÏqªÎi§Îp«Ðˆ¶Ó¡ÂØ´ÍÞÍÞèçïôôøúòöøçïóØåíÈÙå·ÎÞ®ÈÙ¦Ã×—»Ô{®ÐVžÊ6“Ç)Ç&ŽÇ#Ç ŽÇŽÆ ŽÆ!ŽÆ!ŽÆŽÆŽÆ ÆÆÅ!ÅŒÅ!Æ ŒÅ!ŒÄ!‹Ä"‹Ä#‹Ä"ŠÃ!ŠÃ$ŠÂ$ŠÂ#ŠÂ!ŠÂ"ŠÂ#‹Á&‰¿(‰¿(ŠÀ'Š¿%Š¿&‰¾'‰¾'‰¾'ˆ½(ˆ½+‰¾.‰½3о:½G¾K‘½M“¾T•¿`š¿kŸÁr¢Âx£Â}¦Âƒ¨Â‹«Á“¬¿˜­¾œ­¾›«¼˜¨¹¤¶‰Ÿ³›±w–¯p’­hŽ«aЍ]ˆ¦Z‡§W…¦Sƒ¦O¤J¤G}£G|¢H| GzŸFxžDwœDvœDt™>s™6o˜1l•2k’6j‘5i‘-f‘%b_^\Ž[YW VŒ T‹ T‹_œ`œ`aŸc e¡ f£ g¤ h¦ i§ j§k¨m¨m© mª n« o« oª o«q«r¬r¬s¬s­s¬ s® s®ÉÜáþüêõòäöóæðëÛêå×äÞÍÞÖÄÜÓÂǵ·±¡©¦˜˜˜ŽŽ†€€x„†€„‡‚ƒ{||tyyq……{‚‚v€€w~{n~p}r~{nupcwo_xqb{wj~t‚s‚v}yl~{n}p„†|?½2Å>‘ÃR™Æm¥Ê‰³Ð¡ÀÖ±ÉÛ½ÐÞÉÙãÛåêëðóô÷÷õ÷÷ïòóéîðæìïãêíÛåéÎÜã»ÏÜ£ÁյЂ¯Í‚¯Ì…¯Íˆ²Î‘¸Ð™½Ó–»Ò¶Ð†³Ñƒ³Ò‹¸ÓžÁ×®ÉܺÒàÊÜèÛèïäîóãíóÚæîÎÝçÁÕâ´ÌÛ§ÄÖž¾Ô”¹Ò~¯Î] É?”È,Ç'Ç$Ç#Ç#ŽÆ"ŽÆ&ŽÆ$ŽÆ$ŽÇ$ŽÆ$ŽÅ!Æ"Æ$Å$Å#Ä#Å#ŒÅ"ŒÄ#‹Ä$‹Å$‹Ã$‹Ã%‹Ã%‹Ã%‹Â#ŠÂ%ŠÁ'ŠÀ(‹À*‹À+‰¿*‰¿*Š¿)‰¾)Š¿)Š¿)‰¾'ˆ¾(ˆ½)‰½,‰¾3о>½E½D¼B½E¾H‘½L‘¾P‘¼U“¼[•¼c˜»o›»z »„¢¹‰¢º† ¶€µz™³s•°j‘¯c¬\‰ªW†©Q„¦L§D~¦<{¥8y¥4w¤0v£-u£,t¢,sŸ,rŸ-rž-q,o›&mš!kš h—"g•'g”&f’"c‘a^^\Z Y W VTŽSŒ_œabcŸd¡e¢ g¤ h¥ h¦ j§k¨l© m©mªnª oª pª pªp« q« r¬s­s­t­t­v¯m¬‡µÉÿøãéçÖêåÖèâÐÛÕÅÔͽÊÁ®À¶¡±«›“€ƒƒyƒƒ|}}v}}u‚x~t€€vqsjsum}r|xlupl]pk^ytgql[pk\sm^sl[nj\pm`}xmvreun_yvgziaŒ¡?”ÈK–ÄW›Æm¥É‹³Ï§ÂÖ»ÏÜÅÕâÉÙãÎÜäØâçãëíìðôîòôëïòæëîáéìÞçêØâèÍÛã¼ÑܨÄÕ•¹Ñ‹´Ï‡±ÍŠ³Î”¸Ð¡ÀÔ¦ÃÔ¤ÂÕŸ¿Ôž¿Ö¡ÂÙ©ÈܵÏß½ÔâÄØåËÝéÓãíØçïØåîÍÞéÀÖã´ÍݨÅÖ—»Ñƒ±Îp¨Ì^ ÉJ˜Ç8’Ç,Ç(Ç'Æ'Æ&Æ&Å(Æ&Æ&Æ&Æ&Æ&Æ%ŽÆ'Å&ŽÆ%Ä$Å%Å%Å%Å&Ä'ŒÄ(ŒÃ'‹Ã'ŒÄ(‹Â(‹Á*‹Â+ŠÁ*‹À+‹¿,‹À,ŠÀ,ŠÀ,Š¿+о*о*‰½+‰½*ˆ¾*‰½*‰½-‰½1н7‹½9‹½7‹½4м4н7н:Š»>й?‹ºC‹¹LޏU‘¸^“·e”¶h”´i“³h‘±cް\‹®Uˆ¬Q„ªL‚©E€¦=|¦3y¦+w§)u¦&t¥"s¤r¤q¢p¡nŸmžmljhœgšf˜e•c”a”`“_][ZŽ YŽ WVUŽSŒ _œacŸ d  e¡ f¤ g¥ h¦ i§k¨l¨l©mªnª n« p« qª q«r« r¬ s¬ s­s­ t­ u®u¯r®)ƒµÙÚÍçÞÈÙÕÅÒ˸ƿ¯¶±¢­¤“›“–’ƒ}|pywlxvk||p|qzotrf}{pji`llb{xlxvizwktn`oiYvo^rm\ysdtnaohYfaR`]PhdVnj[jcSngVfƒQšÆ[Æk¢È{ªÊ´Í¤ÀÓ¸ÌÚÄÖáÉÙãÊÚäÌÜäÓßåÛäèáéìäêîâèìÜåêØâèÕàæÏÝäÇÖà¹ÍÛ¬ÅÕ¡¿Ò•¹ÑŒ´Ï·Ïž¾Ó¬ÆØ³ËÚ²ËÚ±ÊÙ³ÌÛºÑßÃ×ãÊÜæÏßéÐàéÓãëÜèðßêòÙæïËÜé¹Óà«ÈÛž¿Õ‹µÏp§ËU›ÈA”È6’È.Ç+Æ)Ç)Ç)Æ(Ç)Æ+ŽÆ)ŽÆ)Æ'Æ(Æ)Æ)ŽÅ)ŽÄ*ŽÅ'ŽÆ%ŽÅ'Å(ŒÅ*Å*Å*ŒÄ+ŒÃ+ŒÃ+ŒÂ+ŒÁ,‹Á.‹Á.‹Á-‹Á-Š¿.‹À-‹À.Š¿.Š¿/о-о,о)‰¾*ˆ¾*‰½*ˆ½*ˆ»*‰¼,‰½.ˆ½.ˆ½.ˆ½.ˆ¼/‰¼1‡¼2‡º3‡¹4‡¹6‡¸9‡·<‡¶AˆµG‰´N‰²S‰°Qˆ¯K…¬I‚ªG©C€§<}¥3z¥)w§#u¦ t¦s¥r¤q¤p¤o¢n¡l kŸiŸhžgžfœe™d˜b—`–_•^“]‘ \ Z YXVUŽSŒ aœb cŸ d  f¡ g¤ h¥ i¦j¨ k§l¨l© n© oª oª q¬ q¬ r« r« s¬ s­ s­ t­ t® u®u¯v° r°GŽ´ÂÀ²ÌÁ¬¸´¤°¬œŒ}‡ƒtƒ€t…qzntpc|vgvqckgZplavrenk]urfyuguoajeVfaRicTjcTkcQd]KZUE]XH[VGaZH`XD`VCYTCcialŒœh£Èh¢Ås¥Çƒ­Ê•µÍ¡½Ï¯ÅÕ½ÏÜÅÖáÈØâÇ×áÇØáÌÛãÒÞæØâèÙâéÕàçÑÝåÌÛãÉÙáÅÖß¿ÑÜ¶ÊØ¯ÅÔªÂÒ ½Ð˜ºÏœ¼Ñ¨ÃÕµÌÛ¾Óà¾Óß¼ÐݾÒßÅØâÏÞæÕãêÚåìÜçìàéïêîôîòöæíó×äíÅÚå¶ÏߥÄ׋µÐk¤ÉM™Ç7’È.Ç.Æ+Ç,Ç,Ç,Ç)È(Ç(Ç(Ç(Æ(Æ(Å)Æ*ŽÅ)Å*ŽÅ+ŽÅ+ŽÅ+ŽÅ(Æ)ŽÅ-Ä,ŒÃ,ŒÂ-Â.Ã.ŒÂ.ŒÂ/ŒÂ/ŒÂ.‹À-ŠÀ-‹Á.‹À.ŠÁ.‹¿.‹¿/Š¿+о)о)‰¾)‰¾*‰½)ˆ¼(ˆ¾(‡½(‡»(‡½+‡¼,‡¼,‡¼,†»*†º*…º,…º-„¹+ƒ·*ƒ¶+‚´.‚´4‚²9ƒ°9®8¬9¬;~ª:}¦2{¦)x§"u¨u§t¦r¦q¥p¥o¥n£m¢l¡j i hžgžed›c™a˜a— _– ^” ]“ [ Z XX‘VTŽS b bž c  e  f£ g¥ i¦i§k¨l©m©nª oªpª p« q¬ r«s« s¬ s¬ s¬t­ t­ u®u¯u°u±v²s²-€­…™› ˜…’ˆs€we~|o…‚t‚|m|sdxsfsoapk]ieVc_Qb_Q_\N^YK]VGYTDUNk€;bo.PZ"?E-0(2)3 /:9F!EQ/Sa?fxR„žeŸÃf¤Ìa Æ_ Æc Çk¤Èw«Ê†²Ì’¹Ð›½Ò£ÁÔ¥ÃÕ ÁÕœ¿ÔÀÕŸÁØ¤ÄØ«ÇدÉÙ±ÉØ²ÊسÊÙ±É×®ÇÕ©ÄÓ§ÂѤÀÏ¡½Ï½Î¡¾Ï©ÂÒ²ÇÖ»ÎÛÅÕßÎÚãÏÛãÍÚãÍÚãÐÝåÒÞåÕßå×àçÙáéÞåìàçîÛäêÐÝçÁÕá¬ÈضÐl¦ÊP›È=•È1‘Ç.‘È/Ç.‘Æ-‘Æ-‘Ç,‘È,Ç-Æ,‘Ç)‘Æ-Æ/Å1Å0Å/Ä.Ä.Å/Ä/Ä0Ã0Ã/Ã.ŽÃ/ŽÃ0ŽÂ0Á/Á/Á1Á0À/ŒÀ.ŒÀ.ŒÀ1‹¿0‹¿-‹¿-‹¿/о/о+о)‰¼'‰½'ˆ¼(ˆ¼&ˆ»&ˆ¼%‡»%†»%…º&„º%„º%ƒ¸$ƒ¸#‚¸#¸#µ"€¶"€µ"´!~³}´|³{°z°y¯w¯v­u¬u«s©r§q¦p¦o¦n¥m¤l£k¡k j¡h¡g¡f ed›cš a— `– _– ^• \“ [’Z‘Y‘X‘WUŽSŽ dž ež f¡ g¢ h¥i¦k§l¨m¨n©p©pªq«r¬ q¬ s« s¬ s­ t­t­u®u®u®v¯v°v°w±w²y³{³z´y´xµ{¶~µ*¯-vŸ%e‡To?S .:   !!!%$#..!,+&%%.-$.-!+**433BC@ZcN‚›RœÇOšÇL—ÅN˜ÆXÇd£Ém¨Ëv«Ì€°Î‚³Ï±Î|¯Ìy®Íu­Ïx®Ï„´Ð’ºÓ¿Ô¥ÂÕ§ÄÕ¦ÄÕ¤ÂÔ ÀÑŸ¾Ð½Ï™»Î–¹Î—ºÏ ¾Ï§ÂѯÇÕ¼ÎÛÇÕßÊ×àÉ×áÈÖáÉ×àÉÖàË×àÌØáÌØáÎÚâÎÚãË×áÁÒß´ÌÙ§ÄÔ’¹Ðy¬Ì`¢ÉI˜È7’Ç2‘Ç2‘Æ1Æ0‘Æ0‘Ç.‘Ç.‘Ç/‘Æ,Ç,‘Æ,‘Æ.‘Æ1‘Æ1‘Å0Ä2Ä2Ä0Ä0Å1Ã2Ã0Ã/ŽÃ0Â3ŽÂ3ŽÂ1ŽÂ1Ã2Á0À1Á1ŒÀ0ŒÀ1‹À0‹¿0‹¾/‹¿0‹¾0Š¿,н*ˆ½'‰¼'‰½)‡¼%‡»&‡¼%‡»$†º&†»&…º%„º%ƒ¸$‚¸&·$¶$¶!€¶ µ ~³}´|´{²{²z°y°w°v­u¬t«sªr¨q§q¦o¥n¥m¤l£k¢j¢i¡h¡g¡f ežd›c™ b˜ `— _– ^•]”\“Z‘Z’X‘WVT ež f  g¢ i£ i¥j¦l¨m¨n©o©pªq«r¬r«r«sªt«t­s¬u­u®u®v¯v¯v°w°x±y²y³ w³|´@ˆ²f—°|˜¤“œ›˜š‘™˜Ž‚Ї|‚uuunmpmbjgX``WbdUbc9GL3CG+;?'6:+:>4EH-=A5EJ8GL5DH4CG-=@6GJAPUGH>GG9CC^caOUTCAAFD8?=:B@HONHONOYY†©½Ÿ¿Õ¦ÁÔ¢ÁÕ¸Ò€°Ï|¯Ï…³ÑŠ·Óz°Ð`£ÌMšÉIšÉJšÊIšÊJšËL›ËOËTŸÌ\¡Ìa¤Ëj§Ëw«Ë{­Ë{­Ëv«Ëm§Ëa¤ËZ¢ÊY¡ÊX ÉX ËX ÌUŸËTŸÊ[¡Ì`¤Ìd¦Ìc¦Ì`¤Ë_£Ëe¥Êq¨Êx¬Ër©Éf£Æ^ Å[ŸÄZœÄTšÃL˜ÃI–ÄF•ÄB”Å;”Æ:”Ç9“Ç:“Ç:“Ç9“Ç9’Ç8“Ç:“Ç:’Ç:’Æ:’Æ;‘Æ9’Æ:“Å9“Å9’Ä9’Ã9‘Ä7‘Â8Ã9Ã9‘Â9Â9Â8Á8Á7Á5Á5ŽÁ6ŽÀ6ŽÀ4À2Œ¿1Œ¾0Œ¿/‹½+н+‰½*‰¼)ˆ¼(ˆ»(ˆ»(ˆ»(‡º'†¹(†¹)…¹'„¹(„¸'„·'‚¶$‚µ#µ"€µ#~´!~³ }³|²|²|²z°x®w®v¬u«s©r¨ q¨p§ p¦ n¦l¤l£k¢i¢h¢h¢ g¢ fŸ fž d d› dš a— `— _– ^• \“ [“Z’Y‘W‘V‘j¤k£k¦m¨n©n©oªqªqªrªs«sªt­u¬u«u­u®u®v®v¯w¯x¯x±y±z²|²ª»½Çż½¿··¸°¶·¯¨¨ ™š•’”‹Ž‡ƒ†vytglj^dcPUSV][OURJQP9CB:CC>EE5=<:B@8@?=DCJNLTVQ7=;;B?9A?7?=5=;5=<3:9:@>=CA:A?EJIAED^nr¡½Ñ©ÀÓ±ÆÖ²ÈØ«ÅÖ¤ÀÕ¢ÀÖ¤ÁפÂ×™¼Ö€±Ðh¥ÌWžÊM›ÊIšÉRÊ\¡Ëc¤Ìo©Ì{®Î€¯Í‚±Ìˆ²Ìˆ³Ì‚°Íy­Ìi¦ËX¡ËQžÊNœËL›ÊJ›ÉK›ÊK›ÊJšÊK›ÊNœÊRžËSŸËPžËOÉSžÊ]¡Ée¤Éd£È\ ÆWžÅUœÅRšÄN™ÅK˜ÅJ—ÃJ—ÂH–ÄA”Å=•Ç;•È;”Ç9”Æ8”Æ8“Æ9“Æ8”Æ:”Ç;“Ç;“Ç;“Æ;“Æ:“Å:“Å9’Ä:’Ä9’Ä8‘Ã8’Â8’Â:’Â9‘Â9Â9Á7Â8Á9Á7ŽÁ7ŽÁ8ŽÀ6¿4À2À2ŒÀ1‹¿/‹¾,о*‰¼*‰¼)‰¼)ˆ¼'ˆ»(‡»(†»'…º)…º)…º(„¹&„·&ƒ·$‚¶$µ$µ#€µ"~´~³}³|²|²{¯y¯x¯w¬v«tªs¨r© q§ p§o¦n¤l£l£k¤i£h£g¡g  fž f e› d™ b˜ a— a– _• ]• \“ [’Z’X’W’j£k¥m§n©oªo«q«qªr«r¬sªs«t¬u«u¬u­u®v¯v®w¯x°y±y±z²y²#~²¦³³µ´«¯°¨¥¦ž£¤œ“•އ‰‚y{uvzt|~x]b__dbOUTJROSZXPTRDIGFKIFMJAGE7?<;B>>C@7>;-/&%+)9@=2:8198.76086186/749?==HG‹£°¦ÀÓ¥½Î¬ÂÓ°ÅÕ²ÇÖ±ÆÖ¯ÆÖ®ÆØ¬ÆÙ©ÄØœ¼Ô‰´ÐpªÍZ¡ËVŸÊe¥Ëv¬Ì„±ÎŽµÏ—¹Ð–¹Ð‘¶ÏµÎ‹µÍ‚±Ít«Ì`¤ËPžËLœÊKœÊIšÉIšÉIšÉIšÉJšÉIšÉK›ÊLÊMžÊMËK›ÊM›ÊPœÉTžÉTÈQœÇO›ÇNšÇL™ÆJ˜ÆJ˜ÆK˜ÆK˜ÄI—ÄD–Æ?•Æ=•Ç=•Ç=•Ç=•Æ<•Æ:•Å;”Æ;”Æ<”Ç<”Ç=“Å=”Æ:”Å;“Å;“Å;“Å9’Ä8’Ã;’Ä:’Ã:’Â:‘Á:‘Â:Â:Á8Á8Á8À9ŽÁ8Á7ŽÀ3ŽÀ4Á3ŒÀ1ŒÀ/‹¿-‹¾-о,н*‰½*‰½)ˆ¼(‡»)†»(†»)…º)…º)ƒ¹(„¹'ƒ¸'‚·%‚¶$µ#€µ!~´"~´}³|²|±{±y°y¯w­w¬vªt©s¨s¨q§p¨o§n¥m£k¢j£i£h¡g¡ fŸ f fœ dš c™ b˜ b– `– _• ^“ \“ [“ Y’X‘k¥l¦m§n©oªpªq©rªr¬r«s¬s¬t¬t¬u®u­u­v®v®w®x±y±y°z°{²{³ ¬±«Ÿ £—™“ŒŽ‡}€zlnice`dfaloi_a]]_[[^[SVTZ]YHMJ;A>CHDDID>C>5<9185/429>:4;86:67=:085)21$.,%.,.53)1/+21&/-$,)3@>ušŸ¼Ï™µÈœ·ÊŸºÍ£½Ï¥¿Ð©ÁѪÂÓªÃÔ«ÃÕ¨ÃÕ¥ÀÔ»Òˆ³ÏrªÍk¨Ìv¬Í†³Î’·Ï–¹Ð™ºÑ”¹ÐŒµÏˆ³Í„²Ì}¯Ìn©ËZ¢ËMÊJœÊI›ÊI›ÊJ›ÉJ›ÉIšÉI›ÉJ›ÊJ›ÊKœÉMœÊMœÊNœËL›ÉK›ÉM›ÊM›ÉKšÉKšÈJšÈK™ÈJ™ÇJ˜ÆH˜ÅI˜ÆI˜ÆF—ÆB–Æ?–ÆA•Æ@•Æ?•Æ@•Æ@–Æ>•Ç=•Ç=•Æ>•Æ>”Å=”Æ=”Æ=”Æ=”Å<“Ä<“Ä:”Ä;“Ã;’Ã<’Â;’Ã;‘Â9‘Â9‘Ã8‘Ã8Â8Â8Á8Â7Â6ŽÀ5À3À3ŒÀ0ŒÀ.‹¿-‹¿+‹¾+о*о)‰½)ˆ½)‡¼)‡¼(†º*„»(„¹)„º(ƒ¹&ƒ·%‚¶%¶$€¶#€µ#´"~³ }² |²|±{±z°y¯x­wªvªtªt¨r§q¨p¦n¥m¤m£k¢j£i¢h¡g fžfœe› dš d™ c˜ a˜`–_”]” \” [“ Z’l¦m§n¨o©p«pªq©q«r«rªsªs¬u¬t¬u¬u®u¬v­w¯x®y¯y¯y°z± {±{²+°‡› Ÿ›Œ…ƒ…€uxrgjebd_egahjd_a[bd]fga^`ZWYTNPKGJE>C?8>:296+20'/-#,*$-+",*$-, *)" !! ! &32Ndi~ž®”µÊ®ÃŽ¯Å°Å±Æ’²É”´Ê˜·ÌºÏ ¼Ð¡¼ÐŸ¼Ðž¼Ð›ºÐ¶Î°Îw­Ìy®Í~°Î‚±Ï±Ï€±Î|°Îv­Îr«Ìs«Ìq«Ëh§ËY¡ËNžÊJœÊI›ÊJœÊJœÉJœÊKœÊIœÉJœÉJœÉJÉJœÉLœÉMœÊL›ÉJœÉJ›ÊK›ÊK›ÈIšÇIšÇIšÈI™ÇG™ÆF˜ÆG˜ÆH˜ÆF—ÆD˜ÆC—ÇC—ÆA—ÆB—ÆB–ÇA–ÇA–ÇA•Ç?–Æ@•Æ?•Å?•Ç>”Ç@”Å?”Å?”Å>“Å=“Å>“Å<“Å<“Ä<“Ä;’Ã:’Ã9’Ä9’Ä:‘Ã9Ã8Ã9Â9Á8Â7ŽÁ5Á3Á3ŒÀ0Œ¿,‹¾+‹¾+‹¾+‹¾+‰¾+ˆ½*ˆ¼)‡»(†¼(…º*…º)„º(„¹(ƒ¸'ƒ·'·&¶%¶$µ"´!~´!}²|±|²{°z¯y®x­w«uªu©s¨r§q¦o¥o¤n¢m¤k¤j¥j£i¢hŸgfe›ešc™b™a—`— ]• ]• \” Z’l¨n§o©pªp©q©qªr«r«sªsªt«t­u¬u­v¬v¬x®x®x¯y¯z°z° {² {²!}²|´*~¯Y€‘muq{xmvrepma}{otrfig[XWMNOGHKD7<7-1,(.)$+( &%!       -.=OS`x†¤µ•¶ÌŽ±È…ªÁ†ªÃ…«Ã…«Ã…ªÃ…«Ä†¬ÄŠ¯Ç²É’´Ê‘µÌ´ÌŽ³Ë‹²Ë…°Ì|­ËqªÊk¨Êj¨Ìh§Íd¦Íb¦Ìa¦Ì_¥Í]£Ë_£Ëd¥Ìb¥ÊY¡ÊOŸÊKËJËJÊJÊJÊKÊJÊJÉJÉKÉJÊLÊKÊJÉIÉJÉJÉIœÉH›ÉHšÉHšÇHšÈG™ÈF™ÈF™ÈG™ÈG˜ÈF˜ÇF˜ÈD˜ÇC˜ÇD˜ÈD˜ÈC˜ÈC—ÈC—ÈB—ÇB—ÇA—È@•Ç@–ÆA•ÆA”ÆA”ÅA”Æ@”Å?“Å>”Å>”Å>“Å=“Ä<“Å<’Ä;’Ä:‘Ã:‘Ã:Ã:Ã9Â9Â8Á7ŽÁ6Á5À4ŒÀ0Œ¿-Œ¿-‹¿-‹¾-‰¾-‰½,ˆ½+‡¼)†½)†»*…º)…º*„º)ƒ¹'ƒ¸(‚·%‚·&¶&€¶%€µ#´!~´!}² |±{±{°z¯y®x¬vªuªtªs©q¦q¦o¥n¤m¥l£k¤k£j¢i¡fžgfe›dšb™b™`— _– ^– ]• \•n¨o¨o©q«q©rªr«rªr«s«t¬u¬t¬u¬v¬v¬w­x®x¯y°z°z±{° |°!}±!}²$~²#~´!~µ2¯KƒŸZ}‹YswJ^]1CC01 !#   ((Qchq†ˆ ­“¯¾–µÉŒ¯Ä‡«Á…¬Ä„­Çƒ¬ÆƒªÄƒªÃƒªÃ‚ªÄ«Å‚¬Åƒ­Æ‚®È­È}¬Éy«Êv©Êq¨Ék¦Éd¤É]£ÊZ¢ËX¡ÊU ËS¡ËT¡ÌT ÊS ÌT¡ÌY¡ËZ¢ËU¡ËNŸËKŸËKžËLËKžËKžËKžËJÊKËJžÉJžËJžÊJžËJžÊKÊJËHÉIÉHœÊIœÉH›ÉG›ÉGšÉG›ÉGšÈG›ÈHšÉGšÈG™ÈF™ÈF™ÈE˜ÈE˜ÇE˜ÈF™ÈE˜ÈE˜ÈC˜ÇC—ÈC—ÈC—ÇB—ÇB–ÇC•ÇB•ÇB•ÇB”ÆB”ÇA”Ç@”Æ?“Å?“Å?“Å>“Å<’Ä=‘Ä=‘Ä;‘Ã<Ä;‘Â:Â:Â9ŽÂ8ŽÁ6À6ŒÀ4Á1ŒÀ1‹¿1‹¾/Š¿.‰¾-‰½,ˆ½)‡¼*†»*‡»*†»*…º*…»*„¹(„¸(ƒ·&‚·&‚¶&€µ%´%µ"~³!}²"|² |°{°y®x®w¬v«uªs©s§q§q¦o¦n¤m£k¢k¢j£i¡h gžgfœe›c›bšb™`— _– ^• \•o¨p©p«q©r«r¬r«sªsªt«t¬u¬u«u¬w¬w­w®y®y¯z¯z° {±!|°!|±#}²$}²&€³*´(€´~´{¶ €¸1†¶>‰°I‡¤P€“Qy†I`dFLIJPO@HHBJJ8AA8CC;EG>KMDPRDOPJVXT`b]hjakl`jk^hj_ikcll^hjckmYaaYegfx|q‡z“Ÿ‚Ÿ¯…§¼ˆ®Æ²ÊŽ´Ì²Ê‰±É‡°Éƒ¯Èz¬Ép¨Éi¥Ée¤Êb£É`¢É^¡É]¡ÊZ¡ÊY¡ÊX¡ËT¡ÊQ ËP ËR ËQ ËP ËR ÊR ÊP ÌNŸÌLŸËMŸËNžÌKžËLžËMžÌLžÌLžËLžËKžËKžËKžËJžËKžËKËJÊJÊIÊIÊIœËHœÊFœÊFœÉGœÉF›ÉF›ÉF›ÈF›ÈFšÊFšÉGšÉF™ÉF™ÈGšÉG™ÈF™ÈE™ÈF˜ÉD˜ÇC˜ÈC—ÈB—ÇB—ÇD—ÈC–ÇB–ÇB–ÈA”Æ@”Ç@”ÆA”Æ@”Å?”Å@“Å?“Ä?’Å?’Ä?‘Ä>‘Ä=Ã;Ã:Â8Á5Á6ŽÀ5Á5À5Œ¿4Œ¿4Œ¿2Š¿/н.‰½-ˆ¼+ˆ¼+‡»,‡»,†»+…»*…¹*„¸)ƒ¸'ƒ¶&‚¶&¶&€µ%€µ#³#~³"}²!|±!{°z¯y¯w­v«u©tªs©s¨q§q¦o¥n¤m£l¢k¢j¢i¡h gžfeœdœcšbša˜_˜ _– ^–p©qªqªrªr«s«s«s«t«u¬u¬u¬v¬v¬w­x®x®y¯y°z¯ {±"|°#}±$}²&~³'€´"}±y°)´F‘¼…´Ì¹ÒÙ×ãàèíäììßíèØôíÞõòæðñèííãßÝÒææÝÛÜÔÒÔÍÊÌǼÃÂ¥¬­’œšž™œ˜›ƒŒŽ~‰‹wƒ†|ˆŒ€‹ƒ”ˆ“–x‚„ny|u‚†Ž“‡”šŒ™ ‘¢Œž¥‘¦±’®¼–·Í–ºÒ¶Ï‰³Ì~®Ìl¨Ê^£ËX¡ËV ÊV¡ÊX¡ÊY ËY¡ËY¢ÌY¢ËT¡ËQ ËP ÌQ ÌQ¡ÌO ËQ ËO ÌN ÍO ÍN ÌNŸÌOŸÌMŸÌLŸÌLŸÌKžËLŸËKžÌLŸÌLŸËLŸËLžËLŸËKžËJžËKžËIËHËHžËIžËHËGÊGËEÊGœÉFœÊFœÉFœÊFœÊF›ÉGšÉGšÉI›ÊHšÊFšÉE™ÉFšÉE™ÈE™ÉD˜ÈD˜ÈC˜ÇD˜ÇC˜ÈA—ÇB–ÈB–ÆA–Ç@–ÆA•Æ@•ÆA”ÆA”Å@“Ä@“Å@“Ä@“Ä?‘Ã?‘Ä>‘Ã=Ã;Ã9Â9ŽÀ7À7À6À6Œ¿5Œ¿5‹¿4‰¾2н/о-‰½,ˆ¼-ˆ»,†»,‡»-…»,…º+„¹*„·)ƒ·'‚¶&¶&µ&€´$~³%~³#}²"{±!{°y®x®x¬vªv©t©s¨s§r§q¦o¥o£m£l¢k£j¢i¡hŸfžfeœd›cšb™a— `— _—qªrªr«sªs«s¬s«t¬u¬v­v­v®w­w­x®x®x®y¯z±!|°"|°%|±$²&€³z±z±E½ˆ·ÓÉÝåô÷òÿÿöÿþòþüòýüóúùñüý÷øúóøùóõöïæåÝÚÙÏççÝääÛåäÚêêáâãÜÝÝ×ÏÐËÄÆÃ´¸¸Ÿ¨©œ¦ªž©®—¡¦› ›ž‘œŸŠ—šŠ˜œ‘£Ž›¡ž¤˜¦­˜¤«™¤©‘¢– ¤” ¤Ÿ¤’¬»·Ð‡´Î~®Ím¨Ë]¢ÌV¡ËU¡ËU¡ÌW¢ËU¢ËU¡ËV¢ËV¡ËS¡ÌP¡ÌP¡ÍP ÌO ÌP¡ÌQ¡ÌQ¡ÌP¡ÌO¡ÌP¡ÍN¡ÌN ÌO ÍN ÌM ÌLŸÍLŸÍKŸÍK ÌLŸÍMŸÌKŸÌK ÌKŸÌKŸÌIŸÌIŸÌIžÌIžÌJžÌJžÌHžËHËGËGËHËGËGÊFÊFœÊFœÊHœÊHœÊH›ÊH›ÉF›ÉGšÉGšÊFšÊF™ÉEšÉE™ÈC™ÈB™ÈC˜ÈB—ÆD—ÆC—ÈB—ÈB—ÆA–ÆA•ÅB•ÄB•ÅA”Å@”ÅA“ÄA“Ä@’Ä?’Ã@‘Ã>Ã=Â=Á;ŽÁ:Ž¿8¾8¿8¿6Œ¾6‹¾4‹½3н2н1‰¾/‰½.ˆ¼.‡¼.†¼,†»,†º,…¹*…¸)ƒ·(ƒ·'µ(µ&€´&³$}²$}±#|° {¯z¯x­x«wªu©t©t§r§q§q¦p¥o£m£l¢k£j¢i hŸfffœeœcšb˜a˜_˜r«sªs¬t¬t¬t¬t¬u¬u­v®v®w®x®x¯y®y¯y¯ {°!{±"|±$|±'³#|±x¯K“À­Ìßòöõÿÿþÿÿûýýö÷ùóûýûùúô÷÷ðúûõúüö÷øòôõîïîåèçáçèâåæÞÝÝÕßàØÜÞ×ÊËÆÒÓÎÒÓÏÏÐÌÍÍÊÇÉŹ¼»±¶¹¦¯³Ÿ©¯¤¬±Ÿ¨«˜¤¨Ÿ¨­ ©®“ž¡‘›– ¢Ž—™“œž“œ ›¤§™£¨• —¡£‘©µ{­ÊrªÌh¦Ê\£ËV¢ËV¢ÌV¢ÌU¢ÌV¢ÍS¢ÌS¢ÌR¡ÍP¡ÌO¡ÍO¡ÎQ¡ÍR¢ÍS¢ÍR¢ÍR¢ÎR¢ÍP¢ÍO¡ÎO¡ÎN¡ÍO¡ÍN ÌM ÍM¡ÌL¡ÍL ÍL ÌM ÍM ÍL ÌK ÌL ÍKŸÎKŸÍJŸÌIŸÌIŸÌJŸÍIŸÍIŸÍJŸÌIžÌHžÌGžËIžÌHËGžÊFÊFËGÊHËHËGÊGœÊG›ÉG›ÉGšÊFšÉG›ÉEšÈF™ÈE™ÈD™ÈD˜ÈD˜ÈE˜ÇD˜ÈD—ÇC—ÇC—ÆD–ÆC–ÅB•ÅA•ÅC”ÄC“ÄB“ÄA“ÃA’ÃA‘Â?‘Á?Á>Á<À<Á;ŽÀ:Ž¿9¿7¿7Œ¾6‹¾5‹½4‹½3‹½1‰½/‰½,ˆ¼-‡»,‡»-…º+…¹*…¸)„·)ƒ¶)‚¶'µ&³&~³$}²#}±"|¯ {¯y®y­v«u«u©t¨s§r§r§q¦p¥o¤m£l¢k¢j¡j ižfffœd›c™b˜a˜s«s«t¬t«t¬t­u¬u­v­v®w­x­y®z®z®{° {°"|±"|±$}±)³ z±3…·’½×ô÷øÿÿÿþþøúü÷ùúöùúôóôëööïö÷ðùùòøùòùúôòòëíîçêêãëìçâãßÚÛÖÖ×ÒØÙÔÐÑÍÌÍÊÊÌÉÅÇÆÈÊËÊÍξÂï´¶ª±³©®°£ª­Ÿ§«œ£§˜Ÿ¢¤§¤ª¯–œŸ‘–˜•œž“›œ–œŸ•›Œ••“œžž¥¨—Ÿ£›¡£†¨¹`¤Ì\£ËW¢ËS¡ÌT¡ÍS¢ÍT¢ÎT¢ÎS¢ÎQ¢ÍR¢ÍP¢ÍO¡ÍR¢ÍT£ÌU¢ÌW¢ÎW¤ÍX£ÍW£ÍT¢ÍQ¢ÌO¢ÎO¢ÎO¢ÍN¡ÎM¡ÍN¡ÍN¡ÍM¡ÍM ÍL ÎJ¡ÎL¡ÍK ÎL¡ÎL ÍK ÎK ÎK ÍL ÍKŸÍJ ÌK ÌKŸÍKŸÍHŸÌIŸÌHžÌGžÌHžÌGžËGžËFžËHËIËHÊGËGœËGœÊGœÊF›ÉG›ÊGšÉGšÉG›ÊFšÈF™ÈE™ÉF™ÈE™ÈE˜ÈE˜ÇF—ÇE—ÆE—ÆE–ÆE–ÅE•ÆD•ÆE•ÅD•ÄC”ÄC’ÂD’ÃB’Â@’Á?‘Á>Á>À<À<ŽÀ;Ž¿:¾9¿6Œ¿5Œ¾5о3н1н1‰½/ˆ».‡»-†»,†º+…¹+„¸*„·)ƒ¶)¶'´$³%~²%}°#|° |¯ z®y®x¬v¬uªt©s¨r©r¨q§q¥p¥o¤m£l¢k¢k jŸiŸgžgfe›cšb™t«t¬u¬u¬u­v­w­x®w­w®x¯y®z®z¯ {° |°#|±#}±$}²)€´x°N•ÀÝëðÿÿúýýõúüùýýüüýúüüùóóîñðèìëãííäòòëòòêñòìéêäéêååæáÛÜ×ÓÓÏÉÉÅÎÏÉÏÐκ½½´··¯³µ­³µ¨®°§®±¨­³Ÿ¥©š £—ž¡™Ÿ¢– •œž”–•–•šššž ¢¤™žž–™˜ŽŽ‘‘–—’—˜œ¡¡¢¦¨ž¡¢—¥ª\¢ÈS¡ÌS¡ÌR¡ÌS¡ÌQ¡ÍR¢ÍT¢ÍR¢ÍQ¢ÍQ¢ÎQ¢ÎP¢ÎR¢ÎV£ÎY¤Í]¤Îa¦Îc§Íb¦Î]¤ÍW£ÎQ¢ÎP¢ÎO¢ÏO¢ÎN¡ÎN¡ÎN¡ÎN¢ÍN¢ÎL¡ÎM¢ÍM¡ÎM¡ÍL¢ÎM¡ÍK¡ÎK¡ÎL¡ÎL¡ÍL ÎM ÎL ÎK ÍI ÍJ ÍJŸÌIŸÌJžÌIŸÌIŸÌIŸÍHŸÌIžÌHžËHžËGžËIËHËIËHÊHœÊH›ÊI›ÊH›ÊHšÊHšÉHšÉGšÈG™ÈH™ÈH˜ÈG˜ÇH˜ÈG˜ÆG—ÇH–ÆG—ÆG–ÇG–ÅF•ÅF•ÅF”ÃE”ÃC“ÂC“ÂB“Â@’Á?’Â>‘À>À<À;ŽÀ:¿8¿6¿7‹¾5‹¾4о3м3‰¼1ˆ½0‡¼/†»-†º-…¹*„¸+ƒ·*¶)€µ'´'³$~±%}±$|°"{®z¯x®x¬v«uªt©t©s¨s§q§q§p¦o¤n£l¢k¡k¡i hŸhžgeœe›cšu¬u¬v®v­v¬w­x®x®x®y®y¯y®z¯!{°#|²#|°$}±$~³'~³ z±G½äîóÿÿý÷ùõûû÷ýýùüüøùùõùúöñòêôõðòóíòòíðñìííæèèâàáÜÜÝÙÅÇÅÇÇÃÍÍÊÄÅ¿Á¾·»¼ª®°¢§ª¢¦¨› ¢› £š ¡™ ”™š”™š’–˜‹Œ’‘—™šˆŠ‡Žˆ‹‰ŒŽ‹†ˆ…‚ƒ}„„}Œ–˜”–—”žŸœ—™˜’•›œ[¡ÇP ÍS¡ÍS¢ÍQ¢ÍQ¢ÎQ¢ÍR¢ÍR¢ÍQ£ÏP£ÏR¢ÎQ£ÍQ£ÎT¤ÎY¤Î`¥Íh¨Ín©Îl©Îe§Î^¥ÎW£ÎR¤ÎP£ÎO£ÏO¢ÎP¢ÏN¢ÎN¢ÎN£ÏM¢ÎN¡ÏM¢ÏN¢ÎN¢ÎN¡ÏM¢ÎM¡ÎM¡ÏM¡ÎM ÎN ÎM¡ÎL¡ÎL¡ÎJ¡ÍL ÍK ÎK ÎK ÎLŸÍKŸÍJŸÍJŸÌKžÌJžÌIžÌJžÌKÌJÌJËJËJËJœÊJœÊJ›ËJ›ÊJšÊI›ÊIšÉJšÉJ™ÉI™ÈI˜ÈH™ÈH˜ÈI˜ÇI—ÇH—ÆH˜ÆG–ÆF—ÄF–ÅE–ÄE•ÃC”ÃC”ÂA“ÂA“Â@“Á@‘Á>‘À<À<¿:Ž¿9¿8¿7Œ¾6Œ¾5‹½4н3‰¾2‰½1ˆ¼0‡º/†º.…¸,„·-ƒ¶*‚µ*€³)€²(²(}²%|°#{°"{¯y®y­x¬v«u©u©t©s¨r¨r§p¦p¥o¤n£l£k¢j i hŸgžfœfœd›v¬v­v­v®w­x®y¯y®y°y°z°z°!{°#|±$|²$|²&}³(~³&~³-µÐâíÿÿüøù÷úúøûûùúú÷øùòøúôôôîóóí÷øóóôïóôîéêåààÜàáÛÍÍÈÈÈÆÄÆÄÄÅ·º¸±´¶©­®¥¨©¡¢¤¤¨ª£¦¥“—•’–“’˜š——™–ŒŽŠ‘‘’’Žˆ‰ƒŽŠŒŽŠŽŠŠ‹…„„€‚„~‚„ƒ„}‰‰Œ„•–ŽˆŽŒƒ‡”˜U¡ÌS¡ÎT¢ÌT¢ÍT¢ÍT¢ÏS£ÎS£ÎT£ÎR£ÎS£ÎS£ÎR£ÎR£ÎU¤ÎY¤Îa¦Îi¨ÎnªÎm©Îh¨Îc¦Í^¥ÎZ¥ÎT¤ÎQ¤ÍP£ÏP£ÎP£ÎO£ÎO£ÏN¢ÎN¢ÎO¢ÎO¢ÎO¢ÎO£ÎP£ÎN¢ÎM¢ÎM¡ÎN¢ÏN¢ÎO¢ÏN¢ÏN¢ÍM¢ÎL¡ÎM¡ÎL¡ÎL ÎL¡ÍM ÎL ÍLŸÍLŸÎMŸÍLŸÌMŸÍLžÍLžÌLžÌLžÌLžÌLËMËKœÊKœÊKœËLœÊJ›ÉK›ÉLšÉK›ÉIšÈJšÉJ™ÉJ™ÈI™ÈH™ÈH˜ÇG˜ÇF—ÆE—ÆF–ÅE–ÅD•ÄC•ÄC•ÄB”ÃB”ÂA“Â@’Â>’Á>‘À=À;À;Ž¿:¿8¾9‹¾6Œ¾6‹½4м4‰½2‰»2‡¹1‡¸1…¶.„·,ƒ¶*‚´+³*²*±(}°&}°%{¯!{®z­y­w¬vªu©tªt©s¨s¨q§p¥p¥o¥m¤l£k¡j hŸhŸgžfœeœw­v®v®w®x¯y®y°y°z±z±z± {±"|²$}²&|²&~²&~³+€µy°Š¹Õÿÿÿùúùûûùûûøüýøüüúüüù÷÷ñ÷÷ñôõïïðêèéäÞàÚÛÛ×ÐÑËÌÍÈ·¸¶»¼º°±¯£¥¤Ÿ¡¡ ¡ ¥¦¤ ¡žžžœ—˜–“”’“”’“‘Œ‹Œ„‘’‹Œ†ŒˆŒ‰Š‹†Žˆ‘Œ‰ƒ„~ŠŠ‚††}‚x~~uyyp{{r~~rƒ„y††|ŒŽ‡ˆ{r“¡P£ÒU¢ÌW¢ÌV£ÍU£ÌW£ÐV£ÏU£ÎV£ÎT¤ÏT£ÎS¤ÏS¤ÏT¤ÏV¤ÏZ¥Î`¥Îe¨Îi©Îi¨Íg¨Ìf¨Íd§Î`§Ï[¦ÏW£ÎR¤ÏP¤ÐQ¤ÐQ¤ÏP£ÐP¤ÐP£ÏP£ÏP£ÏP£ÏP£ÐP£ÏP¢ÏO£ÎO£ÎO¢ÏO¢ÎO£ÏN¢ÎN¢ÎO¢ÏO¢ÏN¢ÎM¢ÍN¢ÎM¡ÍN ÌN¡ÎN ÍN ÍO ÌNŸÌOŸÌNŸÌNŸÌNŸÌOŸÌNžÌMžËNžËOžËMžËMËLËLÊKÊKœÉKœÊJœÈIœÈJ›ÉJ›ÉJšÉI™ÈI™ÈH™ÈF˜ÇF˜ÆF—ÆF—ÆE—ÆE–ÅD•ÅC•ÄC”ÄB“ÃB’Â@’Â@’Á?‘À>‘À>¿>޾<Ž¿;¾9Œ½8Œ½7‹½6‹¼5‰»5‰º4ˆ¹3‡¸1…¶/„µ.ƒ´.‚³-²-€²+±(±'}°%|¯#{®"y® x¬w«v«uªu©t©s¨r§r¦p¥p¥o¤m£l¢k¡j iŸhŸgžfw®w®x¯!w¯y°z±z°z±{²{± |±"|±$}²%}²&~³'´)µ*€µ)€´Íáëþþüùû÷ûû÷ùûõùúô÷øóóóìêêâççàáãÝÚÛÕÉÊÄÈÉÃÌÍÆ³´±³³²¥¥£¨¨¨Ÿ ž¡¢ž ¡œžšž˜¡¢œ  š•”Œ‡‰‰‚ˆ‡€‰‰„„z‡ˆ……}‚„{†‡|}u|}uvywm{xn„‚wyynoocllapodxxm~}q„„y‚uƒqz‡…YŸÆR£ÏU¢ÍV£ÌW£ÍV£ÎV£ÏU£ÎV¤ÏV¤ÎU¤ÏW¤ÐT¤ÏS¤ÏT¥ÐU¥ÏY¤Î\¥Ï`¦Îe§Îh¨Íi©Íh¨Íh¨Îg¨Ïb§Ï[¦ÎU¥ÏS¥ÐR¤ÏQ¥ÏR¤ÏR¤ÏR¤ÏQ¤ÐP¤ÏQ¤ÐQ£ÏQ£ÏP£ÏP£ÐP£ÏP£ÏN£ÎP£ÏP£ÎP¤ÏO£ÎO£ÎP¢ÎO¢ÏP¢ÎP¢ÎO¢ÎP¢ÏP¡ÎO ÍO ÍP ÎPŸÍQ ÎP ÍQŸÍPŸÌPŸÌPŸÍPŸÍPžÌOžÌNžÌNžËOžËMžÌLžËLÊJÊKœÉJÉJœÉJ›ÉIšÉJšÉI™ÉH™ÈG˜ÇG˜ÇG—ÇF—ÆG—ÆG–ÅD•ÅE•ÄE”ÄD”ÄB“ÃA“ÂA’Á@‘À?À>À>À<¿;Ž¿9½8Œ½8Œ¼8‹»6Š»5‰¹4ˆ¹3ˆ·3†µ1…´/„´0ƒ³.€³+€±)°(}±%}°$|¯"{­"z­!x¬w¬v«u©tªt©s¨r§r§q¦p¥n¥n¤m¢k¡jŸiŸhžgœx®y¯y¯y°z±z°{±{²"|²"}±#}±$}²%~³(~³(´)€µ+¶+¶/ƒ·×æéÿÿúøùô÷øñøøñóòêëëáäâ×ãáÙØØÏÑÑɽ½·­®©¸¹´··²––‘›œ˜››–—˜“˜™”šš”””Œ‰ˆŽ†’‘ˆ”’ˆŽ‹‚€€u~|sŒŠ€w{xnƒ€t{znrpfllatsiutirqfwuiywlspdtoajhZmlarqfqm_um\vuig…ŒVžÅS£ÑU¢ÍU£ÎU£ÍT£ÎU£ÏU¤ÏV£ÏW¤ÐW¤ÐW¤ÐV¤ÐV¤ÏU¤ÏU¥ÐU¥ÏW¥ÏY¥Ï\¦Ïb¦Ïh¨Îj©Îl©ÏkªÏj©Ïe¨Ï_¦ÏX¥ÎV¤ÎU¥ÏS¥ÏR¥ÏS¤ÏS¥ÏQ¥ÎQ¥ÏR¤ÏR¤ÎR¤ÏQ¤ÏP¤ÏQ¤ÏQ¥ÏP¤ÏQ¤ÐQ¤ÐQ¤ÐQ¤ÎQ¤ÏQ£ÏQ£ÏQ¢ÎP¢ÍQ¢ÎQ¢ÏP¢ÏQ¢ÎQ¡ÎQ¡ÍQ¡ÍR¡ÍQ ÍQ ÍQ ÌQ ÌRŸÍP ÍQ ÌQŸÌOŸÌNŸÌNŸÌNŸÌLžÍMžËLÊJÊKÊJœÊJœÉJ›ÉJ›ÊIšÉI™ÉH™ÈH˜ÈI—ÈG˜ÇH—ÇG—ÆF—ÆH–ÆG”ÅD•ÄD”ÄB”ÃA“ÂA’Â@‘Á?Á?Á>¿=¿<޾;޾;½:Œ½9Œ¼8‹»7Šº6‰¸4‡·2†¶0†´1„´/‚´-²,±+~±(}¯%}¯${®#{­#y¬"x¬ x«w«vªuªt©s¨r¨q§q¦p¦o¥m£l¡k¢j ižix®y®z°z± z± {² {²#{²$|²#}²#~²$~³(~´)µ*€¶+µ,‚¶.ƒ¶*€µÅÝæÿÿùóôëïîãïîãâáÔÚØÌÑÏÄÒÐÆÃÁ·²±©–¨¨¢ ¡››œ———ˆˆ‡€’…Ž‹€Œ‚‹‰„ƒy~}s‚w€~s~}q€}rzwmnkaurg{wkxsh~{pxuipmarpdmk`ml`qodsqeig\jh\lj_fcVa\N_ZJcke`„’Y—µR¤ÑT¤ÑV¢ÍU£ÏU¤ÏV£ÎV£ÍU¢ÎU£ÏV£ÏV¤ÏW¤ÐV¤ÏV¥ÎV¥ÎV¥ÎU¥ÏV¥ÐW¥ÑY¥ÏY¦Î]¦Ïc§Ïi¨ÎjªÎkªÎi©Îe¨Îb¦Ï]¦ÏY¦ÏV¤ÎT¥ÐT¥ÐU¥ÐT¤ÏT¥ÐS¥ÏR¥ÏS¥ÏR¥ÏR¥ÏR¥ÏR¥ÏQ¥ÎQ¤ÏR¤ÏR¥ÏQ¥ÏR¥ÏR¤ÐQ£ÏQ¤ÏR¤ÏR£ÎQ¢ÎQ¢ÏR£ÏR¢ÎS¢ÎR¢ÎR¢ÍR¢ÌQ¡ÍQ¡ÌR¡ÍR¡ÍR ÍQ¡ÍQ ÍP ÍP ÌO ÍN ÍM ÌMŸÌLŸËLŸËKžËJžËKžÊJžÉJœÊK›ËKšÊIšÉJ™ÉI™ÉI˜ÈI˜ÈH˜ÈI—ÇH—ÇH–ÆE–ÅE•ÅC•ÄC•ÄB“ÃA“ÃA“ÂA’Â@’Á@‘Á>À>¿=¿<Ž¿<¾;Œ½:Œ½9‹»8Šº6ˆ¸5‡·4†¶1…µ0ƒ´/‚´.²,€±+~±(}¯&|°%|­$z¬#y­"y« xª w« vªuªt©t¨r¨r¦q¦p¦o¥n£l¢k¢k iŸy°z°!z²{² {±"{³#|±#}²$}²&~³&´'€´*€µ+€¶*‚¶-‚·-ƒ·1…·%~µ³ÍúóâèâÕâàÓàÝÐÍɽ¾±´®Ÿ¯ª¥¢˜š’˜•Œ•”‹“‡‘Ž„•”Š‹ˆ}|rˆ…yЇ{ˆ…y~zntqdrodpm`xth„t~{orocom`upcvsfgg\eeYhf[pncjh\cbVdbVcbVdbU]ZL[VG\WFXVHZfcW‚”VŸÅU§ÖU¥ÑV¢ÍV£ÍV¤ÎV£ÐW£ÏW£ÍW£ÎW£ÐW¤ÏV¤ÐX¤ÏX¤ÑX¥ÏW¥ÎW¥ÏW¥ÎW¥ÎX¥ÑW¥ÑX¥ÏX¦ÐZ§Î^§Ïc§Ïd¨Ïc¨Îc¨Îb§Îb¦Î_¦Ï[¦ÏX¥ÏU¦ÐW¦ÐW¦ÏV¦ÐV¦ÐU¥ÐT¥ÐT¥ÐT¥ÐS¥ÏS¥ÏS¥ÐT¥ÐS¤ÏT¥ÏS¥ÏS¤ÏS¥ÏS¤ÏS¤ÏS¤ÏS¤ÐS¤ÏT¤ÏR£ÏS£ÎT£ÎS£ÎR£ÎS¢ÍR¢ÍR¢ÎS¢ÏS¡ÎR¡ÎR¡ÍR¡ËO¡ÍP¡ÎP ÎN¡ÎN ÍO ÍN ÍM ÌMŸËLŸËKžÌKžËLÊLËKÊM›ÊK›ÊJšÊJ™ÉI™ÉI˜ÈI™ÈI˜ÈI—ÇH˜ÆH—ÆF–ÆE–ÅD•ÄC•ÄC”ÃC”ÃB“ÁB“ÁB“Á@‘Á?‘À>À=¿>¿>޾<޽;Œ¼9‹»8Š»6‰¹6ˆ¸2†¶1…µ1„´1ƒ´.³-€²+~°)}°(}¯'{¯${®"z¬"y¬"x«"w«"uª uª!t©s¨s¨ r§q§p¥o¥n£l¡k jŸz±{²!|±!|±#|±$}²%}²%~³'€³(´)€µ+‚µ,‚µ-‚¶.ƒ·/„·.„·0„·2…¸6†·¼ÌÌíâÑÏÍÂÓÐį«žŸ›Ž‡u‹nŠqˆƒuŒ†x’‹‡zˆƒv‹†zŠ…y†€s†t€{osm`qj]rk^mg[xrdyuhomagg[`_Sa^R`^RURFUTGUUIQQERQDNOCJJ>HF8C?0IE4JK?HVROpzTŒ©U¢ÌV§ÕV¤ÏW¢ÌW£ÌV£ÍW£ÍX¤ÎX¤ÏW¤ÎY¤ÎX¤ÎX¤ÏY¤ÏX¤ÎX¤ÍW¤ÏW¥ÏW¤ÏW¥ÏX¥ÏW¥ÑW¥ÑX¦ÐX¥ÏX¦ÐX¦Ï[¦Î]¦Î]§Ï]§Ï]¦Ï\¦Î]¦Ï\¦ÏZ¦ÎX¦ÏW¦ÏW¦ÏX¦ÏW¦ÏX¦ÏW¦ÏU¦ÐT¦ÑU¦ÐT¥ÐU¥ÐT¥ÐT¥ÐU¥ÐV¥ÐV¥ÏU¤ÐV¥ÏV¥ÎU¥ÏT¥ÏS¥ÐS¥ÏT¤ÏU¤ÏT¤ÐT¤ÏT¤ÎT¤ÎU£ÎT£ÍT£ÏT¢ÏT¢ÍR¢ÎQ¢ÍR¡ÍP¡ÌO¡ÍP¡ÎP¡ÍO¡ÎO¡ÍN ÌN ÌNŸÌMŸÌMŸËMžËMËLËLÊMœÊLœÊK›ÊJšÊJšÉJ™ÉI™ÉJ™ÈK˜ÇJ˜ÇJ—ÆH—ÆH—ÆG–ÅG•ÄF•ÄG”ÃD”ÂC”ÂC“ÁB’ÁA’Á@‘Á?À=¿>¾>޾;½;Œ¼8Œ»8‹º8‰º5ˆ¸5†¶3…¶2„´1„³/‚³.€²+±)~°(}¯&}®&{­${­"y«"y«"w«!v©!v©!u©t©!r¨ r§p¦p¥o£m¢l¡k !{±!|±"}²$}³$~³%³'³(´*´,µ,‚µ-ƒ·/ƒ¶.„·1„¹1…·1†·4†¸5‡¸1…¹H’¼®¾¿Ãº©µ¯¢œ˜Œ‰…xŠ„t„s„zf…}kˆ‚s‹„w…~oŒƒt†€r†~p†p‡s}wkxrfpl`snasnbjg\__RZYMRQFLK?KI=IG:CB599-24(//$*'$ #")2.:T[Fs†O¬TžÇU¦ÔU§ÔV£ÎW¢ÌX¤ÎX¤ÎX¤ÎY¤ÎY¤ÎX¤ÎX¤ÎY¤ÎY¤ÎX¤ÎX¤ÎX¤ÏX¥ÏX¥ÎY¥ÏW¥ÎW¥ÏX¥ÏX¥ÐX¦ÐX¥ÏX¥ÏX¥ÏW¥ÏX¥ÐZ¥Ï[¦Ï[¦Ï[¦Ï[¦ÏZ¦ÏZ¦ÏZ¦ÏY¦ÐX¥ÏW¦ÏX¥ÏY¥ÏY¥ÏY¦ÐX¦ÏX¦ÏW¦ÐV¦ÏV¦ÐW¦ÏV¦ÐV¦ÐV¦ÐW¦ÐW¦ÐV¥ÐW¥ÐW¥ÐU¥ÐU¥ÐU¥ÏU¥ÏT¥ÏV¥ÎV¤ÐV¤ÐV¤ÏU¤ÏU¤ÏT¤ÎT£ÏU£ÎT£ÎS£ÍR¢ÎQ¢ÍP¢ÎQ¢ÎR¡ÎP¡ÎP¡ÍO¡ÌO¡ÎP ÏN ÌNŸÌOŸÌNŸÌNžÌNžËMÊMËNËMœÊL›ÉMšÉLšÉLšÈL™ÈK™ÈK™ÇK˜ÇJ˜ÆJ˜ÆJ—ÆI—ÆH–ÅH•ÃG•ÃF•ÃF•ÃE”ÂC“ÂB“Â@’Á?À?¿>¿>޾>½;¼:Œ¼:Š»8Šº7ˆ¸5‡·4…µ3…µ1ƒ³0‚³.³,€±*°)}¯(|¯'{­%{¬$z¬#y«#xª!x©"v©!uª t¨!r§"r¨!q§p¥o£n¢l¡#}²#}²%}³%~³&³'€´(µ+‚µ+ƒµ.‚¶/ƒ·0„·1„¸1…¸2†¹3†¹5‡¹4‡¹5‡º9‰º4‡¹=‹»h•©…‹–Ž~”‡r”‰v‚o†xbˆ}i†}j„{iƒzk€{o{n}ylyuizntpchdWd_Q^\MVTGFF:<=112&+,!01&-,"#$  )-,Sc@x•N•½V£ÏW©×W¦ÓW£ÎV¢ÌW¢ÌW£ÍX¤ÎX¤ÎX¤ÎY¤ÎZ¤ÏY¥ÎX¥ÏY¥ÏY¥ÏY¥ÏY¥ÏY¥ÏY¥ÏZ¥ÏY¥ÏZ¦ÐY¥ÏX¥ÏX¦ÐX¦ÏY¦ÏX¥ÏY¥ÐX¥ÏX¥ÐY§ÐZ¦ÐZ¦ÐZ§ÐZ¦ÐZ¦ÐZ¦ÐZ¦Ð[¦ÐZ¦ÐY¦ÏX¦ÏY¥ÐY¦ÐZ¦ÐZ¦ÐY¦ÐY¦ÐZ¦ÐY¥ÏX¥ÏX¥ÏY¥ÏX¥ÏW¦ÏW¥ÏW¦ÏW¦ÐW¦ÏW¦ÏV¦ÐV¦ÑV¥ÐV¦ÐU¦ÏU¥ÐV¥ÏV¥ÎU¥ÏW¥ÏV¤ÏU¤ÐU¤ÏU¤ÏU£ÏU£ÎS£ÎR£ÎQ£ÎQ£ÏQ¢ÎQ¢ÍP¢ÎP¡ÎQ¡ÏP¡ÎQ ÎP ÎPŸÍOŸÍPŸÍOŸÌOžÌNžÊNžÊOËOœÊNœÉMšÉMšÉMšÈMšÈMšÈLšÆL™ÅL™ÇK˜ÆJ˜ÅJ˜ÆH—ÅH—ÄI–ÅF–ÄE•ÃF”ÃC”ÁB“ÂA’ÁB‘ÀAÀ@À>¿=޽<¼;Œ¼;Š»9й7ˆ¸6†·4…¶3…µ1„³0ƒ³/³-€²,±+~¯)|®&|®%{­${¬%y«%yª%xª#w©!u©"t¨$s¨"r¨ q¤ p£o£n¢$~³%~³'~³(€´)€µ*µ,ƒµ-ƒ¶-„·0„·1„¸2„¸2…¸4†¹3‡¹5‡º6ˆ¹6ˆº7‰»9‰»<‹»:‹¼6‹¿BŽ»Y©iŠ•tˆ‰~‡‚{}szxjyuglmcji_vrdmj]gdV]YKURDLI;B@3<;1--""#    &I\B|šRÅX¨ÔY¨ÕV¢ÌV¡ÊW¢ÌX£ÍX£ÎX£ÎX¤ÎY¥ÏY¥ÏY¥ÏY¥ÏY¥ÏZ¥ÏZ¥ÏY¥ÏY¥ÏY¥ÏY¦ÏZ¥ÏY¦ÏY¦ÏY¥ÐY¥ÏY¦ÏY¦ÐY¦ÐZ¦Ð[¦ÐZ§ÐY§ÏZ§ÏY¦ÐX¦ÐX¦ÐZ§Ï\§Ï[§ÏY§ÏY§ÏY§ÐY¦ÐZ§ÐY§ÐY¦ÐY§ÐZ§ÐY¦ÐY¦ÐY§ÐY§ÐZ¦ÐY¦ÐY¦ÏY¦ÐZ¦ÏY¥ÐY¦ÐY¦ÐY¥ÐY¦ÐX¦ÏW¦ÏX¦ÐW¦ÏW¦ÏV¦ÏV¦ÐW¦ÐV¦ÏU¦ÏV¥ÎV¤ÎV¤ÎW¥ÏV¤ÐV¤ÏU¤ÏT¤ÏT¤ÏS¤ÏS£ÏS£ÎS£ÎS¢ÎQ¢ÍR¡ÎS¡ÍR¡ÌR ÍQ ÍRŸÍQŸÍQŸÍQŸÌPŸËPŸÊOžÊOÉOÈNÉNœÉNœÈMœÉNœÉM›ÇMšÆMšÆL™ÆK™ÇI™ÆI™ÆI˜ÅI—ÆH—ÅH–ÄG–ÃE•ÃE“ÂE“ÂE“ÁB’ÁCÀA¿>¾=޽<½<‹¼;‹»9й7ˆ¸7‡·6†¶3…µ3…µ2ƒ³1²/².²,~¯*}¯(|¯'|­'{¬'{«%zª&xª%xª$w©%u©%t¨"s¦#r¥!q¥p£&~³'´(€µ*‚µ+‚µ,ƒ¶.„¶/„·0…¸1…¸3…¹4†º5‡»5ˆº6ˆ»6ˆº8‰»9м9‹¼;‹¼<‹¼?޽@޽>Ž¿<Â=‘ÄB’ÁE’¾J‘¹JµEŒ³u£¶¤«ŸdcV      *)2Q[Fz”SÄX¨ÖW¤ÏW£ÌX¤ÎX¤ÏY¥ÏZ¥ÏZ¥ÏZ¥ÏZ¥ÎZ¦ÏZ¦ÏZ¦ÏZ¦ÏZ¦ÏZ¦ÎZ¦Ð[¦Ð[¦Ð[¦ÐZ¦ÐZ¦ÐZ¦ÐY¦ÐY§ÐY§ÐY§ÏY§ÐY§ÐZ¨ÏZ§ÐZ§Ð[§Ï\§Ï\§Ð\§Ï\§Ï[§ÐY§ÐX§ÐY¦Ð[§ÐZ§ÐZ¨ÏZ§Ð[§Ð[§ÏZ§Ï[§ÏZ§ÐZ§ÐZ§ÏZ§Ð[§ÐZ¦ÐZ¦ÐZ§ÐY¦ÐY§ÏY¦ÐY§ÏZ¦ÏY¥ÏY¥ÏX¦ÏX¥ÏX¥ÐW¦ÏW¦ÑW¦ÐX¥ÏW¥ÏW¤ÏW¤ÏW¤ÎW¤ÎV¤ÐU¤ÏU¤ÏT¤ÏU¤ÎT£ÎT£ÎS£ÎS¢ÍT¡ÎS¡ÎS¡ÌS¡ÍS ÍR ÌQ ÌRŸËQŸËQŸËQŸÊPŸÊPŸÊOžÉOžÉOÉOžÊNžÉNÉOœÈMœÇM›ÈLšÈLšÇJ™ÇJ™ÆJ˜ÆJ˜ÆI—ÄI—ÄH–ÄG•ÄG•ÂF”ÁE”ÁC’ÀA’À@¿?¿?¾<½<Œ¼<‹º9Џ8ˆ¸8‡·5‡·5†¶3„´2‚³1‚³0³/€±-€°,~¯*}­*|­)|«({«)zª'y©&x©'w©&u¨&t§$s¦%r¤"q¥(€µ*µ+¶,ƒ¶-ƒ·/„¸0…¸1†¹3†¹4†º5‡º4ˆ»5ˆ»6Š»8‰»8Š»:‹»;Œ¼;Œ½=Œ½>޾?Ž¿A¿A½C¿D‘¾E’¿F”ÀD”ÂF•Ã’¸Æ”“„76+    #% !*&$-(#-($.)+5/1:67?<9?:7;3=A:GXZP|‘UžÅX©ÔX¤ÐZ¤ÏZ¥ÏX¥ÏZ¦Ï[¦Î[¦Ï[¦Ð[¦Ð[¦Ð[¦ÐZ¦Ð[¦ÐZ¦ÐY¦ÏZ§ÐZ¦ÐY§ÐZ¨ÐZ§ÏZ§ÐZ§ÐY§ÏZ¨Ï[¨Ï[§Ï[§Ï[§Ï\¨Ï\§Ï\§Ð[§Ï\§Ï[§Ï\§Ï[¨Ï[¨Ï\§Ð[§Ï\§Ï\§Ï\§Ï[§Ï\§Ï\§Ð\§Ï\§Ï\§Ï\§Ð[¨Ï[¨Ï[§Ï\§Ï\§Ð[§ÐZ§Ð[§Ð[§ÐZ§ÏY§ÐY¦ÐZ§ÏY§ÐY¦ÐY¦ÐY¦ÐY¥ÏY¦ÏX¦ÏX¥ÏY¥ÏX¥ÏX¥ÎW¥ÎW¥ÎV¥ÏU¥ÏW¥ÏV¤ÏU£ÎT¤ÏT£ÎT¢ÏU¡ÎT¢ÎT¡ÍT¡ÍS¡ÌS ÌR ÌSŸËRŸËR ËRŸÊRŸÊQŸËQŸÊPžÊOžÉOžÉOžÊMÈMÈLœÇM›ÈLšÈLšÇL™ÇK™ÇK˜ÆK˜ÅJ˜ÅI—ÅI—ÄH–ÃG•ÀF”ÂE“ÂB’ÀA‘ÀB¿@¿?޾?¼>Œ»<‹º:й9‰¸6ˆ¸6†·5…¶5„µ3ƒ³1‚´0³.±.€°-~°,}®+}­*}­)|«){«(zª(x©(w¨(v§(u¦'t¦$r¦+·-‚·.ƒ·.„·1…¸2…º2†¹4‡¹5‡º5ˆ¼7‰¼7‰¼7м8м:‹¼<Œ½=Œ½>Œ¾?޾@¿@¿A¿C‘¿C’¿D’ÀD”ÀF•ÁG•ÁE’¾¹Ïѹ®˜  #"(!&+$)/'*1*-5.06./7/3:57>9=C>CJDFMFJOHLPJNUPPWQRXRSZTTZTZ_[Z^ZY\UUVOP_bS†ŸZ¦ÑZ¥ÑY¥ÎZ¦Ï[¦Î[¦ÏZ¦ÐZ§ÐY¦ÐY¦ÐZ§ÐY¦ÏY¦ÐZ§ÐZ§Ï[§Ï[¨Ï[§Ï[§Ð\§Ï\§Ï[§Ï\§Ï[§Ð\§Ï\§Ï\§Ï[§Ï\§Ï\§Ï\§Ï\§Ï]§Ï\§Ï\§Ï\§Ï\§Ï\§Ï\§Ï\§Ð\§Ð\¦Ï\§Ð]§Ð\§Ð]§Ð]§Ï]§Ï]§Ï\§Ï\§Ï]§Ï]§Ï]§Ï]§Ï\§Ï\§Ï\§Ð\§Ï[§Ï[¨ÏZ§ÏZ§ÏZ¨ÏZ§ÐZ¦ÐZ¦ÐY¦ÐX§ÐY¦ÏZ¦ÐZ¦ÐY¦ÏX¥ÏW¥ÏW¥ÎW¥ÎV¥ÏW¥ÏV¤ÏV¤ÐV¤ÏV£ÎV¢ÍV¢ÎU¢ÎU¢ÍT¡ÍT¡ËT¡ËT¡ËT¡ËS ËS ÊS ÊR ËRŸËPŸÊPŸÊPŸÊOžÊNžÉMžÉMÉNœÈLœÈL›ÇL›ÇLšÇLšÇK™ÆK™ÆK˜ÆJ—ÅI—ÅH–ÄG”ÂE”ÂD“ÁB“ÀB‘¿A‘¾@¿@޽>¼<Œ»;‹º:й8‰¸7ˆ·6‡¶6…¶5…µ2ƒ´2ƒ³1‚³0²/€°.€¯.~®,~­*}¬*|¬*{«*z«*y©*x©)w¨'u§'t§-‚·1„¹1„¸2…¹4†º4‡º6ˆº7‰¼6‰¼7н8м:‹¼;‹½<Œ½=¾>޾?¿@¿AÀA‘ÀB‘ÀC’ÁD’ÁE“ÁF”ÁG•ÁI–ÁA“™»ÆõèÏâÜɰ¬™’sshddZ[^SPSHSTJRUMTVMRTJTYRRTLPQJJPIRYSV\W`e_ekdmrloskooexwoqtlorkfjdeibhje_c^\]WZ]XKNMHLIKlzZ¥ÍZ§Ï[¦Î[¦ÐZ¦ÐZ§ÏZ§ÐY§ÐY§ÏZ§Ð[§Ï\§Ï\§Ï\§Ð\§Ï[§Ï\§Ï\§Ï\§Ï\§Ï\§Ï]§Ð]§Ï]§Ï^§Ð]§Ð]§Ð^§Ð^§Ð^§Ð^§Ð^§Ð^§Ð^§Ð^§Ð^§Ð]§Ð^§Ð^§Ð^§Ð^§Ð^§Ð^§Ð^§Ð^§Ð_§Ð^§Ð^¨Ð]§Ð^§Ð^§Ñ^§Ð]§Ð^§Ð]§Ð^§Ï^§Ð^§Ð]§Ð\¨Ï\§Ð\§Ï\§Ï\§Ï\§Ï[§ÏZ§ÐY§ÑY§ÑZ§ÐZ§ÏZ¦ÑZ¦ÑZ¦ÏX¥ÏX¦ÏX¦ÏW¥ÏW¥ÎW¤ÎW¤ÎW¤ÏW¤ÍX£ÍW£ÎW£ÍV¢ÍU¢ÌU¢ÌT¡ÌU¢ÌU¡ÌU¡ËS¡ËT¡ËS¡ËS ËR ËRŸÊQŸËPžÊOžÊOÉPžÉNÈNÈLœÇM›ÈL›ÈLšÇL™ÆK™ÆK—ÅJ—ÅI—ÅH•ÄF•ÃE”ÂD“ÁA’¿A‘¿A¿@¾?½>¼=Œ»<‹»<Šº9‰¸8ˆ·7‡·6‡¶4…µ4„´3ƒ³3ƒ³2‚²1°/€¯.®-~®,}­,|¬,{«,{«+yª*xª*w¨)v¨0…¸3†¹4†¹5‡»6ˆ»7‰»8м9м:‹½9‹½;‹½;Œ¼=޾>Ž¿@Ž¿A¿AÀA‘ÀA’ÁA’ÀB“ÀD“ÁF”ÂG•ÂG–ÄI–ÃI•ÃU›ÅàâÕ÷ñÛñìÙïéÔêâÌÜÖÁÖнÔη̧½µ±¨³¬“¦ ¤Ÿ‹©¢Žœš‹’’ƒ™˜ˆŒ}„†|}€w„{ƒz|~vuvn}}uttkqsmhlfbc^Y[XVXSLMFEKHHMMCC@Nq€[ªÕZ¦ÏZ§ÏZ§Ð[§Ï\§Ï\§Ï\§Ð\§Ï\§Ï\§Ï\§Ð\§Ñ]§Ñ\§Ð]§Ï^§Ð^§Ð^§Ð^§Ð]¨Ð^§Ð^¨Ð]¨Ð^§Ð^§Ð]§Ð^§Ð^§Ð]¨Ð\¨Ð]¨Ð]¨Ð]¨Ð]¨Ð\©Ð]¨Ð]¨Ð]¨Ð]¨Ð]¨Ð]¨Ð]¨Ð]¨Ð]¨Ð]¨Ð]¨Ð]¨Ñ]¨Ð]¨Ð]¨Ð]¨Ð]¨Ð]¨Ð^¨Ð]§Ð]¨Ð]¨Ð]¨Ð^§Ð]¨Ð]§Ð]§Ð]§Ð]§Ð\§Ï\¦ÐZ§ÏZ§Ð[¦ÐZ¦ÐZ§ÐZ§ÐZ§ÐZ¦ÏZ¦ÏZ¦ÏZ¦ÎX¥ÏX¥ÎY¥ÎX¤ÏY¤ÏX¤ÎX¤ÎW£ÎU£ÍV£ÍU¢ÌV¢ÌV¢ÌV¢ÌU¢ÍU¢ÌT¢ËT¡ËS¡ËS¡ÌQ ÌQŸËQŸÊQŸÉPžÉPžÈOÉNÉNœÈNœÈM›ÇMšÆL™ÅL˜ÅL—ÄK—ÄK–ÃI–ÄF•ÂE”ÂD“ÁB’ÀC‘¿B‘¾B¾A¼?¼?Œ¼>Œ»<Šº;Š·9‰¸8‡¶8†¶6…¶5…µ3ƒ´5ƒ³2ƒ±0°/€°.¯/®/~®.}­-|¬.{«+y«+yª+x©5‡¹5‡º6ˆ»7‰º:‰»9‹¼:м:Œ¾;Œ½=Œ¾>¿>¿>¿@¿BÁA‘ÀB‘ÀB’ÁB“ÀD“ÂD”ÂF”ÃH•ÃI–ÄI—ÄL˜ÃF•Åq¨ÆöðÝõíÔïéÕæàÍ×Í·ÒË´ÓιŽ§À¸¡Ä¾§Áº¦¸°™³ª’¾²—ƾ¦Á»§¸±¸°™³©“³®›¬§•  ’š›Œ€€v}~trrijjappg_`ZX[UKPNBC?DE>DGBEHEEE?S‰£\¬Ö\¦Î\§Ï\§Ï\§Ï\§Ï\§Ð]§Ð^§Ð^§Ð^§Ð^§Ð^§Ð^§Ð]¨Ð^§Ð^¨Ñ^¨Ñ]¨Ñ]¨Ð]¨Ñ]¨Ñ^¨Ð]¨Ð]¨Ð]¨Ð^¨Ñ^¨Ð]©Ñ^¨Ñ]¨Ð]¨Ð]¨Ð]¨Ð^¨Ð]¨Ñ^¨Ñ^¨Ð^¨Ñ^¨Ñ^¨Ñ^¨Ñ^¨Ñ^¨Ð^¨Ð^¨Ð^¨Ñ^¨Ð\¨Ð]¨Ð]¨Ð^¨Ñ]¨Ð]¨Ñ]¨Ð\¨Ð\¨Ð]¨Ð\¨Ð]¨Ð]¨Ñ]¨Ð\¨Ð]§Ð]§Ð\¨Ð\¨Ð\§Ï\§Ï\§Ï[§Ï[¨Ï[¨Ð[§Ð[§Ð[¦ÐZ¦ÏZ¦ÏY¥ÏY¥ÏZ¥ÏY¥ÏY¥ÏX¤ÎW¤ÏW¤ÍW¤ÍX¤ÎW£ÍW£ÍW£ÎW£ÍV£ÌW£ÍU¢ÌT¢ÍT¢ÍS¡ÌS ÌS ËR ÉRŸÉQžÉPžÊOžÉPÉOœÇN›ÆN›ÇN›ÆNšÆN™ÅM˜ÅM˜ÅJ—ÃG–ÂG•ÂE•ÂD“ÁC“ÀC’¿C‘¾B¾B½A޼?¼>Œ¼=‹º;Šº:ˆ·8‰¸8ˆ·7†¶7…µ6…´4„³3ƒ²1°0°0€¯0¯0~®0}­0|­.{¬,z«+zª7ˆ¹8‰º9м9‹¼9‹¼;Œ¾:Œ½;½=¾>¿@Ž¿@¿@ÀAÀB’ÁB’ÂC’ÂD’ÂD”ÂE”ÂF•ÃG–ÃI—ÅJ—ÄK˜ÃM™ÅF–Åw­ÉõîÙôëÕëåÒÝÕÁÝÓ½Ò˶Òλƿª¸±ž¸®•¿· Å¾«»³µ¬—º±š«¥­¨–§¢Ž§¢°¬›¯¬›¢¡”Œ€Ž€€tttjoocef_kjaYYPQRNJMICD>DE>EF@FHBFC9Oek\©Ñ]§Ï]§Ð]§Ï]§Ð^§Ð^§Ð^§Ð^§Ð^§Ð]§Ð]¨Ð]¨Ð]¨Ð^¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ð^¨Ð^¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ^¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ^¨Ñ_¨Ñ_¨Ñ_¨Ñ^¨Ñ]¨Ð^¨Ñ_¨Ñ^¨Ñ_¨Ñ^¨Ñ^¨Ð^¨Ð^¨Ñ^¨Ð^¨Ð]¨Ð]¨Ð\¨Ð]©Ð]¨Ð^¨Ð\¨Ð\¨Ñ]¨Ð^§Ð]§Ï]§Ð]§Ð]§Ð\§Ï[¨ÏZ§Ï[¦ÐZ¦ÐZ¥ÎZ¥ÏZ¥ÏZ¥ÏZ¥ÏY¥ÏY¤ÎX¤ÎX¤ÎX¤ÎX¤ÎY¤ÎX£ÎW¤ÍX¤ÍW£ÍW£ÍV£ÍV¢ÌV¡ÌU¡ÌT¡ËS ÊR ÉQŸÊQžÉQžÈQžÇPÈPœÈQ›ÇP›ÆPšÇN™ÅM˜ÅL—ÄJ–ÄH–ÃG•ÂF•ÂD”ÁD“ÀD’ÀC‘¿B½B½A޽@¼>‹»>‹»<й:‰¹:ˆ¸9‡·9‡¶7†¶7…´5…³2„²2ƒ±1‚±2°2°2~®2~­0}¬/|¬.{«:‰»:Š»;‹¼;Œ¾;¾<¿=¾>¿?¿@ÀAÁB‘ÁB‘ÁB’ÁD’ÂF“ÃF”ÃF”ÄG•ÄH–ÃI—ÄI—ÄK˜ÅK˜ÄN™ÅPšÇJ˜Çe¥ÆçâÏðçÑäÜÈØÑ¾ÕκËÄ®Ò˵ÇÀ©º´ «£¶ª’±©“«¢‹¨Ÿ‡§„š“|§££  œ‹¡ ‘”“…Œ~{zmyymcd[VWOVWOPQHPRLPPGMNFIJB;=8IKEIJAIJANNDS[V\ Ä^©Ó^¦Ï^§Ð^§Ð^§Ð]¨Ð]¨Ð]¨Ð^§Ð^¨Ð^¨Ð_¨Ñ_¨Ñ_¨Ñ_©Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ`¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_§Ñ_¨Ñ_¨Ñ_©Ñ_¨Ñ_¨Ñ^¨Ñ^¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_§Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ^¨Ñ_¨Ñ^¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ^¨Ñ^¨Ñ^¨Ñ^¨Ñ^¨Ñ]¨Ð]¨Ð^§Ð^§Ð^§Ð^§Ð^§Ð]§Ð^§Ð\§Ï[§Ï[¦Ð[¦Ï[¦ÏZ¥ÏZ¦ÏY¥ÏZ¥ÏZ¥ÏY¥ÏY¤ÏZ¥ÏY¤ÎY¤ÏY¤ÏZ¥ÎX¤ÎX¤ÎX£ÍY£ÎX£ÍW¢ÍU¢ÌU¢ÌT¡ËS ÊT ÊS ÊSŸÊRŸÊQŸÉRžÉRÇQœÆQ›ÆPšÅO™ÆN˜ÅL—ÄJ–ÃI–ÃG–ÂG•ÁE”ÁD”ÀD’¿C‘¿C¾B¾A޾@½?Œ¼>‹»<Šº<‰º;‰¹:ˆ¸9‡·9†µ8†´7…´6…³3„²4‚²3‚±3€°3®2¯1~®1}­:‹¼;Œ½<½=¾>Ž¿=Ž¿?Ž¿@ÀA‘ÀB‘ÁB‘ÁC’ÁD“ÂE“ÃF”ÃG”ÃH•ÃH–ÄI–ÅJ—ÅK˜ÆK™ÅL™ÅNšÆN›ÇQœÆQÇMœÈ¹ÇÄòåÊÙѹÑɲɬ½·¢º³›¶®–¹±›¤›‚§›—Œq–u’Šu–|‰lŽˆv–“ƒŽŠx†…wWXNeeZmma^_S\]SNOHKNFEHAHJDJLCNNCIH‹»=Š»;й;‰¸;ˆ·:‡·9‡¶8†µ8…´6„´4„±6ƒ²6‚±5°4€°2®>¾>޾>޾>¿>¿@À@ÁA‘ÁB‘ÁB’ÂD’ÂE“ÃE”ÃF”ÃH•ÃI–ÄI—ÄJ—ÅJ—ÆK˜ÆL™ÆMšÆNšÇPœÇPÇPÇRŸÇMœÉo©ÆÙÓÀÜÔ¼Ë캤´­˜¯¨’¥œ‚³¨Žœ“}‹‚iˆr›•‚zf‹…qƒ{e{vd‚~mxsbhdXKLAXXMYZOMMBII@CE>GIAIKBEGMG5SPAON>VRBUTEUP>^hc^¦Í^¨Ñ^¨Ð_¨Ñ^¨Ñ_¨Ñ_¨Ñ_¨Ñ^¨Ñ_¨Ñ_¨Ñ^¨Ñ_¨Ñ_©Ñ_©Ò_©Ñ`©Ò_©Ò_©Ñ_©Ò`©Ò_©Ñ_¨Ñ`¨Ò_©Ñ`¨Ñ_©Ò_©Ñ_©Ò_©Ñ_©Ò_©Ò`©Ò_©Ò_¨Ñ_©Ò^¨Ñ^¨Ñ^©Ñ^¨Ñ^©Ñ^©Ñ]©Ñ^©Ñ_©Ñ^©Ñ^©Ñ_©Ñ^¨Ñ^¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ^¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ]¨Ð\§Ð]§Ï\§Ð[§Ï[¦Ï[¦Ð[¦Ð[¦ÏZ¥ÏZ¦Ï[¦Ï[¦ÎZ¦ÎZ¦Ï[¥Î[¤ÏZ¥ÏZ¥Í[¤ÍZ¤ÍY¤ÎY¤ÎY¤ÍV£ÍV£ÍV¡ÌU¡ËU¡ËT¡ËT ÊTŸÉTŸÈSŸÉSžÈSÈRœÈRœÆP›ÆNšÅN™ÅM™ÃL—ÄJ—ÃI–ÂH•ÁG”ÁE“¿D“ÀD‘¿C‘¾A¾A¿B޾@¼?¼?‹¼?Š»=й<ˆ¸;ˆ¸:ˆ·:‡·9‡¶8†µ5…´6„´8ƒ²7‚²6‚±5¯AŽ¿AÀAÀ@‘ÀA’ÁA‘ÁA‘ÃB’ÂC“ÂE“ÃF“ÃG•ÅH•ÄH•ÄI—ÅI—ÆJ—ÅJ˜ÆL™ÈM™ÇNšÇM›ÇOœÆPÇQžÈQžÉRŸÉT ÉLˬ¿ÔÊ´À¹¤²«—¦ž‡¯§©¡ˆ™’ކo~v_ƒ|hytamhUlfSe^K]YIRO?\YJHH;A@3JG9ML=NL?HGUQ>XTC\P9_…’^­Ù_§Ï_¨Ñ_¨Ñ_¨Ñ^©Ñ^©Ñ_©Ò_©Ò`©Ò`©Ò`©Ò`©Ò`©Ò`©Ò`©Ò`©Ò`©Ò`©Ò`©Ò`©Ò`©Ò`©Ò`©Ò`©Ò`©Ò`©Ò`©Ò`©Ò`©Òa©Ò`©Ò`©Ò`©Ò`©Ò`©Ò`©Ò`ªÒ`©Ò_ªÒ_ªÒ`©Ò`©Ò_ªÒ_©Ò_©Ò^©Ñ^©Ò^©Ñ^©Ñ_©Ñ^©Ñ^©Ñ^©Ñ_¨Ñ_¨Ñ^©Ñ^¨Ñ^©Ñ_¨Ñ^¨Ñ^©Ñ_¨Ñ^©Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_¨Ñ_©Ñ`¨Ñ_¨Ñ^¨Ð]¨Ð]§Ð]§Ï\§Ï\¦Ð]§Ð[¦Ð[¦Ð[¦Ð[¦Ð[¦Ð[¦Ð[¦Ñ[¦Ï[¥Î[¤ÎZ¥ÏZ¥ÎY¥ÎY¤ÎY¤ÍY¤ÎX£ÎX£ÍW£ÍW¢ÌV¢ÌU¢ËV¡ÊW¢ÉW¡ÉX ÉUŸÉSžÈSÈRÇQœÇP›ÆPšÅN™ÆN˜ÆL˜ÄK—ÃI–ÂH•ÂH”ÀF”¿E“ÀE’ÀD‘¿B¿B½B¾B޽A¼?»?Œ»>‹º=Šº<‰¹;‰¹;ˆ¸:ˆ¶:‡·9†µ8…´9„´8ƒ´6ƒ²A‘ÀB‘ÁB‘ÁC’ÂC“ÂB’ÂD“ÃE”ÄE”ÄG•ÅG•ÄH–ÅI—ÅI—ÅJ˜ÆJ˜ÅK˜ÆL™ÇLšÇN›ÇOœÈOÇPžÈQžÉRŸÉRŸÉSŸÊV¡ËX¢ËR¡Í|§¹ª¨˜¥žŠ œŠª£ˆs„nphUf\EtnZnhWg`O\VDRM:PK8UO@SQ@RO@QO?TP>WSBRNPM>WTASNbZEB?,MD/L?'GD2Sow_¥Ì`ªÔ`¨Ñ`©Ò`©Ò`©Ó`©Ò`©Ó`©Ó`ªÒ`ªÒ_ªÒ^ªÒ_ªÒ_ªÒ_ªÓ_ªÒ_ªÒ_ªÒ_ªÒ_ªÒ_ªÒ_ªÒ_ªÒ`ªÒ_ªÓ_ªÒ_ªÒ_ªÒ_ªÒ_ªÒ_ªÒ_ªÒ_ªÒ`ªÓ`ªÓ`ªÒ`ªÒ`ªÒ`ªÒ_ªÒ`ªÒa©Ò`ªÒaªÓaªÓ_ªÒ^ªÒ`ªÓ`ªÓ`ªÓ`ªÓ_«Ó_ªÒ_ªÒ^ªÒ`ªÒ`ªÓ_ªÒ_ªÒ_ªÒ_ªÒ_ªÒ_ªÓ_ªÒ_ªÒ_ªÒ_«Ò_ªÒ_ªÒ_©Ò_©Ò^©Ñ^©Ñ]©Ñ^©Ñ^©Ñ_©Ñ^©Ñ^©Ñ^©Ñ^©Ñ^¨Ñ^¨Ñ]¨Ð\¨Ð]¨Ð\¨Ï\¨Ï]§Ð\¨Ð\§Ð\§Ï]§Ð]§Ð]§Ï\¦Ï[¦Ï[¦Î[¥Ï[¥Î[¥Î\¤Í[¤ÍZ¤ÍZ£ÌY£ÌZ£Ë^¤Ìd¦Ìf¦Ìd¥Ëa£Ë\¡ÊX ÉTŸÉSžÈRÈQœÇPœÇP›ÇOšÅN˜ÆL˜ÅL—ÄJ—ÃI–ÂH•ÁH•ÁG”ÁG“ÁE“ÀE’ÀD‘¾D‘¿C¾B¾B½B޼@Œ½@Œ¼?¼>Œº=‹º=‰º=‰¹<‡¸<‡·;†·F”ÂF”ÃF”ÄF•ÅG•ÄG–ÅI–ÆI—ÅJ˜ÆJ˜ÆK™ÆLšÇLšÇNšÈM›ÈN›ÉNœÊOÉOÉOžÉQŸÉQŸÊR ÊT¡ËV¢ÌPŸÊMÊj¬ÎÇ×¼ÕÙ×ß×âáÔáÜÊÍĬ¦ ŠfbOXTBf`Ja[GVP;YR=UO9RJ4NF2PJ7UM8VN:RK8SL7WO:d[F`XCWR=VO:RK7MH4JF2C@,?<)//:HBNt€\¾cµäa¯Ú`«Ô_ªÓ_©Ð_©Ò_ªÒ_ªÓ_ªÒ_ªÓ_ªÒ_ªÒ_ªÓ`ªÓ`ªÒ`ªÓ`ªÓaªÓaªÓ`ªÓaªÓ`«Ó`«ÓaªÓaªÓaªÓaªÓaªÓaªÓaªÓaªÓaªÓaªÓb©ÓaªÓaªÓaªÓaªÓaªÓa«Óa«Ôb«ÔaªÓ`«ÓaªÓaªÓaªÓaªÓaªÓaªÓaªÓaªÓaªÓaªÓaªÓa©ÓaªÓb©ÓbªÓaªÓaªÓaªÓaªÓaªÓaªÓaªÓaªÓaªÓaªÓ`ªÒ`ªÑ`ªÒa©Ò`©Ò_©Ñ_©Ò^ªÑ_©Ò_©Ò^ªÑ`©Ñ`ªÓ`ªÒ_©Ñ^©Ñ_©Ñ_©Ñ^©Ñ]©Ð\©Ð]©Ñ\¨Ð\¨Ñ]¨Ñ^¨Ð]¨Ð^¨Ð]§Ð]§Ï]§Ï]§Ï]¥Ï]¥Î]¤Î]¤Î]¤Î]£Î\£Í]¤Í`¥Íe§Íf¦Íd¥Ëc¤Ì^¢Ë[ ÊW ÉUŸÉSžÈQžÈPÇPœÈP›ÇOšÇN™ÆN™ÅN˜ÅL—ÄL—ÃJ–ÂJ•ÂI•ÂG”ÀF”ÁF“ÀE“ÀE’ÀE’ÀDÀC¾C¾A޾B޽A¼?»@Œº?Šº>Šº=‰¹=ˆ¹G•ÂG•ÄG–ÅH–ÅI—ÅH—ÅJ—ÆK˜ÆK™ÆLšÇMšÇN›ÉN›ÉN›ÉNœÉNÊPËPžÊQŸÊRŸÊR ËR ËV¢ËS¡ËLÊj¬Ð¶ÔÞðóèÿùå÷ïÚúöãùòÞíäÎà×¾æÝ¨¡‰44$        ".):U^EgtJxŠW‘«\£Æ^«Ó`®Ù`­×`ªÓ`©ÑaªÓa©ÓaªÓaªÔa«Óa«ÓaªÓaªÓaªÓaªÓaªÓaªÓb«Ôb«Ôb«Ôa«Ób«Ôb«Ôb«Ôa«Óa«Óa«Ó`ªÓaªÓaªÓa«Ôa«Óa«Ôb«Ôa«Ôb«Ôb«Ôc«Ôc«Ôb«Ôa«Ôa«Ôa«Ó_«Ó`«Ó`«Ó`«Ó`«Ó`«Ó`«Ó`ªÓa«ÔaªÓaªÓaªÓaªÔ`«Óa«ÓaªÓ`ªÓaªÓaªÓ`ªÓa«ÓaªÓaªÓaªÓaªÓaªÒa©Òa©Òa©Òa©Ò`¨Ò`ªÒ`ªÒb«Ób«Ód«Ôc¬Ób«Ò`ªÒaªÑaªÒ`ªÑ_©Ò_©Ñ^©Ñ_©Ð^©Ñ^©Ñ^©Ñ^©Ñ_¨Ñ_¨Ò^¨Ð^§Ð]§Ð^¦Ï^¥Ï^¥Ï_¥Ï^¥Ï_¥Î_¤Ï_¤Îa¥Îd¦Îd¦Îd¥Íb¤Ì^¢Ë\¡ÊX ÊV ÉTŸÉRžÉRžÉQžÉPÉPœÈP›ÇP™ÇO™ÆO™ÆN—ÅM—ÃM—ÄK–ÄI•ÂH•ÃG•ÂG”ÁG“ÁE“ÂE’ÀD’ÀD‘ÀD¾B¾B½C޾A޼B»AŒ»@‹º?ŠºI–ÄJ–ÄJ—ÅJ—ÆJ˜ÆK˜ÇL™ÇLšÈMšÈM›ÈOœÈNÈNÉOËOžÊPŸÊQŸËRŸËR ËT ÌT ËU¢ÌPŸËZ£Ì§ÌÚïôìÿÿõýüðøøêçâÐíéÖïêØíæÒôïÝãÝËÞÖÀËÄ­š—†feYDE<7:3()$        '%10(/2+DMJL_aPq|[Šž^œ»`©Òa­ÙaªÓa©ÒaªÓa«Ôa«Ôb«Ôb«Ôb«Ôa«Ôa«Ôb«Ôb«Ôb«Ôc«Óc«Óc«Ôc«Ôc«Ôa«Ôb«Ôb«Ôa«Ôa«Ó`«Ó`«Ób«Ôb¬Ôb¬Ôb«Ôb¬Ôc¬Õc¬Õc¬Õc¬Õb¬Ôb¬Ôa«Ôa«Ôa«Óa«Óa«Ôa«Ôa«Ó`«Óa«Ó`«Óa«Óa«Ó`«Ó`«Óa«Ôa«Ôb«ÔaªÓa«Ó`«Ó_¬Ó`«Ó`«Ó`«Ó`«Ó`«Óa«ÓbªÓbªÓaªÓa©Óa©Ób©ÓbªÓb«Ód«Óe«Óe¬Ód¬Óe«Óc«Ód«ÒcªÒa«Òa©Óa©ÒaªÑaªÑ`ªÑ`©Ò`©Ò_©Ñ^©Ñ_©Ñ_¨Ñ_¨Ð_§Ð_§Ï_§Ð_§Ï_¦Ï_¦Ï_¥Ï_¥Ï_¥Î`¥Ïa¤Îa¥Îa¥Î`¤Í]£Ì[¢ËX¡ÊW¡ÊV ËT ÊT ÊTŸÊSžÉSÉPœÈQ›ÈR›ÇQšÆPšÆO™ÆN˜ÅM—ÅK—ÄJ—ÄH–ÄH–ÂI•ÃG”ÂG“ÁE“ÁF“ÁE’ÀE’ÀD‘¿D‘¿D¿C½D½C½A¼K˜ÅL˜ÇK˜ÆL™ÇL™ÇM›ÈM›ÉNœÉNœÉNÈOÊOžÊOžÊPžÌPŸÌQ ËQ ÌS ÌR¡ÌT¡ÍV£ÎPŸÌj¬ÑÒãâÿüëýúêõòäúúðüúíúùêùöç÷ôæôòäñîÝêåÖßÙÆïéØðêØíæÓÛ×ÅÏ̺ÿ¯¦£”‰ˆ|uvkac[SVOAE?;@=15/-0)12*+-%,.%-/$,/%/2).1)26025/:>6>B=CJFCIELROW_^PUQS[WXefRnx]•°_¬Õ`¬ÕaªÓb«Ôb«ÔcªÔc«Ôb«Ôb«Ôc«Ôa«Ôb«ÔcªÔc«Õd¬Öd¬Õb¬Ôb¬Ôa¬Ôb¬Ôb«Ôb«Ôb«Ôb«Ôb«Ôb«Ôa¬Ôb¬Õc­Õc¬Õc¬Õc¬Õc¬Õc¬Õc­Õc¬Õb¬Ôa¬Ôb«Ôb«Ôb«Ôb«Ôb«Ôb«Ôb«Ôb«Ôb«Ôc«Ôb«Ôb«Ôb«Ôb¬Ôb¬Ôb¬Ôc«Ôb«Ôa«Ôb«Ôb«Ôb«Ôb«Ôb«Ôb«Ób«ÓaªÒb«Ób«ÔbªÓcªÔc«Óc¬Ód¬Ôe¬Ôc¬Ód¬Óe«Ód«ÓeªÓdªÓbªÒbªÓbªÒb«ÒbªÒbªÒbªÒa©Ò`©Ò`ªÑ`ªÑ`©Ñ`§Ð`©Ða©Ñ`©Ða¨Ð`¨Ï`§Ï_§Ï_¦Ï_¦Î`¥Ïa¥Î`¥Î^¥Î\¤Í[£ÍY£ÌX¢ÌW¢ÌU¢ÌT¡ËT¡ÊT ÊTŸËSŸÉSžÊQÉRœÇSœÉR›ÇQšÆP™ÆO™ÆM™ÆL˜ÅK˜ÅJ˜ÄJ—ÃK–ÃI•ÂH•ÁG”ÂF“ÁG’ÁE’ÀD’ÀD’ÀE‘ÀD¾D޾D޾L™ÆMšÆLšÈM›ÇMœÉNÉOÈOÊOžÉPŸÉPŸÌPŸËP ÌQ ÌR¡ÌR ÌS¡ÌS¡ÍT¢ÎV¢ÎQ¡Îc©Îáìèÿÿôùüõûûóóðàúøìùöåûúíüüñúøë÷õçâÝËÕμäÞÎâÞÌçáÐêæØáßÒËǶ×ÒÁæáÑ×Ñ¿ÉIJ±«˜•“ƒ”’…”’†zzo`aXUYSIOJCE?/3.173@FEHOMGOMHPOMTQV\Y]dbJRNOWVV^\HSRWccVabYcc_jkc„‘b§Ìb¬Öb«Óc«Ôc¬Õc¬Õb«Ôb«Ôb«Ôb«Ôb¬Ôc¬Õc¬Õc¬Õb¬Õa¬Õb«Ôa¬Ôa¬Ôb¬Ôa¬Ôa¬Ôa«Ôb«Ôb¬Ôb¬Õc¬Õc¬Õc¬Õc¬Õc¬Õc¬Õc¬Õc¬Õc¬Õc¬Õc¬Õc¬Õb¬Õb¬Ôb¬Ôb­Õb¬Õa¬Ôb«Ôa¬Ôb¬Ôb¬Ôb«Ôb¬Ôc¬Õc¬Õc¬Õc¬Õb«Ôc«Ôb«Ôb«Ôb«Ôb«Ôb«Ôb«Ôb«Ôb«Ôb«Ôb«Ôc«Ôc«Ôc¬Óc­Ôc­Ôc­Ôc­Ôc¬Ôc«Óc«ÓbªÒbªÒbªÓbªÒbªÒcªÒeªÓcªÒbªÒa«Òa©Ñ`©Ð_©Ð_©Ð`©Ñ`ªÑa©Ña©Ïb©Ðc¨Ña¨Ð`§Ïa§Ð`§Ï_¦Î`§Ï`¥Ð^¤Ï\¥ÎZ¤ÎX¤ÍX¤ÎV£ÌV¢ÌV¢ÌU¢ÌT¡ÌU ËT ÌR ÌRŸËSžÊRÉQÈQœÆQ›ÈP›ÇOšÇNšÇN˜ÆM˜ÅL—ÅK—ÅK—ÄI–ÃH–ÂH•ÃG”ÃG”ÂF”ÁF“ÁF“ÁE’ÀE‘¿E¿NšÇN›ÆOœÊPÉQžÊQžÊQžÊQŸÊR ËR¡ÌQ¡ÌR¡ÍR¡ÌT¡ÌS¢ÍT¢ÍU¢ÎV¢ÎV£ÎW¤ÍU£ÎÌâéÿÿ÷úüöüüôõòäñîÞúøíûûïýûïõóåôðàïëÛäâÔäàÑÞÛÊàÛÊäàÐÞÛÎáàÒÙ×ÉÐοÐͽÇŸÇͯĵÀ¼¬Ç¯ËųÄÁ°½»«±°¤‡‰vxp]`[SZVXb`U_`Zcd`ik`ff^cackjZdc_jj_ge_d_^e`Zed\hi_jlfki`~ˆa«Ôa¬Ôb¬Ôc¬Ôc¬Õc¬Õc¬Õc¬Õc«Õc¬Õc¬Õc¬Õc¬Õc¬Õb¬Õb¬Õb¬Õa¬Õb¬Õb¬Ôb¬Ôb¬Õb¬Õc¬Õc¬Õc«Õc¬Õc¬Õc¬Õc«Õc¬Õc¬Õc¬Õd«Õc¬Õc«Õc¬Õc¬Õc¬Õc¬Õc¬Õb¬Õb¬Ôb¬Ôc¬Õc¬Õc¬Õc¬Õc¬Õc¬Õc¬Õc¬Õc¬Õc¬Õc¬Õc¬Õc¬Õb¬Õb¬Õa¬Ôb¬Õb¬Ôa¬Ôa¬Ôb¬Ôc¬Ôc¬Ôc­Ôc­Ôc¬Óc¬Ôc­Ôb­Ôc¬Ôc«Óc«ÓcªÔbªÔb«ÓbªÓcªÔcªÓbªÒaªÒa«Ñ`ªÑ_ªÒ_ªÒ_©Ñ`©Ña©Ñ`©Ða©Ðb¨Ñd¨Ñb¨Ñ`¨Ða§Ðb§Ð`§Ïa§Ð`¥Ð]¥Ï]¦Ï[¥ÏZ¤ÏY¤ÎY¤ÎX¤ÎX£ÎW£ÎW¢ÎV¢ÌU¢ÌT ÍS ÌR ËRŸÊQŸÊRžÊQžÉPÉOœÈO›ÈOšÇNšÆM™ÆN™ÅL˜ÅK˜ÄJ—ÅI—ÄI–ÃI•ÃI”ÃH”ÃH“ÂG”ÁG’ÁG‘ÀQœÈQÈQžÉQžÊQžÊQŸÊRŸËT¡ËT ÌS¡ÌT¡ÍT¡ÍT¡ÎV¢ÎU¢ÎV£ÏV£ÎV¤ÎY¥ÏO ÌŠÀÚÿÿûúüóüüòùøê÷ôåêèÙóîàù÷ëøöêóðáñîßîìßìêÞéå×ßÜÌçäÕÙÕÆÒÏÀÛÚÌÕÓÅÕÓÆÉǹÍË»×ÖÈÏÎÂËɼÅô±¯ °®¡µ³¤­«›³²¢¿¾¯··ª­®¤ž ™Ž’t{zirtgopaii^hhelk]ec_hhdgbNVQ]fgirrnxylvxhmhb”ªb°Ûb«Óc«Õc¬Õc¬Õc¬Õc«Õc«Õc«Õc¬Õc¬Õc¬Õc¬Õc¬Õc¬Õc¬Õc¬Õc«Õc¬Õc¬Õc¬Õc¬Õc¬Õc¬Õb¬Õb­Õc¬Õc¬Õc¬Õc¬Õc¬Õc¬Õc¬Õc¬Öc¬Õc¬Õc¬Õc¬Õc¬Õc¬Õc¬Õd¬Õd¬Õc¬Õd¬Öc¬Õc¬Õb¬Õc¬Õd«Õc¬Öc«Õc¬Õc¬Õc¬Õc¬Õd«Õc¬Õc¬Õd¬Õc¬Õc«Ôb¬Ôc¬Ôc¬Õc¬Öc¬Õc¬Õc¬Õc¬Ôb¬Ôc¬Ôc¬ÔdªÔcªÓcªÔc«Óc«Óc«ÓcªÓcªÓb«Ô`«Óa«ÒaªÒ`ªÒaªÒ`ªÒ`ªÑ`©Ña©Ña¨Ñb©Ña¨Ña¨Ð`§Ð`¨Ð`§Ð`§Ð`¦Ð^¥Ï^¦Ð\¦ÏZ¥ÏZ¥ÏZ¥ÏZ¥ÏY¤ÎZ¤ÎY£ÎX£ÍX¢ÎV¢ÎV¢ÍV¡ÌT¡ÌS ÍQ ÌR ËQŸËQŸËOžÉPžÉOÉPœÈNœÇN›ÇMšÆM™ÅK˜ÅK˜ÅK˜ÄJ–ÃJ–ÄJ•ÄI”ÃI”ÂI“ÂH’ÁSžÉRŸÊTŸÌS ÌS ÌS¡ÍS¡ÌU¡ÍU¢ÎU¢ÎV£ÏV£ÎV£ÏW¤ÏV£ÏX¤ÏY¥ÏY¥Ï[¦ÑQ¡ÎµÖäþþúúýøúúîùùïúúîúùïöõçôðàóñáóòâíëÜèå×ÛØÊÛ×ÈäáÓÙ×ÈÙØÊÖÔÅÕÔÇÕÔÇÕÕÈÏÍÁÅõËʼÍÌ¿ÆÅ¹Äĸ´³§»»®³³§²³©²³¨ª¬¡¨ª ª«¤¡£œ—˜‘’Œ…‰„hongookrsgqrV]\\b\ekgZb`goo_ecflklrqpqkn€„c¬Ôc¬Öc¬Õc­Õc¬Õc­Õc­Õc­Öc­Öc­Õb­Õc­Öc­Öb­Õc­Öb­Õb­Õc­Õc­Öb­Õb­Öb­Öc­Öd­Öb­Öb­Õb­Öc­Öc®×c®Öb­Õb­Õb­Öb­Öc­Öb­Öb­Öb­Õb­Öb­Öb­Õc­Öc­×d­Öd­Öd¬Öd­Öc­Õd­Öe­Öe­Öe¬Öd­Öd¬Öe­Öd­Öc¬Öc¬Õd­Öc­Õc­Öc¬Õc¬Õc¬Õd­Öc¬Õc¬Õc­Õc¬Õc¬Õc¬Õc¬Õc¬Õc«Õc«Õe«Õc¬Ód«Óc«ÔdªÕcªÔc¬Ôa«Ô`«Ôa«Ó`«Ó`«Ó`ªÓ`«ÔaªÓaªÒa©Ó`ªÒ`©Ò`¨Ò`¨Ò_¨Ñ_¨Ñ_¨Ñ^§Ð^§Ð]§Ð\§Ð[§Ð[¦ÐZ¦ÐZ§ÐZ¦ÏZ¥ÏZ¥ÏY¤ÏX¤ÎW¤ÎX£ÎW£ÍV¢ÎU¢ÎT¡ÍT¡ÌS¡ÌR¡ÌS ÌR ËQŸËQŸÊQžÉOžÉPÈOœÇN›ÇNšÆM™ÆL™ÅL˜ÅL—ÅM–ÅL–ÄK•ÃK”ÃRžÈTŸÉTŸËRŸÊT ÊS ÌT¡ÌU¡ÌU¢ÌU¢ÍU¢ÎV¢ÎW£ÍW£ÎX¤ÎX¤ÎX¤ÎZ¥ÏZ¥ÏT¢ÍÀÛáÿÿôùúðüûðýüñýüðûúíõôæôðáïëÛáßÑÜØÉãßÑÞÚÉÞÛËÜÚÌÌʼÊÈ»ÊɽÉɽÏÎÂÑÑÅÈÇ»··¬¶µ¨ÁÀ³··ª´µ©©ª ¬­¡©« ¥¦ž£¤™‡ˆ€ˆ‰€ˆŠ‚npjfidpsnnrmjnkmsqejhipociedhcgmkfkjhomfkhfjgstmtukkofc¤Åa­Øa«Óa¬Ôa¬Ôb«Ôa¬Ôa«Ôb«Öa¬Ôa¬Ôa«Õa¬Ôb¬Õa«Ôa¬Õa¬Õb¬Õb¬Ôb¬Ôc¬Õb¬Õb¬Ôb¬Õc«Ôc«Ôc¬Õa¬Ôb¬Õa«Õb«Ôb«Õb¬Õa«Öa¬Õa«Õb«Õb«Õa«Õb«Õb«Õb«Õb«Õc«Õc«Õc«Õb«Ôc«Õc¬Õc«Õc«Õc¬Öb«Õb«Õc¬Õb«Õa«Ôa«Ôa«Ôb«Ôa¬Ôa¬Ô`«Ôa¬Ôa«Ôa«Ô`«Ôa«Ôa«Ôa«Óa«Ôb«Ôb«Ôa«Õb¬Ôa«Ôb«Õb«ÔbªÔbªÔbªÓa©ÓaªÒ`ªÒ`ªÓ^ªÒ_ªÒ_ªÑ_ªÒ^©Ñ_¨Ñ_©Ñ_¨Ñ_¨Ñ^¨Ñ^¨Ñ^§Ð]¨Ð\¦Ð^¦Ð[§Ï\¦Ï[¦ÏZ¦ÏZ¥ÎZ¤ÎY¥ÏZ¥ÏY¤ÎX¤ÎY¤ÎW¤ÍW£ÌW£ÍU£ÍU¡ÎV¢ÌU¢ÌT¡ËT ËS ÊR ËR ËRŸÊPžÊQžÉPžÈNÈMœÇM›ÆLšÆL™ÆL˜ÅK˜ÄL—ÄK–ÄJ–ÃJ•ÃJ•Ã@‰¶@е?‰´@еBŒ¶A¸C¹DºC޹A¸B¸CŽºE¼G‘¾H’¾F’¾F’½F’¼H”½<ºžÂÍþøäñîßóðâóðâïìÝðïàíéÚéãÔàÚËâßÒßÙÊÝÚË×ÔÅÕÑÂÎ̽¿»­À¾±»¸ª³²¥±±¤±±¥®®¢¨©££—®®¡¢£—›œ“Œƒ‡‰‰‹‹Œ…ƒ…~tuoyzrsvqfiefifhkh[^YW\Y]c`digorofjccfbchebgcmqlnqlnpjnodffZei`T•·M›ÈN™ÃM™ÄM™ÃN™ÄMšÄM™ÄM™ÄM™ÄMšÄL™ÃL˜ÃL™ÂL˜ÃL–ÂK–ÂJ•ÀJ•ÀJ•ÁJ•ÁL–ÁL—ÂK—ÂK—ÂL—ÂL–ÂK–ÁJ•ÀK•ÀJ•¿J”ÀJ•ÀK–ÂK•ÁI“¿I“¿J“¿G’¾G’½H“¾I“¿J”ÀK•ÁJ•ÀJ”¿J“¾J”ÀJ”¿J”¿K”ÀK•ÀK“ÀJ“¿I“¾J’¾I“¿I“¿I’¾H“¾G“¿H“¿I”¿J•¿J•ÁH”ÀI“ÀH”ÀH“¿H“¾I”¿J•ÀI”ÀI”¿J“¿I“¿J”ÀJ”¿J’¾J”ÀK•ÀJ”ÀI“¿I“¿I“¿H“¾H’¾H’½I“¾H“¾H“¾I“¾J“¿I’¾H’½F‘½G’¾F‘½E¼C»D»EºF¼E»D»CŽºBŽºBºB¹C»BŽ»AŒ¹?‹¸?‹·@‹¸?‹¸@Џ@Џ?Š·>ˆµ>ˆµ<†³:…²;…²<†³;‡³9‡´9…²7ƒ°7‚¯8ƒ±8ƒ±8‚¯7€¯6®6~®4}¬4|¬4}¬!lšk˜j—i–j–k˜ nš$qŸ"pžnœ oœ"qŸ%s &u¢(v¤&u¢$t¡$t 'v£ q¢A„¨×ÖÉëåÓåâÒÛØÆÙÖÆèãÓÝÙÉÛÕÅÖÒÃÐË»ÌǶÿ®ÆÃ´¾»«¹´¤µ²¤´±£Ÿšš˜—‹œŽ••ˆ‘’…ƒˆ‡z~~rz{rmnffg__`Ycd]fhblnhghbfg_bb[YYQVWOZ[U[]XY]Xcfaoojnogrtmeg_df]nodopegg[abVniYevt,€­'{©&x¥$y¦'{©+­,ƒ¯,€®,¬,€¬*¬'}«&|ª'|ª&z©#x¨"v¥!t£s¡ t£ u¥$w§%z¨'{©&z©'y¨&x§%x¦#w¤#x§#w¥$w¦&x§&w§%v¦#u¤#u¤#u¤$t£ s¢ s¢"t£#u£"t¤"t¤!t£"s£!s¢"s¢#r¡"q¡!q¡!pŸ pžp p !q  p oŸo pŸoŸož!p  r¡ q¡ p p p  p !p¡p ožmmnžoŸnžnž oŸ!q oŸo !o¡!q¢ p¡o nž pŸ#r¡$s£$s£%r£#r¢"q¡"p "q¡!p nžl›kœlmžlœj›išjšjœkœlœlk›išg˜g˜h™h™h™g˜f—f–c“`‘a‘b‘b“b“`__b’b’_‘\ZŠY‹YŠYŠYŠ_Ž ^]Œ \‹ [Š [Š_Žc’a `c‘f”f”f•f•d’ b a af•a”[‹ ÎªÓË·ÆÂ±Î˺ÖÑÀľ­ÇÀ®Ã½­À½¬À¼©¶¯Ÿ¶¯Ÿ¯ªš¬¨˜¦¡Ž‹}Їz‰†y‡„v—“ƒ‘~‚€sqqezympoebbY`aXUVKXYP[\TSTMVWOTTKRQEQPCSREXZP_`Wfg^aaWjj`nnehh\]]Q`_RabSgfYjhYggZheVskWWRCSO?]XF^[J_\Jb_McaPfbQf`Mf\G_XEUUFJde-w—y¨qžmpžt¡v£w£s¡om›qžu¢z¦ }¨$«"}©z¦v¤v£y¥y¦{§ }©"~ª"~ª {§u¢t¢x¤y¤x¥w¤w£v£u¥w¤x¤y¥x¦x¦w£r mœi˜i™lœožq q ožpŸq pŸnžkœi™h™moŸožpŸoŸmœmmœlœk› h˜ d– e— i™iš h™i™ i™ f— g˜ h™ f— d•c”b’ b” d– f˜ f— c”a’ b“ c” d” c“ c“ d” c” b“ b’_]^ `‘ `‘a“d•c•e•g—e–d•b” a’ _ ]Ž ] _a’_ ]Ž[ŒZŒ \ ]Ž ] \Œ ]Ž \ŒYŠWˆ Wˆ WˆW‡U…PM~M}NK|HxGwGxFx ]Š _Œ ` _ ^Œ _Œ _Ž _Œ\‰[‰]Š bŽ b c d‘ d‘ c e’g“h•f– c‘ d f–iš.oŽVsyvxlˆ}j‰}g†{gƒzhyrbrlZqkZoiYsn]vp_vqafbSieSokZnhYsl]tp^khW_\M_[Lb^P_\LZWG]ZJc_O^[JZUCXSAVR@RO=XTCXUDYUCa[FbYCcU>cXC\YHQWN?]b0l‚"vœ~¬~¬{¥v¢rŸt x¤z¦x¥w£t¡v£{§}¨|¨{§y¦x¥u£r¡qŸq pžpžr¡u£w¥u¢ožmonpžq q ožmœkšk›mœopŸpžožkš h–i˜l›mmœmœmnnœj™g˜g˜ f–h˜npžoŸnžmmœnžožmœk› h™ f—h˜mœnžmœki› h˜ h˜ iš h— g— i˜ j™i™i™išg™ f— d–c” d• e–g˜j™kšjši™ g– b’ `‘ b’ e”e•g˜jšjšiši™g˜e– b“ _ ^ ^ `‘ b’ a’ ]ŽZ[ [ ] ^ _ `‘a’ `‘ ] \ [‹ Z‹Y‰V†RƒM~K{L|K{HwGvIyJ{ _Šac a^Š_‹ cŽ b]Š\‡^‰aŒbbbŽb b cŽ e‘ g“ e’bŽbŽ f’j˜ i™f—k“:uŒb…v€y„‚u‡uŽ„r‹‚p‡~k‡l†n|kyudvp_wq_{ucmiZnjZjdUidUlhYc_P^[K_\K`\La]M^YHZUC^YFZVCWR?SP=QN=PO?FJML=FE>CA8>;6?=?EA>C>CFBFKGMQMLQKNOITPF4fv|©}¨~¨y£t tŸw¢x¤v¢ rž p ržu  t¡ sŸ tŸx¤z¦x¤ s¡ pžn›k—f“cbŽcd’f“i•mš p qž poœnœmšl™l™m›qž t¢ r p qž rŸokši˜mœ q  qŸ r  t¡ u¢ x¥{¨}©x¥ pŸk™m™rŸ v£ w¤x¥x¤u¡t  u¡ u¡w£w¤ u¤pžk™i—k˜ nt¢x¤x¥v£r  n l› lš m› lšmšn›qžu£v£u¢s¢rŸ pž n nœ nœpt¡z¦!|§z¦y¦v£r pžo›k™k™lšmœqžrŸplšh˜ d” b‘ ` ^ ^ `d”e•c’aa‘ ` ] \Œ \Œ ] ZŠ X‡ W…S‚Q€R‚ X‡[Šf’g’j–l˜k˜j–l—n˜l˜k—l—n˜rx¡v rtžw¡r l—g“h“ k– m˜ l—m˜f”a ·ÿÿöûüôýþõùôãûîÕüùéóïàìéÙîëÛãàÑçãÔåàÐàÝÍáÛÉæÜÄåßÍÐͽÍʼÂÀ³¬¬¡——ŒŒ…w|wgnjYa`PZZMWWHQQMUUKMGII?KROOUSV\YSZXKTSOWVRZXW[VUVN]\S,t|¨z£tŸ qt x£x¢w£u¡w¡v¢ tŸoši”i” o› rž rž p qž t  pj–e‘df‘h”k˜o› qž rŸ qžp qž ržoœoœqžs rŸqŸmœi–h”k—l™h•h•mš sŸ t¡ u¢w£y¥|¨|¨ w£ s oœmšoœ t  x£y¥{§{§x¤w¤u¢ t¢v£y¦y¦ w¤ r oœo s¡v¤v¤ t¢ rŸ pnk›l›nœ pœ pœ pŸv¢z¦{¨|¨{¦z§y¦y¥y¥z¥y¥z¦|¨z§y¥y¦v£r¡qŸqžm› j— h— kšpžs¡t qž k˜d’aa_^Ž^^Ž^` a‘`]Ž[‹[ŒZŠX‡XˆZŠ\Œ[ŠYŠ\ _ _Žg’k–l—k—j–i•j–k–h”g“ h‘i“o™sžq› k– k–l˜ i•ddh’ l˜nšn™ošg–†´Àþÿóúüôúüó÷öèûøêüûïõóåîêÚòðâîêÜïìßää×éæÙÝÛÏÛÚÏÞÚÊÝÙÌÞßÓÒÓÆÓÓÈÏÐÄÐÐÃöÆÇ»°±§œž—†‹†ipoahgRVSIIESVUV_a]gg]fgS\]S\ZU^]U][X]Y``ZWiis› rž rœpœ pœ p› o› sŸw¢y¥w¢ pœj–e’fk•nšnšm™q u¡ s ošm˜m™l—l˜n™o› qœpnšm™qœ t  rž p s  t¡qžnœm™f“cg“h–e’cf“j–j—l˜oœ sŸ u o›g‘df‘i–nš sž u¡x£w¢v¡v¢y¤x¤x£{§}¨}¨|¨z¦w¤x¥z¥{§z§x¤w¤x¤ v¢ s  q  t¡ u¡ sŸ rŸ sŸu¢x¥z¥x¤v£v£w¤v£u¢t¢t¢u¢ rŸ n opž mœ kš m l›j˜j™ m r  pŸ k›h—d’_Ž\Œ\Œ\‹ZŠX‰W‡V…V†XˆXˆV…U„V†V…SƒSƒW‡Z‹[Œ]Ž_‘_[Œf“g”h”f“f’h•i–g“ f’ e‘ e‘ g“l—ošm™h” g“ h” i• i– m™qœu u u¡tŸg–}®½ÿÿñøøêúúïù÷êúøêøöèøöìõðäöñßöôæëëßéêßììáéæÙãáÔ××ËÞÞÔ××ÍÄÆ¼ÉÊÃÊËÃÇÈÀÅźÃļÂü¼½µºº³¯°©Ÿ¡›ƒ‡ƒfmnYdffqsdnqclmgpq^fg]ee]de[a__dciie$k‡lš o›m˜l—j–h”k— sžv£ rŸnšj–h•l˜ rw¢v¡ rž r tŸ s¡ržqnœi•e‘e’h“e’ca_ŠbŽh•i•f’g”h•g•f”f”f’d“e“e”d”baba^Œ_b‘c]‰W„X…]‰bf”j˜mšmšj˜h–j˜m™nš p› pœ p› oš q rž s t v£z¥x¤v¡u¡x£y¥x¤w£w¤v¢t r l™i–i–k˜k™ k› nœ mœ n› nœ n nž ož qŸ oœ pqŸsŸr¡t¢u£t¡u¡w¤w¤qŸ jšd“a‘b‘`_Ž``][ŠX‡V†U…W†W…X†Z‰[‹Y‰YˆZ‹]_Ž a‘ _\ŒYŠaŽcde‘g“j—i•h” f’ f‘ f’h” j• j• h“e‘f‘ i•m™n™pœsŸtŸu¡u¡rd’Bˆ£úùêûòØùõãúùìûùêúùîúøíûùíõñäòåÎóìØëìâëìßîìàíìáææÜØÚÏÚÚÐÕÕÌËÌÆÇÈÁÂü¾¿¸¿Àº®±«­¯«¥¦¡¡£ž ¢ž›žš’v||gopajj^fgcmo_hj[ccagfimkkpoiid4m‚oŸmšl˜l™k˜f”e’j—oœnšk—k—nšu¡|§©|§w£ rŸ qŸ qžnœj–f’a_ŠabaŒ]‰[‡Z†]‰`Ža_^‹aŽcd‘e“f“e“e”f”c’c’c’b’a]Œ\Š]‹\‰Y†[ˆ`ŒaŽd‘g•i˜j™i˜d“a`Ž`_Œ]Š]‰[†[†_‹bf“h—j™l™k™h•h” lš ržt¡v£sž oœ pœpœj—`Œ\ˆ\Š`Žd“e“d’e“i— k˜ i˜j™ os¡u¢w£x¥x¥z¦z¦v¤t¡u¢t¡pž k˜c’`baae” h˜ f”c’a_Ž_c’ d’ e’g–g– c’^Ž[Š[Š\‹\ŠYˆW‡Y‰ [† `‹bŽ `Œ _‰`‹bbŒ c c d e‘ e‘ c_Š\†]ˆaŒ e g‘ k–nšo›rŸq k—cbÀÑÍÿóÜóïÝøöèøõçõóåøöéôñâóòçøðÝðëÜèèÝææÛååÚããØÝÞÔÑÑÈààÔÕÔÌÉÊÄÀÁ»Áû»¼·µ¶²®°¬¼¾¹›Ÿ›‡‹Š…‰‰‰Œ‹€‡‡jssksukttemm\egXbc_hggmkorqsuruqhApo j•f”i–i–c_Œbh”k—k—l˜oœt z¤|¦{¦w£ s  pžmši–d’d‘d‘de‘e”caŽbc‘b‘b‘c‘b‘c‘g”j˜lšl˜j—g–g”e•e”f•e•f•d“a`a_Ž_‹ae“f“g•h—i—h–f”aŽ^‹]‹\‰Z‡Y†W„U‚VƒY…\ˆ_Žb’b‘b‘b‘_Ž_d“i˜l› nœmš j˜ mš qŸmšd‘\Š[‰]Œ]Œ\ŠZ‡[‰`aŽ^Œ^Œe’ k™qŸu¡s¡s¡t¡qž lš j˜ j˜ kšg—aZŠZ‰]Š\Š\Ša’ g– g– e• f• h–k™m›n›k™j˜h– b’[‹W†X‡Y‰XˆW†V†Y‰ Z…^Š_‹ XƒRzQyU~ Z‚ \‡ ]ˆ _‰ _Š _‹ _‹\ˆW‚W€Z„^‡ dŒk•n™nšnšl—e‘b\‹T“«÷ïÜïêÙñíÞêçØéåØíéÜéæ×ðîá÷÷ëããØÚÚÎÕÕÊáâÙÝÞÔÖ×ÎÌÌÃÍÍÁÄż»¼µººµÃļ³´­¢¤ ³µ°¨«§Œ‘Ž’‚†„…„jrrcmnoxyx€foq`ggbhhZa`bfdormrtozuj;nf–dccc_‹[‡]‰cf“g•g•h•k˜oœ s u¢ t  qŸnl™h•g•i—j—h–f“d“d’e”h–j˜h—e“d“g”i—k˜mšn›mœm›lši—h–h–h–h—h—e’a`ac’c’c’e”i—k˜j˜h–e“b^Œ]Š^‹`aa_Œ^Œ^Œ^Ž_Žb‘d“c’b’d“c’aa’c“e”h˜k™i™kšmmi˜f•c“_Ž^^Œ]‹_Œa^ŒX…Y‡`Žd”j™ m›j™h—h˜f•b‘a‘b‘b’_ŽZ‰W…Y‡]Œ]]Œa‘f” h— h–j˜l™n›oœk™h—g• e”_Z‰XˆZ‰YŠX‰VˆW†W‡ \‡^‰ \‡U€OwNuSz X Z… [†Z…YƒXƒ \‡ \ˆY…Y„Z… \† bŠl•nšl—h” e‘_Š[…]‡aަ¾¿óãÇÛÖÆÙÓÂãÝÎêåÖæâÓæãÖçä×ÑÑÅËË¿ÑÑÅÒÒÆÓÓÈÕÕÊÌÌÂÀÀ·Äż¼½µ´µ¯¸¸±Ÿ ›ž¡›ª¬¦“•’“—”‡‹‰{€€tzzw}}fnnahhekkellotsrus`cagicvxqoqkpne"iˆd“f’h•i–f“bŽ``ŒbŽdf“g“g”g•i–lšoœm›k™j˜g•d‘d‘i—j˜h–g•g•i–j˜k™n›kšh•g•j˜j˜j˜k™lškšlšj˜h—g”e’d’d‘d’b]‰[‡\‰`c’d”g–h—i—j˜i—g•d’a`bf”h—i—f•d“f•f•f•f–g—i™kšj™g•e“e“f•i˜mnœmœmnžonž ožlšg–c“d“h—lšlše’[ˆ\‰c‘g–h—h˜e•d’b‘__Ž_^\]\‹[‹]Œ_``b“ g– i— i˜ i˜ j™j™j˜ g– f– f• e”b‘]Œ\[‹XˆV…U…V…U„R}PyOxLuKrMtR{ Yƒ ]‰[‡Y…VS{S{U~TU€T~RzT{]… e d bŽ cŽ`‹\…[„\‰#s—ÄǹÝÔÁÍŰßÖÁÖÑÀÔÐÀÕÒÂØÕÈÎÍÀÎÌÀÇÆ¹ÒÐÄÙØÍÏÎû¼°··­³´«±²ª°±ª°±ª¥§ œ—¡¢œx}{v{zsyyionioontsgljkomfjhbfboqlqrlgicstkw~|o_omf‘e’j–mšm›j˜h•l˜k˜g“f’g“i–lšmšl˜lšl™l™j—h•d‘aag•k™l™l™mœonœn›mšl™k˜mšnnœlšm›m›k˜h—g•c’`^Š[ˆ[ˆ\‰[‰Z‡X†X…Y†]‹a‘c‘b‘bd“g–h—g—e’c‘f”h–k™i—g•i–kšl›j™j˜j™l›nœn›n›l™l™m™pœppœoœmši–f’e’h•k˜j—f•d“f”i˜k™f“^Š[ˆ`e”f•f•e“b]‹Y†Y‡\‹]Œ^```b‘c“b’b’c”f–f–f”e“f– h˜ h˜ g• f• f– g•d’_Ž]Š[‰X†W†X†X‡X‡Ah@gAgBjDjFmKsQzVWƒVS}NvKrMtMuLtKsHnHnPwZ„\ˆ]‰b d_Š^ˆ_Š\Š+s“¼¿³ÑůÉÀ«ËÁªÊŵűÄÁ³À¾°Á¿²º¸«¾½±ËÊ¿¿¾³¯¯¤±±¦¬¬¢­¬¤¢¢œŸ šžŸ™ŒŽ‰x{xoropsrlponpmikggienpijldooiyzpjjdmnfxxnqridf[uo_2j€bbcde’g“j• nš l—e`‹`‹bŽi”k˜l˜nš nnšl˜j—h“dek— rž t¡ rŸ qž rŸ qž o› mšl˜nš p pmšl™nœmšj˜g•g•e”a]Š[ˆZˆ\‰\‹^_Œ]Š]‰^ŒcdbŽ`Žbd’f”g•j˜j˜lšmšnšl™j˜k˜lšj™j™m›nœlœm›nœnœn›lšl™k˜i•i•h–g”bŽ]‰]‰`d‘g•f•d“c‘d’f•d“`_‹`Žc‘e’f”f’b]ŠY„Y…\‰^Œ`b‘b‘d“g—h–e”c‘aa‘b‘`Ž_a‘d• f•e“c’c“ e” d“a^‹[ŠYˆZ‰]‹]Œ[ŠAhAgDkFmGnGoIqKrOvQxOwMvJrHoKsNvNwNvLtNuS|XƒY„XƒZ…\ˆZ†XƒVW€T€g‹“£ŸÄº¤»³ž¼·¤·²¡­©š«¨™¨¦™§¥˜¥£–²¯¢¥¤—££—  –——Ž™š”•Œpqj~ysvpegbz{uuvqvvpxyrklgcd^kkd?@5<=0mj]sqcjk`tsihj_e^NNhlca‹`Œ_Š]‰`‹dcd`ŠYƒV€V\ˆe j–nšq›m˜ i” j“l–l— j• k•p›w¡w£t sŸsžrrœo› oš pœ pœ nšj–i•k˜nšl˜k—lšmšj˜g”f“e‘ddg”m™ o› n™n™m™k—i•g•d‘bŽ`e’l™pžpŸpžpžoœl™j˜h˜g—l˜prŸ on›n›k˜i–f•e’bŽad’g”e“c``aŽbc’f•g–f“f”f”f”e“e“f•g–g•d“d’c‘a_Œ_Œ]‹\‰\‰_ad‘f•e•e“d’a‘a`\‹[‰^Œ`b’b`ac’c’a`^‹[‰Yˆ[Š\‹Z‰HqKuNxPzPzOxNvNuNuOvNvNwNvOwRzU€W‚V‚UW‚\ˆ_Š]ˆUQzRzRzR|R|SzOyV‚‰±»ÞÕ¾¬ ‡ªŸˆ¨¢¢ŸŽ¢ ‘£ ’š—‰œš”’…ž›ŽŽŠŠ~††y…†{z{rvvoxyqvwwmjkdppippjrskrrjooggh_TUH[[O]\Olj]cdWgfXpgUUdbaˆbf‘g’daŒaŒdg’e`‹[‡]‡`Š h’qš(x @‚¥H…¥9zœk’in–'sš-s™#p–p™ssqšošp™!sš%r˜n–m˜pšp›m™ g“dŽeh’k–m™o›o›mšn› p r p›ošoš tŸw¢v tŸ rnšnšmšk˜e’bg“n› r  t¡ r  qžnœk™k˜m›n›qž u¡ s oœoœn›k˜h–h•f”d‘e”f”g•h–h—i–i—f”baŽc’g•j—j˜i—h—j™k™i˜h–e”`Ž_Žac’c‘b’^Y‡Y‡]‹_`ac“e•f”g• h—f•b^Œ^_a‘a`Ž`Ž``Ž_Ž_^ZˆV„U„V…V…LuPzS~S}R|S|T~T}R}S|S}S|U~W€WX„]‰a_‹^‰`Œ d c]ˆW€VWY„\†Q}/s’Å×ÒÿþçöïÖÜÒ¸º¯—§ž‰™‰˜”„–’‚‹‰z‰‡y‰†y|zm}{n‡…yƒurqersh}{qusg~q{znjj`__VddZqpepnbmm`gfYjgZ‚uggZ^]PhaPlgVHgl ]„]Š d g“ i”e‘`Œa‹ e‘ i” i” h“ h” j–qš6~¢K‰©i𵋮Á–´Ã…¦¹e‘©Q†£O†¥\ªc“¬[Œ¨A~ž1vš*s˜'q–,s—={œV‰¤]‹¥M‚Ÿ>}ž?€¢?¤9|Ÿ1t—%kŽcˆ_†bŒ i“ j— k— n™ o› ržw¢x£v  r qœ n™ l˜l˜m™l—k—k–k˜j–k— o v¢y¥z¦y¤v¢ pl™ oœ u¢ u¢ u¢ v£ r n› p rŸn›mšn›nœnœnœnœk™i—i—k™l™h–d‘cd’h–j™k™j™m›nœ m›j˜e•d“b__cf“f“c‘`Ž`Žbc‘c‘d’e“f• j— l›m›l™e’a`Ž``Ž`Œ]Š[‰Z‡Y‡Y‡[ˆ[ŠY†T‚S€S€Q€ W€ Y„ Z… W€T|T}X Z„XƒW‚W‚Y[… \‡ \‡[† `‹ e‘ c _‹_Š cŽ f’g“f dŽ bŽ cŽX†K‰¡ëñãÿÿìöñÞìäÐæàÉÙÐµÂ·š¥›„‡vІw|l„r€|lwtetqdvsgvthqpboobyvizxl|znxuhml^eeYnk`{wjqoauscpl^ol_pm]gbPf_MRb]"eb^Š_ˆcŽf’f‘c_Š^Šd h” h” g’ g“m—@Ÿb’¬‚§ºŸºÈÀÐØÌ×ÜÂÐÖ¯ÂÌ¡¹Æ·Æ£»É¨¿Ë ºÇŠ«¼{ µu›±t›°t𝆦¸ž·Ä§½Ç™³À‹«¼Š«½‰¬¾†§»€¡³t–ª]ˆ ?w–&mif‘ g“ j•l—ošsŸv¡u¡sŸ pœj•ee‘i•k–j”f’g“ j— o›rŸu u v¡w¢tŸ mšj–nš sŸ s  qŸ rŸ rŸ sŸw¢w£ sŸ q qž t¡v£x£ w£ qŸn› oœ q  qž n›k˜j˜i—j˜k˜j–j— l™ n› nœ l™i—i—k˜h•d‘d‘i— k™ j™ j— j— j˜i–h–g“ccg– i™ i– g”caŽcŽd’c`\‰Z‡VƒU‚UƒW…Y‡YˆX†X…VƒTƒ\…]‡\‡ [ƒ Y Y€Z Y€ X} W} V~ X [ ]… ]‡ [… ]… aŒ b aŠ _‰ _Š aŒefd eX‡DƒŸïôèÿþëòëØçÞÉâÛÇâÛÆÞÕ»Ùί×Ì®¼°”‘u†q†mˆ‚p‹ƒq~xfyh{veroatqbzvhwtf‚|oyjxtegeXliZmjZmiZqm]khXe]Ke`OWfa(aw eh— i” g’ h“ e‘ccŽ h“ i“ h’j”l•j•l–m—1w›b‘«®¾«ÀËÂÑ×ÏÙÝÌÕÚÊÕÙÍØÜÑÛßÑÚßÏØÞÎØÞÊÕÛÁÏÖ½ÌÔ¿ÎÕÀÎÕ¾ÌÓÄÑØÎÙÝÒÛÞÈÓ×¾ÌÓ¼ËÒ½ÌÓ¼ÌÓ¸ÈбÃ̤ºÆŒªºv²XЧ4wš$m•j’gg g‘h’ g g dŽ`ˆ\…^…b‰dede‘ j– o›ržqošp›pœ nšj•f’h”m™n›l› m›rŸv£x¤w£ tŸ qž rŸtŸv¢z¥z¥v¢ t  u¡w¢ u¡ rŸ r  qž oœ mš k—i”h•i–j—k˜ l™ k˜ l™ oœ mšh–h– k˜ m› n› mš m› k™ i–h–g”bae”e“aa`b g” i– g”e‘c^ŒY†W„Y†Zˆ\Š^Œ^‹]ŠZ‡X‡ S{V~T|V|[€"](_|,_z-^x-\w"XuSsSu Vz V|S{SzY€ _ˆ a‹ `‹ ^‡ _ˆ `Š _‰a‹Y†9}šêðâÿÿñòóåêçØãÞËÜÕ¾ÛÕ¾ØÏ´ÚÏ®Úа×ͯ˽™ØË¨§™xRK6_ZHvp\„}j†~l„}i†€m†€n†m€zi|xfyudrn\{hup`pk[gcS\\NQfg>m‚j h“j“k”m—o˜m™ h’cŒ g‘p™t(yž?‚¤QŠ©T‹ªP‹ªOŠ©`“¬†ª»¯ÅÎÆÔÚÎØÝÆÓ×»ÊϹÈÎÀÍÒÌÖÚÕÜàÒÛÞÊÓÙÄÐÕÆÑÖÌÖÛÓÜàÔÜÞÔÚÞÒÙÝÏ×ÛÇÑÖ·ÄÊ«»Ä°ÀÇ»ÊмÊѺÉлÊйÈϸÈгÅÏœ¶Ä„¦¹q™°d¨QƒŸ=w–-mŽe‡[V|U{TySyU{W}Y€\…^ˆaŒ e‘ h“ j– j• k– l– k— k–h”e‘f‘i• k˜ l˜ mšqt¡v¡u¢sŸ q p qu x£y¥x£w£w£w¢u¡v¡x£v¡sŸ rž o›m˜ l˜j—j–l™ n› n› m› m› n› k˜j— k™ nœooœ nœ nœ nš k˜ k˜ i–g”i–f”b`ŒaŽce’ e” f”e’b‘`Ž_Œ^‹` c c‘caŽ\ŠW…V…9i‡@lŠAj†?hƒFl…Nq…Zvˆd}‹i€dz‰Pl|:\r)UnRmOmNpTv\}"d…&hŒ$e‰a„b„b†b†]…/s”ÞåÚÿÿëùöâñìÚíé׿áÍÞÙÇØÔÀÒ˲ÖÊ©×˪ÛÓºÚÒµÒŤ˻“Œ{Z0) $&43"A?/LI:URD[YJXWHRRDSSERQBJJv”$i‹b†[„YX€W~WW€Y‚[„^‡`ˆ_ˆ`ŠcŒ d cŽdc`‹aŒcccŽf‘ j• l˜ nšqq o› m™ n›qu¡x£w¢u s  rŸsŸu¡v£tŸ r pœ o› o› nš m™l› oœržsŸ qž n› l™i•g“i– m™nœo pžsŸ rž nš l™ k– j— k™i—e’d’e“d‘d‘e’b‘`\‰\‰_Œb d“f•g” d’ b^‹Y†W…}•¦~”¤{Ÿw‹›tˆ˜r†•{Žš‹œ¦“¡ªˆ–ŸqƒZqGdu>^p;\pBbwJjMp…UwŒY{VxŽMq‡Io„Jp†Ipˆ?k…ÉÔÍÿÿíõòÝöîÖðéÕâÜÆà×¼àÖ¼ÞÕ½äÜÃÝÔ¸ÙÌ­ÝѲÔȪØË­ÝÒ²ãÕ³­ž~\S930       $%/-;A:A`mG{•SƒœW‡ R‡¢O‡¤Q‡¥Y‹¦c’¬jš²jš±pœ±…ªº¦¿É³ÆÏ§ÀË”´Ã‡¬»§¸y¢´s°wž¯ršª}¡¯•°»©µu–¤z›§©¶Š¦³u–¥p’ u“¡w”Ÿtšw™€—¡¥®œ°¸”¨°g…‘BlyDn}U{‰`„’l™t“žœ¦ˆ¡«Š£­‰¢¬¦±–­¸œ²»©»Â°ÀǪ¼Ã–®ºŸ±m”«ZŠ¥B~/r•!jhŒhŽc‰]…]…^‡^†]†]†]„^ˆaŒcŽb`Š_‰^‡\…Z„\†_‹bŽ c f‘ i” i• h” g“ j•p›sžsžp›ošprŸqqqœ pš l— j– k™nš m™ m™ nšsŸu¡tŸqœ l˜h“eg’ k—nšoœpžsŸsŸoœ l™ i• j–l™k™ i˜k™i— g”d‘b`Ž_‹\‰[‰_Œ a a b‘c‘ a `Ž ` ]‰X„‰š¨„–¥”¢}‘ xŒœn…—o‡˜}”¡†™¦†™£‚” x‹—k€Ž[t„SoWqƒ\vˆ^v†_w†f}‹f|Š`u„Vn}Yq~Kdt–¥¦ÿÿðöóáõîÖøñÙìãÊæÛÁæÜÃæÜÂáÙÀäÛÂÙϵÚѹØÎ²ÙË®ÔȨØÌ­ÜήØË©Üͪ¸©‰bW?76#&)   &(')(*,."02)7:2??6CB8Qeiwž±ƒ§¸„§¸Š¬¼’°¿¶Ä ºÆžºÇ“³Áް½•³¿—´Á”´Â²À±¿‘³Á²¾~£´h•©XŠŸK˜T‡g’¦`‹¡AvBwŽK~•Ay‘2m…0i2h|3gy?jyPui†‘v‘œŠ¢«Š¡©a‚:gs7dq@jwFm|Fp}Eq~Px…[‹W}ŠOy‰O{ŽL{U€“kŸ~›ª„ž¬›¨~©ž¬z›¬q•©h¥`‹¢_‹£\‹¥F€ž"m’ dŒaŠ`‰aŠaŠa‹c e h“ fda‰^…\ZZ‚\‡^‰\‡\†a‹ d‘ e‘bc f’i“j” i’ h“k– k– g’ g’j•l˜j–h”k—m™k–j•m˜pœsuŸt rm˜ k– l˜pœsŸt t u¡u¡sŸqœn™m˜lšmšmšn›l˜h•e‘dde’e‘e’e“d‘a aŽ `Œ_Œ _` ]‰Vg‚–a|’^{[xŽVu‹Ss‰WwŒa€’p‹›}”¢‡›¨‚˜¥q‹›[zHm…Bh€Ae}<`x>^uCbwGexB_rh„:c2^y.[u2^wi„-^|%Xv$Vt!Ss%Ts.Yu2Zt,Uo&PkB]y“›ÿÿîøõäüøæúôßëãÎòëÕðçÒäÞËïçÓìæÒæÞËäÛÆÞÕ½ÛжãÙ¾úóàäÜÄãØ¾âÝɾµÁ·šÉÀ£ÍæÔ˱³©œ•}{fNL=HICFJEAD=EG@AB8HKEJMGKOGNRNPRMSWQOOGŒ‹¹ÌÔºËÒ¸ÊÓ·ÉÒ±ÅϦ½Éœ´Âª¸¡²r›¯nœ²s ¶z£¸w ¶g–¯T‹¦A 0x™m‘d… \{VtQlMgLgMeKcKcKcLdPg[o4fw:k|=mCo€-asTgSe$Yi%[lXj PeOeOeMdKcIbKdKeKfKeKcKcOgRi TkWn\r'cy2k€Bs‡IxŠQ}’\†šgŽ¢k“§g‘§]Œ¤XŠ¢Q† LƒL‚Hœ>{™.t•&p”"mjk(o’3u˜7xš+r—jc‹ `ˆ_‡_‰]†[„\„\†\†]†\…Y‚WX€Z‚]‡ aŒf’h’ dŽ ad e dŽfi’g‘ c aŠ `‰ `Š cŒgj“k“geŽdŽefdcdŽdŽeg‘e_‡ Z‚ V} T{ RzSz U~ W Y„\‡bcŽa‹\† XUwTuRqPpOoQqUu!Zy(_~-c€+a&]{"YxXwTsRqTtUuWw']z(\z WtSqMk³ÇÇÿÿóúøêüüïûùèûôÜùõáðé×ïé×÷òßñêÕñëØèãÐÕ͵ßÖ¿âÖºðçÎåÝÇáÛÈÉÁªÁ³’Íæ­£†¶©‡½¯ŽÁ´’ÒǩùªŸ‚Œƒjmk]WZSOSOJLCRWRZ^Y\a\\_Y]_YZ^XY]X\^Xw’Ÿ{£¹yž±wš¯n”ªaŒ¤OšAv:r8u”<|œ@€ >}Ÿ3wš'r•p•n”f‰ ^~WsRkNgKdMfNjNjMiOkPlQlRlWl&`s1g{5j6j~)buXmUiXkXnVmQkRjRnQpQpQpQpQpOnNlMiJdIdIcHaH`IaJcNgQhXl3eyHq„R{Œcˆ™p“¢xš©{œ«t˜§k“£dŽ `‹[‰T† K‚œE›;z™:{›EŸTˆ¥YŒ¦Q…¡;x—-o&jŒhŒgŒgŒbˆ_† _‡ _‡ _‡ ^† [ƒW~V~XZƒ_‡ aŒ bŒ a‹ a‰ b‹ cŠ cŠcŒdŒcŠ a‰ _† ^„ \ƒ \‚ ^…a‰bŠb‹a‰aŠbŠcŒcŽdca‹a‹`Š]‡X‚U}T|QyOwOxQzT}U~ Xƒ^‰^†ZƒX VCbEcJiNq Sv Vz W|Z}[[Y| WzX{X{ Tu Oo Op Rr VvWvUtUt Sr[yàéàÿÿíýüèüùæüúæÿûçþþóûùìöòäôîÜåÙ¿òëØöóäìéÚìéÚæßÊæÝÅÖ˲ÓɯÛԻ˿£Ä¶“´§ˆÍ¾šÎÁ¡ÒÆ©ÎèÎDZËì¾°Á´•¦¢Ž„…|psmU[YW\Ybhfbigikfilfad_^^VYhl6rŽ.j…1h.f€`}[x VuVu \~c‡eŒdŠ`ƒ ^c†d† [xRkOhQkPlPlRoTtVwVvWuWvUsToYr#b{.i2k„.g#_xUn Tn Vp WqVr Wt Xv YxY|[[[Z~X|WyTuRqPoOmMjJeHbHaIaI`KcSh XmYp$`w:nR}Ža‡—cŠšaˆš[…˜[…˜bŒœf¡g‘¢h‘¤e¦\¥YŠ£\Š£`£[‰ S†U‡ŸZ‰ Y‡ T… PƒžI~™@x–;v•:u–:v–9u•1o‘#jŒ h‹&iŒ+lŽ+n%l#jŽ#i‹ h‹fŠeŠgŒk‘$o”)p•$o“$m‘$k$j'k$k%l’)o–0s˜7vš:wš7u˜1r–.p—+o•&m”&k‘$ifdŽef fea‰_‡^‡^‡\…]‡^†[V}U|T|>Z?]CcLmRuSw Sx Uy Wz X| X} Z Z€ Z€ VzOpKjLlNmLkJhMjJia{íñàÿþèûúçüøâòëÕõí×ýúëôñààÕ½öðÛóçÍîáÆòêÓòïÞéäÒçáÎãßÐÜÕ¿ÐÆ¨ØÒº¿¯ÝΩûôÛòèÏáÙÃØÑºÔÐ¼ÊÆ¶À¼«Ä¿¬»³ ¡•z—Žs¥¤•|vjmgUUMMPJef^^b]hibce]bbY&XgNeQgQf PhMdMfMhQmVsXwUsOkKfOjQlMdG^JdOlRqSqTtWzY|Y|VvSrPoRpXw^~a€a`~ZwVrVsWvYy[| ]€ _]€\]‚_…_„]€ [~YzUwUvUwUwTsRpNkKfKeJdKdNe QfOiNhQj[u'e€1k†8pŠ=tŽEx‘Wƒ˜fŽ u˜¨{¬zž­w›­n–©cŽ¢a¡f¤p—ªyž®£°}Ÿ¯y®z¯v›­s™«s™­o˜­l–¬h“ª_ލY‹¥\‹¤g‘¦o•©n”©f§aŒ¤`‹¢Z‰¢Jœ9x–0t•7xšIƒ¢YŒ©[ªZŽ©[¨[¨\Œ¨XЦR‡¤T‰¦_ªh”­m–®h“«]Œ§V‰¥Tˆ¥N„ŸJ€œJ~œH~œH}œH}I~ŸK J Cz›7t•/n“,k(iŽ%h+i1j‹6jŒ6kŒ0h‹EfDeEgMoPtOqLmLlMnQtVzX}X}W|V{QsLmKlKkIfGdKhIh_xêïßÿøàîãÌòìØïæÏÞÒ¸èÚ¾ûøçàÖ¿ÙжÿüêõîÜôîÖñíÛâàÒàÜÎÞÚËÕÒÁÔÍ·áÚÅ»±îãÈòìÚâÛÆÝÖÃÓÏ¿ÒÐÀÁÀ°¼»¬¸¹¯žœŽvlV’_©§˜—™“|~vgh]bbUccZ\_[bd[eg_nka?\`G_J`J`H\E[G]F]H_I`KaH^CV?R@UDZDZBXE]JeOmRqTsTuUxVxSrPnNlPoUuVwWwXyZ{Z{[|[}[~]€`… a† a…_‚]€]‚_„_„][~Y|XzX{Z~]‚\Y}WxTuTtSsRpOlQjRkQlRpVy\ _ƒa„fˆ'kŒ3o‹DwR€–`Š i’¦m–ªl”¨i’¦p–©| ¯‰¨¸’®»‘®¹¬¸‘®º”°¼–±½–²½–³¿“±¾Ž­¼ˆª¹ƒ§·‚¦¶‰ªº—²¾Ÿ¸Á¶À™³¿”°¾”±¾¯½‚§¶qš®e’ªg•­x¡·†ª»‹­¾®¿‰¬¼ƒ§¸¥¸¥µt±k˜¬oš­u°|¡´|¡´rš¯k—¬i•«g’¨c£a‹¡cŒ¢aŒ¢Y†ŸTƒ›\ˆ b‹¢W…žI{—>s’:q7n4l9oEu”Lz—N}™Iz™LqLoNrSw U{SwNqOpPrRuVz Z ZZ \ \ [€X{TvQsMlNmOq [|ÚäÚÿýåõíÓðåÊþúå÷ðÛæ×¸òéÒõïÝØÎ·ÔʱõïÜýûëøõãåáÑæßÎÜÓ½ÒÄ©çßÉæáÏÀº¦§žéÝÃÕͺÒ̺¿¼­Ëɺ¶´¤°® ––‹}whriOœ’x›š~{vxpjlcpqfeg]cd\ef_jmcone[fcKbIdKdJaI_G^E[AVBVCXDXCXD[F]G`F_HaKgNiPmTrSsRqSsTvSrSrSsTtSqQnPmRqUvYz^_‚^„_…`†_„`ƒ^ƒ]]€`…cˆaˆ`†_„Z~Z|\€_ƒ\€Z~Z}Y}X{VyUwUvVvYyZ|Y~[€_… a†_…_„ bˆa†`€ d‚*l‹5s?x”Ay”F|˜Q›_‹ m“§r–©u˜ª¡°«º•³Àœ¸Å£¾Ê¦ÀÊ¥¿Ê¥¿É£¾È£½Ç¦¿È¬ÃÌ´ÈкÌÒ¶ÊгÆÍ°Ä˰Ä̰Å̯Ã˨¿È¢»Å£¼È«Â̱ÆÏ³ÇϳÆÏªÀÊž¸Äœ¶ÃŸ¸Ä‘°½¦´u®r›®v¯v°i•«_§`ަb¤aŒ¢e¡i£d¢U‚™S~”^ƒ˜fˆœc‡›W”PxPxSz’T{“Z—`ƒ›[€˜T}•Pz•NsLoMpRwTzSyRvRwTxRtSv W| [€ \ _…bŠd‹a‡ ^ƒ [€UxQrRtQv¯Â¿ÿûæõîØõíÕûöäöòâæÝÈéÛ¿óçÎà×ÄÔɲâÕ·ïäÉߨÃóïÜêâËéäÒíéÖéæ×¿¸¤´­—”Œq×ÅâÖ»ÌųÎ̾ÏÎÁ¼ºª¦¥˜jcOrV¯¢ƒŸœ‹Œˆz}~tvxomrodf\jkbll`gi\jk^hjaef]VlQq Sp PkJdE]AX@VBZFaGcHdJgNmOnLjKgNjNkMkNmMkMjPoRqQoRqUuWxUvSqQoRpTuWxY{[}[~]€]\[€[€Y|Y{]‚bˆe‹ e‹ b…[|WwVwXyVvUuVwY| YzTsOnSu[€a†bˆ_…[€]‚ _ƒ ]\€a…c…\~XzY|^€`€_`d„%i‰*lŠ,kˆ3l‡Ew‘X…d¦q𝦹ˆ¬¼‘±À˜¶Ã˜´¿—±»¡¸Á­Â͵ÈѶÉÒ´ÉÒ²ÇÏ®ÅήÅγÈиËÓ¹ÌÔ¹ÍÔ»ÎÖ½Ï×ÀÑØÀÒÙÄÓÙÀÐ׺ÌÔ¹ÊÓ·ÉÒªÂÊ™¶ÁŽ®º†©¸€¥¶y ³j˜­]¦Y‹£^¥g’©n–ªq˜¬l”¨`‹ \…›cˆœk jŒŸd‡›_ƒ—`ƒ—f‡šoŒŸy“¤y“¤n‹žg†›hˆœPs Ps OqQt Ru Tw Ux Uw Ux UvVuWvXwWv WvZ| ]‚ ]‚ [X|TuQqRrKn|œžÿýçöóÞðæÏý÷äùñÛðèÒêàÉùòÙïæÑæáÐõñßͽ›ÏÀ¤ùõãèßÉîëÝìêÛØÖÉ¿»«•Œv¨ž‚²¥Å¶—¢q”„h “{‘‰vuiO‰wS§—tµ®›£ŸŠ‰ornwztmoihkcrsjvwmnn_kk^fh^fdZ3^oW{WyRs KjGcEaFbHfJiIiGfGhJiJhFbD_D`DaCaCbA]C`HhIjHgLlRuTxUyTwStSuUwVxUxXzZ~\^‚^‚[€Y}UxTuUxY}^‚ b†_€ XtSmQlPmPlOlRnXuVn NgOpZ~`†b‰`†\\€]‚[~Wz \|_} ZySqRqUuVwYzZ}\€^ƒ a‡ ^ƒ[ ^€a„c†'lŒ8u“@y•J™Q‚šJ{Gw‰Viq”§u™¬{Ÿ±~¢´~£µƒ¦¶‰«»Ž®½’±¿‘±À±À–µÄ¢½Ê«Ä͹ËÔÁÐ×ÃÒÙÃÒØ¾ÏÔ¶ÉЮÄͨÀÊ£½Æš·Ã°¿…«º}¥·v ´wŸ´z¢µ}¤·}¤·tž´m™®l–¬l•ªi’§fŽ¥_‰¡VƒXƒb‰ m£w”¦z—©v•¨}˜ª†Ÿ®Sr Zy&\z$[y&[x'\y)^zZyYw"^{,a}&]w!ZtYsVr Us Xx VwSsRqPpQp WvPtJ€’óîÛïíÜìàÈìãÎïèÔéåÓóïÞûöàøï×ôîÛðìÚÈ»¤æÝÈðêÙîçÓúøèðíßãàÑÑÏö¯œ§Ÿ††n˜‹m£iœ‚V§` Žg§’k²¡~­¤ŽŸ›Ž‹|sxtcgdmogstmmognm`ik`cbTfh^ef\hdV?^iQw OpLmJlLmMnIiGeDbCbA`?\[AaDeCd?_@^CcDfHjMoNqNrPtSxTyUzUxSwVyZ ^ƒ^„^‚ ]\€Y~UxSrQqRsVy]€`]|XxVtRqOnOkOk SpXq#VjNdOkVv [|] \~Y|W|[€\W{VvWwTtOnOnTuZ} ^]€Y{Y{] a„ b‡a†\ZZ€X}UwTs SpLfGa NhWr[x`%f…)h…+i‚2mƒ:q†@u‹Av?vŽ?wŽK~”`Œ r™¬ƒ£µŽ«º•¯¾›³Â¡¸Å¢¹Ä¡·Ã¡¸Ã¢¹Ä¤ºÆ£ºÆ¡ºÆœ·Ä“²À‰ªº~¢³uœ¯n™®f“©`ަa¦d¨a¥]Š£Yˆ¡Y‡¢_‹¥k’©v™­|›¯}š­~œ¯ˆ£µ”ªºNi"Uo,\w/^y.\v/\u.[u%Yu[w.c~8h€6c{1^v,Zr"VpToQl MhIdMgNj LjQnRs_~ÓÔÅñéÔóéÑßдâÙÅÞÓ¾êäÑ÷ñßôêÔüñØóìÙÚÕÃñèÕñëÙðëÙù÷åèáÌàÙÇÙÖÉÕÑÀËÅ´¶°œµ«“­Ÿ‚³¡~À°Œ¹«‹´¦‰« ‡Ÿ‘‡ˆyx|vquqjmfikeqsmqqhhbPfe[fgZqqedcVli\;YaEgC_BaFhLpMpGf@[=X>ZA] ?Y9Q:S@\DbGgIlLoKpImGjHiIlLoNrNpKnKnOsSyV{SyQuSwZ ]„]„ZY~Z€YX}WzWzWyY|`… e‰ d‰ a‡]XzSvRrOnMl RnRk LdKfQoVsXvWwUuRvUzY~W|SvPsPsPqRuW}]‚a†^UvQoQpTuX{Z~X}Y~ZUzOqKjGcE`FcIhKkKmMmMmKhHbIbJcKbLfMfLeSk!_w0i„>sG{–K~˜TƒŸ]‰¢aŒ£a‰Ÿd‰k t•¦zš¬Ÿ´z±n”¨_‡œM{’AuŽLF4ŒŽDÌ–ÌÌÎdÌÎÌljl,&$¤ªL LN俤ìîlŒjŒ¼¾ŒL:LTV<<>äªä,*,,ìî<64dj4ŒŽdìê쬂¬,*\^\\NLÜÞltrt¤ª|\^,üþ´,*,¬®\^ÜÞÄÆÄLN4̞̼¾\ TV,üþtœvœ<6,lnT  ,* dNdÜÞ¤<24<>œžLÜÞÜ|~\¤ªTTV$ì®¬TVTüºü,.$<>4|~<œžtüþü¼Š¼äæl\^äæœž”–”ÌÒœ<.<|~<> LB<”’DÌšÌÌÒdÔÖÔlnl,",LN$俬ìît”n”T>T\^D<>$ì®ì,.üþln4”’lìîì,.|^|Üâl|~|üþ¼,.,¼¾\^ Üâ¼¾¼Ü¢Ü¤~¤<>,lRlLN<üþ|<><¬®T,. ¼Ž¼!þ0Creator: PolyView® Version 3.62 by Polybytes ,xÿ¡˜G‰*\Ȱ¡Ã‡#JœHQa_j˜äÄ™cZÐAB§I‘'M–\Ir$Ë’-b®‰òeMš%OÒ™¹Ò¥HŸ;aÒl¹S§Ì›@o^ióçM’ð ù³*Oœ7cµº)MœW“ŠM9òkÙ d‘E ³«Í«cvÙ†GÈœ0uêí)Óíм| %k«Ï¾\ÿ¶jô-ν"Ûœ (  µmÖy¶1cžgAs†ì¶hMÁ{¦Ûòôb¡DæTcM•wB6ëY÷̬® O³µVâ›3Ë\Müm×&nddYC= Ÿã]×&ŠT(h°Ë{†ÿϬØáªKÿüíed+Jì¬ù@ÆÔ¿nOêÇ›x¨òÑ’c¼¢ýv•7óhÅvE²ãà–½$‚‘˜@v'C‰€¬bà趪ä9_3Òí°æ(AU²Œ‡àý¸8|LP¶Dä1IÀB¬‡œ©‰íÞtǶyÓQ\À̰‡Wþq EÛL“æìÂÌp†™PPùKJ ºhÿÇùÉf(‚œ€‚ À3™–œæº0ÈŒ«Ý\YE@b`@ ä >CéM+<Ùf$WG-‡’ BhB̉Ð%ÀžE,f Ї>b0ˆa¿ÔÆ-Ì¥§#¦‘‡4² ÌM8(•iÓ¦a2Ä©%„ à0 3Ù)%ÇδE¤ýûWÔfx(ø ©Ô”fØ0¶©©Ê+]j Rð2ªMkŽ -É ™Jž­JgÿJÈR¦ÐÅsèT[Å€8ÜØûë«î„¹õ82˜$¢Û¼éM_M€¯ôã ÷p„ë•OѼe!6 +¨ñPoŠIPÁFÔœÿ©ñeGcS• Jb„'Xû©3tëUº8ÌgÞMf—ƒn–Âz‹ýX4[X!.»¶êªxNÄa*öeçÅ.Ê@Ò, 6Või¸\aj0ÁÀqkvî©H‡xÍ\nREp,mÀÆ–Þ4@b±õ¬Ôð³¼WÄnµE«xÍoýl(!@ ­ÜÊ™Pª2Q~Â/ã SË«^s´ X»ù-£9íNP°ƒ@†ðö~ $P_UY˜€4vÚÙ\–Oãhîk +¿ŠJ¯Yy©bsBMlC˜ ^PîHãÀ¹ÿRŒ|KyÃF1ZNR_6,ƒ€)L@Œ(v0$ÀÊŒ=y€Æ^µ`L_úeÇqüfÆB–gzÎ 2F¤ ãA¥Ö‰Q¾—¸Ê%GËê¤oÔ#ª}lµJ'0zrBB»„>xpcN¶a”#^­ñg9Óƒd$ï|Ϙõ©'°¡çð¤¥.Ó…ùµ]ƒKÅö0Ê2ݰÓò”ã哨ý"O[(W·Ö´*˜•ˆÉæ€Òº•…Ù<Ë›8ÎHyd¨pGÈκ O®þäº B‘žÄs]Ç8')>dJ†*B˜(Áb{„{¼b|âTgNs°I‡–»†3’¥5ØñK¨Ö\:³8SU+Epbôb[Å,ră€iº¦SE¥mÅ÷S‡|¢VÃy53Iè×Z#FfN{` üu\%8h ";±cof7WÃ-5ÿ·@µƒJ·~MeEf ‚÷c_&¤w¦Qq%4IŸClàb„Cvq8cqÕ{ÄJ°† )ô’cœña¡Ò9£‚›ç*yæFbhodPFppVh Èe¦UøöûD·‹„¸|yxOL7°qö4—K)ÖYŠ0AÐ9cüå6þõ(Å?QGaóŠËw/üˆ@„÷-RÖ'`rÙ˜LÔu›w‡p4ÇŽuˆ7oÿ¦(»Èqþ(/VófmgE÷1èÕU˜qû“2XhKÇY%Y@„—6„¤„r0XíWƒ¡V+_§EÊ8—GgñâÅFsŽ…b‘È…š˜*lðvd¦DE¹…q=±c[¶|MÇ~R¹:o“*R@Â(”7$ˆ'V…ÒmmA‹Â”J,ˆ“«–vz¹v¹Çh%àŽD9ˆ2E…ßçËh“¤ÆY‘ÖyìwAéטwö8î[˜f=doΣkbgëLdŒgŒÔm9¥Y¿XÜaâ6 1ùW¢ßéùQb&cEÃiÈ&©Ù—¤ ¶Ð !éMíDx€*oþÔ3[Ù\ƒëU"Ó%¹Ób¸äÆ ûÒK˜u®Í½“nÂ䃌‚}sÚ›‹«ˆ,Ü9¡STXî¥wˆæB?$`TÙdoשùÈQ‡o ¨úç¯Ú§MBË¡uSÿw­d—v÷’­ÏÒ…Kr›‘A¸¨,–¶p£ «žãÅkò0_Û1žàך|ͧ¡´½ˆÏdO”GÕO§µ2m"h׿l%ÂÃpçÞŠ±¶®;ç×ñz*zt¶wP´ŒÆÛ<òG¥2ò• #r¤d§™]´w6íƒlƒŽG ÒÝ#S}2ä[]œÙ¹ÀcþÙõúÏZo‹Éø¿½åqÞUßí28 ƒèk\qVé FìÚ•ÝXDy áœõ+MrÚ2ž'ô#Ç5æ)ƒé“˜ðãÐu Ù ±VÔ4f¥áFšô‹­ ÔåqQ‘W*BEhÕ3 ‰…q-Ò²·aY\pÎc¹¸¡šfBx¡%Ô.kó±ÌG˜s^^(ô­ÐÁ&Ϲ©·ehD ÁpzŠ“œš‡T‘¼ ^l…= 3„`Œxõ¥I·#= ³oêxF‹ú6x¤D܃pö žéÐàÄ*šËRX¼’6äõô£à·T_Èa>PÞÃß=(ƒž¢RPþÂnUÁH5¬1Ï'cÒ¬s|.%ÁxÀúKaý1IçÑ5[2tÅçÿäÿš¼¸ó[££ÉÆô™ìºZ2yGÜRø^}*bÇÏ ê;Š.UQŒlØqÕmoÈÔw ·Ò®Ò1Ðâ„âÐX¶ýðkÖ÷ñd’*utK’y{v>xÿ¸÷ ­,Ã]´v÷ Á’ÎOÒ§Ô!1Câ\¸e^<½M])ÇòE:Áþ7hg«%½ý²j6DH?ˆ¯qïî)=Õ‚êijv‚pXv½—ÍÛL_N`b ;†>VÏ·­?³‚Âõw­m?W<þ>”n¿+ì½)ÙáTüÿÞŠt¹åµÛ§ÎÌÁ"vê@ì~”æh·Ä SëB\é—o«ÛË,j`·C×íOÑDJoÕ1 Ê.WM´D¬:t5%Ι Êþñ˜phù e8>Õê?gQõ¢-¯ÙV¸Ðä\˜dW‡ƒJ¦‚HNqVÍJx£ž5Þ·©—º†,å%Žõn=ðzÑ£šKÐrƾŒ#ŠŒ­o «<{”çõ–›NлTEenËYRp’úHÑÅlzUVÖ>^àˆØ•ÏAZêz”—²„§ |,.Š_ß'îzÇþ?síúÖ .n‘³Ÿ:аÛ;ëö¶Ž•˜Äã*Á õ̘ýÌ»¿ôš²*€¥Hšyðcû\Ù~Š­Þ¨,ÙEʼm ÈMmm«$Ù‰Xîê«iøYµ‡ŠIÆ‹üDrGµXm~Ò­a XÏ©#$ýé|œUt†1òåëE_KgŒ\“V½Ûå–D6û2wÛŒýi„ÖÖˆ£Œ{ TÛ‰è¤ÿJŒ\~’ìÙÙ³üš£ßµg_JóÌOUÖ³o?ˆÓBàÚEŽ¢¸¹…XúÍsoŒà]PK}9åÚ"H¬Ù-’FûWWÚ“–üÍq/ˆuK›«æº¹äEÙ ^0qô4\8âåÙ¯9™¥ }Sô¯ÚÜ1½žå&q!a·±OüÑWŸj­ µyí§<Ò©Ë(õ u U–Gº ]œß ÷¡ŒfÂÆåìžœ`È…€e\uÅ3FsÉü«ŠYÛÏ›‹¸'ŽØÌÐù~ù=¾”ËGÕ&Qr-•ÒáW!·ä:úg±ÇB)L¼T÷3OÏ’}fíygÒbq3‘ëR<^@TáÇZäÚgÅWºN™%Ãï#ðÈc“×4lµÄ´-y§§]«,d¨'èsúÒß,V¥éµ/ã3R”)¦tK‹ÈíÓ3:©úÕoQø²ÚÒ7*۱Ϩ·ß6¦DÏv¹bÄ3žN:}é=ÛKu3Aʩ˵YIKÁ,Ørau5C“­Þj—R\<…Pôí…­R€W¿—óÍmi'‡±IÀþ´n‘¦5î³gÌ‘Î}êÂãäƒåŸåÓ$qéŸóR^êÿÇ–Æ!öÆG÷éæè'¤++v”Peá½ ê·~$«þ’#ç?Δzé1ÇÀU^œm¦iÙÙG‘ 8ÏSêhÉ5ý'GQµCÉŽÇŸüRP”0ǪÛ’–GoÂk]y°Òz·_Ê[iÖ–¸Úž,ž§ŸéT ÿÚD—>ޏ8‰[›Š¥_~Öõ0ìCçð£~§­RY¤ËFG7(Ã, ÿ"rñ[†,9`ƒÐrkçxkšÄcdÛ¨÷RÅ<²ý±Þ7§ÆíüѶÜýäH%_‡p]£ðŽOsRWOÛ,8Çý2Qÿî í’/âÓf?B*~X“Ñb¼5@ÓjúEì.R[2Nd~b­özΛ~­¯a”åpjÊq~âÐUÚ‰-%Œ±ЮTàŒŽÆ¸.£fãY•ReŽí[ ²,ÃÓÜžk½;FÊpCqë\Ëö‡ikd¶r€¢[–qµ†FŸÎ˜Ã*•óq¹G²ú9ÄÎ-åĬªŽNÄvÚcÇP3Áýkß^Ÿ/káÃ˸=zÐóK¤ÝÇ1’;:8S²bêùôÍlšu¾œpâh[ý¶-’ÞÇ)ÕlÈ•/} ÕàÔ^ÒÚÒKÁ,Ó9 •U®;žzÔVš]Ť‹Ë—'kÓ'¥ÂY^ÉFFV%=ð2OÞ“Ø.¡w,·—2`‚Ì àt®•'e±v’¤ËyùGÓ­.'“1îc Øè¿LKï–IÖ$y-3»àdžë^iëu‚üÆ re”¯Jû}JšˆŽ)wB±« oi? ƒ•©Iÿ§Õ8xåÉSI&”>A¯ã•<®?tN}zÑ:ômðü:F«½%´ºBj«ï‰ºtéZÌmì­ü HÞyÂŽ1¸c'þuªÅ—ä_©gfFUh¢ÎvöÇךìZtŒïåñ§‰J¶ŽÝk¦#ÚEx}Å6Ò´˜tÈ$“øÛ’M|Ó¨üAªÞ¥¼W·

ÔÆÏ7£­ÄEÖ«yv“"$?NOöü¨¢*6#™n¬0å7þ£Éþ¦ˆj~ë…díÙ ÊÙ…e\‚£©|Ayy!HåeLàHï$a*ù™›øŽhÏÙ!@‰ïŠTY b …ÆKw>Õ—C¬K©’Q†ì(媙ªLVAŒ…Çr¼>,[@ã¸Çz§êÖûKäjh…ènhg@ägu[-t}øòК ª¤Q®:W‹+eÚ8¬ì³Ù¥ƒjÅÿ«uZgÃÑày>‚ÀâŒUqųXâŠèøn&€T-ð˜rnCê*Þ¸ÎkbÀu©Rdõ992’¨ø…ÃÅ ‘y·MyåšäǧÛCá¢ÌùÉÁçÒ‚†ÊÊ9å±–ErçtŸÂGAŸ^¹úÖ^Ùøs“qû†$—mì?%¢0>ÈÖ+•([÷¬f·9cÏçYÏog½†HÊ6¶ƒ.ž)¬î㻈Ráy(Ÿ°®W½~fIds°.ãîÅX5¯Œ!Mö:U°HS„sÎæîÞøíùÕI‹£Ê呺ôÖ(5¶yïå¹ÉQ‹ðžëeÌm4AÜîò}½ Gmq"íBTþ!ÁÕ§ÌÈè!†2Ÿ^xö¬Ž6Š\ yx#®(ÏÃü>øWP¹Õ>´»º1™]y)Ü>üsMȪÏì¤üï†L2²£zƒƒŸÌ‘ö«\‘´nQ— )ŒY•}œØ; ÖVì+(¥w<¼ÎHN„â…¸‘‚mvGÔéOõo‡®`‘žÖ&žÐ«íŽõY–Æõ¥-$Bœêx¬÷½쟀7 ÏLÕwRŒ³¸q½õ«SÛ²ŸþTƒíÖ“ÝÂ|o2`~½…C9z9Òo‡ôr´áVtèHD8ì*Ïl|‚²rzmàðe"ˆS(xz % d‘I¯Xšð0•„椀YNsC”cGì“ý*]íÈûÔ¤Cb»¨ÁEudžXn¹”ÍÔÔ¦I OMجèŸ\Um®î´é¾bÊg†A×aÅt‰!W^@5]Õt”3Â0OQGÇ–½ˇíi_´™ÀŠ UʇU`=Çz°êŠºæ%ò܉,6b!û×?Zåúž™=«n)ŽÄ㊃K×õ-bÖ“²áã<«qOF¥´Y²(|iÒýÊD.XdÛ® =Ë2ª£EæÜÞèú½œ·Q ²ÔQwýܾ»}>•_’kxm¸žCcì(ÈQ»{ µñü´,‘x3‡áo+ÿŸíF0;IÇoZ÷nàb¸“‹ües&…ñÔ1¨Íâ/›ž×5^ŸYÔc³Žé‘Ì26Õ9â®ÚÁwñÏ4E¢Œ¬|vÀß4½ŽŒ+&åþ^zÖFGMèÕŲŠÙWƒUi/Efeç!Hâºf‹‹»hä9ZFÚu„Ã0Ú²1¹F>µiøbÓó Ž8¥r¸¿ê9†3‹üˆ5qLØæªWþ2ÆÒ±)à¿ø®…¨[ ÓÍ*½Ó Öâ1H«Ê‚:PâÃÎ-­ë *MB6ÿP–p÷É#{’zUm!ÖÅ··3´©) ˜íǦ;ýsWc¤ÇŒeÓÜ’s‘Íjí„¶³ÙîF)•š)RBo6í²§¤ÙkQ̾4@ƒÆ[Êó÷«Uµ…ÆüÜ0Q×›ZYHÏâÌrçÛEMÞ‚—œìk¾‹ePªŽ”·84}ÁÀ4²Vã=ªˆ¼´xr¤U^öØK.qÍXîäàÒ¤MÒäÑá¡<»bxíÖ'9B ãŒÓ}ÕĀܩ4ñ´¨¦Ð¼b}à.{óGÁ§–Âîý+œ›&¶&B;üm2úW<×Ù—â›­¼maÓè+°M%ëÈq¶$äû׿”ÝëW—(ÖvÚG¦hümÊÁr’Œ(±èšåŃxm#4\cž‚¯Z¤7@n¹dã¨Ís+(Î ñN-.M³€c¸Í8fö:U¬ðòîrAÙeTìõ,.ü}ˆ¬®,¤ŽÔ¸­En)ÑSÒ<§é^ ò)ö­ª‰| IdþHË~B¡–JÊ$Э֧y!V±ŸLÔ˦@ƒ"$ü«4õòdœ“É¢åÇa^vo´›=F,iE i!Há 8íN´ˆDv Ú«ûæõ—I <ÇÒ­Vn £¨O {ðöTÝ!¯,žEE5Ç…–"ƒ›VxSÄtòzÕK$è>k0Ã5YzV–º¼H6¶NyÅ’«°ÅZ‘m¤iòáW¥ršHÀ1JîXv®dDQt2­'º;TÓ›’2i-뮈<¢©ŽðE@ƒ ý*F<š‰÷ª=èÈI–{9o^Ò!?‡ >f©4~¡ ŠòÞ e‡¨x(@&@ZW­k¶örD""IóÐuªÅ9Jy5ög¿j+§é-k -s8ÛÇ_s\êßJ¹aå†R=”×GÐtÙ¯îžþëFÈót^3Åt]>ÑcŒ&Ð1Øw­|N‘ÛÙÈå|’ׇ±øsSœ…Óƒÿã8«5‡ìÿXœ)–íÔ÷‘Çè3]l ZÜ(£¬HW»(6ß³¥Eâü–î#OîMe_¬«tèŽÌ—°€VÀTœa^(]F"úmÒ¯,a`=ø4^+ldb¹íQ1tìæÖw`Á­5+½1µy­YÉ¢jÏ A!/ v+éöéJïæñ Éè+ÏÎ2¦zLy”¡hgðñ‰× JçqÍZ£–³±Çµs#w4E&‹ñ'4Høµ¥7Ê7¡f«Õ¶LrÅ*eÚæú˜¨ /¹¥z¾¡nÐx:³6Ï5U†Ôtó»à}ªÉ¤ü= 2 ˆÜ Ž©SoÃÖÓ$H–h2ŽçEiú«áÊvºðA¦Òc` ¯j–|øÐ²þµ¿©bkÀËÖ¸¸<ÕjlÄŸ#ô±¢%¼ñÊkš9dÑ5ÍÀ=éUÓäVx­#‘Íi(À©Š9X¶FÁ4 —/žœÑO´ž”¢îOÝz¨È^%8Š,…ûú×(¯²×<žxT¾§wn%¸ ±º0qëV 2Õ–Á7’N1Í50‰Ñ¤q…†SàÚj²•éøÔe`Ádcß%à Ϲ—s“Kïî6Æ@=k’Ø9= /f˶)lí¸¢w&¥šL±&¢L²™á)˜ª–Ù¼Ø,ˆzd ê름ŠÖT 1Éþ•È®\¬ŠGc‘]‡áZ-kIÂ;¥Ž äuÁ^¢´8•LK‘èæÎlxi#Û†®F)ÔI‰HÎF3×4’$QvÈv:ŸlãŸz{D§ºà½6Àpá­"µ5Sˆš²±«+Ž)²§  fN)œ‡9 ¦\×LôÛË<Lczc9äÑPJu‰ã–ÞxÇ;€ÇÁÅdV–Ådžå¦RAFÆ;zKhm5¸¦p ÷§óÁ­ÜKkÚ19›µ²½‚E–X·.pG×·O 7&»Û¼( ìiÛÛÜxû•ÀŒŒ*“š©üŒ·ŸÎ’¾èØÏéVÔ¶Ø¢mi½»Â ¼Àá³±#ÃŽá ™FÓž¢µ+»“zd‰d’Ö3´’ îG°­/m~ac•'‘Y\Œ?ÿ½Ää]7êD°øj‚æácQ…A)ÚÓ4}šé±eŒ¾sUÔŽuJ±£mí§ãccéJm}šë.ÔKÞ«n‘tø6?‰×­-#“ìjk]1±¹ûÑék´t®r°nMé²Lt£Rp§Ã^Ôöàˆ£=¸ªÅÔ¢I‰'U[`2:@ìBFIëUíFçsšgv W°÷³Ÿ€Zö)‘ý"(âk™6ÃÜÑâxŠ. UBªñúÖ·jU1ÜÕûë[J»ä«žeøSâ«}£ý%Ö€è ƒUe„’jùñ$QI¡iWèùb€îÿ¸mÿ&´8ÏOüζ‹ãCáj,à*°õü\Ó˜T˜ù ’yÀ÷¥®‡çí»³žG°ûS•\ Zu‹mÿ†µaRÑ…AÄ8Á¬­˜VWS… +sŠô¿ ’~µçé¤éÞ¶¢–ETª¯ðmø²§çRè–ðǧnrHÀœóÏüÈ¢OÃÒ%³rÑ«e¤ræ(ëM>°ŽXÔQ‚1ÔôÍz+Q‚Hóíö›%¶‚8cfyÏ+û³ÈJ¦]à†ñ‘ƹ”ùÉDÎ8õ$V·hX4nå@dœ-"™cµÒmÌR‰f!¤t=‰À_Ö«“Ù\‰*HH<Öè$v‡Ã *‡Å1°q=ºïulž•¢iD[ü½ÃËeNKŸsMu (mañmbT+‚Áóžÿ•›ð¥èÇ"„í„Cž€cmqåŽÓSŒ óQ‰ª"œdVVB§´?*ì@I4¹µˆÕyqùÒMWâ8a‰·Jª=ÍJVC’KdÚÆ¢ª¬ªÍø 3`w&–Þë¿3!ðsØž¡á¶šòPÓ1oAØQTkÑ)äìôzZ]F]ª ÅýM9µ³X*­Oeb@šm žÑ’1\ätaö ع4ÌeÉÀûÓÙ¢$b…k^ø÷ª©(X…¡)qÎ*ÁÿQŽÿBøkLic¹oz*°þÄR›¥ÚÂ?­Iû>h®¾ ˜ÉËc)Ï`r §ør¹QÊ#µØGâÝÉ1ü1®ÅúžOôÅ4×­CeŠÝCpÇÌ~§š Œ}+Mˆš‘Z0­ÏJÑ«ˆ!~µ•Y\qÎP‹ÓŸ­ uwg¦ÇFXHW8=Nì }ª\VÐHÛI±ÕŸq¤L›ÈÝ!=‡­~÷ŒÚ,r¨o3;`àVé$ŽítT“ØÓúŠ$’餂4ÜîrÌp:ÕjÕ‘Ö[BY-¢:¨(dHd|œ( bál²ÈňáX^kky&…£ ÑŒù½3éëUrÿæ H™ 6á‚éKä„ÐÄ2M}ˆßW»a´ÌGÒÚcºG,}Xæ¶’ÝÅdvŘ+>’í'é5œ;Ø`dU§O³é‘ùP:u˜\qV{(@—œ†q@&ÖÐbŠh¸âˆ…0*o“Í Æj…¿/žH¨'ƒj€;štc§Ò«šÍÁµ¬-·ÿ¸þƒÐWzC¤¬¨k—†Q*@qƒ—öö­>{&îßQ|Ñ6ìêµI%·ýOPKaˆƒ!ݪÄ4ä··87 ŸP„ñ|–ÙÙ4R gNŠúØùr§ªàÑÆ¹WÁZÒè·íg"9Žå»3ÛZêjêèNAäbµá58Ú2çLÔõ­¤j¨€È𲱆k+Ž8t7ƒÖ™X^"^@ÎØPà“éCëŸkzi|?™µïB3î:Ò”i×[ï ŽN 󬟅ÆjÍ7J,êA¦KBÉ2=¸Ÿ7\œàu©Þìê6qÂbåR?Þ”H"µ…-Ô°imè~”Nª!¶’p!+?îØ– 0zà{Uzüx¦g´yÄœe@$ÔU”KôV ÛlK˜Ü‰„Ó Íç9nqÓšM¬5Ä:”%¶€ãh_å•{Òì"´·Dæ;w£¡úTæ›k´··%7Jû!ÝÁbOðʃ–i„¥(ÛgµKmk–éG´Z.ÒØªgk ËF¬a²KH: SËh¶€1BÚ@xâœÛÁÓ47H–+ÚˆDÉäVÉÕ¿CŠ‚Ö<{”öâ©7ºMÜ÷.‰.Û‚Ïçš¾2î'& ð9À&¬´VQRôG¥èpi–áeâb9&ˆžÜc§Ò[ÙIs&ÈÀ^Řð3ƒÞ¶²Ñ®¦šV¿·ÂØUÁÜAüñLC–_•ž|pÑL¹³,ÃÃvxÇ\Õûá­Jki×I¿rÓ2 ‰ëRI¤[Ä¿é¢Tl&lNø¤·ør¬‘H@À¯!‡|Öƶ̾NE7¤_Íhj :ù5 5™F×W_åaÔTíMŠ2'¬¬jÊ“ƒ±ÚªŸü£Î­©¥©†æÞ|sÈéýêØ+ÓÎjYs”øÓ_Ê©o{x“–Ç™@ûÑzlk’øCrmʸñê¶Ööº„-oP´ŽC˜Ð)aƒÁÇZI¨ Ö«&L-1$0ÎëœHªsØw¦šE¬‹j‹ÈÇ ãð‚zŸ¥'¿üYWõ£õZJÒŒ`TFe^K R}Mj mÎ+¨àĹ2ÉáÄŒì{V»-:ÞÒÔ3•–y°¨è*«¥‡l ïÆ}±W 21Ò´¸øc,ŸfO'‘7“âZBójššä,Q[Ì à>”3[|§’ÎH˜ùÆÒIþœÓ=@˜ï[g—ÓŠIñL²&•v^CŠr ¹lZHœOs …ê²çÍôÈÆ}¨ RÚÂÌ$Ù&z‘Œ‘ØûÒ òêKØ•îfe#\y«=·Ÿvï6cçœóS-H¦ÚvÅš-óiºÉ‚n!¸Âžx ØÕÍ«žjàÁø¹«ü$›xÉ9%éD‹Í[ŠÊõ«*ÄÿÙrmagick-2.13.2/doc/ex/images/Button_9.gif0000644000004100000410000001220312147515547020075 0ustar www-datawww-dataGIF89ax÷ŒŽ\^ŒŽŒ\F\dj,.ÌÎÌΔ<24LF4<>ŒŽDdj4Ì–ÌljlÌÎdÌÎÌTV<,&¬®Tlr4 俤ŒjŒìîlLN¼¾ŒL:LLNL4:äªälVdlnŒŽd,*,,TV$¬®ìî<>4lbLìêìTVT<6,¬‚¬LN4Ü¢ÜtrtÜÞl\Z4 üþ´ŒŽ$dR\|~,*ÜÞÄÆÄœžLlfD¬®||vLœvœüþt<:$,*,TV,œžln ÜÞ¤<64ÌžÌ|~\ÜÞÜ\RD,",¼¾\ìî¬LJ,¬®¬\JTüºü|^||~,œžt,.$L>Düþü¼Š¼TJ<äællRläæŒŽ ”–”ln,* ÌÒœ<. ”’Dln4ÌšÌlnlÌÒdÔÖÔ\V<,&$|~<俬”n”ìîtLN$T>T\NL<>¼¾¼¼¾üþ|~|lnT¤ªL\^D\^\ln,\^¤~¤\^,ÄÆ\<>,lnD|~Lì®ì”’ldNd<><üþ¼üþ|LN<,.ìîìܦÜÜâl,.Üâ<>$¼Ž¼!þ0Creator: PolyView® Version 3.62 by Polybytes ,xÿµ˜gÅ*\Ȱ¡Ã‡#JœHQ!œnj(…‘ˆ rj8‚âH$I‘5P–\©2¥É•'•|Y#fÊ•2oÆÌI³%ËŸ5âôi“å‘ ŠPðÙ(pÀŸ7}Ê$9æOª3VEéR«NŸ&E²¤iõ¥Ð1‹ª´)§£lA!:3hרSY¦-[5gY¬(OŠ <”oKÁWë&6kµ¤@qÁ2wëM¿ƒýÎ+TåH²‹µµ|VèV­}¥næ*SÉR-’Nì)")$Î’TiŽ&»·giºf}‹íÍ7÷iĽÅfÝŠbÒ{dã0ÔµrOÏ:—sÆ^6óΖ]5sÿÍ<”5ëÂR?ç½)B #={âï`hsgÍåsß{zøï¾ú™†Û€AáôÝIû¨Ý€ ›|{à€…ÅM倯áepY F”y}UVX‡Ëe˜Õ†á †ò=xmÖW—K4Ö8ãX3Ž'£ê˜#QÕH㉂èˆ!,B(ßdPÉ!‡ "åˆPI¥”Ubyå”\ZÉ%–`†é¥˜a–™%™_’éå W@¥žq$!’ñÑ&Ç9ðÐÅ#AðÙçŸ| htêg&êç#…"Ú(¢Ò1(¡‹&Úh¤•f:è¢20ÐH2Ú$g‹ñ=ˆƒq,*i¢>J)¢–NÿÊhŸ’z¨¬„B k£µêš«®«òÉ+«­"G$ú5*ñ™¬•¾ú(£ªFËk´³ +èªÓÒŠk¯‚bÛk«ÛVÇÎt’’ºÇV\Úë¸Ø²úH¸¾Ö«ê¦¸ ºi°àö i°´òY˜)›äœá„®øúKíÀ‡^ûoÁ¯Ö+m¥µŒïÆwëoŸüa×iËÒiD¤äæšmËçÛ±¢ùzûòÅü\3®Š<ëÕ g»¥î¡AÍ# ˯¦Gü*Í/*±Ç-o uÆX×qL)íÆ/;móÌaJ6ÕŽB «ÍjO\í¿Úª h¨Å¹0Üêï°KÿÜr·üÂZˆ„Þ¤÷Úz©£ß*¯Æ‹KÇZ,±«äƒ_ß;v¦dÛK3Ì~:aE h´ÀH ®úS a€VPæ+ê·¦ƒN .Ý®´,Ñ{àÁ8±¸—ë-ֆʖ’ITD/}"ÒWÿA&1Œ€F môìçânƒKu´t_¶UÊJfÞvÔÆîªAÈ`fðñAõøç¯?™,2D‹ë´äV¬°Õ*iQÉÐ.·õÅm€Å“[¥d †ûË © ŒÀ oËñú†µÉ¥(¸Ñ„w³ð™ tR«U‘èm°zˆ^3H½èe‚ Ç''â~u¤ãþTÉüM!ˆ.$"È´…@ÅøN‰…”àÁ7¶ 4 ¨l¥0«øJ(š-‚”òÓ&ÕU’ºËŒ,ÃÙ†($ Š“¤B"€P3x“U "6]IڵЉI B E„ôAHxXÓ ù$2¼Q˜Xªüÿ('D!v£$¥G†-^ _×¢eu<ùÒsïëÓ¬ `B’ƒùKB,¡§ö=Âð‚0‘ 쑈ôÚÙùÒµ¢©m7 ¢h ;Zq #x˜È&å‡!¬A˜™ Áð4À—…GPp&ÃމȚu«QqÁ0€‰= 0È@‚iÅ*0@VµzÛ¶ÊÇw:j)ýœ °ÀUjð/ XQ{ùˆp5Žx­ž$$ÅK'ïOÔK3æ¢ø80`—r[Ÿ„ü±ò‘fØãNçú§6Hµ•.aÕ v»u¦¦“Ìjà_§ùÇZ=A›Õ+3`émWÖÂC[y½ÿÖqûR'‘Æè Ðæ bë›n0L´A\!| ª L À²¨®šÖ#j‰—$>3>,DZÚX‡{ÚÔ­øK<Ëv»ÏY»7L„$,•´Ñ¬[±[hE SŸ©MÃt.Δ¶Æò@œ7Ìa"¦ð0¦ñRÍŒÐXTسú­j½js…y«¦pß[”8ÞÔzXzIÄÄ ú4>•*1i.åJñiNc ð‡/ÚL.íÆæjßYQwH f–l²û4'‚?æ×žöE‹}±Ãì&&²”šP&?YàRé+±¾Õ ÃDªÉDl•À¢VÄ?9Áé„ÿ&f5,Ø~uÎGx`y­Þ 4»YþzÎ[%¨é @М![ffTL'3"šv³0ŬXj–K±ô0SàˆjÙ rƒå\¯GYÌ aÖì9#§·^Õ¡¦yN-+qµ”êÊ8гhßg+¿á¡Ã7óAµ©h9’;¬?-mNÉñ¥$èkWæ<öÀ߇Ýa겦º7\&€Ð€KM¢šs̬%ïWÃûòôV™¿—Ú ~¿Ò]Ÿ²0R*$ÁÝ·J«x7˜vv‰™|pˆ€^Új m#åƒù䇀޳zp-âšÈ“‰„Ñ l BYÆ/º•ÿ˜rçz³@ Í3Î`d݈o2ÔZ^"ò 83'¸Ø±±ˆ}µÓo ƒÎà ,Íjëv'·œïoýÜGEußÃdAÑѪ6 Ä`˜;äÀÃêüÂŽ‡E$-u(219‚yTz{Öœ©ãÆê>I•ÙÜ  ÌǪu\;9gØ’Gx¶?ÕÍyÿn Gæ'¦o×à œPÞñî6òõ-L™¨+ ˆ4ÌG‹æÒz̶•“Çš´_)uË"ÿ–¾$5‚ÓPÃû+¨Ò³2òwÄW7o<êj%ð˜ƒVÇEåEñ`ÂÃ|!ßŵÅ!÷K¼cñ—J»xWÞ‹ÿ®[\¼?nJèÕ~õ¶ÐÌP‡ê”¾ù`«¬á:âe ^Æ\’pã0³aI÷]•7` q`Vð‚ðY câ†?©Ç7Ñ%,G•)Ænî’]Áµ9-S(n‰ ™ [ ¨¥A“kq”zm¦+Ë”e+&gžC0Óä']@ÁäHøƒV|×D#¦N.a(tp…”-‰äQ„âX„xF€?(v…J˜0•áNBdNæQ/ÃÀ$…dxC ¤$Aˆ£ÒPƒqXe_ÖÔpe¨ZT¸AçmÝf„ouýGj€Óx{ó…ÐI–mØ‚” C°øÿ”q“BYn¦!#‘B eXŠ2-Çl2Ðp¿§?wô{u'w{ß• upFÄ7]ÈᇰgH™Ä^°%-i#H†ƒ€©xQÕ“ %€niÈ+¸FƒFj›×gèVD|ÒQåýæX@Ð P ÷bÁxCÀhTmã¢[aq>˜>N‡aã‚aÞÒqÐ@âF ƒ`#ÀVe,ݸAʦqKcb'Zždƒj4g0„14„€0'¸?°ÜD’@k¶)’ÖJpcúF(žåºöPÑÂl¸CY…<Ðx€ +é€ „ €F \”ø†±äi€âSpC[0U@ô,Y5¡ÿsÑ#Éuh2¨Ц„j÷—V5…`ã‰?PN=6lߣû¨A™µFrnseÁÑ–:ךMGJ%€AAW=”ûµr/›V=70r²22G„4˜ÁÓxÞ³-CÐJS 76ˆ¾Â?gEÔ³Cg’ïI-&¤nAæ.ØÕšdnâ0ŸÅ…‡ŸA €ê‡?f «)6™ #uý"6ŒãWÑÓú2ÒBpWª(=¬OÖò¢äHëÉ¡»–1ðc˜Æèz™tÔ“^D@Y…Š“ÔùØBãs@ßQU™Kg;-ãз Õó~àm™ pˆvÿ˜?‹@ysY^¼DVHH Kè:#pˆÒ‹°‚Õ3žð†ð6,Ac8iÀ-ÊGtÕ—`¬xs2^i—AÀÃð~k3@àšœ7ô˜V«ú¢³†¹Ñ§íÉkIÉ61f(` àhƒÃ‚U ‚n'Šø3¢G9—Çž‘y4ú[uyc„" ¨¥}qD .PôJ¯€ÔH–äùHÀœHi¦fbÝv5H_Äš”þâà­[Jž?˜g˜FÌÖŒ…òcC¡e^c¢µØTÏ'….x‡ùï°uÖ‰UaÚ!9T I|½cY‡ ‹?”[t—ˆÿö§·æ\aVC1ãóWqC0¡0KP@¢d6B9,—gKëõU;ãÚ' `û)P$(=ð`5œÃuº4]C’)[b€ŠHH½jŽHoØ6L™PI*k—<°2è“ëy]eJµ~ö9¡ùà¶=<º?”0X œ•ÇuƒRO§+u´ 6C‰¶~ÂQàƒp¸Vô° ã—S^¬æx‰ej@c{`÷"W2u0€[À¨û“™ÀM^ð @¢aS6»È@ú§•ëIÉçWrEµ$V¬¼ê à Áv ½ ½$9ÿP  SE”•£…•Md~®µ†u‘²ª+©š†ç„(…S¿Ä›†ÿq1èŠ §"«ñ! MòäTsæ*ÌZÀ5G”}e·vÛÀA€ Ê‘i°'FyžzH’únLëŠ6¶“â·"å˜\:ðUD¨]#ŽDnîlÌbd ®TN$ÌÎÌ &dÎd 6,¬VTžLj4l64ljllîlärl^,>î  ~<œNL\.,,>,T®T$N$ìêì.lÞl>®¼¾¼ * ÞÞlDŽDþtLžL4n4|~|üz|T*,\^\Üjl¾\V$¼^\r4trttþtüzt ¤RT<><üþü.læl>. æ ž^¬®¬”FDT*$TVT,*,Òd> ’D~îtÌfd  ÜÞÜ*dÒd:<¼Z\ªLn4|>þ<~<¤RLd244>4\¾\,N,ìîìlâl¾ÄÆÄâælD’DLªLÆ\|þ|.þ|V, > . !þ0Creator: PolyView® Version 3.62 by Polybytes ,xÿ“8 J*\Ȱ¡Ã‡#JœHQ¡•*8j( ö 9dI“"÷¤ìÖïOµ`ó à(J 8`·NÝ+vk_¾*Év;ØshΦQ“æŠò&Ù­{Ø4å#bå»nyîué6·ÖÞœó²+Ü÷î Á¯ò&®œíοE‡Ä‘SGËšÚZ ´X^ܬcï›Áÿ'ì—O®÷óÌýÌõ7Ø~þ8`t^éEÕ`ì@m×ɧ…Kà¥Zx~—á†vÈáfx!Ìg"J´Ä[f,¶èâ‹0Æ(ãŒ4ÖØÛpæò ‰¢X¡H42BEDiä‘ )¡‚ sü$Úk/éhâ”(vÀ lQC[vÉå—[n&˜]ŠYƒ™hrÙe˜k~i&˜oné&—fÖàeœcÖÙÇ$PpƒŠG‘$¥|º†€Àæ™e¶©¥}ªf¥’.ºæ¨\’Hf+¡*e¡Ê…ŸRÿª¦ž¤®礘FÊæ¬tºæ˜c^Jg¥dê꫱5øag :%¡!Ì©š½Vºk™Ô^{ì­ÕjJm¨hj ©–º:jé·[J€™…%9Ûª|0`k·ÈÂYì­uz«/²r ›­½µþJ¬µ\ê‘F`>éȪ¡ Ü!p°Ç ‹k¬çÙ«¯wöQ/£cë-¹»‚ü¥¬eåìÂ!|ª)­i:ªqË0g‹ëµ–^gÌ.G*3­‡Á[KîN†—Æ‚Üo°çÖ¬ôÒIË*±Æâʼ´ÊO?íi aˆ·*ò©‘kÀL[ê@Ød3 0®·–]óØjÿ@øA½Þ$þ¥OêËÁô¾×>o¡î1n)Ü|¼6³×Àzëã^öúÇ=íapƒáû”ÑúP@öïƒ(Ä  ¥';µ k!ÊV7Ÿ¡¹ÏyT@àÿ<ˆÀ úáÓW ÿʇÂj0ÿk¡Ì¸D2Ñ´EySjÝøžgÀõUÑ=ô_«5§þ°Š:4_!†:ňs{Wm¼–/]ù ‡HÜÞþöÇìa€w‰ëÁxÂ0bpŒä"ÜZã ÊÇ~ãùXÄ:îЇ!ìÝ–ˆèG"ñ{ $B Ûh§Á¥.%4R}&WÇ,šXH‘ìž|X<Ì“¨J^‰Ö5]6͸}ÁhéH®Z•‹.Äîš(Eëq‚.uj¿x™Ÿ¸5BîÄîé¼pÔ–Ú;€´(Ö9kyL° Àgõtàƒ¿FM¼X{ ”ö0Q» gš¢@>õ½6 jßòj¶Ê€KV¡¿&¸Ùd¦¬bÝ¿$ìÒ>`U«©$BF«X…ËK,¸-Ì‚!­x§C•TiÊ£®f7µs­ÖŒÅž¾Á‘mŽíE7\}+nÞ̸e¦¬æ*çí¯\J30Y  ¤Íb,aç’I§ c4à6««ÿ‰©šé»ZeÃi>ÐA&óº`H gÈ —¾€âè–÷W'aã’u>KËž{‹–H».•f`@ßH¼&Œ5‹Ø«™Ÿö¶TYÅ]¬ª(j¥,˜ §uô "{Cã‚[Í4‹·Ìl!W1 {Vmèæ Rw¸RSL„´ž^}è¶ê#  ?Ö0:Ó®4.Œyw¾n¿j 0˜ƒ‚}ýû&05ùz5ªÆ­iUjŒq,¨ÎiÓ1ª¢ ®…µGZó-µ–*Ã,Wè=*—c<éP¡ºÑüBÄ“j9<ªd_zŽo84Ú"–­"üoz²ÿŽö–VeÆ`ÙÛQ\µlG'pÅéÃ@Þ;ea_$Bn¥¬XPu8D?1äáî§rûN*ÏÌ# ÒZïA§9Ÿ[„÷í6‘×dÖ±~”’9v‰s‚0Ïj`× Wq¸[œ7`Ê5g‡-Ĉ~[Vv}àjÔÅgB€]r†u„{œÇi72jÀhÆWZæƒùWb×âÊÆS)”²Ö%$pT±8‹ ˆhôH¥¨Nÿ„Šv8ö¥m/äTAf‹zÔ“ÒR@ƒte…³wlµ¢+‰`ñZpE‚ܨxYØ;Ø]±=&ð`dÀÝåÿ5Ðõ&’‡•YŠÌEQvdZx`AÉ(=`[&Ô„³¦`fEÕóŸqZI¨},¢ôWSÃft™•´–B zþc”Ð]G€€s˜G®s5Æ"„bQ`âŠòH4 u}”Om ø:p”ƒmc-eF¯…HœiG.E-µ×QýS7—O-Y‰/‡x÷/B¸S…‡£Oþ’6³„5¸Lö´CV€+]¨¥|0ÔQ†kÿ„œ“¸‹‹HrCvW© œ×s›5›Þ¹zÆc $È'D¤hoR˜- Œ²è•txÛ›|™¼B2Í!7†E†P)†uòFEöqè³Úio{èbB4npÆ}pÙw?ÖŠ72¾5_àMªTxÖ³b8¦–eÖ‘ÃV2t^™…÷Bbù(PYޤUçsˆ×t#ªŽŠWFq\ÆI·Žãƒ’ÎD¡ÕÓ"×T+w7÷E+ÖXÇwHî£‡à‡£Í#&m8‘À9¢Ç ¸•Ns,×XH|·<÷GWb¨V7C-MÆg†ˆO'ðpmi!U<€¦}>q4ªÑf.‹RZ8* ÿ˜¶%pQf„ è7‡7Õá‰rÙ-r:jwgt}àÓU~~¤s´¶‡Ÿú1ÕSÐŒ5ElÄm.ºdW“6žFª½§ à‚½8iÓb“tˆt݉õ“_º)³Šdò›·C)—yè”*cl9vn!°nÉyc&é£Ö©[6 ­w6®-GÝ—àöcazŒ–:3rМ>”udŒí¨z²}A­~–,z82ÞôŸ×ãÙ*yˆº•ÛÚˆ‹1¬t3ž²7GÓ‹xc&YÀ£Á¥CÿÇqmP•H&YŠ®*4£G_”6“¬a’’ø”>°Jæ«4÷_3ÿ'H+2Ùh`AÙv~#Ñ&]Žj[ð{’u´ å˜R‡{·“°ŸZŒð X#¥Sð¦@X›µ9àx=7[ '»%e$@Ñœ’øØU§5£'s‚u%p+ ·q;·s+{e—®{râ™®Ø2Vö3gDS¬bCÆ©¡{kv“(2}Õ¶=Ûeª5R}%™[ò€¶iŸkÄs([Uœ;‹:˜ž+5Ñ÷³fƒ„‚úI™‘Ħ޻oÀ7šiš•¼Z¢žY |Kž‡w¸º8¶yºw—]7)Ú¶r£é2k{—>ëeFqjö) @\þE± Z½Žé\±ê˜ÔK½»È%* ¬:ÿYSk Šò˜Á¢ùš¯$ŠœK:rîkêë¾jBËb­+˜Š 0ˆJk½G»¡œ;§›»¡¥ùw ÀK€0¬‘" %ðžáöÀR 5Á|47FÁœÁì/K-wwÑ*¨©òQ Àl8*¼Â”ÊÂÈj6@M0!?¢cr¶0!¦ <ÜÃ>üÃ@ÄB<ÄD\ÄF|Ä>,Z ¶‘"~ÑŽ&¾8¼ ©(’Þ7ÅU,¾WLÅVŒÅ]<UBŸ¥Å^LÆ\lÆY¼Åi\ÆjüÅM\Ãn…—$\Çv|ÇxœÇzlÇ/@˜¡H ñ‰l\ÈgÜÆhìÆŠªœÈŒ<¾1PÃpÀ+ õgÈk|È–¼Èˆ¼É™L7࢑R;{|ʨœÊª¼ÊkðÉÐo r ÀNr˛˭‚Ë»¬Ë¼ü˾̽<ÌÀL̾üÉJP1Eð¬üÌÐͨ\0áе,ÍÜÜÍÜ\ ðʼ1;` Îê¼ÎìÜÎîüÎðÏò<Ïô\ÏíÜ;0Ê;rmagick-2.13.2/doc/ex/images/Button_M.gif0000644000004100000410000001176212147515547020132 0ustar www-datawww-dataGIF89a…x÷”–”FŒLNLŒ,D,*,L $,ŒDL$¬VT,bÌ*T\.,ÌdL$ÌÎÌ<64,V¬lfdÌTL4Üjl, &LlL&$¬T6lrìŒFD¬\ütìêì<üzt¬®¬Nœ,$<¤TT ,, nÜ .dl><Z¼l4, LL.,œLDœLT,Ìbd< äl|<<|~|ìärl4bĬª¬F”\^\<L<*,L <jÜ.\d24T,äâä<><4|nld4|T*,¼\>|œNLd üþü < 4<^Ä&\ œžœTVT”<DT,”DT$¼^\fÌl.,ÜlÔÖÔljläÜnl¼¾¼zü|<,TT24\<¤RTR¤, ,rä*\4 &T 6t<¼ü|,<üz|<|><üL>FtÝ9µjL£=­f*Ô(Ö¢>ÃV ªÂ…4#‰Ø 3kW™Xßru«un]²Wgµ+VhÍXæù€èET»d÷åš—åâ·‹ç.z¬x¨Þ­8¿h ˆ£ ØÎ”ºw¯å¶cG«Î™3uÛÆp_Ë>ͺ-…0ƒéÆ ÃRìÚwÅJ¾Œópª_…C&ž8š4<{¾“éj¹q—Š8yìËÂIÿÿ&î×gºÓ¹#Oå¼ÙãƒW)ÿèðòÇ)S•zPzzG¼ÅA^qÚáäWMÚ ˜~ðÉV[x .çèý'Ý|Ñ5€@… †(âˆ$–hâ‰(¦¨âŠ"RA ¾ø÷Ÿ#Ed¨Âb(È '$Aüd‘FYä K&¢äF %B&ɤ“W&Ùä•Tie•]þˆ$—U&BÇ bpa™_4ª‡ã›ŽÜ#0x %–]Ú9æ”vJé§^Réd“„âYæKþ™¨–Ph"=Páži+ÑèÙºy…(S‚‰ä Xvêh£b–Ú)©@©*£xr¹j™¯îÿ¹êŸ³ ¾)G¡›6nѪµ j ~J¹h°ˆ†j,©¢Þ©(ª`FK裋ÒAÆx.Y §›@„¹ì«‚ªºl’É’ 쨫nÉl–Òêd»¡Â[¥îYÕæ—"²‡³°–‰¤°ÿ2 0³€Ê .˜ÏB;ð‘zR;(µ©Â@ÂM>ik#Ž%„ ê˜©FÙ±¸©‚Ìg—£.¹¥ºY¦ºåÇ{ òËVÒZC*Ýk¡nt!m­î†É¯¸|~ùsÁé6JëÁí" ô¬éª:óV*X¼m„àñÈ!‡ìrÖyæY*—êB îÊ\k]¶ÙhÝ‚+„é¥[t!èÖg×mwË‚í£ýÞÿí÷ß~Î,œÔ—⸅ƥv±Ç Œ7îøãGîøázô§T&Jäâ’wîùä7pâåÓbíú¶#q󹇕´îúë°Ç.ûë^ˆòh˜M­,”{D2ûïÀÇ.ÀSÖ`K„«W5Ð{T¢ÇóÐG/ýôÔG/È Z£üõ”Ž1Cõà‡?}% „¼6q6»éHÎßà¼øðƒßDå}¬‘nį¿ô‚èA~ñZI^¦–—¤æíï€Ï‹D꥾ ë!ðH¾U‘N/¦»êtÖ%÷õo‚ñ«„:vªXëG1xCH¼%Ï1/ áÇ;@ïƒ+¬^ŠU(„ì’È!øÿ>Ø¿ :6ésSê æ>!¯v‡*Zå)8~6ð¸^HŸÖèM…£šÆ:hC=Œà†W„žCv,?­,JYDÑ(=”ïˆJ"œr²=”qŽÔãA­îD´‡!l8d‰wD¨ÉPŒ„„ÁÆÀ/" ŠLàÂL&6>Á ™Ôà Z`ˆ&Á{è—Ö†·.n^*ÔÄàLVB•IƒÊb GEâV;X·¢.˜K»“†ð¼D 1ÐZW²‚„ƒLŠ`_™ÛÞ .H“ ò –&dE ÈA°J%[•(¬H9`3^ízayŒy8‰êÏ ”¢µ‡Kd:mZ"ˆi‘ö“X«âiõZGÁŠígA:Bz ÂòYŽ~ õ‰+oV„Ô1-TK’*õ*Jr sJØ‘:¾—0 Œ¤°€ô4IíF‡Ë¦ASÕ N•®T LÉ.¶zg˜`QÕÃóÕÆ›þ)«ÜXÅ/N/ü ÿÇW¾ã46à—¸WL¾(ÓÄü¼JÔ)Ã=`¾õ@»RoÐU¯ÿ¼*Îw©¯MýâÛn;´1¹w­,>Á09ßé @tR ’Z¾xõÿ}ÕöŠÄJ·Ü+³$FæEGæÙž‚ºfŽ_'˜Ö%ÌW¦µòþ&+ב-õ;6•4¦kÑ-]z|™N &˜ƒlº1ÐÔ“B~„êóË¡<>Þ"Lg#Ï,]ªâ³ÿ8a¤$#PAuôÞ aþ=/¶þþgmÝñxMÚÒ ³u™$u¯XU ð)üJkbU±|€ ·ÿ+d~m9Ù?þOo`÷ôWAŠ9(H)EÉÐÓÿ½?ñÎ:œÌÍ–²\µ }5]• ÐÌý‰`Ácâ©«7ƒL©ÛqN¦æÌ›˜±^ º—˜‹j uB¿Ãf7Ðn0_@d!dúf¡ ÞˆÐÒDmæ¾­¬,÷lg:H0h0ü–Y7Êz§ „ôa{uQœ&y^ FÝP:Æâªõ{†Ø*0J¢{ô\ð0–ǹŒÅRÌ+…ö³âwj»‘£ý£,(\|kT•é{J¹Uõ}ßã"'[M”]] Ï f¿Ö:Êã$†‰›gËÇO¼²ïãÂͰ„»3©äûlßN¥ çú'‚¤n=­‰x½ÿØù¥Í Vì‹aŒµ–L%Þ¯NêD§©ÛàX·ž(a›ª°Ãψz62ò¤Îe[cäO&zcÆ40`Tá•f'pwÕãÕç'â÷Œv*[ÒWSÑ&cn–N@bp 7v(?æõF=@Fc|°×o(sq)pfx¨fí5}ëfrKrâ#!ð§×gp/@>Hp‚§N÷c°¤]¿wî§b:·`¢V„àãNîV=Bx;þ7D‹¦0ñ´&gw1éõyaã' H}ær€6AnÐVÕó}Ï’„=ÅhîÒ$æ7#>Vxšå3ì—UØs~6vª‚Hï–k7ôw³ÿ†J(g…ô1³…#vL_sOmè?™&KF5Ö“Öˆ0x8UG*óoFáMPX|Ú|k¥sµ2cŠä.hl˜‡õ(Çy°–†d8+›¸bÀ$c HcðTxrŠk%g÷ÄtFqSê‡7ASˆj¤u‚xr0G©-»8=.GB‰’(›w†…'ŒÏÒ'ÅXŠ"rs4ÛömáGq™§,}ˆ®˜vruXcpð·7@BzŠâ3G€ýw\Ó{µM¦ŽÁXOº×/Gzâ)>€=±èŒãdxlöò‡ÒPþÔ%9uâò<¸?Rà‚|$áøŒ˜·cçÿèT2H*ÉYABH€} ÞbŠö¸jd+±8µYäg%+ z' [BR6B$E“§|­b^â&R™h*TÒ“dbb=ð’Od;»%p¶?üõ1œT<­Ñ ‚‚,$˜=í‚mÔöaDSM$’áÄŠ!…~Û‚‰¡Ö)0°‚*{¡¦Q+t==%|©?g0E_n6AèCtZ¨ŽØ/NP+¿²0|B‡4ýFh6`IŽ%äUY=+à5e‹‰@1¹‡FC‡@`'„PÅÁ”†ã”>2ž?áóé5P˜-÷< 6â‚ X©T2€Eÿq‰ÌÖFQŒ9=3 ,cPq4AÞÙ5yCP7x›^DVË4/#hù<— üd6?Ò¬™} „5@Ò Š8€…¸ã•›i˜€u€Ç 7ðWÐú“‘@{!oª"ÙLG2`¢{  +Z="*ŒÃ ö×%úI—ø\!$70ðŒ¨?rðW ‰°GZ=Þ &P¤· HJêC`U4µ䙃'`@Zê‘#HcâÓ?¿i$ê©hYÚQ`…·DªÒD€Ôïô#mp@‚„'mšF“ÅW!bª<#$~Ô›iÿ¹$Y g´p¦µ$êD‚€ÿ– 7Ÿ÷#vj©Ïq Doiú<ð6+T£+T Z„œÑe5×O‰ª¨ö&Žç‘FBW@GÕ£_s•JGD„wŠŠ©1W3&éP—ŸJ«8ô¬¼ŠC¢jŠ¢8¬Ï3­`Ÿe­Ü>ÖºH´`™$7ðGi„§yódð#¾Ç%©¡ddŒ$S±ž‡0d:G¢*Wô ?ß'+Á*DYdŽŠñWÊŠLA²CP ˰а± ±C§ª‚±Y0X±û± ;ZÔHa3Έ«ò¢!Ð+Û.»²- ³,;³-K³,ÿo3k³&ʲtà./ë²;k³;³4+³0Û³4» |U°3W8”¶†²²'?#+“).ìE+…%c²µ6HgÕCMx„F‹„nˆ.ÒB0¨å( ”;™¹3Y†,š6xƒˆ`_ ”0§}k76WeQIÕ.Ÿ¸¶.(}(s$>}3’=T¹“{¹%£7ª™¹ Ó¶à‡¨q€]æš —]3[“ºhó2òÉ2­«›ÿ3í —™³á£ü¹TÖ@"»¹tV±û»þ9·¼flÞrºÈë1{01cA¨hè°{E¼Ç »ÿ䟽˻¼+»×[½Â«›Fÿr 0 •¬˜‚‡`Z¯{5¾ëº1Ó½ð‹ºí˽Ûk½&ÅjÀ¡Û¼t{»ñ {°8\À\À70À |À |À ŒÀ Á<Á \ÁlÁìÀ üÀ7 OÀÑá“€s±PS“Ž€¨Aê³Â7ȇùÂÎÃø2Ã*ÜÂ6ü&§7‘<éw:3œ~@Ì+BœqDŒÂxÂA\ÄGœÄ8² ç#›V€)6Œ(|Ã1|Å4ìÂX\Ã2ÌÅ[¬Åé±_0˜`%@ÅU<ÅH<ÄF¼ÆJìÆmÌÄKÌÆs¼´·LPPp:X|²YlÅÜÅ`ìÅüÅ€ÌÅŽ° 㣛aÀˆ€†EÇt ÇsüÆrlÉšœÉLŒs pa@ SpBlÈ‚|ȃ¼ÊªÜÊ©üÊ}ŒPu nÉ|œÂ°¶ËºÜ˼ü˾ÌÀ<̼-w°Ž,(€š`Ê’,ÅÐÍÒ<ÍÔ\ÍÖ|ÍÓŒ[еÜa0DPä\Îæ|ÎèœÎê¼ÎìÜÎîüÎðÜÎ:@L!;rmagick-2.13.2/doc/ex/images/duck1.gif0000644000004100000410000001111712147515547017404 0ustar www-datawww-dataGIF89a´´ôþÿÿ88äjjˆˆˆŽ‘‘—˜˜¡¡¦¨¨­µµ¶¹¹¼ÆÆÀ¨¨Ð»»ÿ……纺ÆÈÈÈ×רÙÙÎåå×ììÝóóêÑÑûßßæèèçööÿååýþþÿÿÿ!ù,´´þ 'ŽœFŠÖYªë™ž¦«j1Y¯­æãÝï3 Ì×"ñDÄcQÇ’9mÉà'"…ÆY†¥r»W+GI7_€‰XþfÅl¶™¬­zßL¨eŽïÏ# KH>mxw?n=[ˆazŽc~btC˜My†,r‹|£¤yŠF ”—p¬ª¥,<•Œs}†‰·‘¼“pº¸¥‡…𒶍ÀJd¢’­¾§¦Ìu¥Í”Ï8ŸÝÝáàÜÝåæßàâãÜ4ßëãÞòáíêçåå÷áäôâûÔ‰Ë÷i<óÐi°‡î›¾wçâ‹p‘`$,È4 #0e½¨‰3ìÚœ’þ±q<ëƒ7ŒÜ5ÓZ²\+Gªì(ÓcHB%hr`Ð2–ÐpštULh4¤G6ƒ% Y3Nªþ|ê3( ®\{ Õö“1žd‡f™ðË+ÓdiÁÚŒ*7§Ô³Z{ÊÊÆ /T·I…}í+¸íݦ”þ±ûç/B>†î6$¨ n#GvØNre‹ÝY¶8á'æBÓ€ŒÏ舋ѩ^8ZrA%*ìˆQ@ÉÁERܸ䢯C/jÏ2å_³2š®\…î驨[Å"¡б»söÜõbÜ>¡ßü³wJZíS®š¸íx¿€«Yš›_“¶ ˆ…_Z÷í‹S|-þÅ@Å·x"fØyªWƒN9ןZ刞]¢õa}ZuE^Y^vYA*²xÙdÐb>*¶S#*âXcæð¸£‹«ýø£Ž®Ý¸#‘6©d‹Bîè$kxe£WÄ]6FQQ&…T¹beT¹‚YV¶3¦™Çå” Ä)˜bº¶æoQvsÌ”k\'˜l×g!En¸•!Ýe° ‚yE—…[ñW`JêÅhP°E×€!~Äž¢N8¢¦ì è`£o•˜é_]qŠ"~ÎØ5êw§¦Šá¤­"Zˆ“‚$i©,Á†a9ªjªÊ*a'ëi&èvÜoRÆÀ€dþŽéì׆™¥[1T»Ær+è®qt޹\ž-4{&´|Þyn ׆»n›1´ÙeåøåB@ö¨øûš’,Z¶"‹òðˆ$e—ùs0ý.¼¯Ášù8ã‘®ähO‰éœ¶Þ²$®j«‰Â²:+2·Ú7l­%& 3ªÉ‚$²~.³ÜrÌŸš|(4Å‚WLz¼ÂêÉ2eP­)øsÉ&[Wv"ê\ó luZ(- ÓÚu5®V7Ýô†âÜi^2›DÛÇÒÜsБ°DôdöPd¼7ÐÝ¡iìf“5›A 9œpeüxÖÏmé(´XgðLî Aò(Žå 5ôêÌþe}|rÍ/+%ب^$:ÏH½ºÜ¨Óýr¤ª·.D¿výô¥^{8t,SƒÚ’×D/@èqïŒ|G7ë´©¨ê¬{¢#àÛØUC ú×[KMõe†G¡p“¬öL¥'ÿÝëƒ2f8j›eŽÚö<Oá•'ŽšmE?l—ƒ ?0380aù[ic¼¥¦q¸ K¬¶7Áhâ)ßÚR'½±Ks³Ù°dò(áE¥yÓóÙORh´ w&ä`츲¾ß™Ïyê»AŽ÷ ²‘Àx¶³A°°¾­YðBÉ«Ãîý¡EqâèL» šJeËH'¶ 4‘‹†Ñþ  µç6ެ ÀÒŠñKp¼ eRs› ¹/IµáÌß&âF‡0c´œÆnTÀ7âƒF±Ñi2Æ/õ(x¡–ÂCµuÇ×iÁTð…œ“Lç’ÀA%J!A:ÊÑýVx¾ mˆ,¡'™'´3¶R‚@žGÀ±¬`…™3âÁFÞÉ«¸Öˆ*}bƒÞŇD¨u§‰ še!Éﱕ$ŒUŠæÖ¦´…Sz áIeÅo²ó#â BP¶pcR>W„$(IÌIk’¾–´¯Aé Gê׺ÏÕ SE2èŽ,Y*mËNnšþš‚’€ø‰E+ˆS Ψ}µ@MV©–‘V4LÉùÖ™ÈtT Hé¶hºÂMÞ°+i¤&°rḚ… 8@ Kô¹ç‰¡oZƒ¦ éB;oBëŠ&Ñ@ pUwrHªX5ÂuTcNswC•A$-5Îð¡…é<«QÛ©¬°j*m*dåTŸSËjÚUyKåZ¹—Ô Ñ0Üš˜Êõ§tå]ÝR¬ÐØzEv¤Ñz—·D€RKÞ‹OàRW”rsÑѺcL˜Õjêù.ÆJé³3ýÒÂ"ö%vàqb«)@Nïñ°ŒùcšámÅ \ሎ.zdÇ€œ.„‘Âãrþõ⻲âÁxÏt%*Fí’`»”"ó´ÉW¼X‚ÒܦýŠ”y¬—µ³eƒË ȈAô-/ÒFÙSpêáO—YÆX¸»6Ã^s§à¼~•XL;A,u¸¯¡@Œb§«ø2£ª±KÕËB{é—Œ™,€×õž˜f€³_ý׸ͭsý;°€ÏÈr¶•Œý(9þ½£ŽŠü‚l< äÇÉ›Bì'š†\Œ¬KÆ´JIW,{•tN«xQE` –”%qƒe—^ÿ`ìš™5‘_1Ç0°.Æs m¹Õ—°çÔY‡#\I¯Æ3W{ˆ€Gþ]´lr¿ô°žìºýLÀ7/~'XÉÂê /¨÷Ì3èઠ Š_î´Ø~¼ÀÒ`.r7~_BÈ‘(* §yµ‘ï·G»ß9Ô(ÃMf¼îŸlî†kÛTTÕrEJ(ë½ÞYU áý+\+Í2鮦t4epA €*à´ê®Œ8n r·Íy®€ˆáƒç?ƒÛ»[¤¢¦÷<‚—|ÛÛ?Õp˜™I+ç;‡ð†bí× ZÊËvγ͚šÁí¢qÄû†ø}2`“Ðs-÷¶¿8âº2¬æ[iÃãDº/q$ÿ•7÷ luΜ‰$H‰t†·Qd!'wþZë<ÂÄl6¥„ùK7pqV©¬xsÂœÉ ¾öm0Èd ª~î0,ën3¿]Ôåmâxk69 Lñb¢8°§§7͇¤F1Cš¡S»=7R¿EÄf—ø0`€´‰;Úõö°à¿ Æy4} °YC.ñ½oG}ÁóÙX!/ @ ×^ZG‡†>7 3=CJƒb÷³¸ c½PP`õ½ê_oz$%iºYúVðqÒÈž¶Lq“œtŠZo?J(ݺŸHBƒ@”§méô]ªYfùÚš½d:}ö¡°­g³¸"À€Ð uìrv;20¼o€ƒLÒ]&Ò¬Çhþ²ÒÕþ'd~™woxoÇ+¦&E³f÷¦qŠwo¡f`â¡pì&†iWvzö€ WEw&àgf°C WmòhÈ6D#/ÏB/]—%š/œÕ-|^×}é’ÖÒqiFƒÍƒK €ágƒŽÅ-ñ"Zu'—µYù¢{SHn$04ç}Ô/3…S0*"p}õ…üÄ$Uˆz”£0Àõ„d¸mù7L"@{ÎóE–WyŒÇ†h wK+“ „mkOíN&øaywpÙsf€fAu§–f”çwò‰b÷€s'júf àmt—]#4ˆ—t†ˆˆGz$þðà#Æ€ˆ'z—WhMÇ*‡©˜‹Faòg‰7Cyˆ€cešóH¹ö>ùr8:W†”ž¹˜ŠPóðFƒce6Öktlô`r´@5GŒS¦48ËŠçv Ѹ‚X‡ï÷‰ßVf½(žÒ°Š0f±(T ·NëgHl`Ÿ‡ic#þ7yÖvf‡®Do€EC•ˆ‘ ·BÈtööŠë ˆ‚z‹%†Ž™jÖö_¿²IEv¹ê‡oÛpGyeÆHÁ@—·‡G@ÖsšsMh8sý€H¯Á…³9G9gH £š@V?“DD]gÉ ™‚åòNçlb€É©‚ÁatŸ¤‚ÃÁtHGBËIg}— °‹€) ‡ÑƒxxY™v¸ øˆMè¥w…X’õxxLeþ~»`=\G™ˆHšÿ qéŸzu‚b u†þåqYët~JÚf<äÙ– ú†KC—ûõo +ª÷$5â *ò_=¦O&z¢•{¥pPò{X$*{*ꢧ‡¢¬%å'SY-µ&“Eå%ßÇ.=ê'Ù2RÇ¡ ðl<ú|[â.:ê}®õ{Hê&í$SúRó˜4 ÕÁa`É¥3I’)–Š*Ó‚cYŸth˜ŒÉy^5—* bQu‘}ÉB TÙ€_èt‰@º¡{š,Ý1pù  Ùž|' Ù¦X‰€p–•oɨ+¸Ñlr5Rœ™;uC~Ðþ7/K¸„@Y­eæƒEhJ‹%„“ “êy§ø bz±];<é?ï£kPù8ø£³ð0H™lGÆ”öã p{•ë8F‹8ñ£¹ÀV³Ú¨¹B6çî¦m¨6¸wûž‹I¶WY{xœ #X{e}‘䕵¹»ÿG´÷‘¦Ypó8¼~‰·êYàÁK¶ß:—s+½ ‹®‹;šø§I4€óy€ž ¦îç¯30r6Yˆtr9ö8|DªÑþ¬9¦†‰CudÝA›¡9Kf&ç8@ûj¤šaØ,ПÝ)U§.ÈY‹Æ¡uO‘²bJG )G]ìu£•«³È´ŒË»û*v…Úez›®eû`å{g+_¤÷«Ý‹¼ïšŸ&ܶ‹½[gú£¯½«ŸcºÂ z»]•µg ¾¸¶ƒ‰iÊò+P3zP¼g£ýD[½{)º/;俸£2j¿b\Å2:£9Ú‚µœNº?XZ‹å‚nüQ¯ÕYA"~ÆGS ¹Q%5¤É·R ¥jŒÇ€¢|ëiuHœ±EÌJsßûÃ´È¶Š™¶BŒ®Ç µÖãå¸M‹¸ìÝIw| ÄöIbKl±бûC>à€šœiµÝ{¨Ýª¨¦°-¾éÉ‚I¨«œúLÕ2B8ƒÍgª?˜ƒâÒ,ä¢RšÕ¿W@R²ª©X—%G¨ƒƒ¬I1Á„…tzO˜\7JJNNZYCD;iDuL~Rgfxx@AABHHDHHLJCIJJHOOMPGSSJPQQQYYYYSZ[[^__^b[b_Zdc]abbbccmlgjkknoolqjnwqrojtrltuupxxt~~~~}ƒ|y‹:7†W™c§l®q¸w~zíÿòÂ~‡‡™™ŽŽ*©©°¯¸¸„„z˜˜e¨¨W¹¹EɃ׋Þè–óÿ¥ÇÇ××ÊÊ5ØØ'æÊèèééÿÿ„„„‚ŠŠˆ‰‡‰‰‰ŒŒŒ†Ž‰’’‹””‹˜–Ž‹“’‘‘‘’’’•••————˜—•žžš ž”££›¥¥ ¡ž§¨¨¨¨¨©©©ªªª¬¬¬®®®ªµµ©ºº«»»¸¤¤····¹¹¼¼¼¾¾¾¾¿¿°ÁÁ·ÃôÅÅ´ÆÆ¸ÄĺÅÅ¿ÀÀ¹Ë˺ÍͼÉÉÿ‰‰ÁÂÂÃÄÄÆÈÈÈÉÉÉÊÊÎÏÏÁÕÕÃÕÕÅÑÑÅÒÒÄ×ׯÚÚÉÖÖÊ××ÈÜÜÖ××ÑßߨÙÙÙÚÚÛÜÜÝÞÞÎââÎããÒççÔââÕãã×ååÖêê×ëëÙèèÛééÙîîÚððÛññÝóóñÝÝáââæçççèèçéééêêëììâññãòòæõõçööïððóôôôõõö÷÷øùùùúúúûûûüüüýýýþþÿÿÿ!ùè,´´þÏ x®AÒT¸ð`ƒ*ì‘`Å-*Ì8ðbÇABôØ G$O–ÔÈP¢K‹)†JôcH‘,MâìâN„7k¢üyN%E¢ N$I’ו‹JGµ)t%J¦D£Âœ ´*S¬-uú”ºõ ³+ÁÄæüHV-ÕµWÛ¾;tlY·]áôx4,[“|2J¯V¼VK Ì5qO½E§dl×ïá¸w1òº†Ø(ßÇtÎJ´/OÒ•1Ÿö›÷ïjè3×í,,m¯¶C_ÞÛx±4ßÒ˜ÿ-¼ÛïáÀ™ ÿm<øñæË;oÞüùbåÌ3£N<{÷êÕ“þG×nœbwéÓ½[ï†}øvïÅ¥ÇW/=ÉÈry§ŽlÉR诽e5Ú~*8 l¸å—˜`µ•vŽ,WèÖ W¥(!… î`UImDÙk6]sgø!fšk­¥èØR±¡¨Ÿ^ !ô¡j–Mˆ ²ÌößEâ$M€ä`#N]á`C£Ž*æ†dA:¨à}-ybWÁDã‹çÀ0-]eÀ‘Šød”%‚ˆeX*™¦Šž¤%—U%ä%˜ø‰)ånMæ7e™ûýÉ”uÁçsagqå-ÆEå±ç¨yó-Ú 2¨Ó ·8“Ê3Æã 7‹AÃJ.ËHc ¥,vJ+þÒL€qÅ…ç[uó]g_t*Š«y”Úú^v¼&Z+yˆªt3:ÄWF·P!…-æìGÝh³D$À¾Œ@2mÀ8ÝRÁ ˆðK/_žãˆ©œ£çšSJ+TYkÑC©Äìµ€Ap 8'(ÆWÄr5!l)®‘ç˜;Ž7PQŽ8@üpç"¸"н÷¹Ù'd*;¹_‡Æ o:†‚Eb1kŒ ß´Ë*^€¡l!œ¢¹²š2hË(¡¥!‚ $ÊÎkr.#Øä%  ËÉc.xe›fÂÈâËN½SZ²`Ä@„ìlþ@ƒœ»‰ÙdÊ^ÆbÎ<˜coÚùRíö™u.µËj®èDÐH5 P°e-Î, œ ÎC óK GÜyŽ0\²8™|6]'åd~)°»GÚû¤ÁþÞ»ï½ß 7€X0€ ‡€ËM Ѓ!lÓ .-€ÍÀ› EV@  %³üîÀ':üv¯ï~ûèo|úÑò)oÖBZTýÑNºû{¹‚*¢)GáLÚKÿøWž…ëä3ˆ¿˜ý5‚” —ûEk`Gñ ¸¿«ðnM.òWå”ôˆJØ®rO ã—·Á°7’ƒ’ ‡½°†þE–¨Î,­ˆ@dk˜–!®\£a1[aÛn¸CÙðB&:"Ì`DÃ$]qIkû"½ÈÃ$º¨qK¬Ù†¨ø8Ùü)†j<¢†¾¨¯Ûp±1%1³XBû!PZüÛãP¶CÂü9ÐJ(© ¹6²"#äŸ"?Ø=²!´RÿXA6ò’”LÉ$â±/Rµ*`úUÀSö -»K¥¥€ÅÊóxñQåïVéJõñN–ÔŸ-}y+`k–÷C“ ²B˜;Vñ?b cÂØˆE).‘m²©™4–Å&ÞÎOÒt&‚ì5Z±ŒI Áè¦+åKjçlã8ÏÍ4ºóˆáþ,§ÓÄGysž¢'Ââ P5ⱟ?\×H;ܡМ;§Ó$‡Ði&R™tÌ'; ¶àÐj8’ fv5žïó7W(†®nÅä¨gXÐ){ÞÓ¨[]g9¿r£´ƒSßÐ9òi­ZšKŸÖ´=ÀÙbDŸÙ0ð"I]ÔæA®QŒb¨šL̦FãˆGeÊQ$-„*:ÕÈŒJhM+Zk ^l5NÙìgí™PƒŽÅ‡–cêJºa‰¤µ4(ÃÎP†p@­¸j^ééÐ…Âs Œ½œdãÚ6E¤µ wèƒf7ËÙ;œh‰*ªÄoÊÓEJ+eM{Æ0Ê­ °þggKÛ>ØAhõiõÅf3µ\emV­Ù6 U µMîlíZ! Œ ¹›¢j c¨žž'Y„B*²\ú§(§¤Ò)vE¬@{P®z9«4€ÖÉåGmå™"Ǻ‡rixreßá—¡ ÅI7`YO¡œeX¯‚7«´*ÖŸnÜm@‰ë—{Ž•#WE;scÞ3,øÃ¶u04_öVA–Œ«uK(žR`µLÁ ñp‚ÈRx¸¾… ÇÕ|E% AŒcl@qŽ<6q¯Y×_¸ hMïAü¤ÅÂz]¨½úO¬â+&Æ•í”A¼KU¢Â .þŒv•¾J‰4XMåuÀ³bÞ…t¿‹"N1ð1¹ P…1Yzgžæ¹P;}ÔH‹5£ó>*œ0!É—çFä$gñ$¾ ˆÙÏ.ó "]BJst_b E‰èåe¦ù 9(BÜ j¶ R®mðÔÞâØ®²n‰–»¼¤G'÷ V¶h€õêj˜ÓÎ^¡þ¨ßY"òÓåî‚3Ì»à:H®þ áXJ\âôKùûâ·r ÚÏ€G1¤f^0┆S)ó†@n­=îO϶̒à#Ìw×ÁIÖ<“0!õ7ÁöÒÍÒªC)ˆ´HÉ#¯5ú˜ ®Ö(·ÌEE•¦ÛÐ47üÄÀ.h“®À‰‡Ù}ØÑ¡-ò‚¯  P;· §¹ö»›ZwûÒ€¾¼Çx×s€CpðÐ<S|•¬ýïDzI2ž?s°=Âq¾;^ÁÐ@VÏú:Ð!ò]ØBå €H¡j¿ÆsmÝ%<żÍTòÓ+xä]h½ò—ÿzÉËÞòãöúˆƒ­ Ú¯Ô å’þèIë#ÒZ‰ D@­TA€ÆWð½é°üöÓAdà \@û Ô@–¬ö'}•I*0â½tg­q7)®¤+¾SªðæQ½c^é·^àÌòG×>  ¼À>§ä(ìsRÀ“,Ȥ? çoäÔ"Âo'’ài˜\3æñ7õçW@ ²p š´Oc\¤†Fi–#DH{fv3H[¸Ej5:Ø>xc¢·T•ó_…QÄVnMXf0Pp€E@7Jön}d…Zˆf+øeOòZÖ„ dÀzqhªÐb­–†Bè‡(|eo`þUÆ~­76€V#k_Ç…nQ…ç†^¦BPrM”lņ`íçz[€V Pwp¨x–ˆ…hâ!TÖ5TèSßAãqqõ5_¸²g%vÆhpŠ«G\VˆP)³¸]1=e)ÉòŠ˜ŠW¨3Cj€Ò ä6ƒhŒÊ×i…qYVm”w½WPqnõO@÷mHt [àp0Àø–7"ã¨ø”m)|ƒ˜c®d pˆ †[E +@{àŽ_¬€VJàƒ[`“£‚÷økpuZœ€V¼8e{pXë$Å ¡ðJ`´ç6À_ðh}èþk»± ’HM §„Š¥o2Vsèg ˆ@Ê œE0´W{Ò7FjF&m˜xr§°–n×p`±5ewPe¼Öc×p ¼` l ñfdoH‘“/õRÃBà…_¹’Ž‚”°hkI^Ü…°¥I[k •Q mÉfÜ¡5ÅŠÚ‘]«hŒáµ]´uQ•‘W6™G‰Vpwn{pipoh%Wµ6ù˜e£ÉXf…»Á 4Õt Á ˆ`^I‰V'@ ýR“Hx(ôŒÁ&WI†¼ A}´×'PHÀ–àuî¤dœçn/(lèÖyÐÈ ê4–¤(:þpj°Þ™…åW¤ø?Èpxô˜†·ni8‘K±”+ /–V9 ™µ`whhEÏÉm]èX ›P³ožaT iÅg°— f‡hN•¹ ¡‰Ü!)‹¹S‹I‹D…]ÇÔ`À  PVf  Cö“ˆP]“²RÏÁh„‰>?uŒ…¡*S°X@ áH‰ÿ¢»·£{ÁMç H€VБÌö‘@žñ£Ë’u§I'Álá¤ÚB¡,[zÍ9êÔ ñIõI‡‡UŠZ]ŠxYÈe¬É6z^cJ‡y‡V7“„¥ešÅ” ñv•Ì–À„þê5rRp‰‚Â÷[lŠšP*gÌfâI¨ê…[£µ­…›j£Ùqw /°|p|àg{à™‚êq &mǦ† F×óÓr'8T§r±‘’ºYl€c†Ÿ9°™Êöa׬Çr0zr€æSKXB2ç;Ù‡HO‡­ ´tûÓ X€VqÚmp¢FZŸ#×x vov¶ùsäÚú®Du„I›”¯jFìtVè5[xp®v Ê®š5cqª^ç‚ýj«‘¡7“i:Ì€”8v»Öq´…p&ÊY3öT=ÖcÓ©ž 'Žor ~Õ“c†þpA&íõ±›5r9²oX÷ë˜éF×ZB—\|@¬4ˆV°°œuo 6rO埪¨F“ÿöU/Ñ ñö³É•mZizµUe &¨W¦³mêœÊR§ø7B Ñs€Ä}+1u%t –ª”ºY{Ð^&³ À Ö^>¨iËòƒj‹H>g%Ý÷¤9÷ƒWwQ’dJv&_x‚Œ€‹QÁº`Wð›å²»`÷a‡åKÀ2h»D€¼´r"¸J%h­7;z¤ñÄboà¶Z €¤å&dÊ*¿ö´ì™³{§uòZ}cz‡V\«`e–±… þ¡¨µºŸ•Ø´Oé¨fqþf·: ³´Uf,«^»¶©nÇO[ÝÀ .Ä©DGJ«`‚ 3€¹c&mí{vPþÚ”79}¼ `pŠ i@‡» v°xp~6c¶ËY“N›Q;Û× м]ùy ?aˆ¡öº}ª«:e‚j´µ…Voø¼o5 r–Ðk&‘˜õUT"uS/Õ(–P¹ ƽÂ*´d¶±2‹psIƒIT.Z˜né€ËØhÌ  –p ÃBõ_RëhcÒö³m ¿æ²4 ³e6E˜¨LË  ‚öŸbËFrc#×ÀÊ5cçÇ›uo0Œ‘3× ‰p!ÉoþzªEd^Ú»Y%ãæ“q¾zä8—qMîrÞú‰¶äG -xɾx‡¹{ n( ”À>”° 4iå÷?M—Aõº¥dAÙ ®éãæ´ Öe¯5Ç ¦þc aZ•`¢ ÅàÛ´Þ…“Òü{à"Q™h…Y¡¦»bPébX V­á¨ˆ³jŠZŽœ¦×àºEfÞ¹jp: Ĺ–^éŸPè‹®“JmߟÎážoÀ, g5› Šð` ±.eyÕQ+Þ„ާ‰á#Æq²À ² v[Å=ø –þ ÉŽè^GùK‘e«4§¯˜tQC±¶ÇIÖÒiWÓæès{1 ZÀUè} 1u—TISšæz¸‚{¥“ÆîRw}UçGŠ[IñCS½‚º€H?ìo‰‚ü4)ä¢âµ>„ÆJFEK¿þÚ©Kº-7g½Lµ¹·¢àr½»ÂMcHxD”­Ô‡îéʨ»Îè’ÌÒ` øÝ¼¸oßnèà˜n¥YaK¼BÞLñb.­2ð^ë«{¦E(7m^þY % k‡‘`ô ”Mg¦hå­G e¦†ýÎÛõŽé¿ÚÞÖtl¿õlàEyЏˆhUàvÚnZóÉÌ|ÁÑíܵkç žxÐ`B…ÒD ˜B†žsx΃2kÀ—:%Mš”#²àA+.¼øæÃ–cÆ|ÙMæE„¥u“ §`;eÖìùðGŠ2´ TÒƒ²D sRkI.VÎlxó¡N±ÇúÌé”§O„Á,]yä4mY–ø8;iÂk’`t©D$É­[]0­K“.X—H/¦êr'[^pe]“ ù±B^,þU«Ø HÀçT‰´‘µðV#D‡}-Y3Û¼Mi7ìV,T +˜Iüw·àÁ‰ ÿ]\ZòŸÀ™¿€×ñâÔ‰''~=¸àbÌŠIfuá9¢(gf}¹qçÀuVg]øñãËÛoî>~öàƒ²d¢½æª-1Øš1Ù Ë*N¢ µñ ƒCªØlb¡Ð4pA]ZëÂÈ[è©» œ@» Eðo¶ð*ÃÍÌq/È2 ±ÃŽüÄÒ :“)bæš`x‘…“JŠQh‘¦‰ ^°á†-ºø‚ 8ä˜C5ÄG5dÑF´Ò43D3qÈCâþ…ÉP,Q %‚X!A*ÿ …B)¢@¦H"†´Q‘J¸íÌg‘Ç ×ºñRÍtôÏ<€Á†-¸àŽ8ˆ¢@x¡ %Uy0Ï&‚8’HË<“,Ûr¼5N]{”SÈ_z“C· #0éPMF ȼÂH6KœWkƒE3ÃMA¬ÖWö–SϾìäƒï½õÌ=×=^V€8dÜŠÆbÌUE•ütbN¿ŸtR¾ôôë&_íÔÛ÷>þœ£áø 67»÷þuo'fÖÜ5È€-šx,JDÂÞ“¾@•‡2Æ-Í„†E)’Y’X½.ZùÇ™Èbˆ¸8yívÛkº¦‘âþð¸ŽòmÓWž6”´ea{-¶hž2¥¶â\oã„ã Xá!J>ã0êK¡6º[°'•:D¤… »k9¯Ù€weó!U®¨ôh¦w´»nmÏÆ”b‹uÆ)ohv«òÈ,抯°Eå´¹-ÛqÀªÖñ§wœü"¼ÂèIšò¯ñÞ›Rµ-5½D~ß{öØ÷}ÜÙcwøõônï¦ê ¯ãYJpgF–ÝñÅv~m¯=yâq‡žy~_Þyè­½'š÷E“r¦÷ÐÄWû”¿ï‰öô¿¿æÅë€D¢ùœã5ôž,ʵ·™ßóùç^õêç= åNCÛÍþÀ÷=ýL€Ì[Éʧ±É ¡@ nºe.gš[ßš&³ÈMFMÔ›ƒÄŒùEHI„È–¦º©Up7Œ`Àƺk0[Á`ÖzxNÍW8L¡¦@˜+¥õ-uÚêß÷˜`€‰4¢ ±xÄn]K¢×ZGA„€a"Œk¢}HÆ0þpŒTÈĈ‘“E5éßGêh?ôÍ1)yüý`"Çép}æ$BäA6pf{LäÅê¸HG&e%jäù”·;ÚagyÔ»NõλáèŽaôYóöÅÉé5O\ «ò&;P,b°4+‘;]Ú’—§¼¥ÿ–~(F7f1„bf1Ù¨6²qu|c2çÁcžð@W`U3‰¸(ŠiJ³\!Ã8q©‚yÄg.¹ÍsMrÒ„&Ú¶8ÍdjS™Å’Eã9Åy6‰î4!3ÇÙζÑ#×Ч9·¸FjŽÑ(Àza<÷BÂ…­TE­ù·‹;rmagick-2.13.2/doc/ex/images/Cheetah.jpg0000644000004100000410000030646412147515547017765 0ustar www-datawww-dataÿØÿàJFIFHHÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?«Š\T›x¥ _=sè,0KŠx\ö§m v#Å&*m´m¤2=´m©BóJš‹n8¤ÛSmÅh´»jLQ¶€# ivÔiÁx BóN Rí ( vѶ§ÛI²í¥ š—ms@…æ—eJš]¼Ñp"ÛÅj`¸mÍaJ¥ÛFÚw´m©JÑ´ãÚ]¼T»(Å1m9 /µHV”/ÌQŒT¡}(ÙJã#ÛFÞjm´›h¸äQƒéSb o)BÔr3N HBÒS…¤+NàA·Ú“mO´æ“m ¾´m©öQ¶•Àƒi¥ Rí¥ÛNàG¶—mK·švÌÑp! K²¥ÙJm£mM²—m!í>”…jm´m¦!i6ÔÁhÛÍ! K´ÔÁ)vÐ; ¯z›oÍ+í4¡jm´læÜ‡m.Ê—e;m+íæ—mM³ž”mæ€ +IŒTûi Ð[r( Ï5&ÚvÊBWŠô©ŠqJÚvÚ“oµ;Þi Ôûi6ûPi Õ‚”›(¾Ú6Ôå:RæšÊMµ>Ú6æ€+•æµ1\ ÐAiÁiáiÁyÍ7m.Ú Òí .@V˜V¬•ö¦ E}´©¶óAZc!+Å{ÔÀQ¶„â—oçRí¥Û@b‚*m”í@cšâ¥ÛFÚ„ƒFÚ˜-y¢ã ÛFÜÔÛivÐ"‚šSÚ§+Š1@ÊÒmÍNW©4ݽè-´›j}¢‚´_m!Z›mb€!ÛíFʘŒÒ ,G¶—mJŽiáh´l©‚ñJR€+í¦•ã¥X+Í Pb´m©H¥Å1Í;m;Ó€ dasÚ—mIŠ1@í¥ Oµ C@ç4ìsN N ÛFÚhÅ! Ç¡iÁiØ m¦•©qÅ4Ž((œE¦cž)ø u§… b—mI¶¶m ­K´PV€"ÛHš—»hÜÓ‚âž´€f8£o&Ü 1@b¢¤Åiˆ‹o4»sRm£mE·½j]´mâ€!Û“JI·Ò”-0.)ÛE8-<-DšB¼ÔÛy¤+Ú€!#˜©¤Ç4€RÒâúPЧ‘KŠFV“o5.(Ç4‹m©6ÒâȶÒíÇZ“¡yéLöÓ±Rmö£m3m{T€QŠB#ÛKŠ“P0¹ÚM¢¥Å&( ‘b—m?m m¥ÅI¶—mr-´˜©¶ÓJÐ"ÛK¶¤Æ(ÛÍr=´©vЀ¹ZMµ1^:R .DVšTTئ‘@b” v)@ w£üQŠ0 ]¾Ôð9¥Åq˜£mIŠ6Ð"ÛFÚ“o›iȶÐEKŠi@EŠ6ÓÈ Š@FWµ&Ú”ŠB´ Œ P)ÀRLBíKŽi@§b€E4Š”Ž)¸ öûSHÅHE!Ä3íFÚxP1 Râ—½© n)6ÓñKŠ„­&*R)1HcŠ1R‘K¶˜m¥Å?ÑŠ@E¶“)˜¦"=½©¥}*ZM´†C¶—mJ! \ Mµ.1M"€#Å.8§`Ð0)Àf—å€M´„T Rcšˆ¯Ò*f¦@‘ͧ°¤ІcšwCKKÚ˜FGJ1Å;‡ÓâŒv¥)p)0 x uH Å(¥ u¦.9¥Ç¸¦!¤S¥ILaùR2))àSsU`$ ¨ÔÔª)0?Š*@8¤xÏj1Rí¤Ç4ÈŠÐÚ¥ÛFÚAq›x ¯z“£‡r´€S±ÇÜÔ„|´ÀŒÔMR´Ö„ƒQ7ZœŽ BÀæ˜Ægš•:ñP“ÍKh: šœ*8À©i0G¥¨æŒñRQu¨ñŠ”Óš sR/¥DÍR/Õ3PüÕn?z§®EÒ›!Šë@¤n”!‘54i[¥"úÓ%4­H¼ÐWšMÙHªÎ95}Ó+U$L”âLŠý MN*6Z–>õ¦ÉŠ'¥ÎN)ªOzxƒH¢ufž¼õ¤AÅ9G5#E!S¿†šÀâȈɥ Nô^=éˆjŽ)ààRŠiâ€<ÒäŠa9¤-LÝÍ=ŽMEº‚àqšOº‘F®zvx¡ bjš”œT ~lU!jŒ¶ +6 Bäæ©!ÛùëFêˆisÎ(b‹-'"žG©EI¥…#å4ÁÍ8œ `¡‚$PjtéP¯AS ©éŒ8©O™ÔP*ñKŽiê>ZB(6àºÕ—)ªÍœU!1Ý©‡­¸Ö=i²PðxÅ(8¨Ôšrž*lY8Zh¨\æ§QÁ¨Üu eR>j–#LaÖ9ªmZ–™Ò¥#5,Î):ÐÔƒ¥+ 5…HE5¸ :r)»y§)õ¦†Ì´Š»¨Æ9«±ôÍ6J,McÞ”kЀ…φžiêxªæTCó°O÷¸©#‘$ÿW"8ÿe¨jãØ—?74­M ŽÆšZ¤bæž¼Ô~õ*t d£îÔfŸž*64Ć“Í&phÍFÍÍÆ™Ö6ãIÐÒ×"«r­ã#‰Îi #ÆiêqIÚœ½)‰¯µHGTJzTÑI)Êo4忤dÊFÚCÐÒ)[8¦Alu¦ïɤ=é™ Ñb‰XñB´ÞqšrÂGja8§·Þ¨š‘Dnß5 95œ5Üš¡䊌· ²2)õ 6;Ð84½!ê*@x49¤§S$^õ-&2)ŒOᦆÅ)8lRSÍ1Å ~3š Ïz,2¬ƒæ4Š0yâ¦aóÔOÃS@¶ fÜ1RL~Qš­ßƒV‘œ™2qO#¨ÐEY+òdÐÁ¯_j:T**e ÐÆ‡£b¥«`îa9ÅdËŽ*>†§=1P‘ŠJN¦‚p)¹æ˜„èjÂt¨ç5<|õ¦Á x¢”óøQRP÷j#É©_€*¿ñRcCXàÓS æ“5B[iCqŠŒœÓ”äRÓÔÒct¦™õ¦;P¤s•4ÄDd$ÔEÎy§õjŽ@AȦ„ÉQêBx tªªyÍL»"™)Œ•æ@ËS»³WâH#[”Ê]íÃ]¤±æ0Ã!”äW9¬ª]^G48iò¤r+JRå•È©Ä[(Ο§–  •â¡·…Þ¹G˜Ç-ÇJš3,²„|l^H­ Ym`‘¦žxãQÙˆ©›mÙu6¥hÆã§Ûm¤L¨FíœW=¥ÊÉd¬[æç½^Õ|U£IÇêN1Ås‘ë2n¸«¸5b¡^Ÿ>¬èa,R+ù¸$£-Ìj±:|Ί@íRÛ¸ÅÈqHÖ1ªó µ'Õi4M‡5*¯Óp7T«Ò›cCH¦J8©ñQÊ)=)àš`6)àR éM=sO);â€: qâ £æ!G¹Å+ ’ê®j¬ÉºÒ¥Œc¨Ï{ ¼M#¶QIQšÀ›âŒNc·³¸‡¢S)OaJj;°¨åéXZG‰%ÔÔ´¶iÿ–’ð VÔ<]§ZÈb’þ<úÇÎ?*^ÎWµIZ훲PK2©¬»ÍNÂÍÒ.¢Bz óTmÿ³µ;7žÞéçÝÃ39ù ÃÔt :Ú /cŠ[ç^ʼn´¦¡ÍiHÏ–ñ:]JÎõöÛÎ$oEª×~"´²“É0\K)訕ÄGªk¥KÙÁ„CË©üÏ&»ä]Y,o}m=î>b1‘[U‚§ïnŒ(þóÝÙ•_ÅrC‡žÝlàîó7ÍøšÏ‹ÅcXÔã·¶·šxÃ;ª=ñZÎ¥=Üokq4§Œ®â fx‡M½·³ŠßAµh |ÍÞ>ǽ(J”¬­fÍ'J¬5Ý#]›F‚çe´ö©tÇ—“æÛô©5M=JÅc¼Ô–yÝœ\N•àZúìµh©v<×wo¤Zi‘i×·ÀlÇVäÔTJ\’»4¥'4ùãd`7´M)EÍíÙx€Î;»<=iåZAæE ü¹QÅhë~þÙСŽÂà2ªü‡vA®>k#(…H^¼õ«‡%UûÙÔæ¢ÿsI´‚YÜ\Ũ}¢ÒQ„t¬=_á­¶¥p×× 9ÉÈÈ­Í7K›Ãž*¥¤•±SÎ q6?ïí5R·Ñ,–ŰP ¬©F§3tžÆµ§MÅ*½Má Óoc¹š÷qCŠëuM55[SÚV.ß{Õq©¦Åya7Èë¸Wx“VÔ¡Ö&æu(ÜlQÔ¯?yê‰r†âN±ÑfÒíä¶’q4,>\óŠà5߇ÚÔ[5E!Ï^EuÞÕæÕt–ŽiY䌰ÏrÓW¹mRâÆê6UÆÀc5*u(ÍØÑˆ+™>Ó¢ðÅ—¨N‰$‡¦kRo ­Íüz•ÛDܯFç=¼¸mlÆÎáWîó]ÏÃ=b[í&HgmÞAÀÏ¥iRœ¹=µõdS­?b–Åïø´Tp›Ÿ§&™áŸÚë’‹YÇp~øÿD}OH3[.öæ#Ö¼‡L’âËU‰¢Þ’£ŽØ" ©I÷3¯^p¨´ÐúUÑìµh‚ÞÀ®FÇ+QÐéMcR ŽEgø‡W¼ƒÂËvƒ2 ätÍp¾ñ^¡³RܳE+m`ç"³…Î-§¢4hÂI=Ù“}g¨ø_X'瑲Ž:^»£j+­h°]ç—­iêm•ý¨[ØT#®*M*ËJ±hm”¤ ÎsÒZʤRkTE*^ÎNÏFy·‹†¯¡êžjÊÒZIÊ)_¥W½û/Š´a4yZ²òŠ8`=+ÔÚÞöÛËÇu<ÅC¦[<¢ÚÝ!™‡;iÇ”UÖ¨%BòzèÎ7ÂZÔÚ-ÄWÞl¶Ãå 9aéWt¯Ûjaâ·O"ê>¶ïÐý)-¯®¼7ªKk¨Úï†sº)£^¾Çž<-kªë#UÐõ(£}Ûš&8`{‚*¹c&Ûê”RKS¦ÓõK}E\DÛeC‡Œõ¬?&¸ŸèZƇ«®±¦«º¿2äg¿Ñ隡Ԭ"¸’6ŠCÁVæ¢tÒJQa¶ÜZ4©€T1òrj€kj‡/ÒœF9¨Øö¤0'L~E&ìP˜ˆ×ƒÍL½sP·Z’2qC,ŽF)¬qB·Jk·¤-Þ€ùÍG¿+Q‰9«±%Ù¥5L£u&c9ª²qW|¸ª²Œæ„25„:¥ËX¼RÅ´Ã#mqéš´ËÙpî7+VˆÚfµs·Ër£=…;K¼{­.Ñ嘜b²TýÅ#iT¼ùN‹QÓâÕtcmp7ŸB+šÔc†Õ’”b¿/ÍŒ×Z$i¢ N¦°u+W¸ –‚sÒªï±:ÝÍŸ‡/¬ÖF%_pà“Wô]-™î.˜—'€ j\jVöÐH ¡X† ÍVQŠóN’h‘‰ÚyçV¬“¾ÌÒ©ÆÖè\–òÒ~̬žv:ÕÏ&¥©Ýk¢ÂÈaçp½kL‚ñ5 /eÊoÀÍz=º4[âŒ+’qENZw­½5&“Nµ½ƒÉ»Pè:æ¥Óôû+5?dE 8ùy¬}®=Ql¸q×o\Wá µS¬!‰¦e óÓ4©9Òræ&­U ª6Üôm{MÓo­·^±Ž%þ,â±"=…”’hl³Ü èI®ƒ[Ó[RÓžÀ¯ö5ÇøÁWú~ .n¥P ýÑÞ)GÙ¾imÐ*){EËú•¢ñS^ÊmµM7*ÇÕH"· 5œˆëÉ.>PÜVÝͤJáDÁk›–ãGñ>ò³^®B0㚸Î56V]I•7ï;¾†ìRÃbâY×n2 læ«Ûx’âöðªB#„tfêkŸ:#h“¤7÷[)8=+^ËCŽÎµ%àkcÊ‚x¦ã­îgi·µŽ©\²äœT[Æüdfª&­¥M„ߤrtÆy¬»˜àŽRé©Ç'®æùd¢öh§ät±²ž‡&®FzW+.·c¤ZA%Æy.µ^ßǶò#J¶’ˆ×¹ïT©JJé*‘Z3´—¡ª’V5‡Œlµ9 q‚®?„š·&³a"K…CþѤá$ìÐFI«“6þ2¶³ÛR³xüÔYG÷yª²x›L¶$O)Þ”$öE9$®nÒ8Ȭ›-~ÏS,,˾Þä`ÈÕu­e\ˆ¥´²€y’6[ò§mË”­c¦Ù‚j½Õõµ„~eĪŠ?:Áˆë2ižu­â^Jü«ãVü"Þ$½¹óî/TäŒÕÆœnù¤)Jv\ªçg¿m>JAp#>c!±µ?•}©#ZÃÿ=Ld±úRj>$ƒÃ–iis\ÜmëÐU-'ÅöZµê[Ϧ ¹ÀcÏôª„÷ùt J?~ñ‘'ˆ­&¸¡}'m͵ uûI/opîVæ¬ë&-Éï-¬aóp½+ÏßÇÜ—[ÕÀÀ@¼VŠõ•଑ ÇíQÞæ•ÕÏ‹/äòà·h!ì8üs]‡Æ•bͬ<ìx, VÆ4Ú†óÇåJçb}kÎü[¥kGQc"Hð“òí9Ÿµn›²*Pö1öŠò;mJñ™‚ÚñTÏ”Õ͵ß*°¿ÊÈ#š‡ÁþÖ¡Ôb»xÚ;lüÄž¢½ê)E‰ÇÊëØÖu*Jƒå§+£HB8ˆóT™ÊIc¢øzÁíQòKðø<šÔðõµ¹°acx.bnry#ë^{â k£R’Imä•Y¾V×WðïKÕ´ç˜\ÄÉnãî·\Ö•aeÍÍvE*²öœœ¶Fw‰¼/â+ë­ñDÂ>åXQØ_øJoµ].Ùqò(nµêÿÛimvÑ]Æa‡´„ñT5mNñœI<@ˆÎŽ´©bed¦½ÑVÃ.g(¿xá4ŸêGX‡í%e‰›q^£}¨ÙÙÛ-ij,J@ašæôiZUè7WK4 åâøgQÔ ‚]97¤cÒ«ìªTIh‡IÕ§M¹j΂-Nß\°•´Û¤yUp@=ëÅõë]I5IVî9w«`g5Ôø;Ãz敯Cs=³¤üÜö¯N¹ºÒEÀK¯³‰g§G;C[“(ËMshqÿ '¿‡H.¢&ÕNU›ªûWiä7ñSÎ*ÜÖ‰5„‘[lMëò•èk™ð÷‡¯ô˜ï’Y3æå¯cXTj£rzÓ\‘Q7­cö¯±¼Šd#I¬ wá¶™ª9¸€˜$oîô5å캕–·1¸iÃ’Ö½káγqªhì—/¼Æp¬zÖÅN çö±«' "Ö…¢ÿÂ9§ G¸2&r ã‰âß®µ2ÝØ°YXaÁèk¯ÕT’HÌzv5ÁYøÑ4ýhØÌ¶ß´Õk*N£›”w6¨©¨(ËckÁZú´Ÿh*U«éQjg¸dIO5´cY‚ËŽ;wÏzð¿ÚÝØøŠeœ0ç({t¡íê>vMJŠ„Š=OZð~›â(Ä’1cå•jƒGÓ´¿£Ä÷̧æ/Oð á¾ðÄfW&Dùw\ŸÄû;¨n`¹ßºØÕB2rö-è)J*>Ù-OW´ò'·óaa,/Ï"«K¡è²Iç=”BU9,5çß 5¹L“iòÌvmÜ€šé.<}ag~ÖóÄ\)ÚXTJŒá7•±œT™ÑjZl:¦‘-¨#Ëu‘ڼuü'¬YêÂ5µsµò®f½¢„ŸOûM†eEAÕÅÕ£ý¢ÛÈ™AëøÑJ´©] ¥Ô³}Øjvï 6RÈ<õ@IïU¼L.#Ðîذuy.¯©^Úëòʲ2KðA¯\ðþ§ˆü>’9ÜÅvJ¾õU(¸%1B´fÜCË|3â‹WŒM+5¼¶E<­zŽ·©Åaf5@ùPÊsÔW ­|7¾þÓi´ÆW·fÉV<­vZ–…4Þûü×ÅÇÔ ºî”Üdˆ£í šÝÄšw‰‡”¨¢á9òœgñBû@Ò5MVO²]½Ž£ýâDq»ßç:—o‰mr9P¬:w¯Pñ†¦¿¾¶Õ´Çò®Ó†~ðª©ÒžF*su#vµ$†+Ëk)lßÚàe!gà´MèÕÇiºüöÚ¬š»®Ûb˜.Ò§±©¼I«á^=bÔ7‘73'UÝÜM_\ÓnM­Æ«§·¸Pc¸†CÜS„4¾é„êkm¬tЋ;‘gvCÌRŽŽ?Æ´WŠçlŠ`H£ÓÖœ)Žëæ“§!¨¥np)ñŽ´ óQ1ç"¦’«ç&„2¸ÕÌi·ÂÞäHê “·æé^‡ñi+÷UNþ÷Ì) ¯a\ÿ‰nš÷Ävñ#åmãù¾§ÿ×VeÔc²·iF1‘¶³¬íɱ¹Ôg çNÙAè;W8ò^Lô%%;E®Äù(x#­hÅ}y䊥áûCå¼’üÄô>•µo«ÍÏZ樽ë#ª2ЫËæÉüqǵcÆÓ|Kgpç| |¶'¶jö¤Åeß=(›GþÕÒƒ¶uù‡ÔURj2רª«ÇCzíÞ 7!_·cTžæGÎø•}$ª¶‰­%ý˜·¸Oô‹o‘”÷©/Â+ŹA#`¨¥ìÜgfG:qЇìñˉg™f,?г5ëkI¾Ê‘ˆÚxàçÓó­§<70Ç2ï ¸ +ñ$ºûD³Fà ˆ{¯jꦓzœÓvÛs§ðÍÔΓenr+>çD /„R&ù†~ð5ÑhöÉi¦G"`årk‘¾ñr‹‰ÒHöƒ{9÷ü¤§½W¶¼y›´ƒØÚ\©^";½1ôñ¾^Û½rútVº.°öšáxsƒV#ñ>¹aâÜlЬ˜(ÉÚ»-_ÂzWˆŠ\1ò¥`Tã5q”©iQèÌåÕ|ÐZ®ç=wá¦S÷‡bVÝÈ!úÓ­´›ýbð&·¤,aF ¡«v}"ïDК×L21QsÈúW câzÃS sçL…°Êêh§)Ô‹å{}â©S’æ[ýÇ^Þk(ÝtGìÈ9n:W=oªhú}üŸÚw-})à±Làþ5è«qd,cšeHDËЊÁ¾ø}¢jö¤•âßÏÊx5•*ëUUšU¢ôtкBJÚG±½ŒÚ°ûˆ¸d®vóÀfòêW˜`yž+©žÕ<¢;éðù¸ûÌFs\®›ñí¦RÎ3 œnEäUÓö¹RØU];(Õ:Ÿ è‘h–yæ3· T@ÕΣö›=h4{³·ô­ cO/ —Ñ‘ È Ö¼º ígEÔ”¸¸FWåX(ÂU9¥}BµHÒå´=KYµ°m;ÍÕíVWŒrê95OÃ7ž¸˜ÅaÅ8ìãŸÂº+I­õM;‹ˆÀIS,t¬½#EðÄú‰–ÁÔ]!ÎÐÕŒ_¸ã+šËâRDz®¿¥i· ôÁÔõŒŒâ®iö~Ö­RæÎÖ yÂŒŠå|sàFêü^YÂeWà€zTžðþ» êå®íÙ-Ý~až+EN —4e©“«7W•ÇCOÄÞ% ÝC@è=+B}f4д++¦ážÆhšo‰'†¹XîøsÔVŸ†­SC]&ã2ÄVOÙòÅõêkyó;ìy’üLÕ#¹Bˆ”ýÁÜW©iZ„z®•òH3Ó5ÌKð“M2;­Üˆ3•Ïj¸5°ǥM! t`+Zþ΢J’Ô´ƒn£Ð¿â}´5¦hA“ ®Lø“©Í«Eá|—p½:Wy©èvž+Ñã1\æ7å$ÌAð¬Ù\¥Éº±Å=h£ì£§¸ë{G4á±Økš!Ó)Êv«¨®YtmCÁšeܨË:0áרúŠMgâÒ¦[kd"ù[Zê´=^ßÅ?›$_+|®‡¥MªB¯u•xJz=Qá’ëúƒê‹wö‡2+dd×½øoTmcD·¸hÚ)v€ÊÃ>¢²¥ð7‡må’ïì¹W'ίÄ(l/ÒÆÞmѶ9µ©%]ZšØÊœ]+º’Üïu9.M•Áxí÷¯Ÿu«ÍB]BCvdŒö¯£Rò'³Žã¢:†æ±î4k­‰b…¥'Yáêû&î®]zn¤lŒ…zÍÅö™-­ÉgãkJé5­a´Kûrñ³ZÌÛY€û¤ÕÍ?C±Ñ7#õÅbxË\·°´ò¦‰d ƒƒÖ¦MN¦ˆ¨{‘÷™³©hN¹n>Ùnެ2®5kc¥ø"ŒrŸºÝªO xž×[µû:%q·ÔVÄ»i›NY¡ªýà 8©sªrÑ µÊæµ:-+Äö:ËÉ R0 î+Î> hÛj¿o¶BÑKŒã±¬O\\/ˆ 1†8aí^§ªê–v¯]€VB +Y'‡¨¹u" b)ë ÿ _4Þ¶k…dhÆÓšÓÕ´]'^¶V½e¡ïYÚÍô:6Š'D ¸sÒ°ü9ã¸o/NŸt¢ ç÷mÛ5„c978£Y8FÑ“7­¬tÍÁ¢´"(Áç=N,´¿éorRâ.áOJÁñí¬èsÉìu%kÍ|)⫯jK(rñ1ëñZR¡*‘uÔŠµãM¨[Fzæ“à}+FšY­ø nì+ÌzTêØjω°Ýjàn¦œò*9~í&î9ùZReÝÍF½jÖÂJ„¯4Ñ/RT9½)«ÅäS;˜b¸µ’Ô4l9¼â)íåk¸ Ý>Ò½%†ôaê1\N£á´²ŠO.L´­œâºpòJéœøˆ·fŠ$Mu=«ѳŒP+Ð/mcƒL."ÊF™Àô®CÂñ­Æ½ 1LD‡½kÒÒÜÝY\@›X´l£êEN#Y¨—‡|±r<Î×ÄÉ à…0§Ò´ouð–þl`qѳ^q¬éZ–ƒ©IÜO,J“ÐŒÕyu+‰FÏòú ëúµ7fr}f¢ºlîLjà”—Í^TõÝi²Ç.Î1æ¨#µäÞð¥÷ˆo–HÁòbkÜ%°ŠÎÖ|mTP8ö®,e(GáÜíÂVœ´‘ç71Í¥øæ&_– ¼;šê/µ‹µÌ§$.@'­RñŸÙá¶³¹>)AëÍVÔî&ÔeBAÙŒR~ò‹e§Ë&ˆµ nïQÒi³ÄdÛ=j¬Úuݾ¡*4¢kk£Æ?ºâºC=Ž–ÉrcL“·Š£§ÙÍÍì÷Œ"åãÇlU)%t„ãv®XÐ5;¤K:þ" }Æ#µs×^MdÞ$`£#Ž}ksLÖmõ¨n·!Y!%IõZÇ^³™Ca„¾[_J„êFM¥©£Tä¬Ìí;Ë¿·tv¿»cÐT¬dºÖt û\“21À=qšô &Î ŠÝ[Ö°î®­4[i/ ·2eŠŒIV»øuv/Ù{»èdx÷vLòÝ&ba‘޳µê:ŠÂDäD/¶+¶Ðt÷*59ªr5±Ë|FŠëípÏo(Ž ú×aàï6 D/–A³whjkN¶3Ë H?…ªÕüßbÓ%š$á*¢‰Tr¦¡`Tùj9Üá5ÿ ê_ð‘%墙ß;‡jÙñv­y¢XÙº²»‰ïÅ7Ã2}JüÚÝ…?!=k¦Öt›mzÁíe^?…½ i)8Ê1ª¶3ŠN.TÞæ=ºYxËÃjnUU˜`·÷M[Ðô'Ðlü„pêNwv5NÓ×:>ƒsi ûÎKGþžÕ¦Ô-.l®É2[¶îµ3NQ|¯B¢ùd¹·9ßèI®Ûjö€,mìk·{±mem=ã¬gjîc\~¿â­ÅIkp?ÑÙÁÚGjÞñ®›>µáÑ6žIÚ›ÀÅ9ÆRPŒöÊ1rqÜÖv:Š´Â¥ 3¼ 漳ƓjšN¨ RÊÿ  é¾ßÜ4SîÌgÕÛêœfÚú(ÎzD_°«gª›«OMwÁZ«k^I&|Ο+Þ¡ñn¯k¡"I>œŽÄ|¯·½o[è6z=Œ°Ù©EûÄzUxõ=ü.w$sù@~y¬ÓN¥Òн}žú˜šnµeâm/7F2è~•—cñÆÖôÙ\BM¸;Aô®ò=ÆÊÝí`ˆ"IÓäþ#ø{ªÛ߽Ť~|ݺ­mIQœš–ŒëN¬`¹5=rÙ¬ïìÖHŠM ¯N ŠÄ›Àz åÏÚØÆàä…<~U/†íî´ $wiûÈ— wÅrÖÿE¾´a¸‡tEö‚œ!;µL¹NNgauªÙè&Ibe\mRU™n4k«e¸™ daÌjá‚×TµŽW@è@e$r+Ͼ$Ú^[ÛFö©û®å:Ššqæ’ŽÅNIFö;qŽ©¦4®žK f#Ò¼ù~ëšf´·z}Ú²«î8È®cÁ^ ¾ÒuÈ•YÚ [lˆzW½I¢qœw­¦¥‡vZ¦a FºM­Œé5E±…$¾uˆ…óÓ5fÓSµÔÔ›i£”»NkÏþ%Ev-ÊI 9#µrŸ5¹,|I .KG7ÊFiCÏMÎã©YF¢ƒG¨ßxVÔµ#çʹ+ÏuÏêqjò-¥ÎQ6úb½™àaÎr+̼IðÞîëS{4¦æ*iáåkT üî>áÖxCW›^Ñ|Ûw/ÊHï\_ˆü©jZ¤²Û7ÊNFóÅv>Ðîô1–uFêâ¶þÖí± CÞ£Ú{:À|žÒ™ÌxÎïFÒÞÃP#†ùÝ®©¡y-Þ2Çs áÞ)×îåÖeĉ±ˆ ЊôŸ‡º­Î§¢<…Ùnµu¨ÊÞÑõ&Xó{5Ðó¿ø#\‹UžDî#fÎõÝøOºÑ4‰c¿^ã•»EÞ¹ópéÍy¿ÄmróOU·„²#ôaB­:ÉRe MÔ=Ö[{´tÞÍsÃ].êè\Dí –ÏµæþÖo¡×`hr²60Oï¬Å"]ØÝŒæ”á,;²c…HÖW±ÅøÒâçGÐ"Š«°°¯+µÕî­®–dÁÝÏ5ïwv¶º­»[ÜÊzŠánþÙÅvóEpD=B‘Ò´ÃÖ„bÔÑjS”“ƒ;&é®´kie~]ÈïÅr¾>ðäºÆçZ±3B3ï ©}âÛM Ò (ÛyEÛùV¯‡üHší£2™8qX¥8?h–†Ï–WƒgŸü9YíüO¶`éµH ×âmbÒÒÍÖï §±§¼6–º’ÊÊ‘»u=3X>=Ñî5k(å±ùÕy`*œÕj©½FŸ±¦ÒÕ˜Ö4î¡XB3)¯GÕ¼?kªË·Žxï^5áöo[FaeÙ&X‘Óî:åËÙérJƒ%ÀUâ’Œ×+3ÂÎR¼ŠÚ¦‘±£6šTíÂ1¯"ºð~»¦ß¡ÎÛ‰qNoêK{æ$Ì¥[ vÇ¥{.—©&­¡Á|¸bëó t5KÚaã®Ì‰:uå§B(a7Ú,p_ ÜÑ >¸®_„Ñ˨y‘ÞíµfÎÜr+«—Sš9¦óc(" :\ä-WSóÂ|­ØÞJÂŒª»ºfõaMYLëáÒ-¬t?줗1í)–<œ×%¡xÿGñÛí<ŒäÔJêuM6=zÖÞh'hÔáÐ×ãêZ ìVÖÒd*òOz):’n1ÝŽ¢§§.‡Yâ8..t»ˆ³É_W†\‚á£e85ížñ=¿Š4à$P.£ûëëWçðž“wuö›‹Df‡zÒW‡n2FU©*éJ,Îø{|Ú†vL»ÌM·-ÜWãÛ™ Ö|´gD^@W­Dl4Ø’Þ$Ž<8Ís¾.ð£x‚м;ÂýÓëJHª¼ÍhÇRt¹SÔ¡ðóÄòk5•ÑĸV#¨®†ãÃz,Í{öh÷7ÌÙ訮[áç…5mQžkåÄF6ú×m«[½Å…À…Ê´zÒ¬Ò›äØ)]ÅsîSѼK§ê·mglÄÍö­+½2Æþqö»xäaÜŠðm?P¹Ñ?¶šÓDÒ7¹/sïŠÒðÖ¤uv̈6—²ýÚ’`êûü¶:HÚ¦s¹MSŽqVCv¬dk?/5Ü6}jÌ£Š®FNjd‘ŒfžÇô¨ãàæ!ÈÄBßxÔr“®pæ¢vÏÐ=ˆsWá8Újˆ?5]„¢œˆ‹.g9úUY¿J²85Zrö¨F„NÃÜäb‘È#ŠhëWrVࣞh~”ZWæ§¡C{bšzÒç Iž §L‘sW%5RJ¤C"SÍ\Œå9ªª£w<wŠE¥̾.m*âaöd;Œ£º×®Ýø£L·ZPì£&¸ÛßÙ¦µÏئhpÒ`†®¨9¥drTånç¢ivV:6š–ºl*±¨ä×Þ«ßyŽrC8=ºVf›âí%ÈU™z2‘ŠÖ—P³¹rÌ„cŒæ©÷:©M-7ñz\\ê–P-¾cF ä@Íh!{›ÁöpË\Õç6í{'ÚBT1ê=ª•Ôiy,r&$u‹ûª!{Ͳ¶»w#i²¹bŒ½EMà½B+í2X¼Âƒ=ÅcøŠé.KÛÄß*Ÿ½ëZþÒá]2Yã$Hs“NQQ¥®åÆNU<ŒrÙ¼7cu}`À™_•Z[_ 5æ”5 fÛ$äJS°aPèw3\øƒPÒ¯ãÝ9)æ? ô+HÚÑa@5GJS©*k—¯rãÍót8ïËz4($ˆœŒ ô­ 1¨xb(ØïY#(sÚ·f‚˜ÌsF QÅPÒo´Ùn®,m1[ýèÀÅsó¹SåKTÍùTevôe øpxÎûÛ§ ®CYñ£§xáTHQ€+ž§[ø²ú?y&RÐy¾^ÞØ®ëP𮑪j yjºÝ·ÏZZY—®¬lu8â–x#—8ažh–êÊKS,qœaPœUƒŽ4ù8WâP¾ñ g˜b2Ùák qSv“²4”œUÒ»0üW¡jëßh¶ØHÙB•é^Oáè ½“÷͵hÛCö{X¢›l’"’;ÒL’Yà=1N¥g(¨ö:II˹Èh¿ä´Õ…ì×gb6T/®¯QÕ`Ò!V¹è[UØY7+s¾:ÒeÕ4=Ðî2ÇÈ ÞŽwVk‹•SO• xånc|ÄɸYº5Žž5 «Ë]ÒœH£Ö±<sxtY4ýB)ÆJ¡qƒƒY~[Ý Ç³ióoò¦Î Ρ«T¾$žÄ¹»&ÖçS⯠Áâ(à˜€·¾;ŠÓ¶ƒì6P[“íúÖ‰üJ<6±´±–I8íW´m^×Ä sGpj$¦à»¹S*é¶–O=Ťb6fùÇNiÚÖ6­nipbž3¹wö«WÖ[`žKe"b¹ÀèMyLJ$–ëKUœ¸òöH®+çïÙÞèž#“"Eýæäo^kèÆ *‰Q°Çõ¬ÝKD°Õ•EåºÈW¡Ç#ñ­hÕöOS´ý¢ìWðõÃj~´žQû£$÷¬ûŸ-‡ˆ×L¹M«'G5fïTÓü5 6¬JDzT—º^—â‹xnr²9Yc<ŠÍ%~f´4½´5hš•†3^5â‡z•¾®g³C-´­GU5ìÉö(2Ü¢/&²tïéwóµ£JMØ«£9Á·*Â3Vÿý£LðäQêD¸$úVŒ/aªÚî%OCÍY¹†;ˆ<©taÛ¸®OQ·ÃšUÃY»¨'p9éYï#EnSf? h©sçGaÊy$(ëTõkm^ÛR‚æÁ·D§&{WŸh>Ô#Õ‘n¦2ÀÍ´Jõ[ë†:KÜÀÎÍÃo\b´«NPk˜Î•XÉ^$Â(obΧ#•jÆТ¿[¨m)ÁÜ p¯:´ñf¢þ ˆ‰Û‰6”n23^£¨k6–ÑÏ<Á8Š'Ntô]B3M{¾3ׯ´$‚Ke,¤à±­_ëÛz2]œ,ƒ‡õ<7:_‰töÀŽâÁr)ÖZ-­…ŒÖöJU=*[/+Z”¯{ô2.éóÙÅs$સà_kš}Ó¡Zeà¶*o‡Ú´Ú­ÍÄn¸9®Ê“œèlrÆ}õ0þ"_ÞÛê¨zDWå=w~†àøZ o f“°«šæ…e¬Æ‘ÜF2>éô­Å¶X,c†Ü±®Ð£µsÊ¢•%µFª-TroFdJÖsäI;+J8b¾„.C+Ey7‹¦Ô­u9üÅ›GJ‹Â>-Ô-õëx¥•¤‰Ø!SU+p縥ˆŠŸ!ÞËðÛBydgFL= W¸Õ4ÏØ¥‚30Väu5ÜJCÆœ×üRÒ/#¿KèÕ¤†AÎÑœ)Þ¤ù&ôýȹÅjvk{§ø›H”ØÊ¦WB1Ѓ^+¨è••ûÂÖ²¸à¨È<ÖÏÃëÉm¼GírÁöÓlà”BzŒŠÑÏê³ij™ +塃à{;û_ėتŽàW#ñ/@¤KèQ¥þöÞq^‡w©[YÆÆéÄH:dâ–ß˽¶I#ušõÁ¹cZQ©í:eIJŒó…öšœZËL°È¶åpņuÚÞ¥­Zx’íc’KrFàõÕ¤°A˜¡«¨û‹Yòëv¶³(¹•CÀ=ªªVö“æ°R¥ìáÊ?ø…y¨G¨@Y™cÚ öÚk®ø{®M«iÌ›å„àäVÆ¡¥é¾#µAuºvu5Z?Nð~›<–¨Áq’IÍ[«K’Ú™û9*œ×ÐÑ»ºk› ¤„‘4jzzלø/Ä÷–þ$–Âõ¤‘'r¿9û¦º ÇÖ÷æÚt´‡ øëõ­Ù|1¤k WÊ 0ä‘À'Öˆþí8Ô[„½öœ… _ÀN«~·E¼·'.½GãÈZËÂ;-Á)ý+¤†5–èÝA0<`®r sVÞ+³Öµ{¯ßÂ’U7tj˜JrkªCœb¶Ýœ?Ã}m¬5ãg+&äcžÇµuÓxÂãNñEÆy\eœRéÿ ôý?Yh,ªÛ•㿯i–×ZuÃ$HnD+ÏJÖ­JrÒ3¥ ÆlÀ·ÕtïØßØ Uœ# ÔZáìe¼ao¢\£y¶÷A=Ö²ü!öÛODH“vÍzÝ®“kq®OxUL«ŒJÒV£¢Õ38Þ¯¼ôhÀñ.£mªŸÞª@ '£v©ô? O¡é÷Y`á”ûW7ñLº´ñz¤j|¹äv5è–2Ï«x=U+3E·?‡¢£å¦¹^Œ¸{Ó|ËTUV ëO2óXZ5ä³X´Sÿ¯·sçô­&áYJšEæpéïP«zõ¦ÂZhl75) ̱Өݸ♻xâ’<äÐÑQ•ÆÈFO½VcóU©€ÚMS9<ŠV)» ^µvÜäuª Hz»nyâ›Øˆ=Käp*­À85qy@jµÏ¨[š™»ù4àüÔ.Øz3ÐöªdÅêOšWn)ŠF)¬rqH¡âŒP;T›zCcâ1 ©¨×ŠBpªD2¹1,\qQóâ§Œ|´Ä‡“Ç=jl±Æ T˜Ò¥LLš–%ê€r4LA§bbÍE9Í8Ÿ—'¥B„2aמ©± ÖÚÊ6œñQƒŽµ(‰#/J…ª‰O8«Q–ª# ÕmËQ-Í <Ҳ昧&§ÆE$ ª &yÜúÒg&©’‰{æ¡-ó™€ P?4ÙsUäTÝé².áVˆhb¯J™aQŽ*EÈ£‚”šSèbÿÂ'¦C®kxUs!éŸZÑ¿µžþK[› ¬F–*x"®Ëm ²0ÈÇŒgëX—“ÅàÝš=Î7ddÖIÊv¾æ«–hÉñ泦ϷfŽ3Èaë]o…uFÕô(næB%+ßÞ±tK»éGíp(h›æJêþÉŽš`´A"ª>•¬ÚQPkT`®åÌžŒŠk¨$2,n­,c%sÍqzw‹¦¾½¼ÓfÀàù^µƒ¢>©?Œ$*®Ûœ‰3Ð ìl<ia¬¾ ]˜“¾•N:WRÖèå?‡MLÏ x†ñômV)Îé-[+žÃ5ÑxCÄqkö’G( tȯíM地†ù™NÒ+Âu=Yѵƒ[yv¬™Ü ã¯b½ñ%–p°ÜÈFzÕ­oqon·„ž&qšTª:jöÑŽ­5=/±WK»C¢ÛM;õAÉãó©® ³Õ,Ú' $,0Hªºå²\é²F¤Ç9Çj§á„´µµò!ºóXžCEe¾¦›#š¸ø_mú\ÚßlMÛ¶5z ¤K œqpÀ.ÓŽõ_XÒŽ§dcŽf†QʲÖ–_ÑM§w¹Iʱ­%9IjÈŒ#‰.ü£\Þý«Ê))9;N9®CÇÚf¢¦1 o%ºçó¯K…ÖöžÖU`G*8®Ä’{Å8êvgLÓôÙ¼Û{(ãlý哬KQ™mí7ÂT†‡Új³é HÜI´ž¹Åq~ñíÃjKm~ùŠC…oCY•I§5Ð×ÛB›Q{±~#Ëy v©#vá±ÐšgÃ_ÜC©6yKA'Ý ØûWe⯈4ˆÃÏ)žõƒà¿‡ú†ª-ýéXö}Õï]©MÐq–æ)ÔöêKc¶»Ð ú´z‚NêÈQz0¯%ñíìã\’0YUzWqãoßø{P·KfßÈê+Æú<úÖi­ÙGæÇ*ûH=êpÑå’”¶cÄMÎz£[áf¹%õ´útòe“”Éí]'‹­ç>ºTù˜ ñÜWðÃCÔ!ÖÍܼp¨ÁcÅwú¯‰ì,µxô»¾“pYº­*Ñ^ÖðÔ(ÊNŸ¼x-Œ¤jqn%?x9ôæ¾Ô¤š? yÒyõöª±xAKÿµ˜n;”v­û‹D–Ñ­‚M¸ôb+*–²&…'Núž xÆóHוå’I!gÄ‘úŒö®‹Xð¶¥7‰aÕôÈÛÈ•„»­Uÿ…m©¶¾dP«j$Ü<â½jòáŽ,ƒ±BûÖ•kF-:dÓ§'uS¹åu­JÇS‚8î6('f» kÖúþÁ?¾Œl”7­Rñ‡‚ÿá$d–„r/#ŒU+¯ÿÂ1à‹¸-™žv\»¨ç5›tåMG©¢SSo¡7bŠÃÃ3ÝZD°Ê߯«Éük3ž#Š)¯î¦Ýq"e=öçühð,WZ߇n,µ¨Þ[BpŒçŸ¥p>'‰´­~êÊÐ2@¼ ö­©ÓNôžæ5*8Ú¢Øö6ûLñ}‹oUuL§µn[¤Kl±Âª ^Oð¾Im-5;™ THIæüA/n`ºmѹméYO.f£²5…hò§-:Ëí:;=Râhz\X€Ô(2ø«”мE-ö½so4»’BLyìk­('¥ƒ†’9å5){£œ‚M!\¯¥Þô¦»=ë#[YFOj™Çªh”†µ>€•™¥úº­t1S#áy¨î˜¬ÙhÅ”2—SæûÙ¥EÍUô%-D ¦¶wTÍ Q`ç‘V'©ÂñíQƹZ°Û@ÈÀ¦7©P|ÄS\u¡)îùù«zUgsÎj·=ª™œw$äf bHâžìzÔG9¡Š®…[5<#æ©R0Çš|qm~œP$‰楈\1¦¯=i¨»ÜØÅJ&`#9ª%NíÁ皦OÎE+“ÄrrjòtªP­^AòÔ2Ò°æ§V8ªõì¹Y·k©Ås$öå–8ÎþuÅAw¨éº¥·›,ŒŒØê2qš“ÃQ]ÿÂQ$“nÁR2kf9%•¥’õ@ 9‚;fœ’§æk}v+øs@“MñíôòMÊâµì4‹kzâëÌP÷õ­‹%×,T0+Í.îõ¯ˆ‘¬k/“}ÁÓæ¨ÝßBýØlŽîÛíb[”¸Èýá õÌüI–â; ##3Žôž.×/¬üO¥ÛÂH]àZïnmm¯¢ y :ãvt¨ŠöRŒßRç.tâ>ñž­ymá].XÙ‘ÙFXV¬6ÇÆ ‰g8•׃î+sUÒì5[à•HÂí=1H©‹§Ç¼_ºC€£’(•h¨«-SÓ“z½ øm¼? ý¡³4‡*-{Åwzwˆ¡±Ž0ѹ†éÍnßêöÚ|Iq;ìVÇ%† Ñj n’H䓤§ysÍ^áÉʹbX¶µ†Ô™ …äŽZ«y¬[iÒÇì…<ÖÀ=«’¹ñìÖšé‡Ëm‘GެîµCe5’E“(U*™sè™.ª³åÕ£½·¸·k³¬£y]Ê3ÔWñ,]Ee–¢cÎ;U]BËXÒF¨l>e¾Pœðxæ»{Ç‚÷OS¾¹¿ðä?jÏž«€Þ¢”—2çîÁ+{§DÞTñ4M‚¬0kÌõ/…ì5ßµÙÎ2ÛÔÿtç8ªÒxÆÿE×å‚á dÁR;W¨Û]G©XÅsýÜŠgµiûÊJ멛䛷a YEŒQ9Ý"(½iÌDÊÀŽTÖŠuK+Myá;]~µÍøWâ@Õ®ÖËP„E#p²õœiÊIÉt-Ê1i>§cmq¦Ã3£H¦0®_éÖºÞžÖóᣑpê*ô«Yåóš<1xTŒÉ¦Ú¿uFA¨‹iêT”ZÐâ´?‡÷ZˆþÑæ¬¶ åê>µèJÊìPõšåì¼ua=ÿÙgo(±ÀcÓ5ÓyH̲«óêZÖ£›w‘œb¬:ø‰á Fûý7MýîÁóD:þ¥ð¹/!Ñ%Šñ5 @W"ºÛÛµ±´yܪ2MrºOÄ ½DÚH«vÚ­Ù«E9JŸ*Z"\RŸ3êtú”ìfE\îSù×¶­¨išÛ¼rºJÜõô(9Îå<Šåõ/i:¶¥öçCŸ¼€M*F ©-ÅV’\¬ØÐ5/í}Þ󤌣x=rôÝJkU¸³‹ÎGïuõÑÜÝ[èÑÛù[#à+(ëW!Ôâ–ÐÉ/Ê s¸u”j(ÎèÑÓn'ð²[ømîm®£uˆüÑ–éô®ŸÅß¶•+Ye#j[_I¸˜ÚZÏÉü*§­fóa“N¤›—3Aʬ|å¿Vm]$ r²çƒÁ¯ ôÙä}ÜÜdLcÏ®* «­&Ç÷×I nÝIQRÛ]Yêo´ž9qºU֪救©ò7vféÚ­òë³Ù^[°‡ŽAÐ×3ã/j-÷‘jÔ÷®íš4aæ`Ä×'ã/ÇâV²ùw;žVteuϱ¥e._srøÚEäN›.”sèjoIwk§M-€-!êq\‡†´”ð¬ïy{*9Cœ~UÝ­õœð$âuT~ÛÎ^URðÕš—'¾xçP¹½bðɸ·?)â½Ó@Ž{]Ý.ÂÏZµ6ŸñaŠÇø‚ƒšT‘à#œ½ˆ¢¾#Ú$­kF‡%Ýïs˼oâÛÈïžÆ Ñí=OjÑøl÷÷Ü]\³4Cîîõ­ïXèM!¼¿‰ ~„Ö7‡@¦¸ã=bRV|/ð¨ÁÍz·‚/o/´ð÷1²¯ðïï]S„éµ9МfœQÎxGÁúŤËs!‹acÏ${ש"2ƪG#©õ t8&ñ´äô2““»¬¬Œëé`·½`õÍqǃôdm¤TŸ~IóZþ.ÒõF&’Ͳ±¡;}kÉ¿·5¦!Ýdܧ±èÓ”›pvc©8Å%%tzO‡< 4H^Çp[ާñ·‰®|: ’(Ã$™ç¶kcú‘Õü?orß+‘†Ï¨¨u]"ß\°’ÃQ\®wFè¬ùÿyûÍKå÷=Ù¸’/xFVA‹ˆÿ‡Þ¼Ž-6ö×X†Ä‚Q€G^kÜü; Åá]2á Þddî/è)ö“i:¶û›eŽG‰ù%ySZF¿³ºŠº"T=¥œ·!Õu7Ѽ:—2Fƒ€=©¾ñHñ˜Óƾ\ÈpÀž+FV²Ô!–ÒP’¡ûÈkk-7º=Ô–íÏ-“ÍsÞ.-[VtÙ©_¡c_ðœ>-†&”Å"uÇ9­->ßN𦕔“b,õS^Y x÷P‹[Ž7œý–GÁ Ízέ£Yk¶h³±Ù€Á”óZT„饽 ¡*snQ-O©YÙÇ–EŽNŒ:Áñ'…-/ñ”¾Ôâ´±‰îeR[ÙÙø£SMAíÈYc0èjOx-5-pêsKˆrËž¸­ ÞÛ¾¥öQ÷cËc"š”T&ýFã'&å±j_ Åiá»ëkUÚó'ð÷ö¯Ó|=x¾ ŠÒKw›iȯ£íÂÎìqÍT{cx% u9Î)F´©ßÌ™RŒÞ½¹ð†£ kv×q¡xDƒq¹®Õñ´Q]f«’Î^3ò’+ŒówÆJ‡ZSу¥ê‡ù›TŒÔ;ÉniŽÙ52•N†•»üÀ ÓsŠÆ·lÅ_³hÞÐI¤ªëN“¹¨4#FÇwqVãû£š®iÍOdb‰îXV俣™ÁÀ¥ÁÜj TäÔš"´ËóûTÑ'Ó\Tð¯È*šÐ…/x$)ªŒ½ëEÐâ³å5fk¹4-´Tèsš©ùEYŽ„ |cçÍ,¸Ebx´èq¸Š[¸¼ËiÕi¡=Œ¹-žìE[Œ|œ÷RÓjçiÁ«B@€)ëØ ¶Œ¢ÄdàŠ‰y8ô©‰êOz„ðN$ìTµ,Ä£a“¥Tñ‚jÚ6þi±D„jˆ(ËH"¬0ùˆªÑ7ï “RŠlRrj"Ÿ=M´Áɤۇ%’F¼Š¶>íBƒåæ¦Sòâ“"”óÖ¦„qÍW~Z§ŒàDFÈ»Ò1S#l“žÔ;U"X¥øæ«•ëR!ÞØ4é–áÐ…[š S}h=jÈ$¨«FÓUò*Ð-AcG jx©ÏCëUœÔ\,V“Þ™Œ*wLŠ`O—5hɦ58欫f«òÔñ—™H²­Å#àÓšs”Ò¨ˆÔÇšÔ”‰¢è9©Q°pj(ÏAKžMR&DŒi©¤šPwS±)Še ÓD(>è—¥&E ØTŠk{k“:cp?•bø¯XFÓâ{VJ¤‘õ¡`‹<— ’.ç\ÚeìWÇ“$ç\×]ÂNç$å8û§UàFçQÕõ»‰…@ ž€bºâ¶‰r—‘ªns´6:×#à‹‰,lò®­uÞ­¼1n÷g&$,Å»V8˜}¥èua§¥™±q¦Ù_OÅÄHíÊ69bæÞY­¦T|oŒ„oCŠÌðÞªºåŒ³Ä?t$(+/Æþ$ŸÃÂÒG28ÏÓ5Ïsråêt9Å+ßAþÓoô­>õõ,–ROj›Eñ=¦³y-”x2©È Þ·¥F¿ÐWbŒÏR+Í<áÍBÏŲIs,QÉ­Tc5)OFfç(´¢´.üGŽñŸX£vƒÅu^7…í–t*À3׿(B ²†ÔW7ãKÙôÿ<–ë´±ÆWµ%7R*šBqQ“¨ÊsøÎãX7NìQ›qõÓ¹†ÎÓ2$1 n#¥`xc]_øD–úî@DY GZ]bò/ø^áôðìqÆ:æ””Ûå“Ñh8òÚñêtNðÏn® IŒƒÔÁP·½¹»Ñ·í“iÆ;}+I×'Ѽ'Û t’°~ëíU³îÇŽ¢Ôì²Ö—H$FíÓ‘üéª:»½¶´z$·:]&Î[&{]QDЫ¬yÊ×G¢Ïcwcþ„T*pT TU{Ëi"uëÁÌéžÖôµÕ±ecó©=ELÛ Ý3¥Õ´Q”}¹"Yz'Ö­¥¤V–I #÷j>\zW ãÝ3QxÖâÔ¾Â>d^ÕcáÞ©ªInöš‚;D¿êänÞÕ«…áÍs+ûÖ±×jZ|:¥›ÛΡ‘†0kÍ›áuÝ®¤.,;OQ^•©Ý}’ÕåTÎÑ’+‹µø›eý -n¢eãx=)Suù5nc¶·ŠXlãßs Á>´²B·´r. NI’xD‘0(Ã*kˆñ‰5=UM¹{bAÜ;ŠÎ1rvEÞÊç?âoßÚj+s`ZXûuŒÿ…zŽ’%M&œfe@ŽôÛ Øõîcå]sƒÚ¸¯x·PЮÖ8Pêz[sN­ gË'#¾¹†+»g†Eù]Jšò믅÷k =•ÒIld݃ÕyÍvñHñ›3¨I‚µ?ˆõ++Nk˜#/³“J˜ÊtåÊÆ3I³fÝV±ÂO̪s~$ñZøuÐH¡ƒqÍ?¾*ƒÄq²Æ6\Ç÷”ž¿J±â XøŽ5K¶ee?yi(òÎÓ*÷º&‡­éþ*²ó# ì‡ç‰º©«Ú†”·–r[«Ë)«7Ã^ µðÄòKm+¿˜0s[SÉ'Ú«`Šœ©û»O™­O%_‡>$µÖVHnÅ}É(<Šõûc2ZÅÔ( Þ¦°'C¨ê kqÄnŽy­¥í*ÇšÚ#$¡Mò÷ãï 꺼‰>œþbYª4-_KÔ&–î9"ˆeYÿ*ô‰X$~rxè*8äûLG¨8Æ1ƒQíÚ‡³+Ù'.s^ñ>‘¤—¯óu )Ú>»§ë¶äØJŽPžEqÞ!øo©êMq òÜüÊýEmxOÂqøM¤yn„²?§(RPºz„e>{[CM¼?m“O;¤qÈc‘^AâÓ­Y¢šÞXQOîÖ0v‘^ÌúýŠ_y.£Wì¹äÕ™DS€Æ(Ý}HÍ*5'v®:Ñu#Ës„øhú°¶™ï|Ãl8_35ÛÜɪ¾ï\Šç|c«ý˜«¢² þ0¼qT<¬[[ZÅc¨]o»w#ççhE÷ äj,ÄžÕ|M©o·¸òí•qÍKà=7OðÖ±5ºÈ×WîåAõ¯L€Gª“€1T¯ã±3¤ ‘É*Xj•Irrô%Æ|ÖÔμñ¶“kr`’áAç¡«–—Ún½ŠJ£ZðýWÃwQÞÉ™Ácƒ]W‚d“F¶c;¶9jçN ÉܘÊNV±èKá&2Y¬âÎs’+JÕ"…2¡V08¸ëÿ2DÒ`…Æõ÷¬ñË¢ìûùÍgJ[åmÛ_øÆÂŶ3¨bq‚jäÃS´ó-Ÿ¨í^­¼—zŒ’‰†9ÕÜü<×^Ù$‚á‹>\ö­jaÚ‡5ÌáY9¸Øôý>9¢¶1ÎÛ›×ÔV.§¤hrÜ3\ÛÅæIéWÓ^³—xólëÍs¾"²:Ômq§Ý"¡µs«¦•ÍÕ¥©ÒÚEg§iØ·Ú-ÔgŽÂ±cuÝtúV’¤á5ͱ1¨§Ë¹Éø7Åí­K>‰~ã÷èB?½^Ѽ;{á=;Wy&FèÌ€ué^o§é×ú/‹mb–&Y`2½›ÄºÌ=¤RÝÄÒ[Ìv8õ­eÊÒ†Ì΋rWžèñ?j6:ɽ†VÝ»•n†½ƒR·þÞð°¸T),Ñ禸]GáÕåÅúÞé[^Òc¼#pTõ>Ú;}"yß-#Ò§85 ÊÃÆ¤y”ö>o¸µ¸Óõ ¨VUnôƒ5Äþ…¦LIäà~Tß°øX½ùâ†kˆÎ}ëež+tX‚a:;TW¯í"®‚fÝ™àWz•톽,Ë3¬±ÈHÉ®»Å6ókþµÕÒ<¾ßœ%u瀴ínù/C¯q[vú}ž—§ `ƒìȼ">ëŠÕ ¥ï)=ã ±½—ĶÒÁí²Ç^±âíeô½-牂¸àg½hZ^i[yÖÍ EвÖŽ,SÐ]­H—ø†9ȨOkQ9+"©ÓöPin`x3Çw7Ú²é÷Øe˜áìk¼¸×´Û-A,n' pßtõáþÓ¯&ñ=ª[ÆÊé ,qÓšë|Wá½VãÅñM lñ±xèµ­ZTùìŒéT›…Ú¹èÓ\<—FÝ£ýÙkR¸Ò<%›µµ@ó0QÉ5ÐÆ£ìËÈE]¬ÃÖ²ïtmYa[ü¹…·.;×]¥g±ÖõZVdº¶ŠI (ïYWGe®¥ØŒ*Ç%ê+”ø‡¬ÍeuogníUBu¦ý¦ìèRÊÓ³Iåtî>µÓM%.ç4ê«òšv:koì鑺] {W¢\]Cl©$®#¹êkÇþøvãRÕ†§*•ŠyM/ÄMzåµf…$e``*§EJ§$ …[Cžg¥ë:í®›cçJãiÆz×$ó$Ã͈ó.+ÎæÔïõ}7÷Œò$}u>œÏ¢ ÎJsMáù#võ2©ˆæÑ#_n„âL<ÜžjCM!nzQasƒsšBy& V§ƒ“CEFW,ÇÈéM-‡Á¢y¦»|æ ¶? Šj¾*=øZ@üb´‰„ô-†î*'ùM¸|£#ŠRF´ÝÑÍ•ÁÏZ¥uoµbŠ9"§¸'¸ÚÀóÁªSšÓ¦k_Aj0KË/jëmuE©YZ7ËìÈéšã4ËÔ¹ÖNWæVdWYàÍ ´®šFÜÓ¶êÚºŠW{‹)?BßôY¼=¢›Y˜3»äJ·âŸ Câ8mYœFðÈ$u”ÍWÄ–z5å¬w †˜âº‰si‘Œ«`‚;ƒ\ÎSOÚ3§–6äE[Û»mF#HcÔËBOOKÛRdGõª>1Ò§Ö|7-µ°ÌÇ £5GÂtþð´‰ò0rØ=…7û>kê ¾kX«^÷&ÚÛt™ùW’+•ÿ„þÒÿ³LRq»Ò¦œ¦Ÿ¸T£½ío Ú_iZjÚ^J%TáXõµ§ŠÞXÈš4‘ÚFc»…eÕ‘†ASœÕ=N)Å”¢59ÚqŠÍ¶ÝÙjŘÑŠˆ=Š©¬è:õ©‚ìguär^ëqên!iÃè5íZ@•ôÈäfRƒuk*nšfJJWV1t? ÛøyIµ,ÌßÅ[Èé:•2Ã)ïV íb=‰¯8ñ‡‰µ-ÿ qöm¹ S9Ë̶â£èuöÓ4»×¼±€E+œœW1ã­K]°A%‚?—žJu{Á~5OF`š=·)× uÎtWÔf©Þ÷úŸ4}Ó˼âÝvçSº‚M,/ü[~íz‹Æ­´²ŒŽ•CoÝ ¼Kž¥T |¨ÒFÊ3ÓÖ•I)»¥`‚qVl¡ªéZf³Ùo–)Wû¤ŒŠÆÓ|¢é7‚æKwPÇ85Çø‹Ã~)‹Ïlgxóò”“œ~uÙx6r ?©Èþüµ[‹Œ4–ý ½çf¶7µö°²yÕ Ø3€+Èï>(jÿm+¹P¬¹È¯\žæV71×wJÇY<5<ÛÐéí >‹ššRŠ»’¸êFNÖv&Ð5)um&+©íÚ7aóãš«âu¿mc§¨óñÁÏ5£3©A庄½+•ñ-î¶`éRLÍÃ2Ž‚³Šæž†Ú7<â×ÂÚõö¥\+£ìÝ+Ù´ëkˆtû{c—dPOZå|9á-VÊêS[Õ™¯Î#]å–»§^JðÛM:pʦº1svèŒ(.E~ç;âV»ÒÜi—dw\í\Gƒ| ©I¬Ã}òGî`ÇœŠö9$6ÛßÒ¸[ïþêÐ1rÃzÔÒœ’äŠ*¤c'Ï.†‡ŽµKÛd‰4ö%IçmW±‡Q¸Ò ’àìcÖ«éiqpY÷a½+ A*©o¥‹Z¬š4‚2îIe=è‹LP…äÀE5Ô_:ãŠÁñâÓòÈN `+#SÿGˆÆ¼ q^•$”lpÔæ¿3,DÂF9æ­[\´ „•-ÔJ¡¤#Î Æ+V B„“ÞªMlÂjåd¾¼R_ÎnzŒÖÖ‰­É§nG‘¿zqíYílµWœläžœŠ‰F3V*2”Ó;[/Úx¬]5ÉÅÒr޽Åuž³†ÏFkç$7¨¯'ÐüMq¢êi†sxX´Ðo!Še³eQOZè|ky§èŸcÔÐÆÅŽÕcž+?À^1“U”Ø^8•lýêêµka#G1•£òÛ9ÍEiÎ>ì‘t”$ù¢ô-Ãaghí<6ñ¤‡«‚k7Äš×öfƒ=ÊŸ_­Kmâ 2kŸ²}©<Þ˜-Ö¨øßM{ï Í º‚ÃzÊ?æØ©lí¹çþñUûxˆÛ]ÌÏääpjÇ‹¼a|ž%Š×M’D¸xÓ~xnàês *Â]Ã5§…î¦ø€××l­¿$q]²t•FüŽhª®šî6_ Ï|ú¾¡ÞXØ­ýìu£ÃëÀ¸°x›,ÛK²ãp­Ïˆœšf‹ƒåvl++ÁÑÞÞ\[Ý\¹)÷±ëPœœ.öQS²Üô=M‡N±[h"ã ¯5ø‡á)™yj…Ër@¯SI2„ç…6Xãž-¬0k%7s#NU%fyÃ}nŸuô#lã ˜è‘h—sà >S¶à¾•ßÅj¶ÑŸ-B÷ 絸÷ÎÜðj]iJM÷)Ñ-—C!Ë“PÙ&EK+…8ª®rØÍTNJÑìZŽB[о“¿…f¢œb¯Ä‡f})2é'ro˜‚j¤¬Cš¾ŠHÎ:Õ9ÐäñY-;+ŒóSÆ~j¬‘‘V0PkD`âú– ˜¤/•äÕf–›çahh•RÌ´9¨•€’˜²qŽæ›ÎiXjweՔ׊‚f$ÓC|´ŒsPt&5:óS#sUÁù±R©ùñš–h™i&BûsÈíUõ-³\[ÃÇPiç§æZDžêü8BŒf®+©•Fö5ØŒ‘—p¤E €uÅH1ŠƒB›€¯R«v¦HsHAT‰b]B’‘¹+Ȫå`ËÒ­ÆÃîš‚xö¿´Ñ/MDi?v?xÕ¸™mìå`:r{ÕX“s‚‡š–øù‘EHzSz!-u¦+%¿˜çæv'éVæu“ÉíI±mÔ/UÚ62y®xèKW);h‹1·ËN œäÔNÓO,@ Õ 'sRD~n*³·ÌMX·ùÖœBDw«´† QîÉ­‰¡ÚnEc1!éÄ™= ~-Ç0ÕksÒ¬™ üªšLÕ_Þt©‹PFÞ¾µ¬i£9hJ÷€Öô¸û #Ò¹øÁ=kU.L–ØÏAŠv°”®È¥;Ÿ9àS£j¯æ|¤|l1š–h‰›¯Z¦à‰½NÏóg§sŠêVsÍ ØàPãæ5pÆ­ÓvdÄàñJÍòäÔg­4Ì àÑbyÉüÌT«/#Ò©oÍHš9DªÖÄ6j¾V5¬‡~3S\&FqYµfu)^7 Ýž(RsŠ‹$SÔóVŒ¤îJ†Õm[r‚*Žî*Hf ž)OaÒvv Á´ëTŸ-ñÇÊy­K¥dIÆTý(¦ÉÄi©È@ɤ_—Ü[;Ÿ>õÞi~ ‰´h¯¦`"Ç9=+ÿG†æâ݆H*¾þÙáÉ4•—!ùVô5Õ_’i6e…rM¤Cã­}sû;SÓÁ’5`^x=ëÒ,ËÒ-"r±ªœý+–ðÕ©Ó4(¬$œ<°õö®’ÊúÞñ $ªîŸxÒ¹§6×/Dv(Yów9ý_ƶúF½ ƒÇ”$oîæºBÚ=BÈÆIòå^qÜWã? _ßø‚ ûHÃÄÅCã¨ç­v×Ò½¦–Dy"þ”TPQ\»„¹ÊúM½½…ŸØ­".ÙÉ™ãD»›ÃS,Hwž¸â¸ k÷‹ãT-#;•u¯`™ˆ‘ÑÆäóJptf›Ô¨ÍUNÇ ðúÃP°ÒîÚê‰ ÊoÍPðî§s¨jÆšîϹ Œgî‘é]Õž±o{©=Œl›Ðr¹¨­ü/¦ÙkO©[¡Iœa”tªö©¹JKVO#ŠQOc“øo§^i×Z…ÍÊ:DAnäÔÄ–ºÞ­s¡Ì¸ŽE![=H®» ðËlTà^acáíBÓÆ¢p™$'>ÔÔ£Q¹KF.YA(ÄКÙ/ Fݰãðë[1èn,guaù[=ësO»[èç;6²1R¨®+[y®®‚¤DJÔv4£9KI1Ê)=ê@’:Ó%Æ+;Bšy4ȼóûÀ£5.¤ó¥³´Dnâ“wD¥f¤Ð2± ëY‰,a?uw=w÷’€’HÇA'é^1:˪µÄ²1Ý!;sØVôr»ècVöåDZMË\ìÏð® _¾Ò¾Øª@¦èúa²Œ†äšè ‡÷|ŠÒ¥^Y^%B“tí#"ÇN•QVž0 qÍ[ºe¶ˆ³`X·š a„ô©5Gr'hhI; &y5™ª+¬y O%Ö¡•Î3] ÖBHB°ÉÅlíM«˜üiœ\¼· Zß‚mn­î¡r’ÄÀäU¨tņBqÍ:ïGŸAU)©h…òêoøçGŸ\·Óõ;%ÌÄqôÍmXiöþE޹80ÝÅ—1T:·mbßðŽYÛÌÇ&0dcÖ¹O^\Ç§É Ø€`l­âŸÀsÉÛÞÿâ·Ùá? |q]ÜZŒ6újÝ\¸UeÝÍx/†t›_Äv鱊oËa]ßÅ+‰í,ma„•ˆ8­*ÑŠœa¥U¸9I[ø¶Æki$†U`pk5”ÕðrPñ^_¤‹»ß6(KcâºÝO¸ÓoÊLIÞ½éË_]IúĤ“KCbèÙô¨íó,™ÆjÃ&òGj|Py#8¬/`øµ,Ç´ »ÝVnüÕûbqQ&kKrð &0*Œü“Z´ÙÔHl‘PµfÒvD+ϽHˆ»IË’i!ÁËÏrÏ&O5©Ë)MFÀŠyù{óQ³e¸¦caéÙ©ö’sLƒô©À#¥Kf°‡P‘Hø8MÆ£•>ojÍîtÅ\®>ýJ½ €8æ¦r¨¹'Š JÃ@ö§DIfãíÊ ði"g~0˜âšZ OTXx4„â¤+ÔPÛ loÍ*ÃW9éSÆ”4D˱¦Ü)–&sÚ¬Hœf¢FªBz«íÁç#‚ KnLóÅ!9g5RòU·H$ùq’=èÐå7q*OÌÄçÚ´kK˜AëÊhͲæ]à‹×Þ–B"éOdÌTp*—æäÖW6H!û˜4’œ)Ä& ‘·¶Z¹JV†(0~µnׂ*-„/áN‰¶¶)èƒV]ÚÀ^˜¬k„)!$VÞò=©ÄCð:Ô'mJµô+Å&ØÉïVâ“(eG»v; ½lr­”[¾£çL©5FN hËÌù¬ÙNœHªô vÃsWm¦ßÎõREÈâ­iã°#¢ÕIÒnâLûXÚ’>\v¤I‘½*XâýÚšž†ŠüÄŠ7m¦t¡bˆˆÜƒ¾hœïwÏj–hŠdòMUsÔÕÕMÙªr®ÒjâsTMêV,phFÏzI>éÅGç¶[m»“ƒšr±P¼/JNjCI—-_2V‰mñ€zÖ]¿­\rS +)-Nê.ÑÔFŒò{Š9$UÅĉš®ÑíbÃñ§¨´ºMÒ*üÔ䈆å·]Ñ eܯSZÀ¾Øª7Iòð+8èÍêGš%e\˜LÂË,kÕ›µ?Â7WWÚuĺ‚2J$$)ô«¶×µ³í›aT' ¦øyu9à¾UòÔcr€2kyµÈc‡‹æ¹š–z¯ŽLð«Ict¤9'Xú·ú/ć·™¤H¦”ñÙ”ô®êóT¶Ñš¾“o˜ÛWÞ®\Cle†ñ㌲•Ø õ¨Uš^òÝXé•+½SrI¢‚»ÉãÞ ž%mÛ Ç5â«;Ëý>Ök%ã1 zŠÀø‡­]i¶vi „dzÔF››I ÉAs3VÓÀ––ž$VŠB%¶c½u $W ó0Šç¼©Þjþ\ƒ¼d+úÖ6‡7ˆ ñ„ÑOjÌA$qŽÄUJ2“jOaE¤®–ç#o<ÚoÒWÊŸ<ÏbkØu)„0ý£pFâ{­sá­(ßJKeiWæç¦Gzæµ®³áÝ]a‹kZü§ÜzÕMûkYlL³mÜè<9¯ ^Î[ª¬ŽPûÕÍFþÞÂq.ݸä×)ðê'„ÃHyv'=êoi÷wZ°Ûî‘“ž:‘YÊ Uäèh¥Ín¥GÕ'Ó®MÄïŠá÷&:0â·-Þ ‰–ᢻŒkž·•NÒí¦‹y[€eå]%Œ*±oe'==¨’³²*÷W5RêÞ$Ë¢±u_Cd«« ê1Uu‘˜ÉC'Ð⤴¸Ôo´í´Æ3ZÓ‚z¶sNn.Ƀe¦èž'/ É×§zêa-¢Xâ@ b¹ èRhѰ³£sŒô® ŸF¨“] G/ãϪY³[ãÍQ÷{à|1áýRß\Gh$MÉ뺪Xßà/­Y²¸‚ñЕ9ôª…W¸.£”.ÔŸAêþ]°gàÎki’j&É¥ )8é[ÓÆ—´mž+ˆ¼ø{ºŸÛs œRI_POC¯x•Ô®Ñ$l9‘U ÒtËf2Eg99'm%½Ý­¦Ûi'Mý[­h“ÔTÛ°\zHt®'ÆþÔuEY30Sv3VµïÛh@0긥ðçÄ=?]”@Èa˜ô¡­ ¥n{&¯Êdø#Ãúö—#=Ì_óÌœƒ]­åôVQnd€rk@ÊqÒ¹ÚMs¥Éådü¼¨¥'Í+±ÇEbxü[¡_Kö¶+ãq[0[YD7ÃC<îUÅ|çok;_*ªË Ô {®‰4ðiý¦BåW©­+STífgNnkUcVIˆ“i$­fjÚMž·‚á7¡õ¬ë¯iKqå}©VLà®kV+€ÐoO›räÞ¹šqÕ›«=ŽJÃ὆¦n#”˜ó„t®®âî-> ¬B¨¢ÀÏ.ÿ3§¥s= ]¼íaÔUÆN¬—3¢©¦‘±¢ëI¨^_ºC]bÄ òŸ‡q¼7—rHÆTžõêqI¾-ãž*Ý54gÎä“(j‘fÕ‚tÅeéw­,%ûëÆ}El\SiÔ·`óÔ Õ¼C¡ªr!!š”­—;c$¡â¸7Lžç—+ëŠô;ø<Ë&ºô©|5Ik³b‚jUGÒ6Inrè7*›žþÓ֭̄ÿ¤Ç©I© §Ò¬J™^kE.WsG±ÀËoqg+2ƒè}ÅvÞ³¸ó »p%Œ¡ºÕ{‹T”|ÀdŠŽ]BçJÒË[¶ .=Fy¬æêG•n ©¾fušw‰,îõY4ì¬n§j©èEp^:¹½Ó¼S¾'hÆB ajóÍi®­ôYC ¡Ïùô¯TmËÇ~´¹‚\cEê gìãBJofhêʲqZ4^ðV½'ˆü; ”âæ1°ZÈÐο¦xªX/i-$$oÎTzÝðw†ÃóFÒ¬»º6;UíSÄÚ[>@öï\ò”Tš‚ºgD#.UÌÎâÕÌf•›Ë<æ¨ü7ñUݶ¨šlò·˜àþ]ÕøßLòÒàpru• ü/m'ZŠñîÄ‘ÆrëZÓœ=$·1© ûU8½‡Æ¶·×: ©d aÉÁäŠÇøo6¥<‰ äß]¥íÔv0´²¸Ø£'5¥ø¯IÔ.šÖ $ϰŒŸ#ŠF­{Éܳ®ø–ËA·W¹o½Ñ@ëQ?ˆ-îü76£fÛð„ãÐ×ñKN¿¼Ò[@òÆ8!jÏtKÿøF.í®áh„¿t?´TãìÔï©Òç嶇 á^ôøÊ)ÕÛt²Àœðk°ÔtµÏˆ),Àý–Ø $r8ÀÅøu¦ø„ÞݰFI@ZìüC2Zh²Œ)d v$ž+Z•cι;œ¹™Æ­í¹ŽÝ²‡ävŠOìhî­<¬`Åsþ†H4ks !˜–Çã]m¼åX)êÊŤ™¢wBø{Ãv:$`ƒv=MWñ‡‡bñ˜ñ‰keÚF±¯^¦¬ T‹æíëRæù®W*±ç>ð<úLó\^¨ùøP}+wÄP[8+bãZµ¶r*;\ßV…·FàäƒéŠÜåv'Y- Ëb$=ji ·ÕXÄã­T+*Þ´hä§.Œ§uÍ\…Â*9cÛÈïRÀ¡ˆcÒ²’¹ÓM¨—2[£¸u=XÔ¯*ƹ?€¬éä2¶qÍ IèA¸—ÉïN<I±+ð¾âŸS>_väR¶0!fQ/'9æ¯ÁoÎi¶L#Ì$1`j×–œS‚¨Æ*V¥GS¦ÖD8ÂÕfÉ5<¤…â«©ËÑ$81è™j«4=Ø@(¼±§ÏpðÈ#UÉ~ªñ£ZÝù|’ã,ÔE rèhÆÊò1ð;Ó–V32ò X†Ð)ƒrê8õ'{”Õ¬N­Ú‚qž)Š~|TŒ8Í!²£œçÖ®F~QPç&¥‹ÓÒǸÈ"ªìÁ5<­ïPÊäš´È’êSÔ-£šÉÔ¨ù»Õ.Ùmtõ‰F0)—lZÐl;±W­Ðˆ°x sU'¥ˆ¦—5Å„b Pˆô4#m›=Âþïzžk#VPº`­*þ÷sVšÀ“Täù­Zìfôw-õJgÝpiK¹€ì)òHÅL´4Ž¥ëŸ’aÔ‚ç9WnCе¨ì[\)äÕi†í>6=R¦ÚXiõ)%·žI¥Oݶ*ÜCÖ£žÕù›žÕOB}8$nAg¥M¨jhÐy×n‹Uc¹Š¾Q‘œVÄ[½cK¶ŽÅ7a²@5´b¥dÙÜ[²ãm:OhÖ÷zk '6œäSõ•Ô¢øvŽù[ˆã½p+3áü:gÜÅþˆàŸ›±¯K–å…à•7Fà ãªKÙµÒ4‚æ\Û6r?uÙµ]¤ìHÜ÷#Þ¯x¯Ã‰â‹!0Y£9V=ªÖáË-.$±‡›’Tã|5âÛ¶ñkØ\¶#‘Ê€}hÖRs§Ð4ŒTgÔî¼/¤6…áølÙ·H¼±íš×Æ!#qüê ÙáY?".q^?⻩VdpÈÓOÚù‚TPÖ¡¸y"ù`05³§e8¡nD¶¸Æ¹‚ I"‚£žjmbÊöC3¡îæªx’Ïη,"@úWÊn ×GÙZD‘[îç¥k |÷ÔÎSå·™í¦•¥jb—z{Um#IŸF…’&.@'¥^Ðg’ãM¦ÍÇ&®ÌŽ•ëŽ++s5¡˜Ú™,R¨VcÁéVç2=«ùrØâ¼ÛÅz­Í¥úÌ»N}«kÂþ,–ûlæìÕ|G›¡7N\§ây5õ`ù89ã#šõêwú5,h‘Á-—k æ¢sžÆ¸Ä×v4¹°¸rb2Ò»ˆ› :óÍ[J“þU¹@v\ùþu½Ì¥ØÆ¬¤šå6ì¼oq7M«6 ½v9FÅ÷â×~ º±øŠ†$f¶wóCâ½\LÙEmëN£„mÊ JWæ6‡Ì*µÊ°Šõ¥Šà•1Æ)îˆÙœ®™óê¼ä„Ï­×J‚jgE*»O$gÒ¡$·-Êúœæ»¥ÄñùÑ Þ:àu®&îuY |dWs®k0Ø É5⺶¥/ö´­¸à¶F=+JTùÙZœ‹S¤–eÁæ²î/¢ÝäÈ2¯Á¤°If]Îr Iqn»NP}kufC“jèÐÖ<ý«¡ZÏaóOá{î_óšê¼¦]é^û5ÀÛ)$…=«3ÁšÝ¼Z ëtû›O±®¦]^Õ,¢»‰ÄÑ9 ¹;W%iÍ'±×JmN;±!¿ÔÕþÓkóFØÊ÷µç^>2´©8#aÔסê¾"±Ñ¡V¼<¿@+>îÏIñ®’cµœãTÔP¼$¦Ö…Ö´âà´g—ø?ÄsèºÂÅ­ä`g¥}“'Ù–prŒ¹¼.ãáî½e¨*¥±uÝòȽ1^áe E¥[Ç8•o­oŠäv”Nl?:\²9Ü0ðÜ 7ò¯Óo¥±Ô ¸Èeq^õâ -gJ{e>ëZñÛêßÛ_d{'Ú’ ·lg­VqPq±0“œ\Op³˜]iÐLÊô°|Gãk?:ÄÑù“àÐÚÛ K¡òÍÅxŽn¾ÑâiÎX¨8¬hSU'g±¥jžÎG·hZÄ:îš·QºäýåS÷O¥dk…þ¨š3Ê ©ÜËŸÇð½šÝÎùŽFk“Òîd¾ñì—yšF<öÕª ž]‘2¬ÔSîzhÇÚp‰À·%µ$Ž<±œS£S¿!ŽOZ·[Ú“n¤šÅ¢âÍØî’ lÊ@Ú95Ÿªj;tÉ'ùÙNÚòßxîY®ä¶¶m±)Æ}j÷†ukw˵ù›hùџ/3Ø)Õƒ—*Üáµmjñõ9|ÉØØë]ßµ?·Y]ÛNÅÞ5Þ™®;Ä^º·×$‰cožL)Ç\×oàŸ \é©<·)´ÉÕÍuÕtý–‡55SÚ;ì?pÝŠµo0GäñYEØLÈT‚§ngÇjæÙÝó°Æ&8'å©dm†æ8…E¦å~SÍX¿F”/?…EΤ´¹žî]òÝ*AeÍGåí5f"6`šCEvM ñUØn&´YWaÀª›AJL§±¼dÉŒVœhÕX—kš½VúS°©²64…¸ÆifsPd““Ò¥š¦6VãªêNMO0è}jÔ2âµ+‡ÜP—W«’ × ’¬ûâðÜÂ뀬ØcWg~$¾p8­:#&ìÝËè˜#5)öÆÁÅIn[ÉC)±ÍC0HnL g œ ˜¢æöc%..†ÓøUÐß/5›Ù»•Jü¾µ=ÍÒZ¦æ9öªhˆÎå£Ò‘ ¬ŒÝÝI¼9Ž1ÎSZøêjZ*.ä’œz„ªIéNfüª9¤Hàyü¢’Ü·°âêò[ rMk€|ⱬeŠîxœ .ÜŠÝ2=ªæeOk™Ò²¬€í@ &æÞvúT7Ò?œÆ(þ­V-†è¾µÆ‘»ù’©\&ªÏ˜°“¼ô8¦\íù_?)¢7¬V@#'0\j­µÄ­Ÿõ`ñWZ3°š©" Ë—Qï¨9 ÍCƒ$Oj³lwyŒÇïtªö›ÆCÐæ³]Íb (ÍíÒ¬º±`}*+Àbº ƒ¡æ¬#«Çœu¡«1§t:3‘ŠÊÔ—“W„ž\áMRÔfß5QÜΪ¼H´õÝt£ó­§íIƳ4Ы>OQZ{¶È‡ÔÕI“MY\HRèМRG̯Îx©/cÃîMAls;ŠÍ3V…‰¤úU"ÀLO½jM‰]ýEb1îÏz¸3:ˆšÄ®¹â‰ÓrT*ÄL@jW*b®ÆMôfqcÁèi ù¿J’ê?1x5““ Ú¯¥Î{ZV4-  1éWL!PdÑk´’@©&ä`VgRŠ"Œ õl)hÁ¨àˆ…Í\EýØ©4HŽ$X¸ª·(ÀëW”|ÇéTî8aLL€&ᚇËÌ¢®¢ qH!ùƒRW,D1JF;È´P §Ò³î2£¥+š[C3ZW›I”+0#EixgPŠëG™ó°a‰¥ER›dÒ³&Ó%¶·º†Ý¶A2ðÆÓ[A§VsÍ5+£©µ½´ºœ5£+íùXŽÔºÞ»m¢F’Ü8U~½sÞ´þ˲k[§ÎöùNy®oâœ×SßÚÚG˜”eHiFŠ•N[èi*Ž0æ±ê67P_ØÇsf7®FçÀE¼U±e:"oÞñ‘ßÚ¯xRÎþÏÁHŽ ˜©dSÔVÆ…,狼]|’ä‚ gÌéɨšr©Æì±4‹pfƒ 1\šó¨þË.¹çNÿè…÷§“]ú@‚õçÏ8Å-®§ ÍÌ–Êà:u©…YÂöê9ÓŒ— ç‚Ü[ (þâ&ЧҹÂèzÕôRdɈ+±>@f12—çµÿA¢Ù‰sÀëJzÆ=FÔ~'ÐÔ¾F#2á• >µÄxKÅ77Þ ¸·™Ùâ9Ú=+²Òoíõý!.£ RUÃJÇÒ<#‰«Í{Á–Lü­Û5tùcF{Šw”“ŽÅÖÔmîõWÒ¥áÙw #­nÛ'’_•ÅpóÏÄ8 G˜£ŒÁ­wbTkPÿŸ"V·Re&È¢I6å“Ðô5­kŽ0é\…î¡-´Àçrg‚+¢ÑõµB»¿V´foTiËs!FƒØ×=yá½Ý ‡VQÎà+¢Ÿ„'ï\gˆ¯æ†ÝÌs&{jšè‰R¶§Em%º¨Š7h¶AϽx­¿‹uMA<ì°-×Ú½WN¹MBÊ9Ð7Ì9¥:r†Œ#8ÏTE©i¶·€‹«d“Ü\õÂÙhÿê"ÄõQÈ®²x±êO¡5æÞ(ºKI[ÌIöžêÇŠP‹“å*Rå\Çu¤_Cw))‘‡V'š½662°ÆzzWˆizÝÕŽ¦g+-ʱÈ5ìV7§Q²Ylb¼ŽÕUhºlšuTõF-þ°š|¬¢ú†ïWô_Zßâ2v·LgŠâ|m¥^©iárÈzÈ®[Ã’ÞYê)]sÊš¨PNÉê)V|ü­ï}§Yê0•ž1"·­sQøGFÓ.üô¶Úsž™­›Ó-²´/‘ŽTõùî&Tù£Þ‡ƒÇ"±æÓCKjsúާñëq‡^±ãùTzG‹c¿˜[ÊãlñQjz)–s žU¶ðš‰„ð± všqP¶»”Ûù5ÌÍ ˆñä1<‘ÐÖ´Hn`_7Ž:Õ ÈŒE2goLÖÜ%Ü.1ÅŠdJG-¬h 2¨ÇPÀt5_ÃðÍaæ[9IÈ®¹°Ñm>µ‘")gÚ0›ÓA^啸!Jžvš£=ÀYCwÎ)žy[†gÈÁÅ2tFß\Š"âɸäw× TœÒ[  ÔÒ1¶=+ nlŠ1ýð O3íŒTãÉsZK¹Š¦ÑT…'aѰ1žÜÕp–Ï«ZÏ _23…oJŽK¸í¬ÌŽØã§­fZG4÷?k}ÁsòZØÁÏTz‚"Ï9˜qš©u#ïAÁëNÑîKuÎFÒš ëŽÔ’º-»ð\ÛkUïµ´)ÉÕKÛc,ëÔ ×1á½r]GPž7Œâ&ÛœPœù•ΫS½Z<§€kÌo|["jXI¾^¸ÍzN§j/¬ä‡8ÈÅx¾¯á]JßU`‘3¡o•…kMFR÷ÌçÌ£îsZ¿ˆ´ýèrÀäW?yà[‘Úþ•èÞÒšÇKd\>2En\[¬Ð´xaŠPœ£~V9Æ2Ý=¯Ù  0qY·ÁYSƒŠë5½8ÙÝIOJææN¼sZSÝÙœám4½.KŸkª™2¨ êx§|7yoþÛ¤J̨˹_º0­¿\­½üöìŽ3Ü×c¤èÖuûÜÛ[¬rÉ÷ˆéJµd”¢ÖåÒ§f¦žÇ/ãm{ï«Ç™.-†ï óÏ kèZÌ3£2à:„WÐn‘¦ç!~o¼½aËá úð]›EIAÜvô5 BŒ%©u¨óÍN:%­ÐºµŠázH¡±éUµ§˜h÷AŸ1PEJ@·€—åA€¢¼þÇÆÚŒ~(“K¿‡6ò¶ÕR¼YE9·n…»-Lïø¾ú]u´ÛÙ‹Ç);w†½Jââ+XÚYpª£$šäWáŵ¿ˆ“V´¸(üÏ,úÕá¹0«ÛÎ; ºŽ2’åИs(¾mKZoŠt½^æKk{…óPà©ï\W‰þ˪ëÂ{\,2rçÐמøfæhüCjè[q­}‹ò®NN*ªÅáåx2iÊ5£ï# !4o ½…¿8©®ÂZðjWW—!KWª¼{×onõN{8ü½ª¼u8ïYÓ­%uܪ”âÒ}ŽzIü²pj¦±=Óèòy,ÿ(¬ê0˜\–8ô¯è¶ési‡ëE½Îx·{3Ä52âÎõQÁ,@Íz×­K++›«…Ã>æ´õÚêðÎËÑ>õØÛÛÇil!BŽœVµ+óÆÁNŠ„¹ŒëÚæt–H”²†Ågë¾mŸÙ J3í|v·up–±³»沿µ-5+i<©QÙAã5Æv&úœ}Åû\­â'š–(p­.x/-çY3æE!Sž¸«Åjï³9y"›döß»qŠ·p¥”£ü´IÌ`R4‹L¡$g¨¦DH85¢b W–0™Å!òŒÎsïL¯j„ËÐzšº¤,Xq@š¹_i íR!#¥A,ê…w¦¥¡æŸB³$$±ÇZF‡5<)»æÅ-Ã,hrjM… ÕéYÖ·,£›ålñô©Ú輦 01œÔ ̧p籡.à篺GªÝ$©‘w)=j[k´¹Ž9"°µ‹ÇŽÜÃ$g r­ié¼éñÉ=Nkof”.bê9NÆÜ ¼?+mÅDË21nØ" ;îîQŠ¢rØïL¼7˜Î­gšU–‰ˆ%ƒS[Ÿ”òsÚ®Çh7™‹¸çž‚ªÙ»´’ÈÍ•'м$ 2Æ›b„U®,’ÜÓ9È5 ’˜ÇÊ:š•_( KEÆZØyåj+”ó tÏS‰¨çrý([ŽoÝeMä tv£;ke¯|é#nsÍai–q6䜗9ÅjÚ®Ù‘ÔñUR×¹•&ì‘­5¿— ’Ä²|¸­9kqžâ°žAn²dãÒ²JìÝÊÊì.ÊIvž:šY£7 tµ[ÉfTq–ÝËÔ‰ÈÚj·¡÷·+"í`ª8«Œ¤CÒ«ÅËçÒ­JuRk±nX2…<£"/Z¾Ìd…Aæ¨jMó+-BcÔ[ÕÉ>õVÑÎYjД ¬Õ‡\Vbå/õàÕIhLe©,¡MʇQP$ÎxÅM8ýê°¦ê‰ Èûؤž£’÷Lû"ã9àž+jUÎ×cXÄDȦ¶˜yŠBõrFtöÔ.[z§Ò«Z‚'s“RÝdF¾ u¦Ù:œ÷¬ìkrMIÏG½a)Üzp+¡¿@ÖäÖ š¨Ô$)ûÀÇŒÒÏÕü)e$yg©.¤@Š:ñÒµKS»#%¥íj¯´¬™ù 3àPƒ´ÕÚÇ?5Ñ¡cpAÆjô’á}ë2¶¸9«YÉÆzÖ2Üì§ðš–Ç1 w«Â2©Ò©ZpŠ+JV çµnÅBãw½Sœî4­ óqPÈIlÒA-‰âÀU…©ÂH"­îÇ4XåR –¸Ìþ&=*ÄG-SL½aSÔÒúÁA$„ ã™ó>VäU‹•+oŽÌÕ ±Á¦£êðZk’ióŸ)óòê [{—O·BŽÊ>G#v®ÔfíZÙºd‹Ê»ŽOÜÌ:ŽžÕ1M;ô =,sZž›x²†ØNr;V·‡£žÙq!%jòÞmŒUÈì{ÔSÝE,¹CéZîd•Ñ2:cp#Ó¸®SÄÚ,—Ñ?’“ÙªøH6Ý ¨e'Ôÿ1[_jYa¶8ê(ri‚Šhò¡á‹Ï¶ d} õשxzib±2;­çE#6ÉáRErà`ðÃGz'UÍê5IEhmHë*‘÷d«‘×tèueV:õÅi LÎÞ[.Ù;YÚ€–hŒÊ uá±ÜTߪVÑœ<Ü©Ny®÷Mg‚Ô&yŠç,,ç›S* W=벊ĄPÿ|õªœ¥7¨£ÅYã¼–Dº2šÌ‹C·Y‹D¡Iö®›û?Ët d7Ò­Š«–ì8©åù‘Ž–RÛå“*G¥lÚù ‰r;Õ)vE:LAMB”î/Ù#’BŒQ¬(‘ÜZŠ@/jŽÂGù5nÄ+”ÎA,´è.pÅIÆy> ½oJªËµúsY«¢ís@Ì6žyëY· ûÂõëŠ_1±ÏU¯”G(ëÑ©·pJÂN¹ÃƒøS×lSØe29ªm+`¨ 4DísŒ,|š½xƒ,rMgÛ*Œã–5uX˜e$h™  œV6©t#G+ɵ®çD}kŽÔçyeTÄÕtÕÙyY,-d»Ežé²*µ¦Ò6€XG@*Üç#жîÌZå‰ÓxvïánÇ+]d2†\7ç^k¦^5¼á‡>µÛA|’Ù–VŠ‹ò³xûѹ¡:‡R5¤®ÐƹË`u®:ÏÇ…|G%…Óý¡³Ò½ —1 #`ÊGQTÓÒèz-˜èÐfžm¡eË"žô¡vÒ³¡GST¬N¤aF~^*E.{ÒH»â—pÛœõ¡ÈøÆÓ+ÀƼþë‚x¯\Öm–ëM™HÉ ‘^)®Ü½¹<Zt•åaTvÉm§û>¡ ㎠¯T¶_0Ç,O”#8¯¶•§‹q­H¼sw¢K3Gæ[ã®y¥z{ •e ÎËÆÚ”ú~–Ïà“€Epgõ „7Í<ƒ]¶§%§Œü6ÓX¶é;;ƒ^;{o%¥ÔN¥xÁ£ N‹Œ–¢ÄÔœZ”^‡Ðú.µo¬éâæØ‚`Œô5“c½ñs§¢˜>ä¤rkÏþêÏo®›6säÊ1ŽÙ¯a“rËÂCÜW5h{)Ùj*¹‡âÛèß» ™HùEEáoÛxš-çUYq‚‡£ à~ Å$zãoi\Ö†.æÓ¼Ci,l@2Àwºc†Œ©su0–!Ư'C×áø}£Újë©A½6íŸÃšÕÖu›MÜOrÛPp+\²˜Ñ‡€5宦I-á÷Df¹¢Y¨É›JJœ\’=NÔàÕì–æÕÃFÞ†¬±ÁÁå 5C¹·’B¹=+Ó`¸ŠñCÂáǨ¥RŸ³‡ {HsšÝ´³ë€;úÔžuLÇ»‘ØÕ­Eö d÷>•GNˆ¥Ñ`Ü7ZÒ,ç”m+<2e‹öW$yAÇaT t‰K‹ªxžÖÌ*y€å°yéI§k&®rœÖaŠ¡DJOjº qŸ“±Ÿyëò’7UÐCÏÛ•;AëJ¸8¦ÉŠ÷™¡@«6öBÏ»°éVwì^*•Ë|˜ïE…7b•Ì‹Ùyü)Ð:H7ÖžŠ0Fk5a“OÔw1-½=“V" §~…»«Xî 6Gâ’ÝÌ8#Òµä“aR9¬[¸#·ÖRqœH>jºZû¬+éïDÚ°BŠO™ŸZ¥®^yLˆ§ç~4r¯Ùåx”—íX#]ßÇæðàÂ8ÞW&¥EÈ¢tvQíÐ2iÒä¸@3žõ#0Š är8¤…N·SYµ­Íot¢U`Vô4Ø“¶rJuÖ$üQ^\ ¹ÈÅ!¯ŠÄr¢«]ÜâÔ‘×¥X˜àb°µ‘®#Œ)ª¥Èšó´M›]¿gŽû稭f‹b(«N‘!•wŒ¶+bæGr¦5ùqÖ•U¨ðòÒæ‡œ¢ÍNzW;,ëy{"©ùãñ«Ž’eJ‹89£³³ŽHöþõ¾f4¡e©U/- Öñ"ÛÁÍ*0ÚqÛ­S/%³ÇŽÕjFäw¤õW..ÎÅHXÇpäž3Ò­<¾dgiª×1|Žâ¢´r¡Ðži$7;=MèäUÞ‡¿J†â1öBÄe‡J[uÊjÄ›–CåH¨‚ê\´d:s‡µu'j¤«™\޽E:ÙLw2ÇÓ<Šn·XnsVö!n"I¾Æ¥tIŽãšªê`¹0ŸºÜŠ¿nŒÒ£/ µ›5èF,Ì7,ÀpX·!:õ<Õ›¡µN:𬋒@ì*ã¹`ž<;»f™ 1ÙÛ´¯ÁcÅZ„潬ÍVf,ˆ>衾¢Jú¹˜5·¨ÍgCþ¼ pjÅ┪Õh\¨‘SÊ›[¯cÄjج‹›Œc­o4ÑÉŽ^AšÌ–ÝCpÎIÅlšÜæœÐÅæ`OT¨ïQFÜf”º´›}¨HlÍ!¼ñ“Ò¥(Iɧ²8Z°cg=J¶…Tœ@§ø¦ýÖ˜’±< L€U’Û˜ƒQÛ‘»ð¡²Ò— 6Ôª3Òµ*7˜I÷«{ˆŒQ¨I‹ƒÈô¨^Ò% #P¹âžžQOqœJ©·9=WÀv:²¼ñŸ.àõÈëZžÐA_(°e"¶Â‡P}QšvdÛ~ñLÓ•I¸[ Fç¿QÚæ¿„#y¡yœ •SQÔõ&šÆ}>&xf#z­èÃ]ÓѶ̤2“[vËkc %HÚ uÏ5•ãÊ»›ìÊú”’6Ÿ"Eµ')òç×å>°½›Æ¤«å±.Ý«Øå·Š`C§QŒÖf…áË]æyâfg”çžÕ¥*¼±”{™T‚“O±SÅ^Ä1,΢HÎqžk7Y¿“ÁÚºB’~µ•{¨ê6_—ÊY<§m¬8"»?èQx‚ÄÚNqœ~àÕ[—•MèN÷q܃S°ƒÄžXçeS2¬{¤úlš…SMšõd¹ˆeîqíVn´{©t¤Ò`œ/’€,™äÕ‹ B—qß_HÓÜF'øT©ôèSŠÝîsz-ì÷E!º ²¡ÆHë]\úoÚ |°EpÞ%ñé>"–(í—hä6*Å§Ä |¿Þ[€qÁ­oìäýëhÌD½Ób? ‘u½ºÖº8´¸–/,ñ‘È5ÄEñ*MåÌz•þ# [a² ö Ñì_T ¥ö:‹} a¼•²;}*ÓÃm*‚=>•ǯÄdP{GÇMËÚ«_ø Jžt,B7f*}›] sovnÌñÅtà2ƒWôø–K䛨®Û]:†¥ÄÄÈĿֻËcäÆ#•2‹‹³ù–„¶Ö1GW&2EVêÙõ«HA‰ŒñEÇbf‘7zÔ/É•o¨5bß&2c› ÚÔ=F´)-ËÂÆ:†¢WÜNiÓ2\; àŠ« 29Œ‚;f‹»¥Í;6=I­5ÊÍfÛFQO­_,RØY¶Í,bêŒÅ¶Œâ¹µa> 1÷SÆ·õg"$SÐVVŸfËv±É­ééÎ:úÍ#JÊ ­wÁ'5e`ÅTºÉ'=*VåM{¤³0溯ZÎã>[pÃÓ5Î[¯ï®…cÉç#‘J¢Ôxg£Gø‚9íu¹›ißr·¨¯løyyuqáè¥1Žk“m2ËWu±½áÑ¿w ôô5éú•¾™§ÇmnGJèE8¥Õ 0ä“}fI‰R6Ÿj‚ÙdÜKç¯zGŒ˜€*279Fèk®îjž‚¶Xk>âWL3ZA€#ÔÔ+ÈÈëÇQDEÙêBŒ^g#åzþ˜u4n˜ùŽzËÄ~^ÕÀø¦?.ô¸9 ?*"ÜZ`ìÓ8u´èQGJÊÕ¬ÍÜj£ïƒò×Ip(ç Ywp“ÛÔr®ês×S’¤nO…bö f{9!"2¿0a]gŒüºžu¹Xn×§5Ià[¨®tô™£QpŸ+¶95ÙÝæHASƒë\uj5QÉhΨA8(½Qä>ðF«¢kiw:ˆppzŠõ]Ècܧ!ù pN=*­Òy´Ñgn2WÖ±«UÔw‘­8(®TeëÞ³ñMžÝá'î·¥sz/Ã-58®nn”¬O¸®ËD¼³½å·H8`}keàH#5TëN1åLU)GšíjHQJz\Äo \k6 =˜Ý49ùñ í.nµ´’œ£&¼ºÇâMÄ^"h.µ“¾ÐqÊÕRSræ‡B&ãnYu2¼1áëëm"úòâ'–2¡[Š¿ðëÄÎ÷¯¤Î£’J¸¯O¹Ž;ë'Œ`Ç*uõÍp>𤺊n¤š b`LmŒâ´u£5.}Ä©Ê-(ìoj¯"Ü:ì=Ae>$žzS¼J ºò®y5R1•FŒåOzÆAÕZèjê·¥m HØvâ¼Ã_³º¹™Ú& € ÷"½†µE×…´íÕL‘H™®#â0iM š„‰Æâ£µ`èÜ›»TÜb‘I {Vë G˜‡‰’Ÿ)î:7ˆ-µ= ê*ÔR\zNðïˆ!ñ SIo"Æûyï^s Xß·uà™X„Úk¢Ñ¤·ð„Å÷7œ•Ï$úW<éE]-îoɤÚÐìõy ÓìÚüÚ,ÒGÜ.Mqž*ñÅ„}í¬xŽR +ÒºŸ øžËÅ{I à¯Ú ñ/‡´ý~ÄY¾#u9R:Š•hÉ)ŽîQ÷woâ;Ÿÿj©T% äô5ÉxKY×S]<>Ò4mì·.>̼ÈÎzÖ¦–,åÓÔØ¢Çn~îÑŒŠ¢®’Üz;œ ‚-zLÉœçü¤A€8ωz›^øÀÇjß%¢÷ß¿ò¨4«¶¼Œ W/Þ»”i¦r*‰Í¢Ù Z¹mkÜŠ.í’æªEliVÆêÛJšU*Z7F”àÛÔ£ölŽð¤Ôm4æ*1]–Š gN Ö›ø~ìä†k™VwF³¦š±ÁøMÅÄ—’œkЃdÖe®“ýjÉõâ¥,ÎîåzŠU%í%ÌL"©«œdúR‡*j8‘7éQ·®@¬šÐÕ4Yßòõ§G!ÛŽÔÍ¿»ФJ›1èZS€1Y”köÕcÆ9­_»¶¨ßá¶“ô«‰-Ç*½º°9¸$Õ+™2¤ü¤ñZJ˜R +ê Å‚ãŠpcŒŠdêO"’KÓþÕ\ùÁ±÷‡J®ã‘!©íVmŸt¹è [1™jÒMÑùoþ±jmAü»4úÕ[Å0âxúŽ´ÝJežnɬ幼L­I¼Á ¸ë!ÉÕlªÆªƒ°ÅV´nïÚç9XþU«7`»¸«LÆqÖìiQU'NHíS«îÅFù8ôÕX®"Û‚h–;bU²Hèj7P±ÃÖ­yŠm=*[¹táÊŒ‹vg%²dÎsé]~‘¨•"xnÙï\öšø2·¥_Y7¢ËßSšWÔq^é{Æ·³Zh3MÀuæ^ñå힤‘]H^lÝ«ÓïXsDИ+¦G#µQ™@^KHÕ¶?¼8d9¬‹ýiÄä!àWL)Jö0•HÚçkàýA¬µGŒŸÝÉ×Ú½B{Å].IQÃmBÙàz&¦Æé89¯]Ó¦ó¬ü©8IõÍŠ…¥s§5$qðüV¸·½x¦µI#V#ޤW¢iZͧˆô¡sfÀg†CØ×‹x³ÁÚ†‘~óà Km!,q[ß /e‹Y–Ô–ëʰïWR7OšS«SÚrÈôkû¨46[‘©$æ¼¾ïâF§%ékyB <-z7Œ´Ùoô;˜ãÉp2¯–ÞHfhäR®§K NMÈxª“¹O}ð®¼|Q¢È’ç(Úø¯+Öü)ªXëO¶£¾Q”dêþÃp“\ÈêÂ6Éé^¥2«rÊ¢¡ÏØT|» GÚÁsšhqÝdL¨f¯¿C·£ÍLsڀᓠŠänì鶇›ø¯Zž×TKi´g§½`¾e’ dg¹_‰¶O‰t™'ùUχú”š†œÉ2±1ôc]|‹Ø©Dæs~ו}»ùp3¢¼ãÇ·× õÛ#tôèLÊ pk?Vðõ¾­´‹Ûn*(ÎÒMФoŽGá²ÝµÄ×'>I\sëWu;µºÕe‚㪚»mwmá…M4ü¬P¶}z×3u)Õo¿r{'úšèøê9=‰jÔÔä:Ö›Q$09ÕéN[N·3pÅ>µOIð~­4©ö¿õ}ë§Õt„†Ê(¢(0 &šQ½ÌãJQ÷Œù™2Š¥ —#C1ÞÀõ4è.TÌÈoCY8‡6¥»Ž3íY¬ÃÌî+Bio¨ª¬äãšIŽjã!‰Bî­Ëfù~cXpÂÞpcÒ´c›#´Ú[…9=™%â~ò7ÿj:îü¨Ô–Þ9áNHê4›ÌPÞ½«6n’¸ÈÜÆÅÔS£äæ¡™«Žã¥@¦PøÏABÔ‰>C@±hÎ:ÕuþÛ$T¶fVÈÆ*ĈÕ÷ Kø’fn³n%=땎ËhxÞ2Îsí]„Ìn™ÐzÖ#6ýE¢,O½ï[Ñ“JÇ&")»¢šK¼¤ …PzV®¨+dòÁ@ŠËÔ<˜îC@p¹æ¶®Û4r©ÙAU7LšI4Ñ¡¥ÄËcNj{§ò­Ý»ãŠ©¤¾ËÆì9¨u[ "Á<â¹¼BéSBÙ@!T•†NI5-áu\ÆØÇ&\ÇqòG(pAíT&» {ä³ð{ ÕE¶sÎJ1±_R…æ·IÊàZ±u:ý–;XºãŽÕZîgº›Ë*DQ1KcyÊ ~fµ¶šœ××CJÎ"‘¦[>õ±m 󂌔ÿ*ΘÁÆ(²r/—ë+žz³ºž‘H‚ÍJ^‡*÷‡ùÓ&U‡ÄJqÔÕ׌C.zÓ5xDsG8ðhOP’²6¤MñqU¤ŒtVîÝêK[Ö£wÞ¢¹rR¤·Jަ¯X•Õ<›Ü1>_|Twåe\޵^»ì§`ˆäŸJúÞ%f¥®c)ò­Mˆ]Vbàô«Rb\H¼äsX¨æ1!ÏÞàUë)¶[ùnyÍe²¹½Óv-Ú‚„íéÞ‰§Àî;Óa•c Œzò)¯3îëG@ê6Pn~ïD5_îFOj¹eòù‡1Æj´Š •؃ÁëI¤£qžf‹_êðMHÒƒQšª$YàcØ*8w* ß­$Êh˜+´wªó ˜EëÞ­@àÜûâ¡uhvcÐUÚÄ^ä¶j<·ÖÛbö)®y¨!œ$Œ;šÐ·pó%$9²Ü°Ô„gÿ×WäEy^µ“vÅup1ÎjÂI2ݪç+ÔзÑ\‘â-uš°†}iË4m0Óg+åSÐÕ¢Y^Y̼qVƒ³š¥v›Ñ\RBì!$ƒK¨úä€:°'åjˆ˜ÄR3AàUÚèÁÉÅ—'!— Õx_cçÖ£,ÅxéB†ÛØRE7v™£çî椋­R‡ äÕ‡|ÆHëEº–¥rPÅ“üG"ª\ä¦Á×5`¶6!ì)“ Jƒñ¥Ð}Jè·ËWâ¸VNzÒ²,±òUh¼…;MRDÜ|·™m€óV­ÔÜzšÆL—5°Ÿ*š&¸ù VÏ¥ÊoZd¿0ëM‚umÑg‘SÍ%±«øzÓÄ0³J™‹Óü=àk-7rÆF`ƒÛ5¯f+õ­´=)TœÒåOAÓQ½í©JÊÖ ðÆ:ð8¯7ø®·35°H™¡\ò:fºÛÏØZ뉧Hß¼cƒí[w±ØI ÅŒÆNFüb¦”¥JjMR*¤\nyÇÂÛ{讚@²ÇaØšõIíb-çûÁÒ°µ½jßÃZCOknŽ #~•Âé¿õ N(®P4R¸Pr3Zʯz‰FQ¤”.t¾#ðö«âKØmÄž]9~zÖΩu…ü8bK. ó=Ê~ýܳdw5Ñ[ø}â•0}Ew+£Ø¶5P{â´aÒ¢DÈ?JÖx‰IèDh¦ieܬ°y‹ß"¬jq>™jZÒÙ¸€+¨Y!´c w«±ÉoqX~u…Ýõ6½º×…n.õvk˜ kÐ]?Žœbš^;xΪN+šÕ|V–nT|Û~ðöªK™èD™©vª­X’1‚è‚2 ^S‹PÓ’êÒ«^ðî;Ö‘Ñ™KTVIÎ+ªÝ+JÚ"«ŒÖfwÁ¸EjZLŸf\œµ6ˆ„µ,¶N(,¤)¨Êo!ä8Z_/8#¥fâmtXûçJ¯yKbXf¬ÄÓ— ñO”Y«~-qÒ¦§õGDê¸É6´>€”©ê9¬›Ï hºŒÿižÅ ÈjÝüwÖPÝÆFÉ75Ÿ¨xËLÒœG4à7Lkž<ÊVFÍ&µ6-,m´è„vÑ,h;ŠåTMìpµ›¥k¶ZÔLö’«ã¨®/ÇÞ'ºÓØiöçc0É#Òª0”çËÔR’Œy™Ý‰ ¹RÐ:¸ïƒR‹qœw¯ð‡‰îôýj8啚 ›k+סx¿ÄÍ£éãÈ8–AÆj§‡”&£Ü!Z3‡1¥â(jº[¢¨f#5Îø3N¸Ó­§YhÏB)žñlú£IcxàÉœ¡=ý«±¼Ä03€:€)IΕé±ÅB¢æFiœdñR\\›}9Ý¿€(ˆ¤È$ŒåOJ‡W‰æÓä.1DØÎ¢r•ë¾¶KMÚ*€­vÕœ\TbsQŒ¢Ü¤\(aF3YÚ• º·%NUûëˆà¤$ë͵Ï¥Ë$?>+‘')rÅ-¥¶K}l'Î>Yõª1 –b‡b£ÒwQYíå¼¶D„¡åˆ«/¨ÆÐªwg½=®nbd„*°5²ÂÆuƉ!ûÄsY––ò *²a³s[ÒIöa7op9ïNZh‰¦¹ÕÙFf1>lf£´}âIíŠs÷› ¦+à™W­(îT¾8ñ-Ð|ð8¥šP2½yíU옱Æ{óMº‘’FZ®¦Mû—4ƒ«Ûã*¼³ª!Œ“QZ8+É©&·3©˜` 8È¥%fT%Í—$°^•,*Û;šrÚ”zb¬4^ZäÑ= '{‘ƸëR”ÈÃ<ŽqL‹O`c•Xw¬RwD‚29Ôfi•BjÊÀg¡¨— q‘Ð R4Š%•@mâ«É!i×¾L%óô¬ø[r}¨µÁ»‚]¨8¨&.êsÞŒîQŽió‘Œu5I'¡^Ö,1Á«Ä685Z׎}jë¨Ç­ „V„Üvæ™D9~„T©/žÂÌØãT=¢Ô‘g DÆ:ûUé˜L‘òúW5yt­Ä[°ùÀ©ü?©ªØ<rbÅ'®iN7WI)rž!©Ï=ç‰n$9óLÄ]O5k”ƒO²ó¤GHeºË‡±Çâ¹5 €klïQþÕTñ€îõyníœym€ÃÐWg·¦åìŽwF¢Œ­»à«fñƒäµºf;[åby­ü9·Óu?¶ÝËæ„9}+¦Ð´˜´=.8GÜ1ÇSZ~b ½Iô®9Vw—.ÌéTÕ—6è­¬[é¥! ZYz©!/–~­Ö¦¸°í†òA¹”ajœ’)çšž…i} O]é¾$’ÏÌ%Lsé^£ål’Fþ$ÍyÍþ„o"Öd”«• à‚kKñÍŒÄ;3Оµ·ã]ƆH”ȇ¸®"=îIV1’O¥tQ…)CÞ1©*ª~îÇ«ÛëÛzqxÜG"¼ëÄv×iyµV@Ç€ z¯…4uÓ´˜ÑÐoÇ9­yôÛIÈi F#¡"°§?g+£j‘S\¬ó¯Y^Xèr5È*þPÕ¿4ñ˜vr+SR¶S Æ¿ •¸¸ò­S—6¦\¶ÑVFæ ¸*ÞœÀMå°&¦¼·EÎ\{âª,žYYTQ} íË#ju$V"\FéT<âÑëÇJr]¶0k7±Ðš56{Õ©ÈÎMÅ“•Fé<Ô#¡¤¢½Œ‚9äøªÜ RicÍgéَ턼zf´÷O"Ž‹JC§°’œ¯&ªó‘Š»qÇF¨R,7ÒŽ…X¥ñ~äŽÕoí)½C¹½‘1Š.^ƒšM^†„ʽë*ãÌûNäb®Ø3Í=W(MÓi¡>„Q8\îíYÐÊg½šâCÂðµgQ³ÚÈéàU?$Á¦£œ“!¤¶)üHس¤o´(‘Bºã®{U›[|Aw LòÌö5 ±nÅyƒw°Ç^7ÌÅI­¶Ž6“Ââ±µ’Úpè~_J¾„h˜÷“ìÿ¼“ÛÖ©™ñ0–u!ÝZ²#b<÷<À>µ=¡”µÅÂÇîJ¥dCNE‹+G¼´’cò砨̈́qŸ˜ûÕûyIF¼PNrsž*|ÑK³,ZãҞȭà ÒÛðƒéLóUœÉ¤€óè÷z]újÖLåÉÇjõ/êRÞhVÓÊ>vNk&ü a"‚¾†PKU츱ô­eRé.ÄF¶Rºøƒ§ˆ$Ó®â*°»›i–âÝ$ŒîVWšx÷²_ãTÓ“|ƒ—Uêk¡ø{|÷:‚mÂXN­hãE$Eß3LµsâÛ;cì7,‰àšÁñ~—™o¡Pc”sZçþ%iw6Ú¼P|¶þ!Ú·|{ý½¡IavK² hp´ÓÎóåhåR=›¶®AqȾõ·©iòY]<.AëëY‚™ÇJ#+êmkhiøSR’ZÊVÊŸ»šÚñ‡íõû=’¨ÇÊH:Šó+½B{ô’ FQ^© j©«iÈàüàa…*ð”©(J2n · Ù›-+“Ì(¼ñ¯³Ã®\DÙáZö¿0ZÍ»øéXž'ðU¯‰c2ÃuÙ»œ=UóK©Ué¹Så‰ç^ÕæÓõ¨<·;‚²ö"º‰ú|âî+åVØË×Ò¥Ð~ßÚê‘\\ÜÆ#Â÷¯R¼Òí/ìþÏstÆkjµ¢ª)ÄÊ):N>pÒciõr#g;Ç Ö½Gâ&žfðœ7+y…ËwÞº« húDþu­°V?ÅéZ7Cwk-¼è)©TUÄ©MIt*X8¾§€ø6æx¼AlÑòwµôȳ[€ÊFWšóm3ÁqèÞ$i‰ˆ6ø¾•èËržVY¸³ÅUI'L=)S…¤eXY}“̈SvEZt w늭¹§ÜÞ5ª\*Î8(jÍÁK ‰ÚMaªÔ©+²hÀмb™¨ë¶Ú\q+°Ãð*+É<¨Ï ¯+ñ~­<óyç÷oÇÐÿú«®œyÝŽj“äW;x–9¼>Æ)GÏÆA¯¼¹’[—,rA®í4닟 «8'ž=«ŽÔt››w blž¼WNF7WÔËÏ$´ îxµksù· {׺ÀªaGeùŠó^Uà M©jqÉ,L!S»u{Å¿‘…_»Œf³ÅM6’/ •ÙÍß[7šÎ‹ïŠbÜFðmR7 lI´Í÷@®Rõ’ÎÿÌ‹-ž@íY/{AN<Žåè›!W<Ôûœ1`ù}ª8Ê,‹"6AëW6«óŽ´¬Ð&¤TŠÖ ЇLéRáƈZ) ã´ùÂAvµlŠ´C½O Bœ[³9{›{«(É·ço—¥hi4m¬¥€â¶o­cš"sŽ•Ê^Ùˆ7Knå${ÜU'Í£&qör¼I¾Ñ(ÔL„îE;x«±1'?êñóYðj1GE0òß '½h¤ßhµxÎ ÎÚ³3½Ê6ÐÛÉzä¨òú­Vx<­Z7¹ûŽpô«V± Rðܱ¾ëÕÏö«ø£a„Œà7­R}Iò5µ-.·ÚĨ:œV,dÄ$†à~jÖšK˜wÛž&}+'xÈ“‚§Ú¦ ²êÙ;¢˜#AAéZQß[ÜGå6®>ZÅ—2µ¤)SÉ­7ÃÓL™í+÷Z´’ÔΚ“zXÙÏ7Ú-æºô¬ ••&+·k†ÁÐ-ÅÞ“~ÈÀÊ;°«_ëO Ø ð)C¹SZ[©Ñé÷O†e!ÇÕ;“T;OÝô¬©¬¦Ø0~NF*Æ—$¦áZO•›®k;'©¢”•¢ÍçòØIÈÇÔ:$ŠºŠ¶>ñëWuO±±$Z¯h±ÿ£ºŽK b£¡¥½ôhA2­ÕÓ6-LÕ_HbOÖUû´7W±á²R;Ëq¡6ðGÏÒ¢Ú#^}Ñ»™#·N‹‘×½]Õ–8®7<  ý*½³#=¢c•5WUŠ[Ûé]á¯Òµ²æ0M¨] ¸¬;ñóö´´¨`-·úÖUªË1+· Òº;(åX’Jʦ‡E u $–iŒ†³Ø $+ÜU»XB«»îŒT‰‹q“Y£wª&_ôx±ÔŠpuyTšXðñ±$d ªÒbU {Ð ˆãX¥óHùT~uŸªD÷”}ÓÒ¤Ôoqd1œu5AoŒ*g8äôV¢yrÃ{Èù¹¤šrÐã ‘RÝ&ç¶=p•BXJ0vÎ JŽ…sjh[¾Û}ÙÏ9§Åvf›nj‚¹[Vç¦i23Ýà÷«¶†N^õ‘ªîU9ïWЀäŒ3YW fr C$n:ƒŒSbY–`£ž”×#m¬q¸b´ÌiŒñë\þ£+´‹ÏÝnÕŸ5™¢WEtSoxØ<1¢ðdžy«’[4¨’¦+6î]„—â´[™I.AÖnI+Ԋ׺°ÀêNkNe—PqÐV”²‘ ÷èiOqQV†¢Ç.æÁ8>´·'ä韥S„—$÷¦— tªh•˜¶ÀzqOº8AŽÂ *Q2§µ!2H sïG]Ed£¡§jZÞ¢‘NçíÆ*Í¢í´éÐVUÌ×M)—æ8Ç¥ljJ:2Ô*OSŠÍw̬sŒµj³,p1ÇjÊ+ w9¢"«ÐØ·ÆUyw¼½N=(;ã€ÝEX´Bãsri€Õ]‘ž1NŽFãé>fÚOož”ž†ˆy8ŒTãeò{ÕÙSŒÖG#ùŒIä㘑“® ¢Óe¼ƒæuœ3c©^k;WI®t˜®¡,„"ãÖº­&1(Ôf×…çÚÿ(Ϩ§‡•VÚ6hÓJýOcñÞ¹6‰¡<¶ùó¤;Tá®#Àú¦£âHä’i%ER\±$+¹}9|U¡Û ¾¬ZÚ‡ì´ S´#q<¶9¢Œi¸ÛPœdæ¥} —Òe0>謻 )B¼×Õ.|‰ƒ·ïb¹÷-#à®G­FÃHÖ°dkØ\¨,8º q¾¸›‹ã§ÛŒsÎ+WÞ"ƒ[N÷€r¦ªÎ×jö7]â2¬†«¦j¬aPÃÚ®¬{zw¡²E+i¨_°Ô\ Å9†E7'ÆsÔ¶ ÌíY¼»f'“Ú±­¥Ý ¼VŽ«!xÇñVr Ù^‚´OBm© Öãjê‡ öª¶ù°´m‚ËëVÄló”_»OŠÙb¹ pMRzΕÊèÒåçŠÑ‚ã5Rx|™„…¸ÍjZ:JÒ L¶˜ÙÛË çÕrùlUËÈÃ¥UÙÆit4)Éw-ŒR@ïo­K‡*ËÁ©6ûJ6qÍ6h󫣞»x4=bOÚÐИ“ƒÚ RAÉ¥¼¸(ñ`|¹Á« éžÆ”Ñrv2£•ZùÊÆrÌe 2%Eº‘ç4÷R³'­SFq“m>àƒÊ8ëRÚüåäÎriššbÕ\äàÑbË;ºƒÍE¬hÙ¬fiâ;œš°ð4ðà i±•¹ÕoáA€kSM…¦fs÷Iâ›Z^¬ŒwŠ§Ò¤whóEÄ[/Á=ª­Óˆ¯ÑÇÝÏ5šÜÑì)’(£LÀ(„Ãí÷fLéšžíäÔ'’°'oZ‰¤H- 8ïb®ÆWî8)¹vªõ«²1X7/jxD†ˆ0qÍRyHVCëCؤËqŒyqTžGÞF8Ÿy:D!*~lp*ÄÂF‘ùÏAIlL÷5à}°î>•VËîç©s[äÕ[bû¤Ö¡7sKh[¹]çÔSÙ<³¸b¤9<ÒÊF=iÊû‘-W{kó§Ýƒþ­qé],VÖó5ÌŸïc½q·vbmŽlˆÛ•½+¨Òï ¶ád9p0j¢Ç%Ô~±¥[jÖomr¡•‡‰áo `\LÉ&èß ô®Šë’²GÉSÈ©ã“(¬;Õ©=‰kK˜ºÆ‘ñ;— ٫ϵM:[)Ú9W‡Ö½uÀnÕƒ¯iQßÛ‘FA©Ö.踾efxýÌPç÷Š?›M½ŸH½I­Û01ù”T^$µ–8äE:ÖV‹zòÆa›ª÷5èEsÂç$åiòž½Ò^[oj–‡«Éö¹´ëµòî#$¦zH½ˆ¬=W@>Í+€GJÛ’Þ;‰ã™Æ]QÇW›(û98ÉP|ËC­…ÁP@æ¤7 ÁCŠÉ´»%pHÚ8$ö«ëu !LÈIìTkпRÉ™$iÆzQ?Ì6œçµLªƒùqL¹‘"MÎá©8¥¨ôègêV-ul -²xùV®[ZÔõ -*th1(žÕÚÅ4s.ä`}ÁëY÷‘[_¬¶ÒílŒBÒI²Ó¼Z>y]FäÞùí!îÎAé^áÿßMo¾ ¥‘ˆ1ËXWß®âÕ[É; -}zNŸáÛ[}+rˆϽzŠÔå–§#&ä[¸Q4*z†ÃÝx{íZ³IŽ73]Ê©ŽßË9ù;Ô1B­>áÔW5*= œÜ»ltÿ(  &±®,t©¯¼‹“{{ñZ·º¢ÚiÓ#r¦kÃ5/\O#9ƽo .nè‰×äVgкV™kcl¢Þ5zµ5Ì ,mÆ3ë\§ÃzMKLh. 2EОâºBê8™ÎÐ;ÖS‹‹³5‹æØænâ;¤Žk0ZƃnÀ~µ½âàWAW†©´Ë¨u[%ž ±Œô5\²Q¹„¥f2m/÷GÉm¬y¨ ²ÚíYùˆVÄ,Î…d2úw¤hRu;†GB .w°åA=QR ˆ®ÔÀ¯½:Òù`»6øã±íU®ôwXÌ–¤©àµö‰.?vÿº–?Ã5QWØÂr”7; $W_¼+Ö­\¯l70<Šm­Ûºf8éšÔWY±UÉcÔÒÖ.å)*ŠÇ9µ^ÊäX]4R‚Uµ›MÔ…É$$Ðt«·â+¨b¹R25ÑÓÉœÍ?š/¼ùŒS|ªíƘ‘zÃxاƒPÂÑLªŒ3Õn qqpVaò³`vQІîÎNšâcÃg©®cSìu0®sš×°µ’ÏSkhÛ÷'I¨|Gi&íçëYCÝ™¼ß53ÎÙ#½ÞíÁ9c^… +ÂŒ‡+ޝ>µB ù¸&ºÏ^Çql ÈXÁÉ«¬®®Ni;2¾¡v°½Ð,ƒYvÓ,­ ê*׈Õ^ùü±¹Ó¸¬[c-î&o?JPº*’÷δ\5½§›³ Ž•œŒæ@\2±äÒ¬ÝL^Ò?,~ìÒj2yºzyd¼{Ô¤TÊz”· jc‹?1Á4ýéÓQKI2HÆ Ry¦º ex©-£}7S‚N_~jšJ-MÞi›³F«¯NÓÀà¨=¸«Ï >›;ùsšÎ¾&]`p¥A$U¨!s¦Ü¡c´ò{W=´»:ÓÕÅú4ms«–wÝçv©µ 0BûIs’>µk@°XR{…?(°¤»w™Ó?(n¿[÷¥tg¤ “ê\‡}´€6w°ã5·¥;ÛC3NÜv&²µBÿè²B»›ËëVŒRI¡0šL3žÕÕ\Òšå•‹Ð…˜ö&³®¦ÜòmÅ[iq’yÍgØÏO.yÎjboSMm®¤Ë\•¦ÖêÐ7cYw 11' NE\äH7oZznMÞ¼é£E ËõNÅVf1Îx©Û÷ÌÅÇÛ6T¼N1ób¥ì8½KšŠ²H€º¢–dW°Vã4š»Ò<Š‚Êo>-¨èWR»ÁC÷H¦Ù)‚V`:U¢»' G¥\Á­¼Ì`æšzãï”K–rïÔô­=7ÆÌx¥TžÝð {ÔpÝ4-åŽI<ŠèJÍŸ9ÝJóòŒV-ÖíÄžk¡+·r:V\ñ*—Wõ©ÐÕ1‘]0¢³õhÅËþïïji#òÐx5B~`Üf­iª2z¦™sM­í—xñI+‰JzÎJmPKtU4g>qÚw*˜êî9Ù$‘}"U^;ŠGaž•6 š`œ)¨§$Ž›ªí©•í’á séQ‡U cŠF@¨Ém¢©"'RÖ7¼ýº|§óYÎ#’5ÕÆ'û%Ǩ¬ô@®­“Sö4žÉ—.Øù[sÖ£…dÒI ’hcìM]–Ücr`šhoUr)ó„g¥iåÅ•ïXwM"²#­_µ¦‡I«¦žƒ‘¿~3øšÔV8¬'s À†´’\C’{R¹;L6¬ùYRÁ±¤3²`ñŠ©~̺Æ*’бoI‡›v¢äÖì³D‘3±oRkŽ‹P:l–É#c{¦ñ½ãÚxræ@Ø,01ïYr·$»šÅ®W&[ñ _Û~¹¶³pÎÊqƒ^M£x#W¹ÕcŽ[fŽ%o™Èã³àmfIˆ´y\¾xç­zÒ²El:޵¼ªOx#Bí'Ðv VP%¼g;Þjì× onò¹ùQK°­‘­ä–òê\D£8ªú~¹Š~Õmn¤F§ioQ\”îõ±ÕQ$ír…Ä·:t—r’MÄÌÊ=AüªÊ̲ ‹Ã޵^k›|xT„ìùÕ5gIÃÞºÏͨýh—Ó.ì9¬o†‘Êu\±F+ª¹Š;ÛVP0Xa«OÂþƒH·cü´­9Ô`ãÜÏ•¹ó·˜€S ì8=j«ÞGo>Çp*–|:œŠÅù¢PAúR:exá…ã¥5Ï74%Ü05/š@3ÐýÚÅ–âh.6²ðkWq–2Ç­aL· ƒÀ«µ‰nè¹bÊÀ¿zW-òƒÞ£H¶”àÔ 'ÚûŽ´å¡¥wË j§§·“hòqÖ¯G‡‹ªÚ2ÃrñÖ™>f‚H'Œ9¦ɦH6Þ½;Ò¬Ø`Ô”U½AÁ Oœ¶Âvñ¶Ÿ|Š!œsT¥º+u=1BØOF^¹‡Í¶r¿yy§éwÉqlCpWƒšŠ Ì—á†+2æÝìnd •©GI7î—ßÊWyW&¢¸™ éŒTV± -›æÜ ÍR,âì!ìjÞÆkrî©>ë&QÓk=%hìyl u©u« õª¬Ë*C)n™¥k­BUedi[Aåéûó†zÛÓˆŠ$Jço.$Ž]»@éW´k·¸3¶‰+ Œ“—)%õÿú{‚¸Dêj8f]Fñ ¯îÇSYºÙ]EmÝxväŠÓk»m>0cå±À¯sE5ª+ê³ùr˜!7µCmÙ—~~sÔš’Ø–2\̇{tÏj¯utË€Wգ驢“ïSº¨\ÞÅ (§{žÕR{é„[Uvæ¤Zzdd°ïE¬®Ä¦Ü’-Ú+Ý2Ë"p:Wï3ƒ´zÔæ¡ö€0;V\—B(˜ã•©™´ýÛ\ÝM‰f1Yð¹YdïPX^5Þ•¿¸j´Ñùe›®EdÛ¹®œ¢5Ö$UQœðkE-·Ãòò}ë:©|u5»e"¼[OQT•÷"öØÊ1ŽUºô¦$íhÌëÎÑ“Vïáòæ,:75Ÿ!,ÁqÁ4š±iÝ…~º‘—E\É}§¡®sCž-&È,îçµRñ¦±#h‚÷K¹FÉ+éW{X—»;läf¹ïê§é¯: ŠÈм\ú†Zé†&yõ‰mâ›oE>™y…”åV«‘·ªÛrSJÞf\WqxŠ0>Ð:¯­c>›öWf †î*ö¢ßh>(H™”Í•nÄWUâmj}®5á‡Ìtsªr´^ŒžW8ÞKSÈ¥Ôn-µ ÊHÚkÔ¼-«¦¥f¢N$s\é‹=îò8µíwX²¼Gn=+\DcR6êaF3„›{Ö£¯o*ÚɲR§ä×ÚÆŸ¨2O<±È­Ç&½JæšÕz÷ª·Ú}ž¯ K˜^õÉB¢¤Ú’6«NSK•‹à\ê/ö+Ùw¸+¦—↯5­´VðH~~N"®xWÂvlßj†C掀ö«~(ð”~""M“§Ý£šŸ¶R[Ë?efõ8߇ž"¹:ا²·ÝÜy«úìºoŽØ4„Âä›áïë6šä3NаÄÿxH©|wá+ѨÿiZ¦øú0Eo/dêù4gUSóG£[š êAÈàÔñIƒ°òEdøkÎ °¸R%3RkZŠiv&éÁ*½‡Zó¥zÈíZ­K—-N7ŒT!—lÌ;Ž+”Öõ‰u&;3p‘N}Å[ðþ§u{7±”™x$Œn­}›K˜Æ[ØwˆL¯á˳iã¯g7ÛUIÃf½Úá#¹ŠEàä`Ö%†­WSYØ ÇºèVQNçZ.R5<lÙ¤ê»I^j—ŠüL#¹’Àôn‡Ò»[K8,ìÊÆ¡TŽÕáú¼ò\xšUs®@Í*pö“Ôº“öpз­Ê?±×œ–©þØÞ5éxËH9犧¯¶Æ:·A^ƒà =tíM9 æ óÚ·œ”iô¢å;—îc1•óÎj£™íçW#r?¥M­‹¶q-¢ùÑç•Å/q ïFŒÿt× ÜïrÁŸjò+ÖíLÄKnv¸äã½iMæ§ÈGÒšm“šq›‹¹5!ϳ\J8~„{ÖݵüÑÁWñ<5V»Ós,»xÏAVîÊ40«àu¿ÕV_·oc€x§|cކÍfÕ˜FòEʥϚ€•ÇZ’öQ"Å.v•p3RHSb ¸j½âD–qòypqøÒwl¨4™»©.<¨áRd’1–ô«°’š-ÀÈù(‘”}ŽEB[Ê Im¤ß<ßqù¬žÖ:­i6;I‘@ºrI* q¬$rJ¡`Ç ëü<Ö—yaZæ›dVÆ tÚM£*·²fåÖSI²$|åv‘O¾™`ÒmÁÏ'?ZŽVÛ¢ZHÜüø5jöËoýÕ\óX»#¥&îÑ\ÈfóÔv¬9/™y‘]1l–lµ xÄžù¥N[£J±½™y¡ÞÄÞ3OžäK(Q3SùÊØ ~aªHn¦‹ë`µ•˶3E‚¤÷ˆb(™OÌÓÍC¤uûóJKAÂWln ²É©J„ü™«¶6Û¹?-7TeK½Ã¹æ’‘ìË/LñNÂm$Ù<¤$ÍŸÀÕØÜ&œúÖmÎf‰<äf§‘ñf±žÔ8ë¡1©urýæß²,«ÎEgE4Š[©«¶ì³iÅ äT-±DÃéD·[hÙŒlœã¦+T™Lä3Þ¶ í„Ê}+‹ÔîY®K©ïDcv*“qѨÃÌ·Ul2©µ6 ©Øn1©àFš~¦›ÐQ—0ë1‹„b~j»‘ò®%~ìqU!\^Âs[R–®8åMìZWÜÎÒÊ’w†« ˜'Ö¬Y¹·ÓŒUm¸Éqw0©¥‘riG“€+:(Él·­Eq}å0Rx&ö°TšÑ# ´ÙºJ}—gªóX“\0(è*Ô23¼ÊͱÒÊ Þ¦;³jº¥aR'’ícj¦jSrá¶·.Ÿ…‰ó×Ö«]ߎ(ÑhNP8˳nª‹òñP ,âîŒnÎEC¹´b‚óæ'Žiöä´AZ¡{¸¶å3Rª+/#¨4D%¾ƒç¶1À ÛÅH§Ïy˜6êXR_…k›d^üÑä5g©Ìø²Cþ—m’ZPÇ‚ºOi ­øm ‹>nÀWÜÖ^¿0Ùɪ¸%í—÷SZ~ÔçÕ¼:·X.\Œþ5SºŠœz,Û‹êqÞð­íž®÷‘DàgÖ½6TW@jo•ŸY÷ú•¥¬ë J¢CÛ<Ö*J¬®ÍiÂ4Õ¢Tñ3;hsÃeÆÐ/´Ðt3 O6Xûfµ`1O±ºæ´äÂÀßJp“Qå&i7s‡ŸLÙ;HŸt’Nj9m™@(?[ñì}êH95Ÿp¦xûµ¯6†R§©N+¹#TŒ+pEw:t…¬Õˆ ã6#É’;äbº½)ËÙàvâ“bж‡­êúÔˆ­À=+£ðÝ̯nÁØ;×)®XNž"fJ?µv~µ0ÚíaŒÓ•¬¬5u'}ŠÚ¾»ö"Ã<޵CÃþ%{û·úgå4x¯K‘‘¦Eϫ𴋩üÊTƒT¢¹n÷ ËšÝãXÚꡇ>µÍ,l.q“ŽÕÐj­óª“ž9¬›¡±Eè"KK“¬r“Á¥¹¤j óëI¥*®0jåÛ…Jô¥bîš*ÛÜmù_½EtþLé"ÓÚ0ÁHëU.]üÀÀ !ÊÈÔoP3ÔsUC<€£*Æ›nÅ€ÁéV¦Œ´AתóJÚ—{Æãõ}™I¬ûÕâ&^¢­\OçZ* ÏJt±äŸqEµ ÑIå!<èó½:Þ®\J·ÚI”›ÕY¢6÷CÕ9¶"Ùãù¡«;>eb¥œè–áW¨ªÜ´=3O1¤Ú«J™›h÷5­®sJmjLò³J~âŽ*Þˆæ4 2Œ„ÕD–X¢P@-ÍjL‰’…çŽÕOd‘+w&V×.¾Õ*CÎ:â·ôÖÖÔb3X}´hÍ,‡æ'ŠØ[á4Š‘ •S7¥‘¥$›æfʼúìÓËÊ!;E_´³óŸÏœÏÓd‰ç½iqµ“P5ô÷× B‡½io–“6®.Q! no¥dÍ&ÃæÍƒþÍ\k˜­ì™òzžõRÊÕµ lùKÒ’AQëdWˆ¥ýÖùtµiÇz‡ŒPI§¬-•Ž‚ŸhJÌp*&Ý©¤ ¤Ù î^s³Û¼±íSZײbjŒr$玕Ý‹©"Öƒj©i$@äšÐh÷d ƒMÄLQG©­QƒCø+FÂÃîÆ)!sÇŽµh‘c=ª¦ån3ÍQ(Ké÷`U;5»y%âüœrk2ÊèÇrÀŒM|ZìèQñ´s9£µ±…ïMøsói÷×ñ7—Ø0­Ù’å€A= uVâ*äv­9ý× ¨Ùó\Á‹IÒíb’ÎXÄW¥qóü:’ z+Ë&Ä[÷75³ã{k¨o-/-Y”‡±é]=„Žm#.Ù%EB”¡ª{š¸¦“d‹a ÁœŸ}HŒŒ25®…ɪwP‰ìVM•Îÿ@Ecöln=«{7·%S¸z×¢Cj É' ¬¿éË4I$|8ã½:u¤™¬£aéL$àÖû7–wŽâ›¦éâŠGnkRò,@p1Šªšêa­ŠpJñIæG˪;ÖÖ™«ØêÞT%C†WàƒX²bqžõyôË7‘¤xÊ´ƒid85 +6¯c¤‚¤†ÜG¥ë$|¨9ê sšF™ªi·oÜyöMÊn?2ÖšÜ*NÈIühkQX²*avÕ}GOQ´x$« Tvúµ“êm§™qqŒžµ‘â/ÅáýF8eRc~ãµ oDÉjØ–º5¾c+¡ÜªKsSÙj~»b©*÷Æ1Víæ¶×´²êCG*àó\pÑn¼2.–#¸Kþ¬ç¥RIß™êSmè‘ÐB†"ImÃ=A«lª pËχá=?WT—íß4.rEm˜Í›–ÁÁíTÒ‹²fZÛThÙ_™#{iQòšó[ÝãþI‹!ÎsÓ­wë4|ÖµÚ®|»£xûÖ°›‹º1”T•™ÉiþMBþr¹p}jŸµy´c©Ø¸ÀÅwÎ>Ï’µs¾)ð·ü$ ÌGkŒn´FiÍs‡³´=Àø©}»NÄû·Žç¡«Þ#ñ›¥¦'ÆþÀTéËá¬L7¸gÖ¼oÄÚÜú¥é2d$bµ§MT“¶Æu¦áúõ‡Œl5;–F3ÑI®¦Þh$~uÉýkÀ-¤ *ä‘Ïc^‰m´ýLQ;ΫJ¸eöLiâZ~ñèwi,Gú×/|¦Öðó/z²ø…p%EÚx§Ýêk|RO<çsQ‹Ô*ÖŒ–„º¹ÒÇ qµºzV®6ºK ÜO$ŠÑ›Mqr"¹Ÿ0²åXµhÚA¦ÿeÉ4fT=IäÖ÷äW9’»±‡a©neLlêkq§ûFÅŒ…‡zÔáøfÓ¤š,aÀ•jE´i?4GœÒ¼gª EÅÙšfÓb4Œùu÷¦À¡"y¤%H9w¦Ïúa‘q’½OzǬ$GL0:ÔFá-Š×“³Ë"täH{U¿²Ú;§˜K•9ÇjŽÃý*ÊHr¼v"²îµ%‚EŽ"Ä)ÊÖÍ»"±£œ³ïܾè§ÝEÎ’Hø¸Y]C-¢4JÛøÊG ʹVjÏíûAr“Jþbm‹¢}+BúhRÊ`BŽêŒQ¾£'•{{â´ç±ŒYä• ßÖ‰ZãìR’[É£ˆ¢l¶jH,]îa¹rHã°«7s, TÊŽ5”á®"eÝ‘òЉ7m ‚÷‘Öj×ͤÙÛˆ Y öª6n÷Ú]åÃnÁ_»LñzÈÖ¶{\€j]5·‡å.ÌI8æ¹´å¹Ý¼Ú,ø?þAsd`¹#¹)’D¿˜9ÀWlÆ»!lbN›‰8¬_ØEëL/ßÒª÷ɯqX“ÃñåºKšvµ8H’o™”séF›ûÝS¨”dÖv»Ó\Ž3µFB4ì\äãNèÕšåBôaÍVºµQ#àf­iòî!»ôªZ¬ûÇCÁ–æ·W°-$—í¬ÇF]æªÛ>Øn¤^»EY‘žK ê¿2Ž•I]²$ÚH~§>-ÎÎwqNÑmLLŽyb ÏáYöŽn‘•óžÂµlâ‘‘—c4¤úž‰•/É–ão\sV¡pš^Ü`ƒM“h}ØçÓw«Ú8^ Ó{™s;ÛɲܨÜj¯šLm‘ÔÓŠD¹ê;Tâ0ÜôÈÍQ~ë!µ¸q#(9ÏjÔ…‹XõV¬ˆ?wv¹5°Ÿ:Ïî¹3]JÃͽuܽ @:Šæ®ìA›èk¢S·NW?ݬVc1$#±¥Dïb®óæ,`| V­™Å¼…WŒsYwŠa¹‹#µli‘™,¦ u©©¢›·b(X AŽâ´õ%1£ÀšÃ‚mÚ˜ÆN­½R`nç‘jY¬^¬Î0ir“üoYìÅpBçš³9tV$ÓmöȃŒ{VÒ79ê®iØÍžÑ¤“çHíUÊùwQ®âFq]ꩺaŽMd›}×»€À\š¸Ë¹”©ÙÙ6£ýöã×ø dR“oëVˆX´mÙI5¡ãŽ)EêÍ*&’/ÛÌ6®*ËÄ$äVT€Á8æµ-d%¶ž”ÞqÙØ»qL•=êÝÄ9pªi&ÀʦÖ4ÝØË¹gŒò–æ´EÊ Ù‘ÇJÈÕf)*&‡U"Ø“ «7©ª:ã‹hVÒÀeÇ•‹¦ÿeøzP˵§rÇó¬R‹W.M§bèe ­uëÍ6âà1òÏ>õM!Ý“ŠŠäo}éÙ9I–R@e7#­iÚköúdñÛÎÿë¬(Wbcóç|LY¯-Ù\ä Ö‚›±›¨ã¹ìokmvË0PÇ…_)ö€+7“<Ú,BIÛŽkJè”`¡1Óij.A³Íœa¥XÕO­hDÛ”T7± b(z´¬4ìrw·ŽóüØ#=ª9.|Ø àqO¸hé£8ùjŽ #%­R9¥-Ĉ#(vQåWã%«¶TýÚç^øÚŸ³»=ëVÚ妅W¸¡¦(MñQI”¹§1,¿7çO71ç4X«Ü«hÌ“ùmÀ­G”F…{Ö²nÕÖR@Áb'ó­ƒ7$u¥(ŽèÊ pÃPòʃšÛº˜âe<ƒÚ°ãEmL7j¿!!ÂNsRì8^ÍŽÔe2#¨4†ð ¡Œ>IÔ7êâ.+MiZùƒ©Àèhq¼IU\jXÕ½‰ÅÉî RŽî6¡ÇÌhË+d’2qYb0—¢b=Å8m¨ª¯{BîùÔí'­On$,J}Ó,’ªíù;ÓÙ˜þî)Å‘8õDQÊŽáߊµ£³ÿl•Qû¶Ö`‘å˜pv©©®oÞ ˆc³\JÜQ8Ü)JÌŸÄz‰‚ñì`i:°íOÓÃý‹É@QËOìÆŠàÏxÁ¤q’OjmÍñˆ*B¼1Æj.¹lù_5ØCk-Ìåå3ËÛ–ÑB*c•6 ›MØÇ¨%ëòŠŽchÂŬùª öªRÄÌ^*ë>ÅÅCs̓ªç-JN襣(\–ÑXô5Q#`@íVàVk`Ž2¢Q6Ì~nxÅlã ­”e>}v1ïô}rqu{-Ó*6xê¥'Œ"›ÄpŨÚ+;  ,cª0ë^•.Û+àÄ~â~z«ká¸ì5i®í›÷3Œ¼g¦jaˆÙ½Ñr¡uÑ™ž ³{=#0esÍaøßÅ2ÛÏ„AwŸ0ö®‡Äºô¶†wpW=c¢CâØÓR¸C Ǹ¥ s{Z‹CI'nH=N£Â÷ÿkÓÝ÷>0O­jM™—|`t¬½>Þ-5¬+€½8«·2;[”Þ›¡®k©OÝ5š²Ô¯28æ5⦵ºeB‘´äUa%ö¨FuÍ$RH YÓ ê+©Skz²p~VU½=ü¸ö•ɇâÆ|¦Ï¨ÍmÙJ¯ÇR)[Þ¸Û÷lr¿n¼½)›8Œ^3™'v=Í{§ûE¹aœ;{טÚè“Üϲ5$“Åwa¬ ÙÈMÉ"]B}Noݰ$rTÖ‡‰ û 1Ú€ ã•ê+¿ð†ÞÍÞCµÇÝjÓñ7ƒí5iís‘Þ¦X‹OÈ¥‡÷|ÏUØ7.â}Å5î¤ÈÃElø‚Å´«ƒ8u>Ý+ž=}ë±4ÕÑÈÕ‹M¨Ý°ÚÓ¹愾™CŸÎªsJ·f˜ŽÓHñYµµ1\㊈\µÕË»0» ä¾dïƒVlï^ÚmÙÍJ‚NèlôK&ÃË ¼)ëé[%Ír€lÏnµÅ[êÑÊ‹GËr¹'µv>¹Ãå¸í\µ`Ö¦³Ñ™p¶óJOÊ ü«[>°è¿u†Aõ®“V÷>He\ô´°éïpÑmU/ùˆôª„ì®ÈqÖÈÈh¾Áì¶rGj±jÒÝ\Æó·Ê£;OAVõ{w·ec§‚iyfÀÅ WW¡¥Ëw„ ŸJ‚k™.ôíÅ pøRy¸²X'Mƒ¦ñW4xÓtQ‡Éß=EdÝ•ÙPÕò”v5ů•:º¸éMÑlã[ÕQ–xÛ$š¹ªÝ×&†ËdñLÓD–Ð<ÒŒÉ$˜QéÍÍŲÔyf‘Ðx£Ìû=‘‰Ab{ô¶îFŠ7Œ’ý*]Z<ÙA3¿N‹ïY0+á<É òro¿išö÷ššcƒš§¬J·SI}ªy$ëVãÐT±ÞÝK/Ýcjc¹Sص¥ÆL^RGû°ãšÏÔTÉ*‡ÛÎlèÊ7ÍÉäJæõ É/åˆË|µ¥?‹S*÷äIi³Äaºæ¥¼…®®B0À'ƒJ¶oÑ…e‘Aê§5©zc·»´ÈÈÍNò6nÑ9Û„ŽÑ.mÔ’CM?O½P­œæ¥Õ!+¹‡%¤ãô®^Æáã¾Áâ·Œ.›G4äÔ’gFá`¹I-ŒVÑ–3çK´ ¬†xOPj]ζWYþðô¬¥¡q•ÕÈ#¹Ý+’;àT‘ÿ©çŠÏI?Ò6Žõ»jÖÿa¸g˜/Ëìj§¡…6çtRxÀ¯ S¼Ï܆^˜y9ÉZ–(Á¶Çzb‹i“"J=k^ÑI¾CÎÅf'Ê…HéZÖÓ Dlò LµF´´‘-˲´C â°í˜‹ÈâÎw¶+^õÌk?æ+™Ò¥’çÄ–ñq¿&š¸9O÷–7õ(RMHÆ„Z–q¬6,)5‡5Ï™©\¿mûGáZ¶·u£¨í¬fôGE8êÙ•¦ÀfÕyÀ–úÕ«÷'U ŸùfETÒI’I“ŒЬºƒÝk“@Ñ€#,zÓ³z‰hYº„(Øö«Ú³ ’9íV¯I¤`ó¶ªXƒ Í×=ê£ð™Í?iríæ$¸œ£‘T1¬˜<ž¨îîeûJ`|¥sÅX¶‘$ ʛõ׽©8&xÌ`œÅQ´ˆ¬¥LÖ¨Œ[ÆÍè#¸¬Ëi㸻"3Îz qÙŠ£Õb!éÅhÛ"¬,/Å,‘ü™ÆqT„×bHn¼ÅÚzU AöJ…. O·«wp ¡W0‹¹‰8\ qœ Õ¸b…qÔScD¸¾ ÿT¸'Þ¬G,Q“¸Ž)9[A¨_R•«»\8éäƒÉ«ÒEö 4ŠY‰'šÏžõaŽì¨æC…55”(Ѫ0ç”ú–¦;é÷Ú†µ§Ê‘“j’’jëu¯Øk7Iq"m“Œ:Ö®•n-´È£ 0½+Kp3c½c:ÒºåÒÇd)ÅGR tË$·@P1Kª—`>júÖà0Šd,:€zQn³žk{êh¶l¡1î@,¼äö¬¹îþÚ…#Ç”•³¨#KdÈK šÁ†ÏìÖæ?7zÚšÐÊlX¢1''9ªòyv¿J–) —¥gÞ\ÿ(äVÊ=NZ•,¬NÊ€ííU§Ñ«r˜à'qUeó¤”⺠.Ðw>æ5R¼uDRjNÌè´ˆÆÍ!ÏUɈ‘ 5—©Ük6u=ª–‡«5ÔeY²}k4t;\Û†nvž¢§œ(ž¼V[¹Y3ùÕ§ZØäôKq=Ž'RŽ òF¸9ªÓDò(d}¤uzæV3¾Fj¬èʡ㸭bÎ9­nRDþtüŸJÛ³(ñïN+6{a$Aã=‚º&GJ¤CFh3È¥Š¶îqQ†äÓÄ‘²zÜ[‰FTP“ÉẠIå ƒ’jÝêì)=†¾"ibXdÜÍÖž.‡<0©sç\)ǬëÈ™nIV{›KÝZj×ì_'ß=ª]"(¨w½Ç5…tRH—=MkÁ/•r>aÚ´’²G<%y¶ÂY »(£"ª4dò|çv8ÓxmdEûÅÏ>Õ=Ò `n’Fjz–îãrVHvŸõ‡­8£ˆFÞóL¶˜Ü'ÚøÕÃ2]CäÆ¿ˆ¡èÄ—2º3dóSxOâ5%…» ±w3 ŠxÚLضŒç’*í½¤íÙ²)· B/™4[ºy5gù¬}3R=EÇʽi¶ó‹{a1гÚ¾ÕMcÐìJÌÙ³‰WO•L`V7˜ r8­Wý˜UO&²×Ìn|úRÑIî\‹‚yÉô«/Ÿ/¡ŽÖgÊõïN2y…¿º)½4MêDÒ¬6ì˜Õ\;®;TÂ#cµLmŠŒ ›—dfˆ9õ©¢ÌQ”íVÒØãsqŠjÆ$˜€>QÞA$†+3€Xý;$ð ,±m K,j5 2õ°«LÖ¢HðA&¥™sËTˆ‘™*¹fQœ·áõ²Ü›û§.ìrö«º|M-ØVÉÅtlŠ,BÍè*ã+&D•Ú+¬K f%û£¥@¤+ciºîõ¦*‚ù⹞æéèJŒB‚k>þ^ ÀïWe‘PV¥;LÛù}*[»±pVÔ¤²½Ô!áGÝö-Žœ–À@¥1€¾¢º"¬ŒfîÌÇùX“MyIŒŒæ§¸‰;ETf#­ja'ÊîIf…رè*íÄ­ac&¡´g«¢-ÃëÞ¬R|ÈËŽIRmò—<×Ye>èžN8¬´³B…Xf±ø¯8ð¯o¯51oxÁ’CÁ#¥w0ŽôL¤sוjr¤ìÍ©N5c¡›âÿ jöÞãÌ$?:zÖ奜v à r[«]}«ÏnG)ž?*¯4·rHV=¾X5©'±¤`¯ –iÛw8¨ïÕ]‚ÛíëSZFUÙ‰êk7YˆËt…d+Ú•%¨WzhI”É–†àôáI¦½Vt@ã¸ïT]—]³“·¡«\Ý4ž\«Àþ/ZìHàr±^[õiËˉTàt©gª Úð{ÕYå,åYÑﺟ äõéNÈË™ÜÕԴص6cÜóRè^µ…¼Í >yâŸj’D9pXu©ÖçÉ!¿…Ž;R×c{èt"¨;qŸJeÞÖ‰²8"°â×/V +7L÷­IäY¢%[ Š®„ã”tÕå\ƒ9ǰÁ¯@ñÜK%çÝÇR;×ë†"½ .ðGEï1€f¯ØÙÏ$Ÿ"ôªQœë^‹áK BC’3ÐŽ¢®råW!+³™ºÑ]!ó%B§éX%q! :W±k×v1é¬%‰L‘ŽTŒ0¯&¸š)nÙáM šŠsrWc’³±]$hÛ"¯Øê·6Íû©Y3èk<¯ÌE¤‘ŒÖ›ˆê¢Ö%›cJå™OZéô½J Ub“†>µÂY¢Ÿ•ܨõ­Ý*Íly™Ç=k:‹ˆE´Î¿\´{¨Ro7!Wõ•Ûh÷“óÀ±Û.›ä·9 EbÞ¤‹v¬"?8à•ÉÑšÍ_TU{ï>hã~y©áÇݯ§–~Eã¨Ø° HG"ºM ÔZ][m ¼®XŠÒ£J ”}ô\¸ÐšMbæìJ»ÝŽÐO5i4K‘a¤Y6œŒu¨eòßU[‰ Hl*ÜWk¨7y2ÁÉé\®NÇRŒ\®K®‡FF1–(Ý+&ÔIq2ã5¯¬Ý§íöCv4–Ö‡ï¿+çè+4ýÖl×¾R»Á×” ¸­+ËEœ  Æ’{;{k¿:y€ÉásÉ5_Z–X3v¹ä H¶ìµ-i!Qå,Áˆì;U}^í0¨@bj}%U#—¦ò¹5Œ©Ôï—.Tþ®+S9·Ë Û'x¦GSžjÞ»1”Ãqù23ìjm?OŽO3$ôȨåQ) Ê7jŒm^#/‘³·ÏCŸÒ¹Ÿ³¢É½G9®›S´èG³ [§5¡3§Íf y<ÈØræ´ÖØÏ‘•ˆóý¬U yl«é[¶˜x£ 2áOԦɧª9WmÌmÓœVµ¼ 37'£fȬÊ:Ö„‚KÜ>n¦åtD)rÊÅ~Ï”ê-‹n€QÉä pX⤂‚­ëTš°8>k1'![Žô¾[…OjImüÅÝéN†@<ÒK—±—µWÏTæ²ôUV’ãGûâ¶®kŽÜUM-6[]ÊGÞk6ÚV7äNW3má3 Ì>µÑéÖátÒÄaŠb¨"Åo·¶œV­”ê¶[¦ÃšÍîl•‘¦ãílOMe%ËÂC"¢®ÒÇ‘Zöq‡·¸”¹¬eòáÕ”ô9ÃV‘z2'Q§{&ÛÄCýÚtÖçìd(9¥žÕ®/Á‰•òíVf›d[qÈàŠ•±vÔ΂Ü[c5ݼ)ÁDÉ5l4öÈñ`¶TTÞÄ(­M #WŠöÁåL*Få2}ª¿Šo$]Y '‘ÕkñÝh:-­–öIg}Ìtþ»mgA’Îà*6äúQ*<¿¼ésHÕMû>§5á‰îTC¹Ûyù¹®[ñ¬:léomûÇCûÏj±káµÐã¹¼i*¤ ¯=þκÕ.ä’$,]ù5º:Ós{#J¥((­Yêñö•»Í/=@)Ò]4—"ýÃÖ©ØèɤhÑÆÀ´˜ÜÃÞª=ûE(¹ùUß.ÅÎ{\¹¨–À’/½ßÞ±ç¹d¶äúVâ¸µÉ Éª¿Ì23ÔÖ‘•·9êBú™ðý¾î]±d)ö®¯EŽK&ß1íÍP·˜E.Qx­DsvP׌Rœ®]qLÒÔȺÓ“î‘Y>„«93]Vȶ>S1U,m’ÚGô&³‹ÒÆÒŠæ¹bQ“ФlžÕVúá¡€h†å¥‡&´H‰>†~ÕIˆ=3Uîá%ƒ¯Ü=…6æfŠèîÎÓH·!‰  viÜÇ™5aQTÀUºv¦î’޽8ªFFá‡z£&Y³>IÚ‰nŠ®HÈ«¦%¶ ý}«â_³’Y AN.áQ8š8’@@íÖ­Þä'“ŠÉ¶e‹Ì+íZiv— áëQ3jêLmîI‘֥ÔFà})—åe(ì*8n*CÓ¥Bf³ÚƶÏyrÌÜ*v5f>ÎwHr¸¤ž7k¹ži] Ï ddµµï¹Äãgt[·µ[òצj ùQ´âŽØØqW5+Ÿ°X“¶ñ\¤r\]É—Rø©Œ/ïJj+•š-´·hÅÛl@þu©rÂÚ/.Ýyè*O (áϽ; ä3HˆÝƒD@làæ•tµ’1˜žô×·hK| ,{ÛËg¨©Ë«8ŠÌŽ)šðõ5y,ä–$bØ‘zÓZ»#¸˜dªÓíW÷$·Z‰­ÌfbI?¥0,±&“³qï.4 6ã=é±£3‚õ<ˆ G V9X1$¯òc¥1cÆ#Æep‹ßŠC.èl’Í&Îvõ5uícŽàÊ9cX¦y¬ï Ó¬bÆÿšWô®€&Ð2rjdËK©ŽOn)Ô štƒ=Eg\\l$‚²r.1¾Ã5 À8S“YÂ<©vêjM¢gÜONÔÙ÷²¿…U(kv:²VåC¡uäcš‘Ûh$wíY°™#”îäU¼—êk åRoA¥Ã U¹Tü½êÎ)<æ¡v úƒÚšÜ™êµ!‹+Œu­HåÛ=j¨· ާã ÔSlPV-Çr7mÅI-¥¶¡Au KzŠ CÞ½E?í,‘íb 5œî•Ñ´nÌ¡€t«–æmÇ”û¦¹+»­OûKÉY3ùî+׉€naÓž+„ñ­•Ʀ¯ir‹v¿y}h…G'yjm¨è}óíZxÞK7zÐså+da{V‡†ÂÑŸ¿ž}+ »£“ÍrÏ} ºŒ€‚…»{Õ¿-äÜMh6ØàÛüDV–×-&ýÜÒ´¢Œk>ÄyÛÒ¦Rg9ª‹ Б‰h©CˆãÁº¢qÍh㔕qÅDúd{I†FF†«Åp'œ„lŒô­‰B7ûR»*Ñhæ5 VÒE~Ã=A©­åÖŶҩ"ãƒZš¢B@⡱¹Ø¥yÀéZ)ékJ)=Ì»™/žktž=³FÛ•Çò®ÇO»’[`d_™;¬ðŸ“çóE•ÄÓFUW ¼NWAfr~2°—íM*‚Tó^t­“•Å{]äKrÁ%ÇQ\®¹á5xŒ¨Vê3]4+$¹YZN÷<Í~ð¯AðF´,&ò$pû7Jä/ô[‹R¦ëíQ³On¨ Ãk©¥%c]3Ñüe4¶#+Òr¤ôqõ¯.#irà š»>¯s47É#¦{UÛ³»©¥ò«îõ:]æúÈ\£+žéÞ¬aÇçym˜Xœ|¢ðÈŸwîeÚG8ÏZì~Ó°„¾‹?í£Þ¢sqakœ¬úd–$ aÈ= 6Õ® ’yM³Ó5ÙÛXì%¹P}+CþØŒD=«?n¶fŠ”ž¨Ë±ÔÚÎÕUç¶,`ŠîÅ¥tÉ}ÄŸJÈ]1ìu8°»¢ ó ÞEÚßç*Üì+’³WÐê¡Ólæã±][Vyv•wé[šm½¼šÜ¾[sm Gf+—îy™Å/‡`xo..m-ÓéDåuaÓ…™ZG6Ërždàb¶„QjZThd±€F=+.îî95‡i “»Žõ5¢ºÜ*¡*NAÒ¡¯tP¼f…Ú`¨ì ö«z$Ù[¢ýÐ:U{õ#JŒŸ0Ö¬n\BFA^5•ô:ì®e^À$ÕÕ¥$…niÚ¤-Äq*áPu¨¥\u$ðÙóu®ÂÝe¶·J%h» WkR FÃpëPZ¯•ï­I>`j”ÀIâ©2$º™ÒF“¿5Uí•$ÂjÚ§< J±üà‘Z6`£Ìg¡e¤‰×½$öÊã“Þ¶|”uɪNUr§íP›.PV*©X# y¨g·pºc’8¦\»…ásššÈà¹#Ú¨Ík£0-å–ÚVµ“Ðð}kZ×?i Áâ³¼Ki,s­ì_w£T¶“iÚk¢eˆX¢(ªE áWÖmÙ›(ó-Jút öþT‹¸©êÕ*@‘ÜåF=jâZÎáÔÓ«}óÖŸAÙ\aŠXо~SÚK±†þ+@¨6á}* m’P ñŽô‚ãÑL©äÕMEÂ[·©¥¦"XùT3Ê·GoŽ„4ÅríŒb(תҜ:S£…J/ ¦<0ªqДÇñP¼J{U’@ùA⣑vu56ʯ„Ü5eV權ž”lÎx¢ÃL„¾î‚®éðî“qíQ4jÀ“QéÜÞJB•·€Oz— Ö¦ÓÃK¸( zšƒÐäUk‰|Ô}¤äTw %¹Ü¥HãšÊR»4Œt%¸”í =k"èîR£§zИ±^¸ë=í3l_¸½Mf£Í#TÔcq–ñ쌚r†-ÓŠ¼°Æ8§ œ ëJÇ3•Ý̧ŒÎ0iTÆ­¼Y*Þ*–¨›Y•ÖXœsM%QäóVœô 1ïPÝ"ª¤ŠFàph°´X„À¼•'‘RC.K6juØê@P÷±KíHP3‘In|å p<³É4óh‰¨êbKk[…‹?¿]£SÕXˆû²¸ÿjïm¢ËäÈIJàí^Q ÛjWÚ±™<ÒÛ²\æ½s@ÑV $EvþkÎîjåµ…­¤e-ãEóSNª¥®o:J¤Ô¯±‹¤¬ðÊN<×U Ã<“Ú²¦‰’µnÅäãŠå’êtÞå‰cÝ&{T~HäcŠ›ÏSæàƒšÍ¹¾ÚƒiÁ­iÙDå«'rÓÆzsQyAÔäíU®…Ö& [¹Å:MF8× œúâ¶±—:öpùãh}ª…Ô—“ ªeôÇjÓ„A'ïžuç­=¯,"2/×­î+ßTfC#Þ!W]‡¸4ä³òIÇÞ5æ©Þ¯Ùai:¨¨..õ[§UªÆ rXÓådÝ'&4P£,x5E X\™7­ü­Vqª¼*ZDEg½ZÓmb„“HÒÉžKQ¢[‰ÅÉè‰ÞV–xsçõæ³§]Lí8e=W@›73"Œâ«ÈcgVÜ1ÜzTÆV*¥3ËMŽæ9¢¾¤aòçµc^è€ÂTa[äoJ줈JàB?xyª#Oó¸= m²LÂtâyýÿ†æ·E”€{UÐ%iBªòÃå¯@±´Ã-ŒëûÕÈ }*%¶V´%xžÐzWRªúœ¶ÔäôÝ6îÆá™« žBö͹܇ Žâ´å.¢Iͼƒ¶³®#òƒ«+mÎ?ݬý§3Ô¹BËCCÃ×.%D“õ®ö¶1žTמxuIJ5¼‡ ½w¶ò„G''Z§ÄuRøJÚŽ˜~Ô—°ÚNMTÚ±ëÚHIYcÏ=:UíBö$ ¤©$maÞªÞú»‚åÛšÆz³Zz- \D³”Ç.kCLd’&lØÍd_B–ÑͼìOÌ£&¬hKâ×r¶27¬ÚÛ“vÒcæaŒš‚]&eºfNAê=jMêi¬b¬Mm8³‘¦“>TŠTÿh1É|©BsY+*F°;sžÕ« FK@"‰.¡NM¶™†—¥Š ÉÁëZ1M<Ïå&H9ª?Ù²Z¹`3“Zºl´ÉŽpF+F×CY]¦B¼MÏZsgÌAÀéR,,X1h.ü µ,#²k\¬ê„pW5[Ìšµ•´Êl—BŠÏšàÏláßz£©ÓªClæûT‘¶ËÖ¯%¼rAY–hö»‹`J,dvšaü&†(_A¶¥M÷š7VåÄê!+ž@¬kHeI~aòîâ®]ÌØ= "ö/ „H”¤T*L‘T7;0=ªq+*ðP¤õ,JÀžªj®Ü¡cŠ¥orne—ž‡Š|ðg{·@)ǰ¤´º*]^Es¨¤‹÷càæµa¸¥bZÀ7ã%‰5¡n’¸ê8ªßS&´.4ÌXóK4¤®MB“V"R)¡êÆ<"¶Fyªú‹ÝÆA=*Üê^®*€ÿHŸ#ƒ2dšÐÐË2í`8VYY4ö#ýd¼~tÉSÌ‘c=“OHr>Té@¯Ð§ «C¶‚HÞ­ïZñ-ÐQ Wœ{ÒÊ£z¸ëUtÛ©XxÊ*g&¢wµÍ©Úö7ewÈd…Êñ\‡®nγ(™œîb=uQÝ$ÊB0#<â 0Å!‘QwJÂ2I4t¸œÿŠ5©ìfŠòk{J˜Í¦Ã4¿|˜Šá¼F’Í®3}¼ â»­5iñF?»[Ê1QV9ù¤Û¾Å=Fël¤Ö]âɵÓA·þµFñ¾mÙÎ;Vlµ¹Zöå•6)ùš®XAä[ Œ³rk>Î=É’NHéíZæ@£µ$’¹Y_ÝCö·5ÚÔ6)ò«H2;Öl2·'ŠÕ³$$M™ªÌÙäUf Hâ¬ÂT°JCËi}ª íȈ©É­@qNò•ºŠi16Œ«}¯úã­2*F6œ}*œ›[ÖPÇcò=ªèudÁëM¡)lÜÔÛ˜~L°jx°ÒmÍZhìl̲Î(³°î®ršÏ‰æÓ[ìéDZZš ^º '?+Œ€k”½ñ5ÍíÌpCh…Y† k¹C$PB\vŒâŠåŠMj8KšNIèOp d‘Ö¡YQà )« "ÍÅW¿Äqô⹚èt©Y\‰fo´Î«ÓÊàUaq!ß#œÕjÔ'ÚßfC¬-Ã&\Öª6V0•¥«3c¶X”s“êE=m–RrœµrD QV-â ŠÒîÆ|±¹˜t[gÀÚ@úÔÉ£Z å‚=ëS`¤b¥Cl­ ‹ckò" ªò V*j3asY“J¾qÉǽ+›1œú皌Y‡€I=ª{«„Š0U‡4¢îˆe¹ÇjVcæ‰Y±,`šlL³´ŒH ço­+j(÷ñLœñšÈ»ñQâH™Šœ`UÆ-™NqZ›·qZBÓ3ð1X¼·çîWyûÇŠ· ÀÕ.v\ÀHµ%µ·Šdô{U§Êb×6½ èîtdF H­÷›Š»mm½èp$0)²´× 5¥Òþïø\úTzMä)4ºp—{*ü U¶ùLâ¢çcLiÂGU-sô¬½zd¶ÔÞ!àáò­‹Yg™^,á•ûúUoyK¬Ä²ªáâ7½g ]›U‚Q)Ê‘Yî¶„'Žõ¹·gq‘+ùrv>•›%¼WV!IcŒͽ·ó§pØÁôÓ¾â’åØÚ¾WûD*ò¤©œ†SWÊùÖѸÉh¥íÛšá4™î×S_0ýÆÁ½w–¨ÓYÌêÛ~|ãñ©­YPw‹ ¾„µôŠ‹–)ÆjÂêÈN׎jÆ«(Ñ>aQŒV’Èn­¡°'£ —-,8ÃÞ»15V³ûGÙÞ&ó‡üµ>Ù-lØ"#÷† Ö›v Ñ¡õ¹¨aiÞX¢ƒÁ`*“|¦JÞÐÑÖ£’}6á!'ÍÈe<Š_´‘0Ü¿-5CGÌä)=jäÉŠ$ŽÕÄãŒt« ¨É¡O憇_›>•fbfÀ)^¸¬ÓÜÑ­‘¶pË,:Õ[uTù$ƒÅ\*Fcæ‚CLW”yì ãÒ¬f1Àªk(;[6:ÔÈ S“ƒTÑ”dYž7˜«†ÂÍUKq;(˓ޭ)Ͱ]Ü“U L¥²TVf·!¶ˆµûÆãgëSµº[1`ycQÚäβ³|ǃKq.é•G¯4Ø¢ìNÄ EA$n¬ePHnTý@÷p™\æ¦Æ—Y@Øæ’hÙñ¥‡'Ò¦Œü¹¦,î›ý‘T‰v*ÙÙ-¾"ëžsOÔ¦ŠV8i>QŠÐH”L[½bÞ+]ø’Ôe"\“M!7eaÖV„'Ðâ¬@Š’Hž†›mrâæhÝ0|¸iéyݘãÚ„'b|9¥Þ3Å4úf›ÆzS+0(GJ‘Ûë’jÃrÒ«IˆâòÕxêÕV3nä&ä¢<Œ‡.pµrÖ"¾órj­“}¢ìSÈ+L Ï}H^<€j§z¿e°¹¹N%ƤWoÍUdí0Ë+qJF‘Vg3á뛋٣'1I÷®ê%®{KÑSJGòòYºŸZšóÄi±l?<§øEeQ)Ô÷ÑÉOÞf½Í¼,¬Î€Ÿ\T‘am‰Î0+:ÏP{û8®2kO*-p})GGfLõÌ ‹&»ÜìÇ9ëU-í$‚FëÏ­n¯N¢5`Ië[\çpF7•2·Ëœ³RÆ–>â´–%8â”ÁšVV+:‡„ž•Ÿ·çÁõ­9%WTgN•H™«]Dãd‘ä;U«k¡kûǨ&­DæœÛ|¨Áw…@_=qD:²âBä­û¸÷Lçjç°õªSØÚ›l41ô¥â֨ǖJZ2®-ƧªÇ#¦ÈSœúÕ‰’.¤0Ëdš½£Â±3dmÚ:K«xwÆ9¤÷лûˆŽÚcâ€aÖ©5íÊÝ\ç9"¯Äé†XÀZo‘åÌ$ I"\¶-H±\Û”™Š³Œx¬û-.y™‘B²œ†ÅiÞˆ§°O0`gµe#ݵÁ©hãà}+4Þ¨ê´]ÕÚ· næ«x‚Ñ&Ô-%(Xmê+í·?o6ÞQXÿ¾ÞµÑ\Ý [Er»ŠsQ+ÁšÆÓ3£bˆÃÉ*7SãÌɃҭJYóҪ¥´ÁK‘žý©FC© ¬RšóEÄ`nÝ–Òi²y–>»sô5ˆ°“;„åKdJÝÓý5à 6óŽô7pµ–„›¦ÛΪ 9¢Ë]à 4·jf ÚQ@ÏJ­rí ;2RèVÆMÞùõùdPo&´¥µ¹HcÉ÷|Ö|÷";·“7 4_\Ë!òãå‡ kk7‹Ú(Èêln Ë„Î}kß­äeQ[ÌŽGCWt˜&Žê9e#æL©ÄAerP ׊:÷Ô†Ê ñ†B0ß2ŽôÝR;v¿*@2:þu Ÿ$˜VÚ±çŒ5â¹;†#ŽÂ’ÜÑ«—ÖÒ uŒ Pì;UÛI’61¿c"\å I+ØúT—ZÌ·Ž[#ŒzU­Y Z$2![HØòG…vˆç.)eòÕ â¡{Û¢®Ç?1«jÞrä Õ™vªxÛÖ µ+psŽ:ÔsÜ>Â2¤~u66æ²%ŒI:R3ѻՈÆÎ gŠÍi¦`R1µ{ m¬7·±8Í© Ëc[nrMW˜ïŒdà V”íaž‚«G#>íßtR¾¥ÛBÆüÇЊ®áS,zSÃç«ÎÊr UÝ‘P±Y0:•kslóT§pŒ¥N@ëS‡ÊnÍ[Øå‹´™e¥e„mäQÄ¥]˜ƒ—Z†9w1Ëp: šI¢q´>w©¶†Ši²Í¥¹WRj)  ­OÞQUûÜd¢÷;®ÐãëRÍSEÇFYå#5 ÈÃÇ"œ‚ÕdM¿'cFúM Uà6sBCrEÖo-wü*t‚3Ò˜Ì&Š<7Ì};Õ‰Œ‚!kóçµ2ort…ë“Ú²ì<óª\<ƒh´‹•÷GZŠWgàâ”U‡R|ËQ#Ÿ$æ¬ä.*ª™"^?Jžƒ`ÔͲ訒­ŠˆADÉ‚ «K°ÜÒÌ¡—‹›Lëöi£–Ô­ÒYËdíš4ç–ÖQ—85oS€9g¢•E±W“ÇÞÑÍîœI›6M$ˆÃÍÜ N°„ÉÞG­bZ\›k±o•ºÙgf‰µ*ºj[H¢‘AóçR€mJ¥ªÉǵJ²GœùœÒå±|é–°ƒ¸Í1§X×$Œ ¯œ±mÃó¥eÓk¸¢Àš5û7 Þ£Kœ1,sP\=µ´LQš§oyh«óÍ}i¨2]X£^K•0î^µI­å›’›…0jZz€ ç=ªq®ØÃwñéO‘‹ÚǸ¿ÙjòBý)é¦CápZ³¤ñ4{ȉ ÏLÔk«Ï.âHQíO‘™ºÑFŸö¹p×ZŠËå+HFæU%bÌÓE€1Ì[6ʰƒŒ:W?md'‘ZCŽõÔÄ»a æŒWÈDj_FT¸´–aœàzSÓæ]Üâ¯*•l+n“l„ýÜc½4´V˜…ùUqŠ÷Ì{b¬LP 0É¡eRƒ Å>Qs„3y¤†Àõ§a”ÙcØÕå`Ý*U…Šç#4Ò°¥©ŽÒì` ²³€¬pi—À ÈÁoqÚ£U`GaëI´Ì1<ˆUzçÒ©›nܯ­\ÜpGZPF(@â喝j¨Á$\äàT>%Öí´)¢‘£+ ß1•R@ìÉÍ`]iŸð•]4Ó1MŸ*ŠME¿c¢›•­ÎMÖ,õË_6Ý6²ŽsÚ¤wÚ¿7Bj=B‹G´1)ùSëW¦6 õ¬ÛW÷v:í©¶Íʹyb–ãPÔ ÁH!Mu>IŽ&u8®{M .®f`@'æÏCUO¹†#[E:q’HD\àf¦»–qvÃn3O¶ÄÑÏ×=V¤œ¬®X÷íVÞ¤({¥IšF@°k2FÔv_4íì+QˆWéS¶Ç„9õ¥)Ø#O™˜¦âô):µ*ExNI$Q]„TÝ´*0<Î Ú C™ª¤®c[X_]ÈTNÄ÷«hF75ÇÍZª<Œàî©ZE!C)ç­R°*QNæLZ1Ì’»ÈO;³Ò¢X›%!GqžwV„ç`>S²Œt55”k&ЭîÇÞ•ÛЧîU:^À²…a+ c5æ™w*F‘:ä’k|¢´À±G´¤‹Œ¬‰§+FBãéSEl™ØW7s-ÌRÎÕàûV¬—gû"<œ³™©µ‡Íp²Š4Ô·d? ;S‘d´ñ&ö?¹nU{Fi„ r*-JI­¯ƒ»`=ê’Ô—- Ó~ëP•˜|®qL¼–?°6`“í°ê6Ë;|“FyÞ¤žÏÍ·O#ý[I¼Ô½ìTuFm®žúÄ›˜EnýMiI¢4p³Bû]GÝ=®Û[EgnòÉ—ÜxÇQN,òºùDŒöoJÓ™™û8ôËÖû)y“kFØ5býD±4ÛÊÈ<)åLY½=j¥â¸ÒÌ‹!炦¥êÍqEô’&žO2&EUºŽr®ƒ ;ÒÄŠúd1ùÔaj±•Äq±e8njKºÐÙ·òÅÂHx$bŸ$)!;ÆG¡ª¶¥n$QéS4Œ‡‘@4e´1…äg qE,žf1Å2æI#eP8" ¶–Y¥ }Ð;Vé]œni+3Ün@‰ÛÒ¡`éu âõ¦!6ò’Ëžõ¯w$w:Œ¨ä⥮ˆ¨¾²6–Õš_1›ÕaT*`v5Î~Lÿ«8©cÕÞKgp¥qC¦ÊŽ"= ;¦ER@äÓcU)Ç‹g=ܬ_…^•a¤•×la‹É¹,õµæZ|ÐÆøše·6òÀ•ãp¨nmÛh¸íŒ8&©¬[ØÎæSµÎqWdeÌö!¹Q1×=*ÒLM²(RMVˆ#Åç²|€pZ“Î2@]=«K\å½Ë+E̯·½GòÉ"yy÷'½G$¬è äã=¦/ õ£—Ask¡¥l­.P¾ Y`4å%' jÌ,Ëy&â@ïŠt± ©ÀÆ02¤ÔrÛC~{¤É<׎ÞU,V«³Íqn¨:óÚ´hÛ¸ƒU•]·);º(©µ.÷+ÏrmbO |ÑžXÖÁš&šãåP¹ÉïTZ Ó6ïºüb¡¹–i¦6ãPcŒÕr«ûF›5 ôPÚqËœƒIe©-Ë0þ0=ëQÉ1ÇžiÚ<‘C;3¤ ¥Ër]WÍÊhCv¨d†$Ôñ\F£’aHÿ¿lžsV#ýèy§È¬O¶•Íg›ÌÝå¶H¨K¡tiHÞ£€zUc2Ú¯”˜.zš‚v,ÇÚ§’åûkzšÅ­Û“&O¨¥KÈãS“ŸëXªX/Jµ¤±ã@§ÈÙ²ÉÔϸ/Å[PˆŒµbr;Õ›%i˜ª¯Jn +Š5dÝW\TÎSM»‰ÕP ÂŽ RÇû3г½%‡*sXÉWVfEä²ÛY»Çœöö¨ô™¥„´îXç½j,i.äqòžÆ›œq>ÈÆ†Õ…ÉIk¡j9BÄõ¬íCYXFFÆAÔ©þ”íF!J€0Eq·<æq’äŒÕQ£Í«3ÄbTtFËøÙXóéLÄw'¬kX¡6I?J·k ÎüÆT ét¢Ž^lß´ÕQó(Í^3¹ 1U ¬…N´ˆ­gÈWµ–ÄŒîIäÓíØ£r:Òõ§†©DžbÀËPÉÅL®6sPºŒpiVSòš•¥ nn¾•`«Q¼…ŽM+\|Ö,ÆPdcÕsUƒ3R¬¹`1O•ÎË +Î)çháŒSÓœJŒÚz‚C» Ò­2gœàUr)ÒÜïƒ Å\t5ËV™éP­Ìµ35Ó˜™!a¿Ò©ØG7ÙF÷*Gj±qíÁëÇñ[…TÁ‡Çhrj6.0NNL än¶¶iæþéO0àzQwh³.#nG¥YµÒ¥ž%ÁÃwÍoM«jyõ¡%'ÊRk림M7í7 Õˆ­Èô9 øšlÚ›ó zVËÁ¡ϽÅç˜ÊØõÍk²Ö¹ükwþËŒçzóH<9v\Ê­W¸O-SM#e‹©¨ÄEth7Ê#ڨ˦^Fc8ªN$J:™^^ÖÚ\f¥@Áüê_ìÙwÈÙ=ñNû‘¿1ü*´!©„ñÍY†&Þ9¤XöðAüªÄL£øI¥$‡î,± ðMcIåÅ?ÞÎkrB gšÌž5i d#=)SH*I•dr€æ£7çwQJò™•@Áþõ "ànEcô­¬ŒîÅI̘XúÕËQ#JˆÜ.y5^3ÉØIïŠÑÓtû©åó ‹ØTT²‰tï)$vúyX­UTvëPÜD²ÈKóT-nÙÉ`Aµt|íœâ¼«µ#ߊN:s1‚BUx¥}JVW®<¢6œT%‚>‹Íl’‘ÇQÊ3P»•Õ€%³MÒ,el<‡#9äÒêoåŠõ«ZH"%˓޺c¢q:Òr±zp"·,¼`v¬DÖœ–Q#ŒzÖÆ¡ Kb3É®nEV;Œž´â“¥fiC¬Ýb”š—ûsQVÀ—úÕM*5ùgh®…ô{[È×ã® &”]¬Ty¥³).¯*Ç™ðÇ®E[µÕ£¸1Iuá¿:Ñ£V9Ƴtí:[)<¶VÈîjZ‹\ñz»GÞ}êŽär‚aº¹û±–\©ÅgÞ™So–Ì£ûõf£sOlÓÕ|ð6¨–j©*|ØÇÊ+Æ}E䊕¤RzžÂºÈà >v#šÆK‘êtÁûE¡”Ï I‡9â®Ëm9RëUŒ|àž;Q&9Ò’ÔI$J½ao²Z¢ÅT óOûW” c53ØÒš³4¯ß•n€Ôr0p£®ElÐNAÆså©äVqØÙè6fò o˜ôïXWry€,gk6Þµõ,y6;p95œ¶±¼k0l•àóÀ­á:³|ÖFœŠQK±sK;&üƒÚ²¿{“²@ÙîJ”k78ÅpR÷IÔ«6O&¬ PmnyÍW†ÎR¡€È³WI(žRà9è KÔÒ È®Ò’Å#JnQ@ Ðt¤™J®í ‘ÔVk“"œ!ëI¡©%¹ ·Ûs°çКti#läzÖ,;žP‡!W®*ãG! å{õ¦‘<÷%¼Ô"‘ .ç|óÒ«éú¬ÐNÀÛŒp*Λœ2¤@ÉØ‘Ö®…= õȦ;=ÉWT·#…f šK¨Õ•YºÖ?Ø¢y7…`3Þ¬y0É(G“ @Ï4Òbº4Ö-ÌG#œÕæU’ᕘ· ¢¦•Ç€ìOO­1ÙÐ)|zúP-ÈmÃ0;ò§¥5wEpÑî8ëÅX-Ž|¶Ë}j†XîІÉ#­L‘pvEëÌý•^ÞHMŽÆ :1©[*X€£iúÕ1h‰<|òO"ìSšáˆŽIûÞ´H± >$|Ùê*寗¾ðíû¸ÏZ«˜,„•SŠL¥©›(ò 4ŒàÕŸÃqx xTîTSŸZÙºÓá1!UQ‘隬˜ß,È6Œ÷ªRhÍÅXʹ·’Hã–"ªá0@=ëWOiÍŒLAb8`*ºE²8ÎÃó°©ÑYÝ´Av«¦™3H«#îâö[ÆŠÛjž[µ[°žW™¢˜ûqVV4{¢Ë0RÇ[ƒOY b©=Î9ªèBÒC# ¶Î™ùÃrMFvGa:N»€äTþpr䣟j©r±)V`Lô¨¹«]Ćö'Óãcû¢£XRâ1µ×ïdúÔjôXØ`62>•_I–9 ‘Uãn­ZŽŒÍÏT‹±Í.ŸzUFáŽ*t½—ÍHȦ)¬“¬ÇËŠš;¤Š Óž2*bõ4’º2µ¨÷–$Õ_D-3L@ÀÏJâD½»Xü£­kX£@ÈQ+¥éÍOšw4cˆO 9•|I˜DAaŽ+RÊvÜ|Ò? ­{%(àžµìu8óEØÍkA2FjÝ•›ùN’!ÙïN"K‰TG½_•Ú1ƒÇ|ìç§AGR“À.ØÔÞ ’I#\ÆäMûd“Lè 9£˜ZüÄ}iKVi’dêLö¾Y9ÝïÞ£šÞ6ƒÈsÓž) C å›q=1@&DqNÚåtA"³F±¢£¾´Æ±«ƒéVå1„UÈÍAËJB‹·Ú®&SmUáÏ­,Q6p¬6õ&«J×p¸@±zúÕût¶·Ž)·bc±¤ÈàùyÛžN*ð·;VRùv¤‰$Žð“Æ*Ò)Hˆ#76Œ ‘ƒ$¥—8¥ù‘¶Ò„hfÎr®9¦Þ ©$pj¢ìEnË$«¸œçŠª¨Ï«IŽƒ©«f$Ü@Ê‘ßÒ€éb‡q=MTe¡œà¯¹™r’3¼¸8ÍE bØÆ+Y[ageHàSm-fžVòÏj®},f¨ër„¶þd‚AÀašµÇÀä÷«ÓX>~ö¦)¯kò ÒŸ5ôO”ωÝO=iävç½X[m„¶FqLŽ!´ñøÕ_C>V3hS[.çü*x© %d  'r¼£~ÒT´±w#çn•Wnù÷ªºŒw—ÿ£áP¦¦nêÆ´U¥sp#´JÍÜdÔvÚ„Ü\üǹ©-Q¾ÁNùlrjÒ¡ûbÜ<˜ Ú±ÒÚv—5Ñ%ÌÒÇ6 {ÕÛwÌy=qɦ±‚xò¬ÄqÈ(Šº ;;™zŒ¡ÙÏaXE:‘È®ÀÙCr0ÃŽøªSéE‡ƒë]T梎 ´å'sŸ·E8k\Éà}ãQ9ã}ØùA¦\G†UJJLÅEÅnf;‰ëVau<ÍVÃd‚–0D™ÍAû©þšjÄç¨ ÓŒŸ.AÁ©à¹,6°Ï½Eì‹I6@ѰÆzSI?v®Ió•DÉëSrùHDÃ¥8X¹ëW¦VÀ£šÅ*i”ãӲ౫?`²;TÊO­H0«’Õ.N÷58ØbÙ(ŸÆž- ©5&àÉÇ4«:uœ™jš"kxS±çO[KqŒŽ´ÿ³þðHÝ}*®OÌ*e¨¤V—Iµ‘H Œú¥&€JG9QÛŠÛ(6søS²}Ì×Sš´ðÜÖ“bëšßŽ5EÕ;1úSxüEVÄ«màŸ›Ò–\Êõ¥*3ž‡Ö”‚Wèè2‰’`Cç¿Ý©aº•æÃGÇ­M¹·í)Ç­HvúT«AÙ :â˜áqÈÏáRt¤,:UvM‘]£P3µ*ˉÈÌkùU–QÔf xÈ9îÅÊ€YZ9É…ML´ß»Êì)ñ°ÉdG½>f.TQ}*Ñúºô+7à­hɸ}Ò?f>\žMÍ„YŽÞ±lœŸ©¨ÂP9ù%À­õæ2ŒÃ'­B–Ë„ÆìsOÚÈ—F Äo í#l£ŽÕ¥§Ù½ŒEp «Øç¯@îI÷¥)9hÇ Q‹º9}B+ˆ®ÍÁ'äÒ£›T™¢Ä*Äû é¥X¤Jç5^ÖÍ •˜(*}j9QW’ÙœªÜ]K'Î{šÐ†mƒäÖÅì–Q®¨Iô¬&Î>XÂö­¢—DrTº{•/l¤¹›vê¿gkåÄÒªF.3ŠÒúXÅFÎå;Àòç5™=¸òÎ>¢¶#²¸¹”m…¹îE]ýë…¦¤¢'NSØä­`(û”6âzšÜ@ÁARËëƒ[VÚ}¥º…UÜ}H­í"#%@>˜¨TÙµ<<’՜ԒÞÅnÍ ®_°¨bÔµÃÍŒ³wùk«kD\ùx&¡”ù(K…æ³æV5öO{˜ë<’(fOÔR™ãáÝdfè^‰ÒGÇT²Ñm„"ÊN7ú ÍÎÆ‘§~¥X®`·qBÆ^êƒ;~µzRr[$ÛÒ²¤×ô­<5º¼óËI¯Ö›£Ý‰îœ.@<Ⱪk³®”ã~TmLÉL_ ªQÊ&RÊ8êÍíÖŸinÓÞ1sÑc^kÆò»—xî«:iîmU«XÐ9tü)ªB˜ {ÔÀ ñéUçÀí[=LššpÌ› ªdb¡v¿™Þ¢´‘£@ ô5Zæõ¼ã2Ç  Y”æ­r­üuqµXÿ‹ÔÔ‘ZþéÐd# T‚Ê—dÈœžkE#ùǺZ.IËS>=&çOwš ·†è¯N3uxÔ8ì*ã5â©ÃŒ‡ ´33–.3Üâ›}ÆÖ¶Dêè}‰ˆ=æŸýñ|Éh8þ#W%¸œŸ-NáëŠd0]0e— v8¥uØ«K¹·W‚ª€1ô§[X݉ ‚ÇšÖ†Ì,d™xïV÷Œ\p¨f‘·9ÝKMÔVÑ£¶X÷‘÷‡ZÄ´ƒWÒî<Õ=AäWtóº§. =±UŒŒÇ,‰WYXR…ö2#צ…;<`V…þ¢g³Këh³Ÿ–UÏs,ª© lîjÒ©¶…‰‰X‘÷{Rj×°£msšŸ\¹¶Ë·Üäu#¥aÆ×­x÷Y“Ì~Ií^‰°<8x¹ê¤S6[4›¼€zŽ+HÎ)éO¹Ã‹Ûä%‹IøÔ©«j·æÊŽÅk¸)ÆbR}1Mh¢ Ä ÏµÑ³Ÿs‘‹P»Hd‘bÜ㨴­µ#tðî^µ¥ŽEoÜ$hî:Õ9âs$*QƒÔVrhÖœ$ºšv±í´rüínN*GȉeûùãûIÌbHÏ$UkÉ‹#yËòtJ‹«´î4Ü‘›i#ƒY2³uW#<äVé‰ÁüÊFpkíÞ;ý›;¸¸¨,ÔÞï¥ÆcÞ‚ RK´m~ –ÏjÕ‰K!@Àì+:ȉõY¡nc©‰Ž¶.Ò¦~aëŠuå¼3LNT bŸr<›ÆWR’íÞã¥-ÊìÌæ¶KˆAPCF >Ùó0víW-¡R¨[¦4¬‘ÇóçµTY2Ž·Dm,ì Ç^ìG#"7q‚O¥[eu‰œœûV]îg³v†U9ÅGÚ-ü! -ŒG-ä V~• :¤ÖÊÛsÜúV¦—!›G‹ÊVv'Rê7³×#Ú¼Š3ìke}Œ]“¹vDº’I*vóV¬¡[ò;÷¨õqj’Ií]±a%²²cn+$¬Í¯us†‹0•dL°5§mq$(eÎÒO ÷¢=ÊÊà¥[)mt›\mÒÝÏ.*ÌK{¸¥w+‘ÓÞ­«,¶¤u# ª0Ù[A&ŽÑÓš¼¶‘…ó (ê3YÊ(é§&·´’¥x`jã –`J–8â³ådóF#š¿hÛ¦U-s@ãdÌñ¦L³I+\ìÏDZ.mžhÕYÏËÞµnA1'æÍQšq1!8¡0œŠ¡¼ä yž9¿vÑ=)ʶ8î* Y¢j÷9ïbColÚ‡ô§y1¢UQUÞrè 0â®ZŒ°gæ–Àµ#A¹Õàv«M ÁðÁ…B×)êð0MjJRHx†ÊŒS*ù‘À›‰>¼ÕèvË™Ž¾µwòãø™¸«áÌj±Œp)3Xh2åWoNj£IäcsÖŸpæC€Ý*‹™ÈâšDNzèI,3b©¢;Fž9ëš–¼¾sÏz•xëM¢Vº°NŒÂÁÉ,zÔ[%¬;ëR,›G¿¥#IžªiXÚãXñžyíPÈ2>\æžÌO^=*-ý©£9H—ŸŸ¥M¦00BÇ óQ†#œà ŽŒºË:T>R3rµš†ÖãÓ5?šÆ+6ÙÓ(F[ZéEÕ·7F3Éõ$»•KãˆÈu žµ.ö¹¬m{EФqÿ«AïVÙ–T1ÉѸÍ5!ܼOXÁ8j"î:‘ièAgköbSvAïS’¡öt4÷`¦íÉ£%ídŒôÍ2 7•<×I?0ȦÏb$a"|¤U©™:=QŸœdzT–änæ¥6NNwJ-ö)óÈÐÿ1åâñ“ÂªÍ Œpš„Á0çÒ°îÑ|>*@çmfƒ: °§%ÄïÂ&jZeÆFгg9â§ žõ‘ö‹Û|¾iùº|ðGÒ•‹öžFºCбzœÖ‚>÷5<_låÏãCEÆ£} ²ÄóŠPÌjŒfðF e> Ò™§SƒÎæËc@ä±ü)wàVkù&VP¨ƒ¨'­\Mün> Õ^ÄîX Ý©»ŽyÀ ’¨H9ö¤êõ&ÊHy`Xô¦;o_¼@ö¡¢iBàà¾ôj^MÛö@is”pçÁÇ©§n#®3Ë&ÐÜžôÇŒ9±àSæbåÌý&â}ê'm;O´Åc÷Xüýh¸X´wнBy“Ídàñî)© ”aC⦫¡!±î* `O©¨Ël¥‹Êß»å‹{š`m­ßT\0§¥)ryÝøU\V-„n#žÆšÄ§9¨Ð u$ÔreÝÇ£˜9ID€1ô¨'šä ¤ŽÄšjƼ`œúšx‡w;É#Þ‹‰Ä¢Òê$ecP C*jÒ)P1ô5·.Hç v« Ü62)ó[¡ÎýNHhZ”ŒÑF{“VÃW[FeAí]9ßÀP ÷4l”ðJâ«Ú>„{õ9¤Ñ&€åå{U˜mã†þqë[RÔ#>¦³eO˜¨9aíRæú•좵FŒ,¥1øRÈ›ºVL7 a¸úÕÔ¸„ƒEÊVDªÞ¦¥*Å1³Þ™“úÔÑDC3``ô¤ÊVC†€sUoã…ÐMÄwô«€n9ÞÔÔR$Rî]ÊäuÁ©Ø§fsë¶)NÑ‘OšEm>HÜm'<Í_–÷`(ãÒ¢{P«Ï~ÔÚËCŽM4)%3É«öŸi³}ÑGæ×ksÈN»TcÚå*¡*÷ªNê̈EÆ\ȧ6§h,K¥<™å«J½À,H uÔB¶’&ÙáŽLt. ÓÝ-‘u kÙED ¢¬tT¨äUŠåAçò¥‘•— äÔŠûH;WJd²/÷GáUÊdç¡Fw‘:'¶)–BY®C” ޤּ2©DaS sNÄÅu¹zxŠŠœ¹«²Û¤™fÎj¼`F*–Ær^õËe`$ }j¬R µq8klcÔiðù£ ¤Z’÷z¬¢ÇÌãž¹«.XEXTDN€}j´‰ ,j‡'i/€:®)³L¬v! R< )ÁQ¦³Þ“Aq¦%$;òËÒŸ>i ©Ç½>20$Õ¬”øQd=HÒßb«ëO1ƒýiƒp´Oâ’3¼ÞÅh‘”äÒ¨½Á†SÂðÈ?­[(wÏúÕy3C×52*#¼Ä1‡Œ‰÷–…™ ù¸ÏJ®-ž2| "ÿw¡ü)+ á¶#n)+”Ò%ÈVÇ–Ì£©¥1öÜDÒÆ~eõ;»F™6ç¦N VŠán-¤•h`Ð+‹o²Mïœü¼Ÿz­y(–Þ(T¯Îø¨´Û¬G"˜ÏSš«aºÔ&ÉØNÑž”ô!·s`Ë NªK€*¥ÙYu¤A”QÉ5 ï‚rø¸ç½>ÞÖi‘äó9Î0i't]šfÅÂ\Dà *•´1Ûj,Ü–sœÔzcù73FW Šz¼ªÎÅ3ƒHijEvàÝo ƒœcÖ—í‚)¼£"íÛÉ?ÃTnH’?3qR²g½X–ÞÙT2€Ó9ÈÜzSŠÐR–¶,Ú^FãIPÜV&ÚÒ"Œ‘ÔÕ Xv3ž'"­Å!YIf_J"‡'t‰d’1n.8¬ØPJ$} ^IÕ¥pʧ«.Ws,ŒŠS>ƒ6ê;ÛAÚt²iS=«/Ï'Ì t“RÓÛgö–âÓ)ÉÕ—Ü"]†ÜÑpÍÜ{V‚Ý%ݾÕl+/'­}L®:Úê=GLd—Èèj èyr[ŸàlU:C Ù€ó°õõ8ÉÕ¦˜? —½Ícf¬ÊÐEºMãjä¡âzŠËS( Ç¥ZžEQ´r BÛ­Ç™¸c$9=,S|1ŒúÑqLƒžzqS©‚å‹®ƒŸcP­Ææ+‘ÁéZ-Ži+3"úÔÛ¨o0Þ¬ÙϘpl CWc"'V¨™A‘Tͳ° Ñ…N¦X“h9¬§ätѲ܆à»ÈŸÕb‚-€ò*”°K1ÜÇõ'èßÛ­+]¤ã+¢äwYØO>µ4s†cƒY¤3.dö4ûrÈø Ñuï¡¢Ó–1š É'˜Ì‡pN­ ÈcÀÍh´ØÂW–âBf#þ”É\Ç{Õ“#ð¤`T"/=Î;Qqò•p[îƒêsO³ŒU‘nêy {Ô!1& š‘ÚÄŠÌʤ‘SyŽÉ‚1H *åN}h=28 ´¬0ð¸Æ)õ4…¹#4»ò4ÉÜ“= úS6'­=\·¡ºQq´ŠÌ2:fžˆ£îñëN O#­=T…Þ†ÉQ·¥@t¤òØ·ä#A©¹¥˜ÜqéR¯Ê:Ñ€zÔl»[®EY"ÊäúT˜SÖª©ïÎ)ä9û¬Iw-¢’ÙÏËÚŒ‡"vëP/˜ï`öö«P£ IêEuÎïZ­3Ýê@.6É¥ÔÑQ¡¸ˆ+¼m†ÀíM>Œ,¯tÌuº‘î…Àá×ïZÐv˜¸+Á8«³Û[³ÀÉ·{õ•4¡´÷„äKãßÚДí'¨K3–çîÓí×Ïû¼Ô-æ^6ÈÆÖ¶l-£·…TŒZMØštÛô&³bBqÏ¥Znv‘š„§;†¥=®B…Uª»:bùU‰V- 1QÉ6nidº,6¨ÅBÑ“‚OÍCI I±ÕÈ9úRÜb ´œŠFÇ€xü*טVÐÊû+Ì„"ßÖª[XM éóÛ÷­a+‰øÓîcŸoJÑ;ha(¦Rk6óŒ÷ªSƒ ã‚kM¦'i„Ö\ì$“Ͻ4c5brÍå|¤çµB‹€Ù$u©ÙJ[îëÅE$)cɢ䵩£y`dqO˜û”g¥W}Â2Aè8©rÿf–#¥CÜéŠ÷lGçÈOÈ¿Zl¸nà-–á¥;ׂ­4”ùÀzÚ‹‡³º+ˆ²21Z‘`Þ½A¦¡Pp)ñHÈäæ‹‚I• p­ƒPÈ„‘—©¶ iŒ0}ªÓ1’"ØÉlÓçң繧a¦\FbëëŠyVN<Æ*{UX¤=¸5iËKÞ•¸¨Éd=‰©|õu;X;g5Fky#9Ff>犥ijÖEØ,ª¤÷9¥kîlE;6ïº@êW‚|À =TXã4rOSIh²yn²6y=h@÷.Ey/L2hóüÆÂä{ž•Q­—»`Âþé*{æØÚE¶Ë.S|µa—éP‰ »¾• ÉÈ<ñÚ‹ŠÂ"*å£ÇÒ¥GÝÞ«ïœ0 ÉÜÔ€Hq»jZC±cê)Ž@8ž œr>´4jÄ094®P1Á4¢0‡åzÔ­³Ü2*CûÅh#Ú˜Ø!\nÅ2I@QÐÒÉ § Ÿ¦j¬ì â‹ ±ÅÎà#½[ŠdQ†nj¥º\7J¾ªá‚ŒwÍ6•%Ò¤ß×5 yi’¥@ïMÚ€‰7çq⋱hJx0ëÇjWŒð­ƒM2c#ª¦âEfù2;U] Ìq`çÚ¬•V^GÅfî¸yA µzŸZ´“>ü2œc­$ÐY’8Ö<ŒÕ&·ÝúŠžâFxÊ) ïQE#F¸<žæ›ŠŰuÉ¢)09«3|ÝP$†ã¥4c%g¡t\•_AP´Å›*sUŒŽÆ8¥†Ý#Á Çñ ¾ãü× siñ®æ-ßÐT“!1îTVßë=C5I&ZQ*®U€ê9žF“ëSÜeaÂ.~•R(rÇð¦‚[Ø«!’)wãêx¤.™ÏjeË–r½Aéš­ 2žj·0æ³±8—©eP±Y¼ÀH« ÀÄGZâô0–R5 Á5Ò¨Qlîk™–Õÿ´C€qšÝMÆ0¹ÅT‰¦íq1»P\Êr”ù¡Ëœš©2Ø4¶_°•Õ)>µk2Èx`zÍA´ ¤qV„¡"ÎNiX¸ËKLê08ÝëQH \–ÅG¼Òg“VÌ,À ¹¡è 9 µ}Äy«ñ¬1* 7rj¢Úº¶r)5,Ö)¢ä“»/ËÉô¨aiÝ›®j(ÒQÜÒ–•ÜN*nkf[eB2½Ë8òÉ$u5@¬²do!{ŠraÀQòИ4ÍÇSŒZŽ[d¸`3íUNçËn úT«pU1¸U\žV7ìò¡ýÓŒz5<å,¬‘Ò¢2³¹Á?QI¾P¿ë8¥t>VMç"'Ðö¨eo:&YŽ(’Ø'ÔÔ•ó„lÚšd½ vÐÁöp„‘À>Õ¨y73 ‘Šdò—º!*Ž f§”á·…Á¤ÌÓwHq¢¨ÚG wªM¬®#‹çÇ¥\%a“÷r—ÝÎÓSÅæL»ÖÜ+Ž2{Òf‘¾ÆcLóÈ&à ô7Úî]ü¸àc~öjëÅpèHÕ¨SDRB7Ç:ž¸£a´™UƒÚÎ]¤f Ï>ž”‡A7Fñ1•àÒ®CûÐq ã³R92 b‡¦ÑÐÓŒœE()™ãQ6ö{Áh«6Ú¼+ÛË´>ö:SRÖA+¬öÎàó“Ú§î‘|–ÛÉ8çµ6Ó3ŒeˆJ•‘%RTwžj[›,L%›1Ò¨O¡ß£y©'”3Õ«Xµ{fH’DÏÞã&‹“z ¾#Uù£y¨ìj¤VóÀÆyIÝÇ¡­É¼ùЂ¡è1Qy2³…|¾¹ïJáÉ©}Št¼‰È(>dÏZɾ¾çó¡Þ¸e"» ô˜æNWš¦4‘ç.èTg¾*Ԓ܉S“luŒq$xÆг+µ6þ5… ÆøÔ©!–¬}µ‹|Ý«]NˆÔJ&ŒŽ2”Ó•°˜^µœ/AÎE$w3’]¬eÏw¡¥ræ´’n$ƒPÅ1S†<Ò»„Éð¤^È™¥VŒnŠt/»äUBêèëSÆ…GZ”¬k{–\“Ú1ŠníÉ“œúSD›É\â”è0zU&D£¡ eo”žµ™•nOj«ç­Xˆàf¦F°-‚;Ó]yâ‘8éÌN8ågv^H§$Êà¼ÓŸž*±>[dS3z†ÿ7–BjûÑךš*0MM\tIƒšsõ©qMt4î¶!wzS‹ç’ ™# ô¨• Ç”k"¤¬ZJx¦sQy›œœsI!Ȫ0¸Ù†£A»©¦63É➪1Á4„J¦ :óNÂ? àÕo,1ÁàÕ˜  !à)ùªO+šFÓÖ‹”âL®TUˆÜª¨C “r(.%´|ŸjV$7ÊEUI=x5(‘O­+˜æ~ÄÔ9ëÚžýsš‚N†˜¥{rjLäfª©ÃsVS¦h&:ˆ©«9#ªr!ëS[±Í-‹Áò8íFK ‘Å È\švì.j Íª9­7*: ÇÒ”`ž´ÞOTR/cÒ¬asM,Á eeOÍYS· ÔR ¤œqUDÁ_¯ZWMù †b§²Gµ>ÛsœƒH°)•Š“ÏQÚ‹‚CâÙ´ÒœXòŽ *Æt¡ˆ#ŽÔ2Ÿ’Éf š²’ŒìJŒ©có`Šk0S ,W¸ºlò1UŒ„žjc–ùŽjT·š¤ÌÜ[a¨ûUÈÎó’ÇiíT¹ šx›`ÛŒÑr’±lÚDy$‘éš_!T§=*¤s‘’ÍÈì(kÂxi&6¬ZKÀ`wª¬\¾Cwª“Ë.w7éP£¹~Iª±“™°¬qÏ5'ÞL÷¬ôœƒÉ«‘M˜Ï­BÖ¤NBåZ®ÓdúRÎç~*'Òš&O±aŸ1ü£&¨H¸njK‰ž$_/žyªåŸ$ž”#9’ya8§D8¥1s"ðqS ¢Œšd¥rÌ£l\JÏFhäµHó’qšbƒÉ"‘MêM%ñ\(rn|s“PËµŽ Æ*x¶* sIž¢Màæ«º’ãÕ©n0 â«$ÙëW9µÐ›nÀ3Þ¢Wo3ñD· œf {…Q‘ɦgr錑ϭ)€ëÖªÛ^ [iàÔ³>ÎE ¤Ç£o95 ©æH1ëL…Éc“V7çƒFÁºËÅHã&£ßŸ»V-™³É›*».ÁŒ³#¹h 8#ŠŽ9NÍH$= K:’±ˆæ9<óS"¦7צi­2 þtÁsU±Ih7©:•S †|²‚;PÓ*Ž4Æ— sC@˜H8ÀP>•B­¸±Ç÷iâSŒM2ç‘Hc€ =(D Œ Ôm ¥ ¹T#u4ÄÑ0Œt#ÆÚ¼â›ö¥$žxªwrÌu1Þ“`‹I R­G,wBܨP­Ûë-î/QÃ*“íšÐƒPÔ"|”JDÜd4<<ärl¼\ .dü|<üþü, ,4^Ä ¬®¬LNLœ,”D<T$fÌÜllnl\.,\, ÔÖÔ,6l”FD<><< 4<\L*\zü|><ÄÆÄ\^\<L|<\<< R¤rä<,,<üt<|üüz|<¼< <*,T*$¤RL4 *Tìîì^¼J”Ìfd ¤L\,ìl<LdäìrlÄ\!þ0Creator: PolyView® Version 3.62 by Polybytes ,xÿ½¸gG1*\Èp!€† BT(q¢Å‹-2ag ÇcÈè©‘%&M¢<©2åÊ–,_Æ„s¥M˜.sÊœy³¦Ë8y¢ÌRC‡11P’'ͧ>mF úS§Ê¨=:Z5k׫Dè|d#æ$V«g·JÕÉÕ,[¨=áÂÝ7-|ê8TFEÓ¯Sev­+µî`´‡{ÕŠV«M=Cæ°‚¨ï'µ4¯%œX¨f¨réN{5gI{!Bdã¢ÍŒIÃFì³ôg¬vƒÆV̇†tÙX¨‰¢O‰@»Ul»ñfå[ß:MóÌ,|Žè߶ɧ£ÿlœRwxÁÒ—Ï^·áÙ†sà¾z¸e¶fógίŸ?ìšþåà€ÏØ_bW ÝpôÙÐW'e¡AnHaá…f¨á†vèᇠ†H$õæ’"ÚmG\e~Õ †'œÀ…Ð(c…Ôx#:rqŽ>θã4òh$Ž:âxã’EO*ù¤Œ2r±†±\\ 2¸"ƒÞùÁcŽ?ùc!7’™dŽ6"©&›h¢i#”r²IdKJ)çfî9gšqþèG#Ž„¢Šô!ÂC&~¦ eT6Ù#ŸA*ù¨¥vÎig”I6i$‘—rê'’™ÔÐßK ²¶b}60c‘9vÿÊ饎FŠç§šVJ)¥uJúg›˜2éäž…4` s8 È—ö§­º>j&®p"9d¦dâZ«§Ä†*í·=nZ©´aÛJ©&JÜ·J™k¯âÞjë´™Bzd¸íI/¬@Ö¹¦®5r²‡Ö§êpw8 ï¶–N«pµàžë¦Tb¬¯BÚ0·ú²É¹&u©êª›üÚí¼¹Ö:©¦ÖŽ9ñİF»ï™ïR›¤°áXÁ3˜°ÍÞ: (¸Á¾¬É˜Ü ´Ò~Œ0‚¯Â«´“6ÜiÅ1C|ÂÇ\¥;2q›à;.½²Žº1š'í‡!8ÀP"·ÜPA3$H&ghÿ’ñý–=.œP¢,£ÎP)ûe} WݦÆß:Y)’B`rGPAIœwîùçS"]( ›ööùçÆwR %×@¥jðÁ?÷*9á*ïZHi$@…  /¼ç‚P‚D7D@3¶“³ k™<:Šø©Š«¸ZÉS®9o¸bù . /þøœ»ÀÄ& d»©ãW»¾çTáàu¢6ü mÏÏhµ#¨€ðä  ø(1ƒœÎ_Íï¢U£é †g»žÔÎT¦8Ñ g:CÔ ÀŽ/+8 ¿FHµ4I¬p›0ÐID¦®ú.k@“X&ä Ö07¼¡;'IœgÌ#œíÿbf„øñÌK[ÆNv)!p ; ž£è‚4ˆ k£œ°BÁ$Ã&îà‡MÄ`šS£çä0‚G:¬}ГcV’•¢¯]ÏŽ»–@…¢É«˜Ž@„'è0hDÁ!™À&Á'^dÖÄ&±~ ‰ Lð žðØ -ƒ€¢(] îáñYü:aª·*DlBeöÊâ,7'@JÄ ûƒ2!Qæ!º3™,o”ÿ¯ȎY¬ÁÞýœW'!$ ƒjˆ„&ÒéF3Ý!|ƒÄ„óÄÈD4ñT‰ 'É¢”'ȱI  @Á¯æ…ÑG¥ V ¯OEéýŠì"8;ÊJa«‹0‡75ÉlriºA-ÕÀñ”—šÓE£8u™óŠVS<(?èiL³( !J8+«ÿ“¿RX”ÌQ6…ãÔ(6 ¢šh±¶è#1ˆ2V}fë(§¥ê¤©®täÌ~º;$ìPg0Yàò—†’O `¶$‹¯˜öä¬#saÖЉ¤ Õ†yhS'«;°3ŠË$¬devÑ VE Z,µðÙÿš¡c÷:i(éÁ ¬õHGzt µrvOeذ€$„¶îpª«hšì*Ê;@n˜8;\c»¬§®`}ç<ß‚KR–ÂTÕˆàö¦‹E“"—cÜrr'­Îä”2Á[áé{¸…e! QÊA¢{méÙÄ©înÇ~q1bâZPfJ?ë&9úôƒjødÐ= ÿðT؈mˆð†`”‚SFÚ"7+äD⑹5FýËb¨mç ‡K(oe’«Ø"Ñßrjƒ£(p—tâ–üsU6ˆí›*H'-B~xÃV½j\à tY¬*ˆ¶ä Ò¤‚DgmAõýíV¬I W¶7¢sµTZƒFŠha .!™b䃈 оsçÔpTúв”¯y>A;rø»7hn‹Ô;„àÝn›ä@ -‹ò1œ†Kq&n>ådMãXÖ¯¤ 7Ás®=ÅW‰Møíº„î5Ã,›“O+ÓØ…ÛpE3¾0…/tP˜A&4–=4ŸTÈ£ÿÑ(±¯ß[P®û‘Ç?>^ žùÝç N¤?#³•l,MžNm½´3_¸* ’ªŽ³.•¦÷W€·pà?6ë¢Þ'ç’·ƒ.H@œuRT^™6šïeÛ33ç¯eÚõ5óª4 ¸Ã¦–J†™2zÃ%˜Õ],Æëí&\ÌcŒÃ(ªAnÀy¡—ÄpÁníöø”‚[̾S § o3ÍyXÀè1‘l|¦º°Ÿ¨sB|[8EjKË4ó#8öëâs `¾WÀóŠ‹]cûÁV¬ÄûÝ/çx4B”¿‰Møwø$lOó„bza‡„£ê_òZbK<¬>¥XÿáJÎk˜AOgž@sJˆá«Kô)­¥EÖ-Éèå&´¥~tÃCëøK21PaE äm“Åyl²}*¡r`ƒ]&õy ô.nDP¢€{ã#"956>2_UAfåÖr³v^û‡G(#]1 A âãk€vÞ¦:CÝÇ8ýfp*w'OíÓ- 0(<2°{|·X…×i,‘b÷eR _еutå.Ïëe`N‡x5ãoQá`:¸2 øLJÄPáÆ>çÕ¸@”`EE7,´Òá„דiegr/#DgVb6'šÐdö˜-Ãtƒ Èz]Ve7ÿÐ}€p Ð{`æbW$ƒP„ÁCðtT›§#1õs™§YCt7"R ðKa—K€×-n²iqrvæATPJb‹–²T=†qä/Z öö9”˜ @V5#F[ö„Wú¦>q4Š2‘bªbS¡˜N?L€{‚0>Pp£õ^’tD Verd$­õ‹ˆx_bHA|Ç#pŒÃƒÐ´`±‚ŽwF îELów&õ Ø(p)H†±rH>T &9—U©´)ɆVEˆ³Ø>ïHdñX‡ð’n72nÅR#¶gÌsI>És˜&–…b†Øk4Âd;ÿ$ƒÔ({XD%Ñ$JPJÑe;½hD©YôB†2’ •°C¹Ø‡Ï2{4`OO©VAH# iNê&q4"ø8>¹X“ÿçFžE7ÔSoçQâW«P>cM(E3 BoUŸ’ ·hC݆/°÷$[™]9hI ‚°†Âóö˜ç–#uW9ÅdQ)w”fvvQWið—ã7°#vfSÒc)@EÀ:Θ?iæ3V–’>0T0ø”wø0‘"iRQT Î{¬9$wP°p ÉYeSÒÿæ‡fà&Ù†Fã… ¸+&—-qœšÇˆj• PàA`@Ëó(D+ДVIeÆ–_àT˜+›æÔ“9'˜`Xã@ ?$5kE& €·9<:D ö³>Úcr1` &!Ÿõ³a|rS›¸ca—gP‰€ƒ&#pn@œ< 5ƒ4øe:ô1p:°·nzŸ,A¢§Nÿr#B5zdê9jp¥‰™)…g$ÈvcÜr¯úƧ;ó‘ ê–½gH–È# :O¶°Â :GP Tð ð4<(®»ŸÐ„õpõóR}…mé0ZÐI`9Gp÷9º™gXy‰7­òò.ûº?d† Š;Xuf\Š$ºbëM®³¦DÕŽAŠ*¸oÇ2mŠ 0W UJ)‰ylt‰n\țʵYŸ2‡A¢V g=øcgk¿Ç³e{3CD‹ù#W/F PÍq >Š0P‰,ƒlèªsw‹doq€R¶·ó’rв$Šž Bð·'·#KĈoúeSŽÂBÐÇ‚’Š «±"Ð7z†ëfn’®Ú{†Û‹½¢ò$šÿ€ ?ູ & 7à~°¾í˾î¿ð;¿ï[¿òk¿ô{¿ú›¿ü‹¿õë¿ò› ”ñ _µ£Û3° ÜÀüÀÁ<Á\Á|Á”‘Y<ð>AG4…\Ô3ˆ2Â"\Â!|ÂH„Â_“Â,¼Â.Ü ¬ñ ô¥,NÂ-j8¼8:l=< ®ôÃ7¼Ã>ÄÄÁ+àRAQ°"L?$¬Â0ÅOÜÂRlÂT<Å/ŒÅ^b+P¾8` ÀPÃ.,Ä@œÃ=|ÆfLÄCŒÆmlƪ²†P¾z€|ÀÄÝÃVœÅ{\ÅP¬Å€ÜÇ|¬!ÇŸ “y ÆŽüÆiÌÆ<É’\ÉnŒ\r¬{0p€ìJrùÁ¡<Ê¢\ʤ|ʦœÊ¨ÜÂV°ðS@‡ÐÈ)œÀ¶|˸œËº¼Ë™·Ð›œ^`|ЀȜÌʼÌÌÜÌÎüÌÐÍÒ<ÍÔ¼Ì*ÀHá;rmagick-2.13.2/doc/ex/images/duck9.gif0000644000004100000410000001422312147515547017415 0ustar www-datawww-dataGIF89a´´öz!0++%.+&-,&0-'fBZ_X]_Ydb\fc]Ž\¨m«nÉ‚í™óú¢û¢ÿ¥“Ÿž• Ÿ”¢ ¥¦¥§§¦¨§¦©©¨ªª©«ª©ªºº®½½²¿¿¯ÀÀ¶ÀÀ¸ÁÁ¹ÁÁ»ÄļÃýÃþÅÅÀÁÁÁÂÂÃÃÃÂÅÅÃÅÅÅÇÇÆÇÇÇÇÇÉÉÉØØØÏââÑëëÕïïÜææÝççÚîîÛîîÕððÖðð×ððØññÙññÚññÚòòÛòòÜòòÝòòÝóóÞóóßóóßôôìíííííàóóàôôáôôâôôãôôãõõäòòäõõåõõæööçööèööè÷÷é÷÷ê÷÷ëøøìøøíøøîøøîùùïùùóôôðùùñùùñúúòúúòûûóúúôûûõûûõüüöüü÷üüùúúúúúûûûøüüøýýùüüùýýúýýûýýüþþýþþýÿÿþþþþÿÿÿÿÿÿÿÿ!ù{,´´þ€z‚ƒzFvƒyzNjˆzX\z‰‚dR‘ƒsG–ƒ†‹šz”¡˜¡…‡‚‰ž©Ž’¢•¯¥¯§Œ¬ ¯£²™´œ¬«–¹ƒ»„Æ‚¿–Á‰Ã“±—½„ɪ·Â®ÄÏ‚³Ò¨ÊÕÌ×ΤћÝÔŸá°ã¦ÓŠß­¡ÅÇܶèñÙzÛåõ¸éòùä™sgO>}ùY»·Î×Àeð šš×b3u¼Ø=|wñÂZÀ8ú;¤·‚ØÒ ‰R-Š„¦Q!8†ÚŒ˜2çÊ“ýpÒÔÉ2¨Ä—Ç*Šª­¤R™Æ4ÚsèÏsT]ZÝWtáÑyW fÙ´f×›_Ë굪ڰþGªäÊ­[dFòêµQD¯‘#<„Ñ‹ÄÇÁyáÄo‘ˆ÷öÕ X0aÑ3v Ù¯¾~+G.|˜òâÆzGÎ šràјMoNÝÙoëį/—N|Ú³ßÀ󡼎ž&gôü6nE‹ž:¿õˆ©Ýž8Fž^üxòåzšk?4}üõìÕí'¹r;ÌW—Ný÷ùñê¹·ÿ?¼üèåUw_zëuçxâÍ pÝÀµTZ™UOZ½EVmUáZÚ¥áGOõX!fHÖ†BE’„Rx"ˆS™‹bɈ‰1zø¢T;u´"‡5ê8#q1…â…Aºþ8bL6YHMÞq\‘ä!%[èq“zŒQÉ–‰”f"F@ɤ”MPy¦#Y‚Ùå—\Šéd™QNYå•mr饖qf2æ“u¦y'›|&²§›rrIçš‚®‰e¡oÊeR9*ùcŠ"^Šd‘ÂØ£\>múà]Š8aª©OðÐÄ©NHÑÃOœ*BHqêDø`ë©Kðë­ª²ê*¬²Òº«¸êÊj¯¿¢¬¬¯6;k­·æz¬̲šêªÐkê´Ç&{m¶Àrûm´ÅR‹ªµ¬.¢Æ»ï®!ð¦1‡^Àñ®½RT!GïʱEs¬Æe ‡ÁÏ[ï½ùî;G¿ÿþ]¢š=aÒH³tÑ¡:4¨[Y$ÔY½5ÖjÍ)©0}j¤§Ds¶×cÈcÚ`)ö¨VÙ$™fZi§£y g˜~Ι7šjêý¨›‡ö)) ŒŽ'¤‰¾ø¢z7jxß‘"¸¢ƒï}9äO*u¥jËÍ6Ý;ÒØvêD¢>$ÐL›‚Åì´gáô_¡RdA»iñ»Bl;YTáƒðµßžûî½ÿüðÅŸüò´#ïüìºóîûìþÀÁ<ZoüìׯýñXt=øÓƒo¾õÊ«o;ûîO~üäÏŸ= `~°…n! B¨‚xÀ%8! üˆ†r¡ YøÁxA d`AJ‚Ä 98@ rဠ\à GøÀN°‚TáèAÆP„$´! s˜Áæ°‡3üá ƒhº”2[§Þö´¸¡­Šg£âÕ²¨:×Ýènœ ”ã…¸¿EèO”#Ü §'3& ob\#æ"wFÁÅ‘o ƒÔW¹1²Ño’ŠÚÔJwÅ-N±‹*R鬨ů GR¼K!yÈÖ%²j§»d×þ7H‹–Ì”"#é6DŠ“œ|$VÉJ3a ¬ˆ …3¬R–N˜`I†3`á»\¥¾ „3ð’ ®<¦,iiK2àR—¼ô%0y9Ìb3™±œe-o‰†\³—¿üf5ÙÊWf“™Üôf4ÃIMb’S˜æä&:ÙMh®Ršß\¥öÉÏ)ð ü”|À„)ð“ Búy„,”ŸNèAûùÏ€´ MèC¥0…†nÔV ¨?zP‚NT e¨CÑ“r´¢%Åè>ªP•~´¥"…éLMšÑšî³£+ hÙ>YIØQm“‹¥Q ÙÈÕ- Œ|T#˨þÇÍÁ±qrÌ£æ&×9Ë=Žª[EcWý8G7Z5ªžûj9T,UTš\[*ß:·¸šn®d‹"Q%ÙT/Žr¯¥ eÐP™TyÒ­|5å`‘JJÖ-•‘Š-æ@ÙÊÒo¨¬ð°2Ô²rȲ€9PÖ^pBL;:¨¡v`mk1«YÎz´¢%-kQ«ZÖº¶²½lfAkÛÏÎ!´£-íiS»ZÊþ6¶–¥-q;k\äêv¹½uîk¡ë\é·¸¸Mîn™+[Lá¼èµÁ_ÐÛ«!,½L0Ì{Ï»!ô€ èÌæ›ÞõÒ—î…¯|Ùk_ü¢×ûÍïÔ›ßþöò7¾?ào}ï›_ó÷¼ f/€<`ú¸Â Îo†ÿàóBXÂÎo[ ™XÁJ–±€u,\O cÄÖ ŒWícVÁª8±Þñs<–œ±:Õµ†ÕŽD²‘{Œdcda[üX¥Îx±rr`«lØS’ÊW~q–ûº0uÌ1‘—Ú´LÒÍ6–q]ß|W-Ÿè°,Þ²™™Ù3×™ÌmÆkÝ<ÚÉàÆ2y!MfzC›Õ|ÆÐÉM¢cÛÙäE5ž¹M¤mEË5—®dB#éNSú/Œµ£5-Ý,ÚÒyaÐo ´Ÿ÷Äg<ô1vðCëþ¨? P}¬³kþéÇ×ü¹µ‚†= í°Ù¶ö®Dlô8Û@É–ö²ñÓ =CÖÅ~ž$›ÿç2ÏË`q3ºÅíWšÜy–³ºÅœnAËÛÞæžw¸ûjWvÛÕnM–ª’¡Ìä0&Y­rÀÓJÆ%+ÜàNxæ žc#|âNÒk¹mç|ã›ãïvwšoÔ.d=ë\Þj•±ª¥,^ùJ['oº¾µòuµÜTär–¹džrp±|\//—°f®ru!‹].o–Éw>,iÕüè77•Ïâe³œ¹,g0ãÆF3ŽUÝ^WYÅÔ`²­§lcT÷˜Õq&ö˜õŒë*óºÚÁÎv½ì3‹{Ú[V÷¬“þ]f>[s»kowä#‡÷—ë&ø~ó›Îþ†üã×=yzãyñ÷>¼âÇ-òo~ðˆ€jþGŒ×âoxÂO_qÒ—µª\ýñÅé¸ÇÑ{Uõ—Á|nzGžò}æ3¸Kçˆì­ïyÞ“žø¨w>äÕ/{÷Cþûö·|ùU}Ïoþ §¿ð¯|×w>ö´/ýîóüÍOô·×>î+ÿûþ£èB†p‰5lâ/XD"Ñþ2Ô@ùÇ'„Cü·BÅQ“Q•Ȉ—舙HST7õ‰/ŠuR¤hS”èR#eQ¨‰¥Ø‰ü$‚Àç…C¨oE(„tŋĂ>ød¦W{cõƒÅƒÇHŒ0{‡{Í8d7{¡#eHgY˜„œ§þ ÷g‰5Fhx×èOÈS¨‹U8:ãø{¾Wy)ˆŽ¼ŒTYÑ5\ßE]áu]sÀ[ÍÕZÛ\ÞµYøx\¹¥\ûH^Ú\õX[i]ɾõ 9]·Eâ…]ýø\iY‘9^ÙUY †aþu&`F`v`!Ö_ ¶a(‰b+y^¦`#f’0ibf’)F“-I’/YbGpb*i`>ya V’'©“)éa3y^¸ØŽTÇ…¹Ž_$zË(qѸp.øzG†z®Gƒ×z_I–=¸•ÔÈVV¸Ø¸…Zè–ä˜o)——'—ìøŽXi•R Œ×–ݘ—½H„%èþ‹T©yàh˜'(¿X•q˜îH|„öh¤ÆižVi f˜fÖj“¶¨k›9j®a™§¦™9š…V™°š¨É«Ö™¥v™¡™™† k½f¿¦l¦kÖ6kǦ›ÙläÁlÅvmµ† ÿQœ¾ÉkÁéÑFœ¹& Ç œÏ&œÑ¹œÓÉ Q©—Šy„ßhŽ]¸—‰I˜»è˜ây•ß)Žá™nŒy˜ë™…iž‰˜„ Œj fåŒÓ¨Ÿ°'©÷‚û  c‰ƒÆ({þeÝ9˜ï¹˜èY—9•uSrÛ2t=÷tâ²,A§sêtF—¡IsLGt>gs@§tÚ-.H‡sþºtš.,uîâ3,s3!ÓvZ—wh×0s19jwngv]·w8ú2;ówowv5ó£a'¤;š1zç£|¤~‡w˜çHžéÙ—\ ¡ÿ¶ óÙ àyx‡À :—péždÊžå¦10àô Ÿí™ Z‰ úŸ^yƒì—?##à}ÌG?㧪ÛWªÔwªé—ª›Ú~¶ «Ö×|³3¤€Ø€˜8¬È€Lô€û§CþG¬ T@ƪþ­èCx­Îš­8Üʬˆ$¦ç)©lê sZ§jª®‚Œ{úŒ}–f ¨«'¨:F¨†Z¯ˆšŸþZ–:ȌՈ®õŸˆÔ®•º¦ñúH‹§qº®Œ °ïа~yg©›";¦ +Ÿª†ÈD‡Ëdˆˆ‡â4ˆ|¸†dx²ˆ˜²{8²}XK('à²à”ˆã4‡3Û²n˜³0ûN2˲édO@{L”°ˆ±S¬‰œTû„S–(‹£è´¦øŠ9¥Š&­(‰P R°Øˆ«ØSµ¶R ŠTÛ´›xµB¥¥ã¹ž—Ê®”Z±yÚ°†…Ÿ| –ÿº·h©¯jÄþ¯‡*°‰º–ö:°ŠÊ–êx· {°,ѱY¤p©eJ—õ¯ ±ç¹i¡@0ºÀ–Ê—~v—z±pÚ¹u+I°@ºpºùoôØ] ^©™Ü5[¿Û ’)‘¾ËžåÐÉ{Z8p³;ºµ;°½ *Àû‘‘ Ù¼Y]Ó{!IY#™”AÉaMÉ“OY“"¦”99”;9aF©_Hy“DI ºØ Ú»½ |»à¿÷K”N¹¿ôë’&”,¿û› p«ž–ÛºA±7 »´‹À \ ܽ ¹þzgzK¯|K¸ûÂiGüº0 lÂ:ÌÀ1ü·Êè·Aö¨ºÛ¥ sŠÃ:œÄ%ܽ+°±r;ì¥O¼»3@ºà ÄZ\àÄ|#{¹˜*±‚Ð2ÀVŒÅ[\Â0ºlÆC잻 Q`j<ºWœÅ[ÜЬ{#“Éj³y𩦙¢¶š¥Ùš¯–š‹L™ìj9  °Æ~lÂo 5 ›¦éš‰¬š’|hŽüi¾›Ï¹›ÚÖ›Ôù›ùqЩœÓfœ®œ›± lËÙ) ˜\Â]Ü©<œÚImÍfØ–³Ìmc|Ç«‹•h¼ÇÐÇ›ìþu<ÈP¼¸‹·œÛ¦h¼V 0ÇfLgª»¥SLÄ„¤i<ºn ÎÚ|cóÚŸ;Ã.ìÃü 2,&l÷Ú¨‹*–gÄÖȸv<·Í|Î`JÎsM'£?§¡(ÊÐ$Š¡-Š-/š¢(·¢¢B§¢m¢-¢1JsZÑ5*wUФwxp×£7ºvVš¤XÚÒMšÒX'Ó,ͤ(}¤7½ÒKZ¤TÊÓ:ª¤[÷.ËlÐæƨk·[Îq«Ô»ûÔî¼¹‰Í˜ûÎdŒ—TÕÝp¯ÉxϨ?\ÏZÖòœÏhÏd)ÄÕü¥ãÌÁS]вc|ÑGªÓç« š«³ºþ«ùó~±Š}}}×¼š×ç¢J«åØ¿*«ö³ªz«-ó×BË Då hDÊ:®˜}š­­âšDÝÚ¬æºÙÑzÙøÚÏ®MÚäÊÚ EV]ÆXÍÌI=×ÖL -œÖöL MÖbÜùºÖc]Üà ֎:ÐÙ¼Õ¸-ÕoЙ+ÇÑ Õèì±êêÔr]ݺ ×·}#";´…è³F{†z(´Ø4ÞE ˆ:«²â]‡&û³æ-ˆ1›ÞðMÞì´Ž:þá½Û×®@Þ»Æë¼è{‘껼å›ä盉þøäÂ¥äR®¼ä[¼WåÁ;å!©‘y™¾Ã+’#éÀœ¿=É¿6i¿k¿ú bý çð+“ü“î[Áw^”tþæï“~®bÎÔW=âKÝ@ÞÛl}ÖÉ-ã‡[¸ƒKϾíè+é%^èŠ>ä4Nä=nyGèFÎéÒýÝ×Üé¨^êˆnã ®é£ÞÜ5^äŽÛÔ…ìÉ¥Œ™°™i¶îj¦ÜhºÎš¼Žë¾Î™Àþ™œëÄ>ÉÆÞëz!k¯|Ìþ²¼m­ìœ°¬ÊÒIÌÕùìɉËÉ<íÆVíÂÜíö‘í¶líÃï¶½ê÷Ï®âŒúâ‘ÞÖ>ð‰[ð@ìpnã<¾ï†Þïú^*"íÑ$=£'ZñýÑP—ñ½ñ¿Ñ.Ñ#z¡%u9£_tß.SÔ0­ÒCÊ£5-ÔPJÔ4¿Ó1ßÓ3/¥.ýu@*óQJÓ:Ow1íÓEý3ª®ï¦.ïo—ñ.ëÛœïõÞônÊÝXïðÝãŒ~Üa}éâ•.ð1ö0¼ð@ÈÜôžêoõîN|šJØmª“Ø~Ùzþ~޽~µjØŸª÷‚ýØ}o~غ*÷xØá¬•ý øÙÇœmÙž½Ú‘ÚÛ Û­È:ùŽ_¬¦Ú®Mùšoùœ®ê>õÝöþþöòZâ’>Ï€ëõ]Yö /öÜ`û‡ï«¿õ¬Ïô­?ݤüU?ünOü°~üÂßüõ. "kß%‹ß(‹†èM²c¸ÞÕÞû­ÞýßÖßý÷­ý/þ„8þß¿ýŠà®áµ.à ¾áX;µLûà`kà ~ÿNÿ¾ÿ€ %EåÃ4%8(4D…8uôÈ(¥GY©gdW™§ç¤¦©‡Å¥·II6Iª7w4j‰ùÙùÊZþzZ©:KéJ¹ » *ŠjŠ{‹z™éÛË*\KIÜzÌš¼¹\)\œ—­}Y§}§×”6š÷µ¥w—­76™¾yë¾iÔý>^~î¾Þ®¿=Ï8qõ@éSÇ¿Uñ¸ ¼WМÂM ÷ýS° Dr'ò›¨ÎR®h¼<ùªFkتbº¤™TÌZ³T+¡½zI-fJTÏ*µ,K§žk¶jú$É ç/\DEŠü™4(Ó™=GÞ”ÊL%.cWO mJs+ÔiK³ò4j™R”Cg:Më«L­,‘’e ¶*WµrwkwíWªh÷Æõ:uëÛ±‚ŸÜ¦ã¿u#çœì¬0ã¾méÚ䋨¬¥@;rmagick-2.13.2/doc/ex/images/duck7.gif0000644000004100000410000001211612147515547017412 0ustar www-datawww-dataGIF89a´´õ;!''&&::+,#/0'45+??5?E;KKYYBC9ffxxOOFKQGQRHU\R]cYae[ooglqknxqtul~~}ƒ|‡‡šš©©¸¸ƒƒ|ÈÈÖÖèèÿÿˆˆˆ‹˜–““—™•š¡žœ©¨ ¡ž¦©©¬²²¶¹¸»ÈÈÇËËÉÖÖÒÓÓÕîîÝóóîÜÜéééçööþííýþþÿÿÿ!ù;,´´þ@p¨Ã…µcQ¹<&F§%V‡O«2;¤N·_)ô*$ë¸e0”if¢ÏSó[®ÖÖ»wdXl'¾çn{XyEtL|xc‚zˆiŠkpD/-‹’~—^“ƒ‘f›}‡Œ¡ed ™œŽV†©¤:.&®¨‰¯§£µ«]¦m—5¦lš[Á„ŸqG±ÃªgÅž¿Î¯Ì¸¸˜ºM¬³ØJÊÚ‘€Û…„â༢´¹¥¿ÆÈÌÝÌ0.íÏãÙÜÆÇN85Àþ4üõHcà?iD°€ !4(˜ÂŠ 1.4Ð`¿#Ö(làB†1"txñàȉ]*ôÈÐäIÓÔ‘ƒçî^þ+n½êé泜¾K¨ýܵîÓ:—êˆã^¼¨ï°*%”[5©WÑQëI䛨¡šö½ Ëî\:¶øly=j®¹!få6U«·ˆ]²ÒŒŽ³vw/ß½„ò>-ìjß¿ƒ}Ùs»X0e–ñʪ+ÔkPž[©­ÌXñäË3rt(°#•.'R,˜úåA7-®¤â:"kÒ­}›þØ»¡Ãm—Þ=²¸ò‡Lhü¤J’+Dý|îR}v|Ù϶åûö2Ý›JçGý)Ú¢“±œo ÷Óá¸ã‹Tò{iŒ1f_gM)†Y8Yåƒ`déô5 hZIÃ_$ŠáW_‚•_ƒþD3ž‚·Ì·_b›‰—á-Z8Ýeþ͵áci-¡f€Ñ—"d!¦õÚC;òØãq¯½ÔcI;ÒVäH 4äD¾fdM"·dOòÆ$’Uâvå”HrùÚ^GQ_fæuFX…ø8fš`¢™&™…ÐÉf™kÖÙ¦_pÞé…gT7g˜E¬wf˜FùçšA"zˆóYsß"âh¢ŠšxàZ‘¶xâ¥F5ifBTªgb*aƒ6Z•ª€÷ÝWa€5:ö©a÷tõ”¤¤îk¯¦öúàZµ~ÅjcÃ~ˆXh—ZZj‰Ê"#g æÈL6FH—f¢Œ’Ó'šeh›†¸‹‚¹Óšþ×ÅÙD¶ip‹ ýœ+îäºÛg·ñn‚Ûº:d®™H\]¬é£kPÙ¤q‡pj*d–$ùOÂ;JlÒF–ô°lg,dÃNFÙÄn ;j|ÑžºëÊ3*»)ˆ  ë‹­²ØëÂŒª†ÿiê©´8m-Šð,Ë#¦ë}I‰ ­žTZë¬;[iÀ̾U«ª.(¬7ÐîZ¬Ö1ÛŠŸ®¶[­|í½­¬ 2L=6ƒrûj··[J%U”I(Aì·à¨Þ÷á)ÓÅ3A~±E ©†s-±V±KmŽœF“nÓhoä—¢Ëz¶7È@à y×ç3þ}"-ûÞiS*#77°0À¼(Ì€ºî”™^u®NÏn´ƒ§âÐBÁÐ@xÐÁoìî¾zÎ}­]lÔáwMþ*(ßÁ%Ä/ÿü#x@=€ïìÚ¨Cm;]Í:_Ñ’àóK K Ïûs[Ú’¥6¶!XyãU8B¼,ðƒ ð&p¡¢õoR4©ÜáGºÌ]&+4‰HjB9‘î#HÂÎÀ“ÁäRrΑ7€‹‰æZø·¿©m®’·” >Ì¢ü><ðÑoAã% ÂHu-#B= Å62xÖß­þ”§3V•0yw¬4pE7ºH@úêƦ]Ker,£)Äñ4À~ô6# ô™M}ñ²#ÏXH f"Àƒ$$ €H±mÇÃ5,¨Êþµ EéFò”žääÏn1ܘ,6Ž;Ío| 1Â]®—'3JhÐ’ >FDÞncm”4¿ñˆ4_ZÜ´A0S¬g(‘úƒ ‚gúÑ– ×ʉ»NÄÑòl[zq»­Ñ±|s@ܹEîu€‡|êÆ´.kUšd!LJ,Ál$¨…çÁŽ'ؤÚ* F¯5ÔyìKþ€ÐgJRxÀkip‘(×úßòð˜È -LÝ÷A&2•%ÅÍÆˆFµ™Á‘µåP›ùAIšòhº¼$DYá%…lK_ «“ºV*È * ðA¾ «@«WW¬GÞ¢ 9ü§’€IK_Š«W— (? j[ì¨;7 Óv.Ж)`GaÃy¨m HCà뢶å—=á` øbÚ«Ê€´ -j¯:•Сmi…@7×aµ¯µmëN© ï ´ål[ÛÔÞÖ¶:€­q“[!¬Ö´2°-p[å²ÖÀîU[€]X"¹ïfp€þÝð!»Ù=/z·+Þï ¼æ-By7Pønf·A- «ØÇ áu/|é+_ñÖ×ÀB°ïvË+`ø–¡¼%²¯I¥ÆÓ .¥€³Ìo!»ÓBöóRPìÏݶ* ¿öáGéU­R zš §e¢¬5ÅmdUVá ¦è\ÍøWŸ‚¼®,¤i^‰âÀˆŒ.oáÀ±x8¹¯VضÒ5's]ù¯ëÊ×_CF±(ìUK.fÍ…é6=Ê¡”³Ø½„mcŠã˜ž VMÙä¯=u•…/±vÎ9¸ €M‘ÊT‰Sf(}åÎ ÜC/‹/8êÎ$íèþ¦:ôyÑšƒejéøQR×"©vŠâ¤~:¥#½hFK?š`©dZY9@§Y?%õ¡»w\gÔ¨´Ù£“=èËt£€l¥5QðéjD°S[èÛ ÂgŒÀ&› «MK‚ãgÌQ²,õG`Íߌ[7åVãdè‘Ä.p›Ëçúœºé^ëÀÆ,µ4õ®úá?ThÊÆ¤ó(¸©\Êü.²Í8Ç|æR©r|uÆùÒÈ{±“ôñ«h­_Ãú”R_\\<Þö¶{eCu‹‘­N°Œ$ßw#1JP.‚ôlµ*xÞTcWü¨ËÛ8‚Æ iÌà鈺Îþy;r—Ë ãŽ9›Å!SëÛöæ ø+¤@b‰ Äë;a¸äŒn7­n4Í -hW7xðÀdJ‚|€±ð"Xj7rV7Ïß<Ž<#ppО ‡j ^V@†ò*ÿ<ôú=ÑQä`)@æƒW€ À!hÁU]éjªéã>¶"Ë1ü´z €€>‚â`{÷^ šÜTÿ5¾ôüÌ9Ê—mÆð1x(;Ó£ Ô0X†õe‰"(…(®8Œ…Åd]fYkxq‡¿³C5ðç‹€„‹>$I°sB‚|Ç*ZèOf@pc½¥Ph5?’4ˆóH¦d{ówpŒX>U˜;GpÔ3k´ôR ðq@äŽò#BUa~~(R«DtmX ç‹”€†ñŒn$Bñ¨Çftæ£khƒ 8ðSéF#v(¦@¤äF\t‘™‡ô¨OQ“-C¶dðÂe…‚|•t%©E$DW$0PmDeûr|õŠæ¢/9¨/HÖ/1‰/yrŒqWe$#‰OÒ€8€nüèF/EZDUþmTg£ÈcfovW¥8VTb–"“%Ïi)tØF"¤t~Už8à‡†Æ—JX#µäLïTˆdKцˆð]×ö€™+éOÌôp:É} dK[ B >´çOª丆$’ äsPHKeš™ `„IØ’°™7'>3€—ZtH™@’gÈ’âçxáàl†Ž=w‹_ }7†m|CwW:DTC2Á…¶™ˆÆµ¤Ž)I+P8tçÃqß¶]w Q£žPÔ‘¹J"™n.<ÿ˜E¶$±ã—àÇx5s­P@ÞÙV†&JÙþ› Œ¬µo'÷™'Žš6 @™ZÄEÚ¨E#ÙA€‡h‡”† acs™EíXK¤Cäs»øL€Än9¡øHœdrSaŸwy¢Ö<¬©E ¨xQ Qº‘ Ž™€_ï´ŽúŒ˜Ø]þ4šÍ7ŽK8t4 #I¥Xšø§ D@`¹ÖIòYmPsLhccº@½X™¡¢ä@À][˜‹ˆ¬>L¿toî¹MÂÄLäGÙ˜v¡ÊtÀ£~†MøöMgÖnxM–X2Þ:ƒµl¸7÷4HÊ•DT/ÅbÖÆ8ôÄß!Qàx¨þa¨—7š@@”ŸQEJpN{š"Ʊ¡§¬bc À«ùõReÓ3¤¡ÏI¥EÚcp Q8Ô#À™ e3}‰Š³b4¬ª¹Q*€(K«!ªk¿–wÅ*e´6°ª®O5F;¸äŸmbŠI2$þÓ#qI@‹ˆiW2ð%¨È$][Wd¥¶TRVk+Š`æYëWFÙŠNf(i2vœT}<P¶–E·Ür/àÂì ·ae”ß²#¬¸eŽ%ÄÈ'C²(çpÙ[ÀI–³Aʆµ¯É£´Q÷oxEÒúA#꘮ ÊK³²VÛ˜#š©ÂI0qY=ÐÄg| |ŸhB,1g«ijH¹Î#*p¤«Æ›6+GYªIûxVèb7`TZU˜þT´"ÇK ª)€'Ýá.oâvÚŒ{fXêÒ'KI“Ly”Oi§I 'Eé¾Qpƒœ5þ0MÀÌèdIf#•lùMiÛ0£1V¹gS– 1“–jb1n1§Hf,2mùMtšsß§­Ý›Ò™ªõç±-F›º Æz­a¾Ö }‹‡©z¨½Ž‰lT{¾*œ,;bK»—õÔƒù„ʵț:¶³•ê¹Fü,Ø‹‘MÌÃ_T¨y¬ŒA7I¬ÂCì -ŒÚfžˆãm+ôBl†žn<9ôCn'Cp g¶¡žËQoí©Æ[*$¥Æ¸mW:B§³· B—ÂÙ›²¥û—P<¨WHÃ8E 7Å«ÆÅ‘ɳH‹„'ÅȰp¼=[>0ªÅ"ɲy#¡lÅE‡Â¿Â°þŒ{ø¹QôÄL<œ$†Ä3ײ;¸ÈSúZ,æÂ‰,Ë‹WuQwXVWu 1CÀ¤BƒüÌÚÇ}ì9r›rÜžùÅ d¹ŽîÖ~% â4¯lTÒÝ%µü]ÄȳcˆÛqÙTÌmÊÑ2àŸ­ ÿÌÑ„U´/sNòI@šân3F}ýè ¬<#,²À“€y>ÔDYÅf“~vpA¬¨cYER‘…·1ú¾ÔØâ¸Ð$÷fåµÊ\G¹}pF*â+9eb7çÀ#’Ã4L7ÐNÛP“ïŠIA­®€ŸÉ}1©b˜Ò‰¦§¦¢€ÈšTäR¢ ã4ô…J³ Ÿ…"p =RŒ&;Fy?j'S­²®çœíüš/N’+›¶Fiª’¥P–Ï·§ÜБYš‰Y.R>Y‰lŸËΊi6Ÿf§VQa'âÝ2„+`cý#£š&ú{_Ãí (½å·±ÅB+[Àí,œrÁÎ7!íÇó£ïîK[A"Æ>EðÔ:ìZÎVâ»ÿ¡øÖú2ô‹›k[‰£y$ÆJ ÷žúxÞÙâð¶®ýþ$`{ý(*í!šIR6“Œ¯Ô?^ BíŠ$‘<Îé1ÜÊÓ\QÿRè TKãNDŠ;uV¹í¤ùƒãý'Ë Ïm5ͳÛ'Î/“É÷&ޏ¹´:LQ[@…ã<¶v°ë úŽ*—ðLöò[ÂD^@9%¼òhGV÷5»™oií8]¾ P[¥gè϶êãð–<åNBŒs‘ö£MìðÜ›¹D¨áv…ߟçBÛ^<3Îl¹e°9Ô*U†uÉ;Ô¼9à†‰#|ýa‰ÈïiUrYÙÇ pË"ÆrùÈoN; ½Ïl-e-—;†à~ýÕ–¶–B$C™AØrTcÓÌUn£V%[e0jNì±F=gwu¢{=@Ú½‚»Åp±àÁÀÁÇ ô5J_ìžD„ovT“†5œmé Ñ©ŠjpI2•>`ùSš1JœÒ¢BŸ€§PcO¸¿‰xâq’ZO¥}ÍE·m;F[È{Ó^i³ÝÜA>u7¾Y½Z–×LÕðCðP¼ó$óÉãQGrç®<…[§é’<²¥˜”ÈŸ½8?z¦ßJ¾¸¸HÄß´˜íÞÇ“ö©›[‹Xͺ9”»•R²lwÈ­)Le±ÒRÙ;Òf»Ý“m;ºÇýè½Nô²E° ç„îíò -¢å¾UXù*§ŒÿZ êËE <ŽZí7º)wÑ~‡y/ø¹–Ñ2G%— 籎ÅeHÄ×14+‰~^flÔã‘íä,§‚0EVø…‚šx¨©7]«Iwz~™¤Á#Îê«"ñÎh?-5¡¿ƒü@a‡q“éöâ«Ô%7ðF¿K*…ûÐÊŒ–Ërpx¤„}>§·ØÓTét£-ƬfœG–´y?û§†ú]0Ü6©‘²O¡ÏåA僆ç55€¿—tÍG¦´ ±\ÃaŠÄŸn>œt(Ø,-aŠ×›¦eφGgã5'‰½ž(yvØeŽH~³íN—%IÒ&Ú]­‡[5¦öK‹}Í“ÇTFÅ®¤r§ÀL»pØóz²ÓLƒÁ2^\ÇäÎN*··²7Bfâ5$7­2q·V¥JÉÛ^ÄÎË–Áo•˜ç#ª4ÖtÇ—F ЬJv‡{àæ´GÒ)f•èR&•*THwR¦*V0â^6¸Ž´ÎqååXÓMv'qø¶Æ6,ŠÇ}µj½ÌvSCs-ªÜ¬l~Fë8àÐãXK¥Uh¢!ß<±Ïtb¤Õ ié‘y¯Ò GãBê€ax€ô áždºQp¬ŠƒhVì:&÷â;‹§ ¢®B \rÕWW]*IÈ”Ÿ˜SÅI*”{µV™¡ml%,êNÖ•<×6ñˆÑARŽ7v3šÕ°ž[˜L³³4¬rÌz?jLŠ\m4^iSšU “œS IbñQÀÆ2ü|ÙÇÿ:t«+9.òè+F§Ã1ŽƒëRžÄß!AÞ ° õŽë2=&æP[£ªÈ½ Ó*ÿuôÖúuÕìÉ‹¸ò®Þ\ušÉ)áLÊpvœqR{)­ÏˆÄaº*8©D¦FÛÒç,ÞÕd«ÞÐ2;ö£FÑ›S¤–U·²O®Wýãè=Oµs‹j¥mí¤Ÿ¼Œ?Ö³-®e¸•-Ô‘ð‰ä+ZûL–ÖÝZEòÉ5Á’RY*Rï¤WSÙ‘%–yÂÄÖòŽrµnŸ§\ø­nFãû¾töhelÉ< ìtEŸ,ñ‚`]Ã>”™¸üÍ]£Þµ¤Êàðç>•göù.ÅR|ø²Wú<ÍsûEÙçòªc·ŽÞ@ª‹ùŠô4‰uHšu*@UÉÆ@®?T³{Yþe#̓Ëû¾†ö:ÅmvJßT6‘ÞˆˆÁŽDþ}Š¢þÆÆê'¹Ó7(îKg9+î§ÌUɧMsg,©1 Ü[ÈVÍ%­Öôn¿_nMÁìçÍJ[`G 9íy¡R±«tNáçFÞÆ&Q)\ºJÃ'å[6ڌֶF¼“pÛ˜œ-Up7»@ŠOÒ£ª©5Ó9G/µ§Ü£QrÖöäŽAaü¨e$F˜= Û3€˜åIªàí=мW¤„¤Ü¬ÚŽáî³Ëœ ÜÿjÅøª-JXa6ŠÅÞdù(ËBÁÙxÚh‘ÁÇð¥Ç‘â¥tW‚É3á­âVV¹¹‚äZ;D„ÇíýkZhžÄŒªG`sZ?Þ—¦ÐÃø‰<k6ÆÉcÈÝë^wŠnpËfZ+œ+áÙŪÆt»ˆ²w¤€ŒÖd|0Íóur õ@?Ë'ç^¬’9Z{GkðoüÚž õãÀâ¼O᛿öÏL+ÙíçY Y˜¯“úÔʘ™Å1šEŽ7i 9¯“LÒî¾$»iï%ŽÓs:¤C³ùñ]göñá@Ó-‹ ˜nrW¥Ø%Ä2I&¡m ‡¥–M¤ÿ]ŸKñç‡ ÌÝrÿ,li{‚jrÅkCjà¡ÿT@ÔPl¹¸Q1ÊgæUQ’>ç8£um*æß À:áÜæ(m2Éæœ±?ê•‚¨üÍ{øÜ~Õ¦[#nKàÛµ]Ã_‚îɧTnŽcž~õ£« šüÜ/)'#ªiÛÄ%U³–_8ã|ÿ¿HÔVhZÊpåÐe°+Špr¬±mÖ¶6)¤ÜY蟟Ú2•r¿]‰®Š*éô¤Ùd­Ð ^{ñ þ5ä‡>uæx8Ô¼§/³VÙοubaa#͈YjiO*€â¾“½Hì¬Z+ƒ.ܸñîd(·_ÔÖ4q‘ü‹`}… =Ùü4VÀåW“Ïf…<8|À湡‡)?vVR´’$iR4©É’*ˆ©P Ÿ$nÏï¤å~Æ´Egê‰ò¤€{1¦é™¶¶g—bæSÞi\˜0ó¢-Q%`ŽÓÞ*(¡X&pŒWžêªK•“¢Û ÌS!õŸ†5fžÔ+¶JñŠñˆÜ©Ïv? kbÞñcü¯Á¯7ê~/ÝÆÚ[CBKô³³ø»á×!ül2¹ßí\“i ¬Ëwâæ>6ÄÃ*Ú{¯f´•gµ6pEpiv{†Wµ»Ï/‚¯îEy_NógOÇ›ý¿bMʪèáunK{ÖߺC/ê+6Ú8d™b™|Žï˱ÍhÀ¤ U¤ø*+Ñe•Í՘ݥh‘©ÈÀ™ãIsþ¥ÍlÙÚZ]ÚsIä¯_¥e^i/“ €¯ 5IJ㜚kgTpäÆÔ¢`]ʲH̱ÔqŸ§ŸzѸ¶•‡¡ ±ÝõùW¡¨ŒÔÛØM”¥_;GåG]\Ëá킞×vhKK9™ð(õ5³ø8`‡/ûGõn¿J†YEHÐÃ)+fÇeÉSæh;ŒFèÑðPæµ/¤s´çÞ…K7c¹Ç­ ¥¶‰·H¼ß[jVÞÐ17“Ž¡×F»'äž9#=5XÖãÙÅJÞym[ O54Tézxš5í`Öé9Ú9>µiªa»ŠeÎà§Ì»9ëšæw{&Õh‰¥HšU…±Á§C\ƒ™†}V%ú±¬¢ØlѤYTe˜¹¬IuIŸ…Âj¥’C–r~樱?sr6§Ô ˆ§{{VLóÉw.æ<‡ª©«`uФ`£Ð;ìš0k®ÐôIõH ŠŒ‘\ŽCys[š¹¨h³´móG¹¼¨ä–?å½þG†£lÙÝé³á£eoB;¨\Oü2”o3[iñ¹»Uüf2‡&‚½Ô4;¤b®asäÉŠò¢òòþd7ò¶z8r:©håµ+q»¬Á±ï©vÐvά=¨Et-€ÙûW«µTe=Û‘ç4=åÔ’’¹ :›JIo.… ªe“sp îŒb¯“ N¸¢vÊ3™åD…OÓÕKÃ]¸Vâ‡`È}h_&t(ý¸ÐíUíSu¦B=•±_Jˆ•ã9GaS" G5DNQ²äÔÝx‘w{ŠT+(¥MÆ?;Ä>´üÔN¬ÎqóHƒti—ºbå纞1UÔ…+ -^ú£­ˆÈ‚J!*Y 3oð§Âwä 1‘rgïP…؆?­Jv$rOë\±M:g\­Ì­€´DpÇnÇ55úWïUÜÿê¶Þ¨«rÓÉÀã5z$‘®1œ÷UZýtcŽèÉÖŠáŠk“ìÉ´õŠ}û…&ìÕcº5Å1§Q=Ñ E@õVT 2•5*sçJœFÿÙrmagick-2.13.2/doc/ex/images/Button_4.gif0000644000004100000410000001135112147515547020073 0ustar www-datawww-dataGIF89ax÷ŒŽLN”–”\F\,.ÌÎÌΔ4*4ln<>LB<ŒŽDljlÌÎÌÌ–ÌÌÎd¬®T,&LN俤<>TV<ŒjŒ L:LŒŽdäªäìîl,*¼¾ŒlVdìî<>4dj4ìêì<6,œžLtrtÜ¢ÜTV$üþ´TVT,,¬®\^ÜÞÄÆÄLN4ÜÞl¬®|œvœüþt,*,|btlnT ¬‚¬,*ÜÞ¤<24<>|~\ÜÞÜ̞̼¾\,",LJ,ìî¬<:$\^< œžtüºü,.$¬®¬L>D|~<üþü<>,¤ªLäæTJ<œžLNlRl,* ÌÒœ<.<|~<> ”’DlnlÔÖÔÌšÌÌÒd,&$LN$俬”n”T>T”’lì®ììît,.\^\üþ<>$!þ0Creator: PolyView® Version 3.62 by Polybytes ,xÿŸ˜GE*\Ȱ¡Ã‡#JœHQ¡.^jÈdcRˆ,BG¤È’tJ¦@¹r%Ë”'IÒ‘¹’¤Éš0aâl™³åIž)læ´ tfIš/iåáAC&Æ 4F%Ê«)eá)”èL—;úL©2&Ø¢]ɆE)ô$Û²owšì™b Ž.»@Á7(K·cçZmûòª_µ,…Š}éìâŸ|žüÖªHk8j¡(fá¢Y »|<˜mÍŸ_›æÊX,hÂ2³ž6k´4ÖqªaÆ3êÈb½Ænõ¯ñœ=I·&ì8lÛÆŸÿ6iÓæ 7/´€à­å‡çïɯzÿ-<~lê­ay’f}z}tó„ÕŽþ}f@;¼Ù€hñ}ó£q©Rµi¥SxìñÅÜr"eàwŠök_~Z,Q•sÒÁ•ÞXDæVWb_–(bk©µ'Ônw!jleÙ€™TQáHWk¿õ¨^Œ‰($PX˜ŸŒ½iØ’Q!TIe•XNie–Wnéå•Fd)æ•]jÉ¥—fbYf™i^ Å IP`XI^¸dojŒ‘D‚¤Q 5¤¨  h¡& è €â'¢‹*ZC¢„袎Nz(£”*º©Ÿœ‚ZT€Ã‰ƒ… ¤~v²¡Ntÿšè¤³nJk¤zë®»Šª+¢šÚ«­¾>êk­Á"êÄ gåX'“¬òÆÂœÖ:(¥Õ^Š­¢¢Zê-²Ú:ë¶ãJªí¹äêD6–B­òÂ|$›é½Èâ)·ùjú(²‚~,¾‘L(¸š0 bx ›zðÊ»$Q,\®£‡l+ÁçZ®Â³ZÊq¥o,,ÆëZr t–#IÏÆ+¹k,颢ö»o¸¹Ú;°¹â6ê/§û& rÂFŒæUÄó6½A‡¼ò¶(W:ô­ÝBjl¨ÕzuµÄŠ[€€Á -o |o×&-®§ÖÞ,wÔr# ê±6',èØÅÿÅtÓü<©Æzg rÞ´ºõ¹m¬È"S}øÊ€V0Pp¬zvÚ’ãìo¿»âLtè>';.Ý“‹0¯E[^\K/ÉyÍë+7âW]>ôîû¾û¼ïøà†ÅÖB~óÁ„ò-17ÍFà‚Ÿžk±Àš|ôÉ9ϱ‡à‡/þøàSŸ)ºçgßiÛc£÷Rìùq.ºÖŽç›3¾ gZ ä÷?¾:óUÛî§-G¹Ž=cÒvw>Ý}j~|ààtW,@|À ù2¨„´kc=kàçÄ ”Àm‚ËÙņu2Ò™ënªÀ‡ÿÑ0|”• Gè³°Õà€eYŒÿî„6æ ø:˜ý°&8@1ÀJ¨¡ ÁÇÁð1ðvõ£_º\g#–œpz?s`Àêf02PhÂטCÄÝKqQ³Ù{"”Þ‰F´Û¶¬6@ ù‰F˜aøªXErŽ_Ú+š›çž/^ñ…Ù"#×Ðå±ÌAkdãÇlF² ž®…›xŠ ª³ÉèjÓØX§³s9Tœb!•ÀA.¯•>4 ážØñBx”Úã¦Æ(B²VB@@&3™C•…Ñ“r´˜(ûâÈÆEÎ`¿ÚÆBÈa™k¼âé'ÆÎù‰‹…‰^´@pÅUæ±qÄ"þKÿͲ>Ø—×µW«öAàì_!ÈÇÅáNeݪœ`À’$h1)mÈûØ©Måq@†6”"ùtE+&ru˜U"§™–²š¦ë!iÅ«q9á{ éÿ”jºkµ°…9s]Š §¤³ÑdÝ™çà f`ߤå ×êP-ttŸ”ÔÞ¾"—Øò™}L%®æ¶;²¡à›T3ÉÁ|Ú+šMT²´šÎ!F«ˆº^ýÉOŸq ôd(¾ƒÁ‚“ý$«XåÆ7ÿømU­¢^ßêB‹ÌObÀäIà=©ÿ*¡Ùê¤\=Ç5ËåH$vE¦ ÂÉuÔŸ“bÀ¢*E+”à©¶E¥)ˆº*í*ê&1' °¶¡¤6Ôƒj]¶N€>Ô­zy,Q‡iЪÀ%‹DH…ñQ>ØCÃ'z9a"5oùàú5¾ÞršÍß j¿U´Ê]ã  ¨ò†´ŒÛ-ÍlW9×`®«©µ/o |­TV° Q ŸxeáϦ †ÕY­€ø>Ô>Ö|¬…f‰ã90>ô€§ä“ƒDõßfÇn#®íxÕ<Ï”¥”ñšò¦ ÔG‰ SÜÀ „ ,òB•¡÷|èDÁ•7½Nš»;³µ]m2ÎÿR"Xî3 Iµx™†×Ý ¨»¼¥ÁyµÓK™ˆ?` 4}“ħ¨¨ðÎj5$÷À°Áës“jˆÞåX;=”uó…ÚŸø‡´ xK0)¤5Ù]æon¾­ÍIüUCAae¬Áè9EÔÙ\«_!ajFû:ÆçÚ ‘þäØÍ4æx-Pm4¡ `ÆG±`ˆ¨Œ!íñ¶ Mazý˜›;Êùä$»µôUO« ˜Zƒà›°3W'o §˜ÛLe*¢ÿåLú–(6/0ç–³=ÇÀS|â·I}?)Ýòc¾G4 Ž…ÖÛ§ÿ¦Ö‡³‚ë7TBbüöÿús_»l,£t•DíÉE…‹µ\ß+àkä\î7€ñæYžW>ÈT ç|µKÄar-xäl'¼fC{ð4 è~ð7Kó·«…W™V$3¡*Q&e­†i€g¸'>znà28ƒ4Xƒ3è:p€k…6؃3X1~¤>€€NŽ¡|5Qº ÅxA°Nè„‚õ„R8…Næ?T˜…O¸e¬%sCDÑR­ryˆc»SjkTz¶µ†àÒåj–2M&=(D]CȆR¥ƒWh^7P¯vzøVoáHf—0| gdz؇¶ÿo´0Ø“vŒ‘]w¥z†¶(%ð-i„%`R…~à4v‡iJ„/~·û'euK€ ˆËć–bä{ X‹á“ìW]‚øO®ŽÔZMÅVЈ¶e‹l(Ô£[:¤+áÆF¸`žc_†Â°ˆÔfŒŒ'‹âó€ø5Å…1ùVy^%e¸³[QÀ‰=eŒÚRKO«.€Á¨yç¦+D pRd<¥Sû˜~Ú6>üx~J Ç£‚,¤1ϨŠÌ&1Ù·{"&V Y‘y‘z ¹‘zðCŠàs‘y‘YzÇ5:óC‰\eñ~Wq àƒ29“4èr·L<ÿ8“%À1n†:±F«ø†úÄ^#·pýÆ/‹·PâÓL?Cqô—^‡2b~@ç@A(„ èVðG>³Ó“«%Vn´¾G¸c­8I1T?ã7™IÓ‡TKætzC‰!b‚DÄÜÕOZ3qÓõ(n°†YÀ`´Jô•+Þ‡]6æKÄ—(Å`ÇÄGšB)æ‰â£`P”_I|õŒ.!Dt(\fh‡ãd–„¦T‘Âk°†3ÀK„m›‚P}§62njÖv·SP”£z¯%A D+l)ŠötCDP/l&Lc4F5…oéQ,b3L!ø+ÿòvÛÄTB@!ÅSz Z½RUí÷/ÓYIÿ£"û·f—Š©ýÓhüÃ@ŒÃ;°P¡;rmagick-2.13.2/doc/ex/images/Button_U.gif0000644000004100000410000000776212147515547020147 0ustar www-datawww-dataGIF89ax÷ŒŽDŒ| $ÜÞlZ¼lrä ìîì|~|üþtTVTœžLjÜ$&L.,6lljÜ|~< ÜDF”.\trt,.<,tzü$.\\^,ÌÎÌ46<<^Ä\^\ ”’DœLN$L,.J”fÌ< .D¬®¬*46l,ÌÒddfÌ,>4>Lln4ÜÞÜlnl<|,*<ìîtLNL\zü<>|¼¾\TV,ÄÆÄüþü<>ü¼äæl<><,LR¤R¤düþ|TV\ä.\,*,^¼DJ” < ,|zü,.\<!þ0Creator: PolyView® Version 3.62 by Polybytes ,xÿó˜Bˆ,*\Ȱ¡Ã‡#JœHQ¡ 'lj8K@=¢8Š"²¤I“#S’I²$Ë—+]ÆT)ó$M˜(kªÄÉrfL“h-˜0f£@,B:ZšS&Ìž;u:mÉ“ªU©U›Þüù4gWG=øÙè$K–=²zõi“«Û©S·VŠÓ'Ý·4k²ðC`Š7[̤u™2*V·[µâe›êbÅMáæMYˆÀ?K^мrpËš{†ý¹1iÓk™®ý)áž7{ö¼xÉka‘·™êÎÍ·ïÝ¿{.¼øo‘JAß¼ BŸ±÷Ô€t¶sÊÁØGf²½»öïÜÁ{ÿO~¼yñè3.‰ #èÑ_Üõ³ýûøóëßÏ¿¿ÿüriõÐ([`Õ]õß‚ 6èà‚“ýDÑU¸G`!qw 0àᇠ†(âˆ$–hâ‰(¦¨F ŠdxÕN(ÛŒð!ƒ_à@ÇŽ<öèã@)äDiäŽ`àB VmÕ…Æ÷† iå•Xf©eE˜VŒ†¹ bhiæ™hj©†"ê92a”ѲŽiIgxj)M®&4nÁ•wîXh¡=Ò‰hž‡êè£G‚1ÁO.½ ç]X‰h£<Þ¹¨¢é©‹všè‘:ô9ÒŸb¾0Gžu–ÿzª°þ(Fi1=yé Y( ;K‡°<k¤±W"{$²²ö˜V¬úÂu"+ìµÃû£²Ç ì·Þ^¹@Ÿ"Y 'ÍîXF9¬Ëî»ðÆ+ï¼ó‚!$ôæû®»ôùì‹QD&µDR`ÇÁ'¬ð 7llj™ÈÛqBÅ {AGºãÚ…®—ö*¤ŽIAH&›Ê„¬ÌòÊ'§óÉ3ÃŒr‰È AÉ-£¬2Ë@ËürÊ)ëáo[" L#µé–œr4uÍ'C²ÕQ§Œ³ÄN -4Í.c}uÌAMä¿^™¥ÈCò,õÏ`¿œõÔVÿÄÖA&âtÜ-Wÿ=³×S£löãV¥t1øê´ÍAQ÷ß@»ìóãwGœ÷â>“sÝ@÷´çƒNdán.ÓmGþ·Ëswþ9ã}ã $í¬«ìwÐYs>¸£ËTúÚC’ìsæŽSmüóÆs®üÌoþêd ^$ï\ù>íéÛMôÓÏCžµÏãûXþö¹Wíüü>3Zº 07Aé\颃l ‡5ì€ÄûßÛzæ¹ œáIàBŒ`¯ A hà¶³ÖeÐÂôÀ€¬/5î#˜‘ѬÁB£\ôrG ,@ ÔßÿlØèÉïdg@r`9#ý‹'j³Û"õ=p&,^<À…&j 7(À¸×¼ ¡^ó´P ®Ì£Zê˜caÉ3Ôˆ«ã¤JÏäKÊ™ ¨YŠéJfÊ+£>Ò~(]ª™\™Ã“Ù¡JÕ QE:0S^©¢_³šØZ+–f ªX"à[¨ZS#ÙSr¸{Úÿ´ª¥žš®â‚!Y—fÕÛ©î~|ÍRSûÉÍ—Ò’,y¦D_ª#´Î¯n’K+$®°¡ï¬ËX[õ»Â:õu.Kl+¹§VBv’•'! =¬ÿ•3¥ fëPöÕnªg—Z:jí´¸Sl&’f. *®J"YšZ•o¬¦j¯ÄONþÔ¡["×h¥%›K· ¶³fnoG´×ªW)¡kaÑ×I¡M×Jž \oªà–”{£´®úÚ*¼±™×H¨œ‰zik7»aõ½GÒ÷ߣn°'–,‹ÚÜ!ØH=Ý$h+Õ‘4—Wœ½«Ì éÓýîshAkðî¶Ýpn´è…‹”aÇ=»Qí®êZ$“žrÅU'ËòêZ°*÷Á¤}Ÿc Ê8Éá4Èåßä’›ã·|˜Ç#£Z¬S ϘH=½¨Š §˜¢¸vbûÛ—‡”͵ºÿÇXêpœ–Pë–¯T;˜/’ïÿ¬/º%,.“ƒü~4³©N‡WfI µ•äš6FOÖL8Aó^ù·5ü;KDJ=74´’+?º5špe˜9¡`jrÛFMähzâ©}î\¦Ñv“9Íwd¬ºÜæ–uÔ9Û‚sÒÑÍÏ–?¤ £’‚>íM“½ªg*ƒÐ©™Hàè´êÌΘM¡ƒönºÕ%0L˜°”Ú\€ùY- X<°Á¸/„>”Òé:YšZPľñm·Q³ƒ xÐ#nõ>{ƒ1Ù(€qß~¥ÙXº ú;¼ÿY­\ÈA‰`€,þ¢© Â*@LØcûð#Ïÿ*pHÐÖnv€‘F"¨@&§¹ÌA ¨S.O2ë3 bùÕi÷”2¤¨ICàqÃæ5~„'ŠÆ\àq;Â&7J·×9Ð6t$–f©UzÆgýw&`à8d`HeNUKwöKw“ux"v(‘miG@t»•Vø^˜2vÀHyòt)|fJwri”ÓiÃC6'`PßGg°²øHÂÇ80&|@ZðGµbj(af°rŸGFÆO'57NµEI€. •K;aƒy.pCÀ$6a#GµVBé³=C`çtõÑb#¥su)ÿhQœ?’8‰(s6 Å#4¸hV˜‰;b@1ˆ”XŠÚgIðƒâ‰šO%艉Ð!wv@ЦÈ[ÄbD¬è#Í–8Sx$±è!Èz@ h€Ik Èh °3½$bRIÆy×8$` à(ÝX÷1T•Z7Žêˆ&tÒÚ-€’)?Âw¾2s›’&ôhlARL piò0*³¢ Ri¡r yZww2)ªñ±±M  y™Ž{—eÉIjäQ‡Pb ±ðAâ{ë“@V0ºá'2ÿq2AD,0©-½ç#? ”DY”z'$Ö"”‰2|R6Y.òbs`Cù’°r•V¢•@"Pðô1E(Rpò³M /j¹–lÙ–nù–ì’]ÀKp!a‰K¡6¤µ’©’|©“€i‘‚ù—ƒ9#I˜ˆi˜… ©œQðX–… (|ɘ~y™Š‰™–™™œ¹™žÙ— Y™}‰!QPK BÀ:)&„闉ɘ¯i!°©˜±y˜´y›³™›²i!4p+ Ïq› ›šš”™œÇ)šÌ©œ‰œËÉ]KÉИι˜»i›ºéÝÉà£9ž“ àJQEÃY›Îù™ÍòùœñIŸï ´ùçHPñ‹`öùâY îy ¸žJ ‚yžf€‘š I†pZ¡z¡š¡ª¡|¹@Árðêš»’¢*º¢,Ú¢.ú¢¹ðjy@X<Ú£>ú£@¤B:¤DZ¤Fz¤Hú£f€E¡;rmagick-2.13.2/doc/ex/images/Button_T.gif0000644000004100000410000000736612147515547020146 0ustar www-datawww-dataGIF89ax÷DŽD4B$" LNL,&$4f,¬ª¬tB D& dÎd$2$V$”Štljl&T>$dJ,,ÔÖÔD6 TJ<¼¦ŒŒR 4* l^L\RD$N$4., ŒŽŒ<:4,ìîì$œZ dVL,*,<~<|J T2 trt̶œ\^\4J ÄÆÄ< LžLDF& 4n4D*lÞl$6,^,¤–||rd$"dR<ìêìD>,TJD4. 42,LV$|~|\6\¾\tþt$*<><4œZŒN 4J$ D’D,FTRL,*$4j4¬®¬  ,2,V,œŠtlnlD:,ÜÞÜT: $Ä®””V lfTDV$Œ~ld6 T®TÜʬüþü<:”–”ÌÎÌlælTVTlVD |þ|$,&<!þ0Creator: PolyView® Version 3.62 by Polybytes ,xÿóH‚0ÁÌ@¸0¡Ã„ >œø0âD‰j¤è#G…7&$ÄÂÀ“Í4b¢æÐ—w\Æ|)&L™5kÚÜI³çN>qòä)t¨O£3mÂY‚ƒ”[\€c(Ò¤WƒÞÌz”ëV¤:5ªó$”k"‘˶ª×¯VÅ~%ú¶mΟwÔ ‚!Ä æÂÅÛëÚ¤V·¥ëvp]!¬ôð& `ÂŒ‡ÊÕšõ®a¬ž†m¬¹4R'O€ÌˆRyƆº¤a›–MÛëfÓ.Oìy`!Šï(`äÄ-ºèXãŽ=#GÌyùع£‡6*ñ»²åA¡×ÞÎ{âÏ;Éÿ¨l|“ïÝÓ«_Øe$¿«³ÆÓ“*ðW!"P~þþñ÷_Hà~X  *ˆ .á„ò‡„ù…°ƒc6½GkÕ½qS °Â‰(¦¨âŠ,¶èâ‹0Æ(cŠLñZVïÅç›u–aâŒ+ÊäD cz0æÞx î¢?)å”T™A…½ä|òUgH•`†)¦Š8œ€”‡M69à c¶é¦”N8¶¥ŽÆðæ›BÞ £ "œÉdš¾ ‚§Œyæ9£¡zªØgbs–â/$º‚¡B"Ú¢¥—¢X艘ªØi‹0†&ä *é©/~:dŸ…ÍÙ%k‘¢ÿ*«‹ªÆªQ£viª‘<‚ƒ¯¿öŠÃ°ÃK¬¯ÀŠ€ì¯u[l°¿Šðë´Å*Kì³8Ljä¢så(y±)$#6`a.vœ{nºê²Û®ºëÆ ¯»æ²K¯»°Éki¹ê¸+‘d!p Y\p&Bp /œ0 üðÃ;¼°ÄLpÃcq„”¬~檓à)ƒ3¼°Á ?ŒqÊÃ<°Êk,ðË4ÇLðµºxëPýV÷/`1Æß|ñÍ|4Íë\sÌSgaC”ErûÕÈÂj¤,+sË,_LµÓe›0óÀM+ͲÚH¨°/®êÅЄ±vÄ6?ÿ5Î)kìrà*›ÝpćŒBÏ,† TŽ>.n,à°Ä)S¼2Å.µÂTç,øè Qã*þ|š]¾wŒ=ؼ2Úƒ£MxÓ³'½4àf nÂY¶ä«•M¾ç 7 ‘sÃjï~óó÷ÎpßC¯3ç++¡/ªïÔoy¯¿(H|W_qíÐ?»æ/§o½ì6›0ÂÚÎòQ\é”1=áí{lÀ‚ ÙçÚG°ôà>`A¹ž—3Ñì ¨CÑ­¬´…Tä ûž‡¡HÊü&½Àe¡)º$е)­s‰ ÀÇ€t?Ÿx‹d^Rÿf†Ãêõ! >b ªf±å ÌAúA`=à ì\ÁÏÇ$RŠh#Ð߆…"loEK¼]õH°*¸È IH Óf±2üˆS/ÂYØÀ%'íÈx/Òƒ /w3#@FiüÜÊ,èFZ¹Š´Ë\À é‘4A³ÎWdéîy ¸£‹¹¶‰…-aUèY@Áš –ÔÎý¸?ÕÁhgC˜D9JœuNp›ƒŒ~` &Îjn˜‘å’IÖlRS˜]ßÄpÆ‘Òl-X#côƒÖŒb ¨¤Œzh“üU,Ê g0µk1’Á¯çKƒAqFt›Ù:ÿmÑ{]Ô•Œ*€õñ ÙÒ5á'Í@lSF0š'ß6„„ˆœ2áÚ£j #hlXÞæ‰=_Ì÷RF€¶ê‰4UËÚŸxôE!€¥C˜Š4O±QÏf%TnÈ7ð²q±9ê¢#¸O`¨¦Œ¹HöA-¨ñD@1݇…)ØŠ_%Ù3eP9B Ž0IÉFÔÝ¥²HS(húì „ž±Ê*æücŒn $ Á†cTãIJ·µfÂ,RôÆ4B"…0ê^‡ÂÚ¤gÆp B`Ùõô|{[¥Tµ ¡l‹.©•Yê6­@T£Dÿê®yÍC¬Éä9ں蒤ìo:ë¦kr tÕæ¬RDN˜¸VrËE  6µÜþ/ )Í"•ø¤œ;tЙÑ=QIÄŒe«¨j®–úØ5¦ÎjžŠ<¬ÄRºÜN6r• ï Æ+Úò¹½§jîðˆ[I]ómu€%µÁÕÕÍÄmÓgKÞ›½5ºêõ.|ôÇŽj÷x£üö°‰ÝTÝI²3a@ÃË_ÿ•ú½+O\…_÷ÊŠªÍ“¦ÌΫ_ÕéDÅÖoOÉ›8L¬ÝZ#gcTM·¤´[cb£SžùQ“ëJä.8Q=¬ ÓÔäS}V´ý}ge_ç>8ÿ¿²2)o»±¥}YOö–£‚ݵpw ›r}³$/‚(ËbZhU©Üðjm'c&Yõ$OÙ1/’O챟 ]Ó>³ Ð$æ±£i貘ämY£—+ƒ*ÿx<o›—Æ’zî`>ò¡…ššÕŸ™è–¶fYIV&ß®mw4À­z¹Žƒ4{%½ì¨Ñ‘ÙwÆ“¾“+R!:LÁv™æ˜çP]S)Ìn¶[É¢[iÙ…6·7+6ª¼•dwz¹¶m§ù¤™í7eØ×ëöôÞ,9QG×Ç÷íš—­ïOú¼æž’Œë=í_㻂·£ Ù¼i Þû½bÃÃG;jLn8>ÿŸ•<¯=ì‚ËûT¡JÌiê:†? Í»0´¡£a§¼~Ÿ¢””žünlZ»Î¿J7šÂ9º¬<,uÏÇ‚sæ#cò¤ïD®»›­YPB?Þq”ËúT†B€ê¬Æf,ŒX:ª’ Pó™Ò* Ü@,@nšš;sRüfM&ÊR2ð‚–Gbı¬ qß¹Q²Þ¤2ßéëÔ.÷?ó~À *§{ÂÍ~7IÉ€uH$ʸ‹‰ÜñCB4ð0bSþ¾ºžÉ¼u)© i° F€ÎE¯ËÖÙì |%·R’A†såR݉ ¸´yGléŒÅ ðlÓÿ¿—Lí7©@¢ƒì\Øêùif G ½GïÇÒ¿ ûÀ4:r¥ÇèAÌñ&÷#»W–'w&–"Ø'b¡ckƧjªFFñ‡:ª‚b/Q}'&øç4UÓæÃëçJàw'WN'§uׇ~Oµ‚,¸‚ðwb„Öst’a²-xƒ8ø~á7&¢”W½g$6˜ƒDÈUX%U†Wvhwb…ÀP…R8…TX…V……p„çæ'•×$A¨_`È"mVh3hax†ÊÔk\RcŠqhˆv+P áf4"Šð†xø"ˆuä3à†y˜( X7L†5€è&‰X%q@\ÿ(Öª"t@xrG‰õ“‰µ‚‰”ˆ(œh‰™ˆG°!…á!Žâ(»²ˆS¢ŠÑ‡"8@ŠÊ1s]È ÀŠ}u0QvÄÃ30ÀŒØ"ŒÔBŒÆ8ŒÈXŒÉxŒÊØŒÌ(ŒA0­±‹"³†dæqo`Ú¨ÙÈÐÛØàèÛHŽßxŽå(ŽåˆŽéŽìHŽãøŽÞ¸gQ ‹„v(õ‡_´T†¤§p­ã½ètôX½Ø$—1c[ð-íÕ…5¦ni9ƒü‰×H‘úX‡œF2fb.p½‘$É ‘9‘$©’ét)‘I')@Šw°ð`§Ð>‘Ù“IKew>ù“CY”=©?ôqtð°‘%É“é’&¹’ÿˆ’OY‡T)•t"".±€0‹;ÉcI”±”Y– y–§Øké–"r@xð*Wù”vY’Z)z‰—'I•~É#`À(Ñ’°GÙe¹˜ŠÙ˜Œù˜Ž™ŒÉ9—P‘*±!±™œÙ™žù™ š ð';rmagick-2.13.2/doc/ex/images/duck4.gif0000644000004100000410000001274012147515547017412 0ustar www-datawww-dataGIF89a´´öD!(("#99((#-0'11(?@6JJXXBC;eewwii7KKFLQGQRGV\R\cZbe_nojjqhttl}„~‡‡ššŒŒ(©©¸¸ŸŸ_‡‡w——g¨¨WººDÈÈ××ßßÈÈ5××'èèèèÿÿˆˆˆŽ“’—˜–Ÿ ¢¢¡¢ž¦©¨¥°¯­µµ¶¹¹»ÆÆÐ»»ÇÉÉÉ××רØÎåå×ììÝóóêÑÑæèèçööýþþÿÿÿ!ùD,´´þ€C‚ƒCB„‚?‡…Š‹‡‰‡†ŽŠB‘„•ƒ–Š™ƒ—›“ ž„œ‚¤§¥šŒ’®–©¡¯˜²³¨¢¦“±¸´¼½·¶Cª”À­A†¤Å¿¹ÂÌÌÆÄºµ¾Ï¬°ÖˆÆÑÛǃ.4«¨žÍØ×ŸÎ»èÁÚðîÃßÞÂÔ£ø­Ù<A?挤­ã6`6u¦ÒûvC…q‚£»iÝ̵K÷îb<Žó iÄXð\9}ò,"©Š˜@y =4ȲZÁ–ô^bòã_O=ƒþʳgQ£? Ê“ÒÏ¥C}J ÚÔ‡Ò£>н”(U¡[• Íúo+T¯S‘ ±Šô§Ö§þG£v)©„pÜÈ7/H•i 6òæ´Â}qò=ñ—LÞ8ÙfÊŒ‹+î+Ùo`r…(ƒs¤aÜJÆ01vXRtLÔ§A·„(eK~@j~í94$Þ¼;‹Öù™'IÎÄGçâñÑ7ë”É[Ž-=³ìãº;KÌÉ;lç©Eþî.¾ùõÖô¾2ýêUGV¶Nݶ%«•(%žhãÇwÛT~}»b9eŸ]S¡õXFH |X9%`\ë!¥àZÊW–*Cø°I$.Ø@Øx¥$rÉ?ŽT²Œ9T"b.#"öq’´X"ˆ**¢áŒ Ñh.;ôÚpfÖÙf±Ý]7‘þwÙ7ÛÍâBEM&¶Ð”á57¤wàÕdÏtYê£S<‡erWn‘kÜ­Æ— E¹“h¢gÞ‘p*Y$›®¹Ø¥rE’‰¤ut"÷g•ºõFdqdÞw_YŠ2zß .ÑhVŠ6U)¥ŠbZi¥Fqº©£ ~ú©¦^º)©–šªj£¢nê*¨Ëøf©o$Þ7Li±¦¥åÔºh1ÅÔºˆq¶65¬±'fš!$+"°Â:¸ì‡±ötÒ¬ËÜ-°ÌžØm9¥î¹›9=±¦šÙÅ »qYfbzjÇnh/0GݘþŤºoÎ9¨¾LŽéf»Ïšïw½ñ‹(–.Y7ð'Œç¼ þ£[ ó&oÁŒ½ ÃžÁ¹«pÂzJ,g'‡šìo-†hx⇲F‚ƒ2Äëò-7›«s‘Լ̊‹h´‰Ô»b¶´|,ÌÜ^{t!7½t³‘4Ûk)ýeúëZ v*„2xý ªŒÚ·(£RqŠ*}÷yu6§]¯½µÙúy:é©ê€uÏŠï üœ·äÊ„.l±¡"3<1J[9rÅ…¦ 9Â)&¸–Ž3Þxäÿ~.L%YR’Cðá’áʼn›ùyᆖ\]Ž‚j^ù$.ì{rˆ—.¦ë}Zw;ƶ·ÞÉÌæbÞov’Jó'SÞy—0š’¶\Tå÷V|><9Öõþêí“~óµ¡Yj¹v}\ù×Õ…I©µ^PÍïYR©ýlµõðäÅùÛá*÷8ÕH x»‹9‡ºÐ-Pz¤Þãâ¥ÀŠ"ëÝëîå;?."³Xc|Gºh €ÑÛ ûr9ÍìK`gÒœÓ5 xhxµƒ·;ÙQ‰†Å+6Ê=Â)o2Lá8.ö˜AûÉ‚n`•·D¥|õK‚,d–¸@B÷ƒWð3>2‚1mðù^Ôc ì%¨} NÄv8Ç4tB*âò(Ãá”lÓ³ÜÈ$ó.Ʀ…3ôÜgiºCh ƒ†äcy³ÄÑ…J¼„Nþøâ„´DÈpÄÝÙñN)¬Þ`É~Ã¥qå Á;Lqpã(<´’—æÑ£$uèÌÃx׎Mª‰Âƒá,…ˆJØõ¨•mšh)Ó!ϳ¡„ŒX¢¦×¬äU†r ä) fËŸ2õ/B EhàþæðvcUV…*XÉÍUpk•ÖVµµFÁ꬧êڧкÕ¡t¥2ë¦ìYZíÌZΚ²BCx‹Q‹ˆV!Ž®­5BY¶¬®ÂÁÖ5X)úÙ±ˆu"G v8HìÎ(»È}^²7ɤ)È2FÒàA€A# õ¿ £{ºƒ©%©CAŸÂì–†B2_p[§òI¶¸5Å&×uZ“Îtƒ£•D<í5Ô "‘I=®i›ª²àê+yŠdèl_TÑšZW…«å ry˜ZŒÒ<<›°Šö­¤ei=S¯hÐÞªÅw°1{šÏX{^[@SZ¬2t×;eXøÕ­ ªú4þöÊê¿“ýÕÚâö+¦`sn rAf¯ò¶¼yoúápÝàbKaŠšŽzg߯¦Ì®…"޿еãÁâbÄ/u(.?+L‚•% uÊ]ìØŽ2Ý©1½‹š©‚­£´h›Î;HŠMT.2êÚYAðCaêägWZ̈–¹Ç–Ãa)3¨æìþ–d¬;„ìuÈA–¹»ßéA¤"¨±(³¤¶¤'•ÌH«i™˜|™¯`€Ý%šrà³bÇ×¾ý-]¥šê CmÂdÓpÉžZ¬( ¶Ü˜ LÉÌ J]\û–€tN®FfOþŠ—ô%t›%˜d/¿`™Lޱõ‘eaG2¼ŽÆv%-ºÛF¼GÕ\Ÿã\OßF5cÛÐ_Ñ]ºœòËT³¶ÑìÀ-ñÀC~*p‰È‹0´WÍ6¡«ˆÀ –¿î·ð>½Æá/~—~bZˆXÚ,z¸©¯¸M[‡Žá»âQ”¹óÍg‹®‡q ÕUáÒEèëÃÚVAþ.tëÍ8?N»ºnVŒÀÄðÀÊÊÄÚÕ¶3eLíÁókA0ˆ¶Îõ®o}0è–| h(aûÛ@÷ñ.i©ïmâ1½tº€< Þ?Àþ ëføôl–R ÐkÏd³3ôÈð ]wNЂÊ[þò—?¸¾ÌvØË×ÖζåZ›Ç#sз ¸N€¬ó°½åM@€­gAx§CJîé‰ÛÛb41^†s¯šâ´Pv€®sàõ²¾ìA°õÏ»åËÅ'MR‰S.ýá0\ÔYÎùØFï04³ *g.g)غL ýúGµ7{ÓƒÏ=>øyO‘ÐM ë€Îmnn=yÀ”g{+`°³lFBTeFz%…h¬[·8&ˆy+P}±”'u2I®ÕsÓCpÐþÀsôw‚8ˆy& <ôÖ{Ùu@UuÙ¶[×9˜„˜·àƒPoÆ5d6W:1}JØ+ð9x Z gÛ…H‚÷*%Öa\%VeUV5p„[hy›7x‚PqÕ†¡ÒVûÇƆФ(t•+/¶^TÓXz-Ø"ˆ°u%¨„Ô‡…ðˆÈM¸XÈ¢3f-¹XqÕXÞB-š(+„uklg†º0°Z˜„'P{›×ŠØ5öBÖ‚0Ønx6x‡+à[7Œ-`ŒIH}B JR˜‹iw AðwH¸…¶ø€ZÈ„þI¸ƒcg(ZBÈ€½[÷[‰@‰×ÐŒ0×kKånRnU"sJxè{@IøÀXsõØO,“!Ss_Š¥_¸H`‚Œÿˆƒ]xŒ´hy«˜„ ² ÊbWÖ =ó,¨5&’1c€úUN…X6åäLbÓ‡Bñw8ø ‘–Wà…9X{{X“{Ó5hˆc3V0Vgƒ*ÅÆc °zBy‚; *}.O„¢·8R7fD¶~0¡Xh‘Lè" ({,0- pi‚;h?hc»ø;¢x¯µu>þ} P˜-PñT-°ƒuh‚Æè„ï„cHÑfŠÂ`±h‚‰…%8$py)À, $À-@”h)¨Ç¶o¡7†ö˜ÄÕTjÉh×™—§"`yo9š—g‹Š){¶IŽ·yHgIH‡2wÇYy+`‰€“¿),°•ñ´•—×‘Ó ‚ÌÃ0ˆ‡ àckúóN÷Dýñ†Ø){sèŠYoY—±g‰8h‹aó>okªFÃGFkôŸê9kêaFã³R™[gÔg­iyÛ9œÑW{'˜‚sj7„?•I'jŸ±gœ²wšñ4ª9}'þh‰8Õ—¹vmµé%óø á ž²Gñ„š²wm™—õG}°x‚Wm£·xçaŽ ú‰y) ªY*Þyy‰˜ºu8†”TZ‹ägšÑ Áð†‘}(¥ñÒ—¬ˆƒx{.8u:d¦o6p» uØ¢•7—Ü™¥# •³÷w6˜ƒÉ[à(•|sáFgE$Ö?j}j•O{ñ¤š+Ж$*¶Hr 'Mi‘ ”Új "©gHh†`ŽUYŽ$‘# s˜˜ pQîW£…ÖP$<บZ¤ò7¡H}Ð3þç–C4 …‰—  –úh'°“Y {´·uá:¬MHžn&¦ÚF:Í@j™¦Aê›°Wpˆ-Úh¨X†hçs#$±®ÕJ‡±7Ÿá)}y_šD€)pdi›PS檰G´¨ŽÔ:Ÿ ’3*zþ&²€ GI> VEêô(³hyüˆ®qØ`ÊÀžªV*F¥âMæ”NBÝDb8«²€å~êé'W(ÊÈ…Æ(Œ3ÛÙˆoJ"è÷Oå9"H/)"±àUI«G¯°ÇÙÈ +}x‡Øµê¶òC (›ebŽ `½Ù¢d»Ÿ[mù–¬¼hþ¬Km§Ø`°ÒÇuDÚ'8±ûs2êœQ˜@ÀB˜ÒLJBZ}´™­¾×vÍÕ­¡ &d7`©S}'`ðlóÆnŸõ‹gˆ©¢U÷áŠòev«ik•ýXpK:+·K“mc»È‹†|ØU`e»ƒ¸,~S_ˆ¨(4 vŲzö:³+0‡€p6€/g½Æ-Úò3Þ²Xv»ƒEˆÕ-‚øë¥™ñJ¾5âj{û¬‹aÈ,…kz çI¸J43ò†I.à|‹y'Q»ulÑ·ùë°:7«Ÿ!h±Õ8©EwÀy·wð þ· f 2 †¥ëŒh›dÈZ%v‡³4 u^÷Ã`·nÙÖ#…7²i—¤Ju:ÔU òtë&:`tVv_ã%~‹¬J: 4¬1B’!Q-wµI‡_©g’)9ŠØÊ’#‰’êuX°féEƵ^!‰Æ˜4/“¾‡õ`T“Ç%‰`Ô[·Ë7üƒ ?àùãžêE_AkÛjatre$?*ŠàÇŠ§ '̯…oº½ÁŒ“L!Ü®ÝlËž5åâ—eªÎÃÌQCÎÑü¶ð*¸–ð¼µÄ¶õÊ]AA ;ýŒK ºÅñÆ:—Á™ùÐß ÃÛ*¹´Åº€S‹ú{HÊ&~KŽ*MÔj™Õ\™"= l4qO¤q«zjÿŒEPѪXíÕ*7<Ñ= —–5)wjQÖA«ÏGÖìA?qtgæùs´ —Ô8=þ±¸<^Üš™­ü )¾Ýv 7³ýÚ„Fá×ܯŠ}Ê:×i£}å#µÚŠÚšÙ®ŒpcæNQŸ3Ö›^ç7Ç„PÇüµY÷µ_5#5²Ln4#iÜ·@X>Ç”ÎÆŠþ醦Çìë(èÔ6Œì}'öMôœ)ÈÇÈ” ÉqÅ6 R~HiV>ðl&–V˜¬ëµbM ë’$læl\RD  Ä®”trt4* tbLìêì\6 4.,„vdLJDœZ ”‚l$N$¬b|J <"<~<ÜʬT2 $6ÔÖÔljl$*<\¾\4:\^\\6ŒN LžLdVL,*,4n4lÞlD*  ,V,$6´¢Œ,4œV,TªT<>$L>, ,:|~|lfT¤–|¼¾¼Œ~lÜÞÜTVT,&|þ|tît 4V$¼¦Œ\6hƾ?]G¹›Ïÿ™óD:ñóèÓoÝ\‚¹xܸ£ç|0fL uòs¹Ÿýþñ÷߀ûX ~ˆ ‚ÿ1È…ƒ>H €þù ~÷ñÂÔU xð97^y+(ñE (¦¨âŠ,¶èâ‹0Æ(ãŒ*V€Ej‹Íô¡ˆ!>€ 4)¤Š) i$)İՇáM5)å”TYÁ Yíøžx†Téå—`®¨EÝŤsðÍqAa¶é¦”JÆÔ^š=šðæxÊHBPgò(EEæIe ‚Ƹ§\Z†—[…Â(¡Žùè‘)äpXŸïÍÁh£+Bš¢§/‚šç¡0%Úã$púé‹Q4ÒH$‘äÿI ÄᢨnF‚¦NN¨ª+Æ‘ƒûyÀ 7ü ìÜ€†’8’€ ºg\söjn›… u°€Á2C¹3œk®º¤Ë¬*€k›ºÆÄkˆÝÞIh ÈqÃêž›n» \pÁ1@]X»«{Mâ–j¡•Ö!ºí lð ë¢pÆåþQD¿¶0/¥–Rwï¢'Ïxr 2, 1ÇíRóÀ3çlsº<ß ‚­(¶,$©/iâ¢o:„?€¬±ÓÓüqÁÿqÆù‚Yïp¼nûgž‘ ‘îÎRS}0ÔcSm.ÈE0"ôÐÔá0gÄãM &¡>aöÓRïÿŒ1ÆO¯ý±¹E˜ð6[ â–ä\QvÙkSÍóåó|ðÓLÐð—De´×ܺ‡ ?Üqà˜·~ù悃lîd¤àø­)_uæ¶ã•.dË¤î´Æ~Ϭ p€7œqùÚdO.pYKI´KFŸj÷—9ˆ‘yÍ›_^|QdZ pƒš·/;ÈL‰—‰‹¢×Û–\e X±qñ+ž¤Å ’s_ñ¶. x zCºL²µ%My©HQ`Ú‡³T¡ -SB£–1²!¬v·[Qâ°w¿LAðH8CÁXµt5áD2ÂB;øÙmì  Rèÿv’=ümoJ»ÜǺÜ €3"¹Øå±½™+PR¥.ÕÂ^5n@ÀÇÖÁhÀNAŠƒ\8Àk&;ÒõZ’½£½PH5(ÂW7Æt-€MB2"j0¾91JGª[È»¯ ª >ÜÛÓ’Ð¥!ÅAf}CøÌǶ@‚/¡`¦Žh¤HŒo›à €6$´¯j‚ÓØ <Ù‚Ò‘‘ÎÑß‘:°ÄM:mg€P‚”òøÊ*frI˜Ÿ‘†h&÷ðÈ‚S"æÀb¾vaÀRJ ¦y6T¦Ë)Ü¢ÊG:GJÉØ[ 7ùM@‰ì `Ƥ²) nöbN#{‡ÿMJµÀ <„ž$gð*Y@rf`ô4…*²™kŽ.ñˆ_âlx;ë§”\ 37v“`írÃ2ã&JEÝQF\ˆ§&ʳPkJ)1¶®BŠá¥A²%KvçÂ)­ñ—™ãÛ p8%l |Ú&Á‡ùIb”rÁ Ž9¼>Þ€~ \`5&Ò ‰Sw]Ä-µºI2d8ó€—0U+Þ ­6{¢ãæ¸Sgzš·zQ$Êȱ Î Tb+Ï ÷ºœÍ8ÑCuÖüI)ŒmdÝ[g… ®±†–;˜l7lÙÕˆ’jÁeǸ¹ÍU”G"ÄÆ¦ÉAV±|Zœ =YÿÿMö˜ÑC„¼¼$2¢•‡ðY¦¹ÑÉwC’ja½é´¦\À¬!ÇÇét%+óÕ‘´PÑÀe6€Nt-W¤„àâÖrr¥(]’-EAU‹$dÈ" Ìy•E¢šTƒ–ƒx.Л;{bN“]My2Ix^UQ™Þ*‘@xi£ç̬^δ÷T'ÕëVÕ¹. *¾æ%íêf€{Êèº8È®9‰3›½µ¾²Ìâ”,PVj’f?PæŒÖ‹“Ñ µ(-dˆ y_úA¸µ-ÎØ4zbª¨x¢3š€YåIå·"Á|^z°tI«±‰T>1þ2Ü¢0‚ˤZ‘«‰ÔQ“ÿµÿ›ÁÈœ"˜Î,’òóXÛÇŒ5Ø eåsMç©d<’:‰ð1èöÐ`>T]ºÖ Ó”Õ£àÍ¢öX¶^„²Œ 1X¤ôž’¥ƒ»`5ËF`f¡¶Òdhå ŒŸŸŸ;¥?zp[‡›ü—{IôH9pÞ÷`ñz©¼RãÛ 6lC†‚ûäô‹VMßÕ‚ ¼–Ò™¹‰YËYÁÄ.Uy'jCy/."[-I9×ç=—Z¿l˜"ÒúHÊuãgvmÓˆ ¬^-p ¤zù†§"ªuŠâ`[&N®x:¦Òea Ë™e\OA¥¶ î"\tà@ÿeê âÀ‚ðÁxsˆm8VRŒËüÑ’ Uðm„ÿ†3ìWJ‚]v á¼€WÃz.ŒE“x$ž"-—Ò±œ¼Tƒ#—¤8[Âì\sí|ª &cØÈJ))}Ô\WMɶ٦bEäâ!¹‹lkcx“ØèB A@ë´kþÎRqái“ÚÃb¦]ž`úŠ:ºå¾ÎÓ xQ¬µwø(E†8êä~k¹1P©%,M ÉdÄŶ‘øšR”8Ý“kŒ ¶¢¥ Ò \T®Ë¥# ¼>ýTú!a!¸&äcºŠ`b¯¶  vûPvÓ#Ê™å$¼Œ,€o>ÂIà,Àý—o¦K*wûÿk>žní+¯ûMZÏeu hCR ÙD à縂”ÃG:¯]>EXÀ>mòdO¿ƒ"`^~#I^ %)S>æ$¨R%åz 2 D2#. GB§vó”r×iœ)¤#}3bÕ÷?Ãs.SWx¿tcƒãEWBa*#wAO3ãK«{‘Â_S N?¨1~'%žVWøÓ+((#) `·yn¥ð6.À}•9.L(i©t6;?؉éâP4Žzåd¸tlIƒ–pÄ3OÞ¦óTVp‰BtmvŒobHpŽBwQ@ˆdP”QÏWAOEœ(9kΟÏ$ŸŒCŸ™bŸÐ‰Ÿ³vÍÉBýw\z˜÷ u4hòœMXN–¹Ÿê™ê'Àžìµ{Ï ¡ž9ŸtŸ ó©Ÿ÷¹¡ : zà.A pý¹ O ùé #ª¡§¢tõ¹Ÿ"j£Ú ›8à<0Dð Ú$0Ú¡úQû4¢ô©¤ýéžFš¡-Úœk@Y Îø¡5ª£ʤ2£\úž3ª£8J¦¦1¡‰ðT …[Š "Z›R*§wŸŠŸKš“ö§v*~P0;à¦oj£ŸdZ aš¨_>ЍŒz¨LªjP|@C §}*§šš©œº©žÚ© ú©Ñ ¨L!j G ªºª¬Úª®úª« `¥$;rmagick-2.13.2/doc/ex/images/Button_J.gif0000644000004100000410000000733512147515547020130 0ustar www-datawww-dataGIF89ax÷DŽD4B$" TVT,&$4f,\Æ\tB D&”–”$V$$2ÄÆÄLF<|rddJ,&T>$D6 LªLlælŒR ,Ä®””‚lDFljl4.,\6 4* lfT\RD>ìîì 4J\^\¬bÜʬ LV$TNDŒ~l.$tþtœZ ¬®¬l> <",*,<~4<¤–|\6LžLl^L4n4dÎdD*´¢Œ,V,$6\J< D’D,F& \ZT,*$4j44V$,2ÌÎÌTJ$T®T”V 4LJd6 <. ,:üþü d^\¼¾¼|~|ÜÞÜ,&lVD4J$ |þ|tît¼¦Œ<&dÒd̺œœ^4*,„J L*œŠt<2, D><!þ0Creator: PolyView® Version 3.62 by Polybytes ,xÿ혇ÀŽ/~!’¡B„>œØ¢Å‹3f”h‘È!=Š8c A*RªLYHeË•,cÊœ¹ò%M˜8Uؼ¹SgΟ>úÄÈŒ‘õ@¨RÓåÏ—=…JJµªÐ6¡6­â¢ÑH5@œ^­ªµiPž2Ëö\ “mШVS*ÂCˆ…8³N-Û¨[«ÑJ |6¦=¡¸‰b!Í`³pÇLyo^³*›”p@$Êb"FúŠ~z²XµgQ¿MËzµÞÈ‘W YàÅB”ÛQ¾ˆ€‹µ4fØd+ÇÊ÷·Ê xà^ìÆŸÞ ŸNý2iÒd”ã^%võïàÃKÿWñáËmæž=?Wiå 9ÞÇŸÏ‚~|øòóãß¿?üÿ(`€h`€æG~ñ¹°X9-bÞbËyæFw.БC vèᇠ†(âˆ$–hâ‰f@GhÖµ$ávžgA hã8æ¨c@¸Ò‹1¦w›4èhä‘Hîè‚P/ž'¤gƒ$)å”T~‚¦5 £gDlXå—`êøDi奇žg0„©æš%ÊPZVlÖig‡oÎä¢yfš ÂIÊС :h¡‡&™œ|n醆úa¤)PJ¥¥(¾©WJ@:yž’‚ˆi¨(.úSœž‚Jj‡pèઉ¼ÿš°‚ë­°Êjë­´ÎZë¯Xè˜gj*tz¦®Ê!"7Hñ†Ð>ël´ÐV[­´ÒR;í¶Ïž £©6*'¤Ê¦Ã€Äîº1¨ën ¤o»ì¾›®»ë¦Ë‚°ÄrÊ'zÌ©ºª 窈ÁôÎËî½ë,/ €(ìðÁ1ì›#¸8¡ºœÀ«Ì0½í¶;/È!2É'[Œã°z5 °gÉ*ËE$?l¯Ã"3ŒsÃ%‡lÆ·Œn—ê¨vžkóÍ+ ïÂKãÛtÅünZ,/Z®¹€±ÓN׫³Öß õÅA;Ǥ|ò½‡­´É#ŸÜ. DȲSZ‰ìÕ9Üÿp€ÜöÖ2Λ,·Þ’}ê¿ç\7›2ˆ1H]05Èo«ËîÈõ¶KH °Â D a™ÆøèÕf€Lq3Â]s ÐÀã&b “Æ¢Í:‡90!»Ø_7=ï¼ÐÁ{¦>;aŸ0bG€ÍôÇì2ñ|©9í)´äZÿ!`~´í1l•šæTfŸ›"R­3ħ{C_òM4†ᙯo`{àîE‚ï¡HA;Võìç!&,lµkWâªA=IOh©+9”=¯©¯ié˜:(?ÆÌ€æ#ȺF±ýÅ@+ì×ÇwZO† #ÓÿÚ…Ã/ +cÓKÝGÈ!^_sZ«®–‰KHr`¨œÈ½ž½+^Т‰Ž“ò¼¬~'"”I$F±m^#ܧ$J€žñáðœX;¥9-MF„Õè·Äʈ´ûÏn¦*âíŠäkãø¸¹¤-L`"ãJæw¦<2±C$ØžàH6Ç) P%¨BYçÄå5ÌfKW)¥?$Rï<1;’$ÙHI/&°]˜ `øvè¤àí²N\Äçræ®Y&éˆ;áä–Vy5Dr-–c¤0Ç“·'Q³\\t×2áLø ³Sã+Ý'SðF“‰-pÎD’#Ô(%ží˜l¢¤Â`Iÿ8@š3ä±V‡(Q™ˆh£Zc¥T#ɵŒI„QTOÄ… ”A MCÂÎP#|†Rs Ôè[s—8I„¼Aúê/ ![@•¶¼Ú–_§ÙarŠ¢-ÿh ‹Tê¡Z­=T©÷¢Ó6Ã…E3ÙµR‰€,÷dÊêy„B¤(ã¦þ󬩰qòÔ]8êӇР®ŠÊ$™Æ3€µÞmÀ‘J*Óþ‰µ£6Þ“ŠZ"Dà¢5üØþŠ£:ôÌpÛl•d0‡ÈtÓ¸(ªàU8/Æí9dL_9Øu½6Gw êä´·ƒò ƒús†s$¨Sõš˜#¢DOÕO±·DÛ2ÅÙ®ç7ð¥yk]*™Õ–z£íˆd€š¡°fn0‹ûƳ!î½òTov x¢ @Ö»ÀUàŒ”cfRX”^PFœÝÅ‚Hÿo0a}Û%…( ë µKj•)–f¹ÉÁõ„hEäe3#O1h®Žd€ »ÒÐ5Ãò‘ ÉRýš©Ä%¢“·ÅGYp§Ñöd!ïó…ÃK’_ã#0à\ÎVP\ÕlÕU„(ˆXˆ7tŠ8ˆˆBLÿq#RSÔ†ÃÆ:†¢(‡)!MUh5@‰nØ&s@xÄDHçAq+¹ÒЬøŠ®‹®‹´8‹¶(‹¸X‹¹x‹ºØ‹A@5Íáù¥o¨g!pŒÇØÉhʈŒÊ،ˈŒÑÈŒÔ(Ï(ÕhΘÑܸŒsxN§Åd6<¤:OR…cxjÄ8‡§†zíøŽéÈŽžÒò£DŒ¨8ûøŽù¸‡·äûñ¸eòÈpX²@¶QŒüXŽò„èhi‘IV‘LB<|n\ŒŽDÌÎdÌÎÌÌ–Ì,&TV<¬®TLN42,ŒjŒ 俤ŒŽdìîlL:Ldj4äªä,*lZ\<>¼¾Œìî<>4LNDtrtìêìTVTTV$,,|~<,*œžLÜÞlÜ¢Ü\Z4üþ´lbL,*,<:,¬®\^ÜÞÄÆÄLN4|~\œvœ œžtüþt|^|  ¬‚¬dNd,* <64ÜÞ¤<>ljlÜÞÜÌžÌ,",\RD¼¾\LJ,ìî¬lj<üºü,.$\^\<:$¬®¬L>Düþü\^,¤ªLäæl\^äæLN<œž<.<|~ÌÒœ<> ”’DÌÒdÔÖÔÌšÌ,&$\VTln4ì®ì,.lVdüþ<><\NL|~|ìîì¼¾¼¼Ž¼¼¾¤ª|lnT\^D¤~¤ÄÆ\lRlTV,üþ¼\^ üþ|¤ªT,.ÜâlܦÜ,.,<>,Üâ,. lnl<>$TN4!þ0Creator: PolyView® Version 3.62 by Polybytes ,xÿ¯˜ç„*\Ȱ¡Ã‡#JœHQá HejXeŠ>lňAè‰È‘$ ‰,y’%J–-M’©’¦L‘&U⌹òäËœ9®œérhKž$Mi££K•!5 ™´æQ•Oˆ¦¤¹µªÑ”Eµ®ÌÚ“hÑš3mê{óeU¢A¿¦dÓ‡ÑFH@Øp}[³­_«qùʼ)Ó«ØÂ.«Æ£pÜœVÇ" [¸G<ó€ñ"Ådà’b¿b¼µlË®E_u ó¦ÑÓcß–æjš¦HwʹAÇ‹²mï”}Tmcɇ׊õºS4Jé喅LY8Éxp€¡ÃL#Ö|Ó¾ÿfËx9ò¤) ÇLNmXélá‚m;F›uöpçn£QV¾È!7X€B6›s¢ç’F©· h‘VŸRS@‡Üa†TÁÕ ‚â'Ÿ`(lê훇轇mRX¸ß~^ÈAVZæå¸âŽ:öâËùøU5"ãŒr¦×Hø1B#PF)å”Q>)¥•QÒe#Zj9¥—T†)%˜bVY&”]ô WbÄyáŒ4ÊÁF+°à†nbˆ>ìiHžxúè { ¨Ÿ‚&Ú'ŸŠþ©è¡‹"ºhžŽjéž}’ÑÀ }˜%žHnî‡a†t€áò©ê¤ªbji«« ÿÊçŒÖz磵Ω®}Ò:««±æš*¦{ª M¶‘*œû푱»Bªè®…ʺë¤ÕªJ+¤·²J-£€Öšh·‹öj®!ƒô@[[nŽJê…Fhé­´úI/±ôŠÛk¡Ø ;m£úž[®žx ¼oÁЖÛDå­´¬»Üy‘E¶åV l¥ú¦zí¿¿êÛ-Åá .¥¶B‹©´‹âÇh€p$œ"ð¹Òº:nÀööòÁ"g,n½›(¾Û8Y»ÌÒ±…¥(Ï[­Èjs¤’†Kh´ˆ†lïÖW:°°ixŠ’ËÌŽ ‚Éæ½*¯kûº6ÛÚ®-ëÉmÇê¶Úpo<¯ ±õÿô0œgmÞo\xáÛ"Þóራªã«Þ{µ ¡™d$Ä3‚@®µo?¾¶çŸ;¹è­ÞÍ'è§žúª¨'¬1߄ʹì»t€ðó¾Š0¡ûî¼÷îûïÀû¸Áo¼ïŠK9m3‘ý¦¨µç,kèaýõ×€ýöÜwï½2`: Þk½ùz ÿýõJ ûñ|³,Óì€_Zk?D¡ÿú÷ïÿþÿ  ÿø@ÿõaQLÈŸ@öÏú;€ÇˆE9 Äeî‚Xग'ü1ðƒ `@È*‚ L¡ÿ¾0LñÍS*¡©l—<>±@*ŒÂû·Ã( Ð=Ôßÿù”ÀñŒ¨Ðþ´¼™ ÆyÏÛí(æ§,A…ü¡AHÀ>¤ªˆ Ôâ¿,‚rô‘ÝËÞu¶÷õê8ô¡ƒ˜Bjqˆ†cÂJpnå‚]q*ÌÕg|òàXG>Ž˜bÂôGÇöQ…,XµÐ˜,P­Ñ]3˜!‰Å0zäcÉH²É±ˆ$—KÚ!CF2Rñ’ª\ $ï”JKrñƒd„´`מü-sÓ €‚ Ä1—L¾€0Š @È„ðh ÐJ¸@Ÿ²5,4 ‡kœ!¸e-&4 H‚7/!¤aæZ0ÿ8œ@ÞìÀ¦ÀäÓWãBãN‚4ÚµkÓÎ`Ê‘‘{à˜À4´J  o)P+¨À¢L› YÃtJñvëŸZÐ ̳VD‚Šñ;ð@ÈàQŒ¬O/ô KŽùR´¹î`X°)QhtŒŠåjŒh“êŒc–ŠƒŒ Cbè¡\#˜žÜˆ…üï§ ì€æU²sAž*\Z ´uj2O*@ÌMèÊVk[Á",ªJ ¨@˜5d‚r¸4("nSƒlÅ8é“‘8Ï¡4#¸ &¨(áƒpퟴà*ZÎ éÿ`Õ¹ÿ‘ëPõª×Õbš­R\‹iÇòÔ€/x“I0‚à€ëƒ4¸„˜ÁNf[@NË /D PÈ6* ÖºÉã@ piJJFá Ðìžð†ÔFá©|a*S@qÖ=2”b¶p˳¥ -ï+€Rrú€ <ˆ-FýG€‰ÕÐÀìô™ ÃÐtš-c¥V·4‰Jq‘W®|`„ðv‚Z¿VÜ-©5Q©èŒ"2Óö*ÁYÍO€˜,yeë¿?Az˜$-€…ºö•X`5'yf§Á%fM­Bë– ¤:Uœ>–QY¸À[¨‡ pÌ}ç2ãÇ*?šä÷¬×²ZG¯ú+*àuÿî­_ ¡9¼y ¾,¿¨û5‹A»í­Œ@ a½%³´ØòÍ >Á¡› $ L¶¹oñwcí‰KÛT6ªÅ7ÃÔ!¶êá:6 oH!¦«É4CXÅ+• ,Ë*Ë)B4³­%Z±žéËGaRˆ\w€*DJþ•²UlcÚ]hŠÓg««ëƒA<7£á::BPƒÏ|©Íö8[±Ü'_j«¸ùZ@[[êÖû=TÂe ›+©!ÒZœý'eÜé™ÙØÀÒrÀnzb«º6ÔýÎõp‹›•ÐÀ¥g¥"¨}Öçœ5€Ê¥„³ÿÖ0#ƒùÈ_ÿs]¦YÄäÌ¥ÜgóØÓPÑ«rüÖËåoly013­“¦9ºª¡’3´´‰ØÞ»×„@$ò5mž'Ì[DãSüŒÓl‚opÌNí8ÂeèXÑÍv:@„%–Ëß.êû*X›3’Ò¯Þßîƒ)3< Bà¨Ñÿ¥OÑêÝ…š5Á¹c;Hé|gŽ—é8Õˆš{SEö¹Õ‡k1s¿½XZ± elkiÅ[ÜWé#°Xo~!¾§¯´Éür´)Ô4v§!ŸñV§Ò‰Î! à‚FÃükV— h |ñ9ªê%/æ‰û ùË¢Í{ ší7ìàVÿ¸nß"N3~óp‡õÕ¾t5(؈(<‚Uýldn¡Þº»O 0Xkðºîô¥S{Z°Uðwu x“§'’’5É£1`?µÑRÐ#*4Ôg70䂼’Æp‹û–8‡å6Y—f4öB@£EÐÖjo(+,0<¦Jà†X-´bÖòTg$!/ÑP€s]¼‡QÓ(f§J©µéUC´d[1y}g5á[Œ'{µ—r±Ç'Z@ï‡Zøækú³QÞ×gý23`¦Pé¡xµöUW³ySH‘pgç?4ÀZw+<ˆPpCÑPÞÕ{öóWƒˆKfÐ…½&@äW=ÿÃ5(³[;’{{§yruLp)tBˆh§?pe‘8†oXW€ÖIE˜£{ùB}­è/‹¢ðtö”&–KS€R0udÉ60|è0v~€¤s*¦|>àÐmô‰ pˆxDq ò‚Upgz:—]ÈÁ]DgxŸˆGå*`­Ç@‹€Šð',pv5¸eqMð€b爷rh¡†Îfk߇ƒ5†1`yA_à`}U`˜BIÐ}7¶1ŽGŒ}Ç[V6Âh? hT­¤uׯ@Pl‹¢PQõW^¡vNÓg[Ç…Ä,º—<"x-„ÂƵ@;´ gÝÿ"“7%o,¦+tSNè¦]èdVÑÓŠz8xÃaOÀO…¼&rŒÔ]~Eå3ÍWw.5‘;e.Pp¥Œ¸3xâ ¹HT%frƒC~ƒ5hehT§7Ž–‘ «o‚¢óæ–|ôW–•î33œUùu~’“l¯¦BBVÀQÁ%(€0“$@ðÕ€#ö`€ó3tH=óÈ—€Â @•ú³‘1'yØ'`  ŽH5…ÄÑu¤Ç—J0Lp 4Bz/Ykip‹içšÄ·Öy.\/–ÍZRs?ƒ)PŽØ¦?ЮÿÃ1ŠP7µ+PFäp‰ç›õ4f$n}Â…È@(v’<÷57rôE†0‘¸-[c82zÝ…š-Ti}B~¹@f¢µ1'Ù–´™G—™Tª±’õão(-ƒPŸÍÙ?u[e¨ž†°™Û—Bfù8ÃHmùêfH^ùeª¢‰pgZÄ?‹`M9x(7£ÏtoZ”!ÖjIç(œÔ"d•4w…‡BXpxõCtÔÝg}&2@p\ý“] ê§7‚´l×™—ù¡YrŒµ@w8s8Z eTI=´%ðûFt§n²tw09+ïdÞé‰ýÓrÿ€L ‹;yL 4Àœä^”g€€Xט}hšl¤f{ @prøKÿG@ðF`Yp-,`/puðKî¥G`0«¥k)YLu~aÙwÌY¢—÷X!£$J“ü BÊ5-t÷‰ ¹¢zðt˜*@zpeæ"­®é«6ׂûÒ¤Èj!˜ƒf‘ç­-ê…Ø6®úb®¬šváº@?“[× +JCȬðÇGö*Søús¸G8,=îér¶%¯íè–áj¯ÝÚ H¨Jý pìKÏsaJ± ë?ãÊ_ [²j§®LêD±­Ñg_…§µ©Bqÿ€±ÔMM©v|dk›EaqqqƒZt C²æõ…5»H=t°ãWŸ¥F³HK­úZ‡Ò¤oá‡ê4n*@?е^ûµ``;¶cK‰¹(*ðdûb»¶m»¶]û¶k«àÒ˜/Û•Ü)dÀp<~ <ây.{û·„û;}Û;“6²‚,9v>)˜‡58,{ ƒ“k¹ ê€ÒW7vƒT!Rš!K* ›NÈ~PX¦Nø•™›w8ø>àÇ'/"Œ '…À*Örº1vhyk8³ºš·S<è†>Ì3…G‚9PD(\釢’‡[©·2'ˆûu’ä4fi³2$bwPrËõn(ÿ÷ºÿœs£˜ù½ i  .Ò„c˜Ùˆ9ctÂ%Jg¹ôhxž'qXø„‹¢M°&Áñ¤ƒê‰ ¼Ö(+¦qö ¹iåiØ8„™y|† +¨ª8t` °„os7"̹îVÂy3‘CÂ'œÂ&œHF+³PE‚·oÂ`P *°Ã<ÜÃ>üÃ@ÄB<ÄD\ÄFÌ P`À^àB›Aƒ*°V|ÅXœÅZ¼Å\ÜÅ^üÅ`Æ{p ½áÄÖ9» 1ï 3l|šnÌÁÎFpküÆq<Çp<#M<”žÄq<¨~üǀȂ<È„ÜÆ50 Cu¹PúÇv\Çm|Ç,Ç‘ ÉtLÉ—Œ970@ p&`PZɘ,ɤ<ɨ|ʪœÉml‘°$:ðS 6Zȶ|˸œË‚l ðEPb`HÆÆü.ǺʜÌÌŒÌμÌÏÜÌв®,80eðĬËÜÜÍÞ¬Ë7 °H`ÛñÍèœÎê,*`ÍP!1 0Ïô\Ïö|ÏøœÏú¼ÏüÜÏþüÏ÷¼Sð;rmagick-2.13.2/doc/ex/images/Polynesia.jpg0000644000004100000410000002612012147515547020353 0ustar www-datawww-dataÿØÿàJFIFHHÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀú§"ÿÄÿÄ?!1"AQaq‘2¡±Á#BÑáð$3Rr%‚ñ4Cb’²ÿÄÿÄ'!1"A2QaB‘ÿÚ ?G¶ÓS¹šé-â–(Ûw yŒÔ\ØÉ34¥€€zP®§F%fe,yÁëEmíZü‹kFat™vlp}³NCƒûa½9mܳ‹pÄœ#còëN¿¼•âHjÜåŸj#§h× 4wÝô‰ 4NCzhys!,ÛOÀPI –¶g×":ÝÝü?†(hÜ ¬™ByëÇÖ™ûaeö¸VX.QVÝ@tTÇcil¹!TÈ çmC}`òZ]Wl£ “T­Xê4í™üšeߨPôår£ÌükêÚ=³©hß~r3Óhä·Öv‰ÅÒ÷PôúU+‹©%³Ã¾WñÍ•½•®'ygžq^ª,îê4Ž­S7! nçžqŠ}Ò'°…¤’5E} 4™Á¡š–‘ö;Xîî­D-2oFÊßj‚_‰#ÌJŰwà`+li¹Ô!½fµIû½Ø³Š¥4Âη+ÉÐáö>”¤ežyöÆ6’pzÕË;£c+ý¨8'pqFÐ8¶û)µÜ›^7>Ç'­Ò4YuH¥™&UXðª̟ʦ¶ÓƒÈ;ä _†ßÆ‹^)Ñâ·‡OL4²1¨É$ túÒr²•Emsí}¾›¦îE·.ûXI?Ò¦Ô{J÷:-¼Ï!»‹p”¡Ú6À÷ Úõέ®+0)*ųiädÓ›a½…Ü—ÑÁ4—6¥âÜ»‚0ô>´Ô.@Íövhâf|eœ àgŽ<ªÀ¿žÛlC³'ËÖ¬èÖš²„¸Š0¶³¨„Èÿtùþt7T–ifhf ÞDNHã 7ô-"Sj“˳1ª±ÞHã'Ò®.X-½µÐd_á鵿·´™¢i„‹€ œš’Ú$-€ä3```zí¢ bgÉ*0Üäõ©ln® µîVekv!™ËÞ®ßéÆi{øæER€çñ«#³†5\¹dtø¸ƒIèn‘Σ«[]­¤±ª’Í:u[K8V Áp3Â’OÇÒ˜®;¢½œBÖàDÁG&a¹;ŽNqżìu¥ÕÂO¨œFÃs) 1ž™à?_JËz¢öªØ±ûBÍ÷;Yz7·ëVîu†0b \ƒÀcÁ vÚ6ŠËÃ$ŒýéÿVR˜PÝN:q€:õ>Ø3}¨-åßï|ÈŠ„GÌà9ÉÎ:ŸZëIR9ÅÅl†ò᯻=sÝŽÙeˆ¸Ÿ'ÄWŸ>JBeaÈà´êumâƒnÖP®w.~>T£yqö™p9<:{WAq'ÿE&ckgŽ}«Ô[TÑŸNHdY–A2îG+ì}ëÔéÙDìô×VòêLRMö£î™F / ôÚ|-¶ÙZ\ŒîÜp ç<ÔŠ›ÀòŠÐ­nËq^w,dgs?Jo°Ô´ë»c“t“…É&L«`sHªB±9©Rg*Ä0èE+†‡Ö´äF¸™Þ%ÿMò7§eÚ˜žî9¯`*ñ©éÎÀüiyÜ»›$‘Éà¦ÂIQê1Š PK²\Éw©ÉrÒáØ“»ѹd{M gŒJÇ÷az²yçãKvVò]ÞGg Í×ÐyŸ¥]Ôîc»½nêBU»ˆcÈQ XߣÝͨv>k +}Ó áz¼ûRà´[[–]Nwˆ©'À7dþT.ÖYãW ‚ÜQ»ÎKym5Ä—¢%‚mÙ»vF}E.‘×ehÌ–œƒ€àŒ`Ñ͹ž+v’Iˆíå¾t½y¦Ça#™ãÈÆWõªÐݹd9ÀCá ô£@¦™§ßi2é6²K.µdF%YÜ1éæi_öؘ¦÷Lœr«Š[’s<Ùvm¤ç5<¼[]á‚yûWEf†ú¤iÜÇvÌC÷n"Fi-Î$dùÄP«›«øåµ¸Õc€¹2(B# q“Œzühm¦™u$vÓÀ@‰Y¼_t|*¼z-ÔŒ^M‚ –2³dŸlTšIšàäêk²ü¯¡éši5†žóp“ljd€G_¦(Jkm$àÃÝ–êc€Gµ Ô¬á7#éПZ$½Õï £i#ÏÖž)>‰å·m7•\*÷n`G—Æ€Û¤ýË‰àž£Òé¦+ˆD=ÈpÜu¨äÒáïÉÉ _çFÈA pö^ú÷N†çUE%Õ£pÛóæ½AíÒkU(—s$GÉ[ }kÔ(nV7Á©LB3Ë »©XþÌij¤¬ŒT•"¨,ŽC ÔfªËCmÐÛ>ø˜eN9ÇÞ¹Ù™nßlñTÈlƒZ¹d+ýÂÊ8~TÁŽBsÖ®I¦\æÃzüÅ)*1åŠ'£é—qÞApöò®ÉnAÏ4õ¬ÚǬÚ}¼PÇnÝì¦ð¤@ØÉôÏ­+trFcm$ÖèÓFŠ‹&bÉëïŠûDî IàñF'Ñ “» ¬Y<1“žX`n¤n'œð©ê:Þ§­ødš}…£lì<ð~@ôäs]hsÛ•C:fБ›N¸y‹6\mÃ3JM´¹y)ÀœtûµMd”ÎâÁ”Œž)f´tu &©Ü›²€–9ç’j´¹.U'C´tÙŠúˆ³Ý h¥¼Ã(TÜIà3A:BÎOè«ûícês,qŽ59v¸¡ÒÊ‘Iû²Â> ã¬jS½Õë™wè7À}1D´ÞÇë¬qH–."ê%˜„R=³Ô|)ÁÈ´ÝQ¢ß r•c¤c=9ë]¥ë ¹䓌íŽ)˳_áD’ê‚÷SºAin¥ŒvÙË7@2GéIšÕ¥ÌL£²vç’|ñSœQ³š\_Ð#SpTªüèCNz?g.µB+TF;Î\ú(êi‡·ý´¶kU²º—•'ÿÄ×ëO FÄžåB¶‹v!@B´TÜB­†; œŸ.Ã§ÝØÊ¢XÙ”NEOuc<óoGÜ„òÃøkˆµL:e€® çõ¯Rå…㣴 +÷sÆ+Ô)œäÑ– Þærí¿''¯4ßt4Õ‚Ia¶Ž*6ã=?žhuŒÎ×7 ¹aTô-VuhÔa‡t  T²åWG¯áúv\˜^_ø%ÞÆÊìxˆÕ.Ù¶ïaÁäQ²f,p€ä€3‰«vê« ˆc‘ŠhåODsx#5ôìm” YnAe@¬NÒG®N¾ÕC¶=¥ŸPÖ&ŽT+2·wP9àdûì~Ø5¦¤R𲨌 ÌÙdð7~µsVÐᾟº¹µÍÀØ:l(€±Æ8ÁÀ$S¶“Ù†)´g)«ÊŒØ×8§þÊë ©i—bXÙ„1œÇÆÉY†œûóðBnÂ鑪È^BsÞd ñ,œ}*ݼ?²Dkkt³!’(ÕH\¹<6|GÂpö惜_AQbµÖ™ö ÷HG#»à•öÏ?V¹™âQoݲƒŒÕýfm·®Ñ»[#Á³tÅ™ò¥‰âº¯²²Å«ÂǶ±õ«!عÚ@+À'Ê…[tbGj¿ºE‰$‘rSž=(¤ƒÅØc²úBëð3¨haýä¾üð>ζ™_#cp=©3²1À4qw F1qâ;ŽIÇ®iÚÀ†i-˜—™¦ (䟕NRÙ»:š,®l{4ò Y‡8ç~•žÝi1´@mãÅ;v²{};J´ûD¡˜ õà“Çü@ùÐm"êËW½X#”0#á?wûâš[j'b„¸¼•¢×dt(tÛ)¯dDï$ÇÞÏ 9>ý~”¿­GöÝAä˜*Hã¦sÏòù rÖµ8´ûˆÃ€èy8ð³p«ø~uŸßëP¤-±Æ@âŒÚKˆ˜—)9² ¬ã°1ŽG¥#Ý@Ðê&(Ó©ãûg#Í¢Á4¿}×qùÒÈHäí H7,qŒsúRc*4~6ŠÌ¤ŽÒŒÈÝkÕbòúÞ=BHÙÔ(ÿìÎAøb½Vkz1Õ–®Ub’ÚÕx&Ï5ÌÀ‚£î#c>¦«Æ†r£ ÅyÏP½G4®Ôe:’aÉ¥³ëü/*0|4–‰aÔÙ$W÷I^qÎEŠRó; ‚9¦™ãtʰȊxªS2}ظ»¢ÆÜcÅM4— UÃ3pTŽ'¦*享nÃǘ5ò;Y’h¥ž'`\|ÛÈøÑ*Ù¥£Åa¥Ço¾(öF€ÁÇ¥ìíý¦™­Ë{n$fîeužT'©õç|ix]¥ìƒ»Œ–nŠ«Þ°øçDtŽÏI,³^=äxE;cÜ}Éçœqèk<¸­Èôâ4võ‰Ú8£’+Y¡Ž×$on8ÉÆ=«ï`ûY¢iÏ8ÔRHçvd+¹qŒÇN§Ê–µË±l…$²ve û·fvž‡N£ž” [Ý3Ç<+¸’;°á˜c© g‘N»äw¹?oÙOãú5[V]RöE´Žk«}¢fû9æF-–¿AI}«5œW6°KIà†ëÈ Ž¸ ö­Å£ -çx˜`å¡ÈÏ­[ŸX’çN{FH°É±[žyöùVycŸ¹ÉŽ\j\FÛ'ôÝ™ÏÿBþB•$µMC\Ž•¢GÝ—N£ÔÖºÒZéqZÊXº ]çîó}Þõr6ƒÈ5x*•™ò´ãHq²ú$Uí»öP]Éü?¥z“`í-ô6âÞÙrW9Îy¯Vµ(þŒ4Æ›«Øû;ÙT´Ž7÷Ǽ’BÔ­ »Ì’I‚KëM¬²Òµ «]OL–VHÒ2Hp g¨ç4ªñ%î½?b˳Þð—–¨•áG, GûØŽÆÙjÚ/Úî¯n‰Y 1 ãó'ÏáHìFzsN˜ÕåÓti"Â…i €ü@þT0º{Ôñ)cµÝ’v{±Ú2w—p÷Œ:}¢rIÿÅqU¿Ä='Kƒ²pÜÙZEÅ8ÅÐÊAÏ>~U›jz¼·W®Ï!lšÓõTýµþ«–û*N£á—®<º‚+O.V ÁA¦Œio$…¤h÷«€êGZŸ²ñE{Ú{T½rb/¹¼÷cœP§i•ʨàóŒQ>ËG#vŠß I‰øb’+efݺ۴ƒ;×o—@ú|dù4qÚmS³ú»ÂŒ&´#p†N‹É£§ÂšôŽÒiúÜ;£wI€ñÂßy˜÷ªZº!Å¥e£¦YÌkó¬×üEÓ¥³¾‚æþVUÛ€1µ‡_µýOúq“Tõ ÕíM­ä1¼©=Är+š°'NÌw²z-Ƶ®Glé^;‡^2ŸíùôúÑ™Ì~±ª%±ßl¡ãd2ìØ:0{ôàôë©ÅmÙ~ÎÝOgC€,kÁsÀÉóþ”‡$ o¥0Ul̪L„ø›'vãô¬ùŸ_g£âAä•ýj¦žM5¬mmÙ#p<ÏÞ±Àƒ€ON¤Ÿ: cö¹¯•šåÃ`å±»ÓáṠr|趇q ÌËÉ8Ë‘»LñŽjy2TY»'бî( |‰ ª±HÎqÏ„ b©}£9ñè4~÷E’îA*H¡ˆ #ê È}ibD=ù-ëåÍ6)&ªÌ3ƒìµÞÝøÔ¶ðƒ îF@ƒM¶¹½EGFÃ*]Š·Ðf…ëÚKö~²>ÀçÄ6¶sÖ®ÓFNI‹+Q8nø0ÉbŠ #Šõk0iv›fÀ¬e¡C"í\9Ú:ñžµêrBœw_³ldš&HÌ+Ý·“/_Ôлƒºð‘Î jö6‘¿`­íä~¶#wC·>Tƒ CvªÍg‹¾‰Ê?ˆ õ¬ÒÅ»¾Ïk©EaPqè|Š™ò¢×+ ªqÅC­í‹´÷In¢8»V0ι¸„´`ž˜¥QqÓÉòVzqèòøy<ÖÍØ[‘uÙ·Éc4mȃcèkº(—éäEjá}éšÛP¶Vû¸ur2U†W†™æåÜD9m ¶£qlÃ/ >ÄŠh윇Z™Û'Üà–Qúš Úµû/nõA8’NðäýiÃü9Œ}ªú^qÆ íÀü+—ä;…;aÝu”†CÜRȼšÂê+»wÛ,,cÛÈûQNÜj#þ£½Š,G ÁÏ‹©üI¥æ “]ÄîÎIťȺ´Štd¨Ié‚3ýó]³l <Šž˜Òö‰ieÙ1¯o£‹üºx7xp9¨õ.ÒBñˆ´èä Ý\¬_­W‘ØTÓ£vO„·—°˜®'Xm»ÒKwŒœ¨àséR”a7rìÚ¡äxQÒ3YôR&=ævŸò¿•ìÕ´‘Ç’)íPA\`gÌ—<ü+L·M&óYý¿ozÒ$°˜–"ÁSƒÉŒçÃùÐ}gQÕ¯žÏRÒµ+[m,à˜ÚPNW'¡9©äÀœi1ߨO'ÅÅ!â{‡ž[Ù³waZ ñ©n¹éŒRìÚ úÛ½ÄÖæe™øü)ÿ´ÚÊÜ[X_ZÃ3÷Œ\m;˜d©ÃdpÜ|±:sq ·gî-…Ô—WJ̱˞ ÆG'Œ|i¡Š0û!/"rU¶6’\è¶Ò$­ãHÆ8¥¾ÒöóX”KòƒŒmhóùÙNÙj}ÊÙêŽоÕÿtVsÛ[(dׄè»e†lœãçøSdt¬ÓéÞbÃ'vP:@Y¹–NHКUŽ4V!cbÄÁ'ùP¶ŸS†á£P’!w/ïÈÕ7!‚HäVQ‚1ýùÒrLúù~>MXA'¸›ìâ<*F%ýáÁ*[Œ¯áP™eh¢ˆ³a_ ç­Göô³¶ñ«mo1Î*u(v>ƒCAöð¦ÿe™nY.­‚Û£·nvê­DÎÒIöFábž{¬\ÜJÚd¬^$BË“Ê*C7+;•…KdõòµŽÉh°èúnII¦˜æG Ž=3×HöyÞ£ŸØÄOús^¨Ùœ¦Gµzœð(Çï ³1+I{æْıóã¦zPíGL¿ÐæIM»ê ¬˜+lpß›´>ÆØ%Äbq±åšNxö£=£Ô,o54øâï¡hÎ2>æ1Œ×(é²N;¤Ž{{°÷ɱ¥Œ•îãP0—ŸZÎ^þxÉH@§‘oªèÒH¶Óª[\­´–ûãõ¦+mÝ»so²$3Å(3 ƒÓ,zõ ù£¦×ô_ {F5.£pÞ¸<ùf¯hÖV×ÒžùÝŠòS}MGs¦É­Ð…8]ÙʲŽ:cßʽcuw§¤2,˜¶åÖ ¹ žAùtþ•ÓÜ~%÷±úÂö-"ÑcŽÍZ û†$€ç>T•Úp×7ÒêZÇm ˜cbŸß¢›쌈»Cxßi z´V¯i)‰{äÛÏt7:|?ŇțivZpUhHû}ä–Á¥uÁñêGüxªÏw-̬ÒÏʬ25´ñ$Ð2€² 1R0O¯9§9¿Ã»K+‹k›­j9,&èŠ#Þ:uÀÏ®kÑKú!Ï[f—ØkżìV–äÑÂ! ã§Í)vÔöŠe<áBý¦«Óè𥵚G-ºÄ]BޏƒI]¤”7in0rÇ®=Î)sª‰Ø&EJÓG2Oˆýó¯Ci·w Ⱦ,žžõö6ÿ1¸g¢–@ý+»Y}.8àý¬f zT2ßçhÇãÞ¹¿Ó9UF!vr?¿j+§4ÒÈfŸxæfa€Nïà)¹0©Im0lZ,iÀ óŒyðj7±^òóÏ•”r±Ÿ¯éTî$S°¯qŸˆÀ¢¤Ø­¾ŠVÊó O ´‹ò­šÂ&†Ùri>¸ó¬~Èm»U^ÖÍd‰HF*Fàqõ­~ÌÙIKm“Ϩ¯WÜ™*¥~5™€æËpI7Ÿ7?MXhÊŸ¾?_Ò¹·Ù‹2ÄÇÍË—øÚVfÁè0Gé@'{GÙä ä†t8¹a&sÁÈýh‚e¢‘½vñðÍR'=|è¦+>[ß·—Œ~b¶›Øã†Â€3ÔÖ-oû¹|D|«^Ó¤GÓ¡mìHAÈ«Û3æcN7c¦ìWªà%Áó¯V’‹öÆò_þ5’)=²ß–?:yqy1¼ºÁNÜÀoj¡¥o;0ûí£—TðýO_]Ò£mRö;ibnèÛÈuÏJ\­(é|<òÕLââÊúKº0ƒÓ«ôÀóþ´O³}™[ë%º¿ƒka Dà(é’<ÉÅ2ÌŠñƈŸ»B@ýQˆáX, 2„éÀþ•çsrg£ŸÌÉ‘Sè\Ôô14Ã(¶YHHã'h<Ÿ‰æ†éú4WúÞ›w1¼ñw„m`3Ÿˆ$ÿfšï]Áº±äT}§øUw Ú›G–;¥ÛÞnDŒÈå³ò\|©Òi¹¶öÌÐö^䆎„k•8d=ã铚¯e!Žê<Aòôó«=¢Iìb”øs‘–ÁúZàμŸ¥s ߨSáBã>¸5VW,<Hô<þ• ,‹Psgž3 ÉùêwÞοíP<ó–?™ª‹&lò§s`}EJÌÂYˆ9,Fþ4(%Ëu=Ô€úøPç;de#ž”FMŒS®Å8ôà~Ÿ•¸ÂÝ?ü”E!Y ËòsÎÔÖ¹¢ûE»“·Ò²K]ªìG>, Ö«¦ÈNjC(%Æ9­X{f|½ ©oòNO¯Ug“v,Þ`õi"e Ej¡f»*<×Âùçñ¦ [p`PIDLP’Æã×˧OZKµì]ÌŽ Õä1z„Éü«@ìþm§¬ä’4b `ÌéðÏâ>>ÃÑ$¤òà6ù|ŠëSÔDrØE‰¤'Ð*þüê¼{šàF¶ |±úf€v–õ]䟻Ð0@úXbRéWmpÐÃ÷ò*œùddþT7· ’ÝE|ÚB>B©vfðËdK€«¸?ÄFÓ4UÖEÖ¯q&r7w_ éôxwD×vO¡jm$·:\’kœ´,OÝ”r>½>uoJš+]euôí®[eÔdÿ£0ÿpò“õ¤mNå¡»ÂÛYNA¡¢Óêäpk±ÑÜm¨Â:o†ùŽ~Tî'K³Lº]öû3Îã°Ž¼y} /ÜÊ£0“•u ûùÖ¬éÓ¥£A!“»@P‚9å>uFýJ$©9ÀñYª™E±?PFIeŒ„šƒeò€qÉè(î¬Ë)Ç$núŠ.Û²ð~#ÿuxôIöšFb8ǯÄ ‹c ËÀWk‡Ls·éÅG#™$P9ð­J¶U=Ö5kT^[?Q\?ÞÞ3‘´#ô®ÃsÉ yú棓ÃnäõÛÀÒ®Æ-[6CqȆÑUƒ]ÈN ê=ùbÙƒÁÞ*žaçãŽ*Ë~øŸ0qE έFJõÚiZ;Ù¶àŽvÇ¥g©N3ÆIæ´-*m–1¢Çœ žkFٽܖl(ßêªdä—PÇÉSú׫IF;ÄŠá¿w‘·Ã!ÇÒ‰éÚ‹@ï1#|àR§}ö–³€ 5c'Ùb’F<  «ï×õZÍä=Q\+v1Áwƒ+ýÜgiϨ\œ|±IÍôik/‚F–dïnÇŒ{Ÿ¥–yZÆÚÞX¸”>GœÿÿÍ'j÷±O-ÿp¹Œwq¬‡ÑH}jPŽÊÉèdìü»`¾Øå·\,p2/êý–è…Áï¹ä š¹¡¿w ´¤åžF? 6¡öשsw²íKUÇÞþŒ?:Õc\˜‰½/¡véœTÚ);沑ñot»ŠÃ•o‘ëxû*Ë štKö¾è‚ ð¤yÓûö§l-}Œ’Ô¥‚êëI¹>(üKíŽü¨® ÄÆxÆÐr=0x¥ëëYíuk]R܆T~îv<`Õ¿ñüEÔ¤XÕŽíÊÀsê1Á¬ùí UñO]Ñçó b^"JÈÿŽ1D¦‘†Ã×Ãõ Ížñ€è$`}ˆž .Ãl€9äü‡ôªìþ&ÁàG‘ÏžOëPé’ìI¤<@ü+©ÅâÄ;¼?M+[0²àCu`ƒßʾN@‚UçøHüª6pFÂÁBàn©åü»®9*£?ššE,îÙ1mÜm™ªÒyõÍ´ÊØ;‘ÕŽ>KCÄEÃÏà( 6Z¶lÜäŽ7`ýiÂÊg[Eô×úR½•›™Ã7Äã??çL–ãdeƒÃšÑ†-l†I&ߟ<ù â½UžV$wcsúžz®LHÑ»Ar‰¶ÉVи÷#iÛèOROZdƒXªÃwS¨%äcÃsŸˆ¥; 9-¬÷q+¹ñ"e˜˜À¢o5ŠwáEÌŽFªé’ÕšjNVpX29#æ+<Ôì.4Õ{YG&@7`€ã{SdÐ!‰¢³Ô¡vpCçi'ëŸ:)} ¾»cÝj;”ÇáŠãhNSÈ=M4bÅmßìMÓ.Bè€ Î}1ý(-½×ùÕà`çûøS5ßg.´½7÷R-ͰÉï“§§#Ê’gßmvÔ«§{ÑŒm°òèÐ ™î4Àñ±'˜ôýE •Dª×—0øTuø‡ë\v~ü1S^n±½Æ„çdP}«š,ö€.³¢2wd÷¹Vyõüÿ:¥Oû.Ù'ƒF¦ܤt8éÍI¥•6wVÖ’H« /lêpTõû‚6š§%ÃÜüŒ,È$Ç£tqõI§Ð©Jm¾j8ÅFï/n¸¿çEfá•·u}ñBef’Tœæ¸]yÆ`åÔðè*]P‰´kwRN®>#?¥HKyЬbšØŽNé ß·lU™A =jwí £1Urs·ØçJ œî8ºX²NÒλډÞä‡ë}bØXÅVÝçr8Å[´¸FN}NzUÒà–HPãŽUvÑŽ8®…sl0/аÚ» }ä#éÖ¥ŠýwñÜ!ò  }3C Æ@Ý€>XN lb6e#Ó#Öž€Nu2àIê2Zõ\Ž€ úƒ^® ŠÝ„ì¥ïl.®"‚ðÙÙÛ(2Hq%³€1CNrÿ…pèß¾¡{¨Œº-îwdaÍÿ !Ž~Ð,Q¢(Ô™@UÀ§]K‰áaÁ Ø"š0LŒ¦ì Ùk4˜æš-îfRZ$”äñÎzWË»kIŒ‘N‰Ýà ŸŽŸÊ–5Û»˜»VëĨ¡2¹8¦ —i{5o$Œ^B3¹ŽOOZ“c¡oU²‹H–K«9^ã¼ÂH¬0‘Ñ¶Ž§Ÿ‡ãY¬¶ú/i.Ý· 3QÞAæ)O·¡?Þi÷S's¶|MÔùœŠÈðµrìf´–Æm㺚Æåd†wTSîCVnuasoºU¶FQ€ŸjÇŒS–‹}Øcöµ ÙÞûp1ž”£qq¯xþŠWØ!7ÑsCíÓƒÄÐZ¼.ûŠ¼ÃƒêäyzÕù5]>èà†Ø±bÂ/¶È'“´°ÚGÓáIï,Šþað5ËI$˜Þìßò9 ’l-±Šîsm ŠâÊîØà²21ǯQšÒ¡@bŽRáŽÇü>„sE;>Mݕ͵Éï ‰3Rx•¨@;¨÷¦Ú)”P9²ÔóÅ%¿q–_°]¬6‘Ç¡õªóXâýîèƒd;H$úrçQ¸ßÊâyæhÔ\…è (§Hæìèiádî÷Æ«&g`8ý+«‹hʱÏ #q‰p<ÉþUñ¹€±å€àùН-f9#ÌÓX,b²Ôí îâîÂ.|[NxëMö‘-ì"T‰Ö>ªX`·¾=) AU“QµWPÊÒ †šÖâ¹cŽGJäÎ.ž\#ߥX[NënÅÎ1Ž>ʈàa½±Šêã3@tˆ FÏ;¹ô?:õX‹–pzñó¯WPOÿÙrmagick-2.13.2/doc/ex/images/notimplemented.gif0000644000004100000410000000746012147515547021427 0ustar www-datawww-dataGIF89aÈú÷Ò€€‚‚ƒƒ„ … … † ‡‡ˆˆˆ‰‰ŠŠ‹‹ŒŽŽ !!##‘$$’%%’&&“''“((”))•**•++–,,–//˜00˜11˜22™55š66›77›88œ99::;;ž<<ž>>Ÿ@@ AA BB¡CC¡DD¢EE¢FF£GG£HH¤II¥JJ¥KK¦NN§OO¨QQ¨SS©UUªWW«XX¬YY­ZZ­[[®\\®]]¯^^¯__°``°aa°bb±cc±dd²ee²ff³gg³hh´jjµkk¶ll¶mm·nn·oo¸pp¸qq¸rr¹ss¹ttºvv»ww»xx¼yy½zz½||¾~~¿ÀÀƒƒÁ„„Â……††ÃˆˆÄŠŠÅ‹‹ÆŒŒÆÇŽŽÇÈÈ‘‘È’’É““É””Ê••Ê––Ë——˘˜Ì™™Ì™™ÍššÍ››ÎœœÎÏžžÏŸŸÐ  Ð¡¡Ð¢¢Ñ££Ñ¤¤Ò¥¥Ò¦¦Ó§§Ó¨¨Ô©©ÕªªÕ««Ö¬¬Ö­­×®®×°°Ø±±Ø²²Ù³³Ù´´ÚµµÚ¶¶Û··Û¸¸Ü¹¹Ý»»Þ¼¼Þ¾¾ß¿¿àÀÀàÂÂáÃÃáÄÄâÅÅâÆÆãÇÇãÈÈäÉÉåÊÊåËËæÌÌæÎÎçÏÏèÐÐèÑÑèÒÒéÓÓéÔÔêÕÕêÖÖë××ëØØìÙÙíÚÚíÜÜîÝÝïÞÞïßßðààðââñããñååòææóèèôééõêêõëëöììöíí÷îî÷ïïøððø!ù,ÈúþH° Áƒ*\Ȱ¡Ã‡#Jœ¸PšÅ‹3jÜȱ£Ç CŠI²¤É“¢\ɲ¥Ë—0czT)³¦Í›8sФ©³§ÏŸ@Iò J´¨ÑœC*]ÊT(€¦P£JŘtªÕ«?«bÝÊ5¦Ö®`Öü*¶¬ÙdϪ5›v­Û®mßʵw®Ý¦uïê5šw¯ß¬Oÿ fÚw°a™…+n™x±c“Ky²å”/k^YyóæÎž/ƒ=y4éǦO/N­ú0ëÖƒ_Ãþ+{öÞÚ¶ïâÎ=w7ï·¾¯ .ü,ñâe#«|9ÜÌÎ?C.z:õÒÖ¯£Î®}5÷þƒ-~<íòæo£O¯{=ûÞîß/8ýúÆïãO®?óþþ=àyúÕ\>ˆ N .ˆSƒÚa„ˆH!T^øR†2fa‡Jq"J"ŽÙ‡&UbŠ#­È"e(¾˜`Œ22HcÞˆ£„:îX¡X¹dFByQ‘FJƒ¤‘KÙ$OúåŽSâXeU&4 ¸d´e—9AÓÇ0Ò|‰Ò–¼ÈÕ/l@*lþb&FËüòŒN”æœ&¡©&X~ZÄgP~JR [])¨žm9ǬPJ™\Jƒˆ PЄ1^H xðH%'@'AÆ|G4þJä(¤’ZôÌ0‚9#Fäð£\)Jiš‹š Š+/p@).´†.¢h0E§'€2K ¸PŠ,7T4Z˜°É.Š@€†4n¹¥²Ì:+ D’‹ÐaL’Ë›h8!º¥%€0_Šã²ÒJ§“X”¡X¤¿ CÀ(ɱ@3…€°4 Œ~\¤ÅÒC Y!pßd0µ,Ú˗ЀG$âL§=SºË¢¼t@ D·”œô–½8 ËE‹0Œ'Är"7_eìÎ`¢9',pè0@¦M,š› -xãM2þ£sÒ ÀÖ{ýÉß5R6]9Û„6Ó_†"E3á1õ=·ž¿ÀÇE€ÑLž{Vzlæ}\tÒcuqøTg l9/_ª"²¼²ƒ°6*z ~:ñ@"º(²@Òp#´ÿÎ(õêrsX†Šè¢ÇÔÈ,ÖâÇšÙ 00DҾˬŸÍ ÁŒy2= €À ΧÉ̀‰F2` «{8K’TŒÅ"¦È&‚àˆ$" vÈ‚r‘¡\"&2)ŽKLŸFB¸ÀÄ•¤Nw’ èn‚B>k„¢óÞa¥³ÂL•³¡ÙLx¨J]*Sþ›êT!@…OØ WºâU¬’r -°J2è„4¢P‚‹0nFŸÅg™i‹€¢·”@yXT—TÅ*Wõ/<É—¢5­j]+‡-(Å+``qÑË^øÒW»~‘ ¤`¾0… ÐŒRàqiHD*’‘_2S%¹È½5¹¸Cxe¦r+]ëÂPEÒ°‡Elb9Ì„E `¬¬eyÙ±29¬‚kð…4L‹!Òèå/-Ò5_d’Kʦ3Àº\vàY™ED98BhB#šÑ:e Ÿi ˜Ã ¡Eš¡/ÁÜ“†&àŒa ëþlç;¹÷Ì.±ÓðÔÓ–'®¥“KNƒšÔ¨¦ÊoŠŽmnƒ[ÕW7‚^ì ”F3^.ä†`”0 0‰:TàhíèGCÚ<\|)¥©@ ‹‹lÌ_ªÛÝòF‹nf•!iÜã"7¹‰2t¦CÝ 128S\D Xš4Š€„|Á"M}jTû™U‹@u["ÄEª‚genséœO—¢A.ÙwºãQw ½HHzÉ[e+ÐBnh@Ø,r @lÒà«_+ØXôS± lضdÉa‡x¡ðˆg<ä5´)â#ŸùЧF¦IcýûŸEèg?B^ä þ€¤ðŠ "UˆF`+[ÚÚ¶ŸÒàílk;2Š (`DiÛ÷¾ø­•­@U Œ¤ûYêB׺?Åîuµ{ ^È»j+.:øBŽ×P.ÌIzWÒŒ  3‚ WèBúê…FÁ¯M@€H#¾R)aº+f©=i  `‘Wà ©D.† ‚Ì*R“¢Š¬ð( ¿ð‡šâF¨hE,Jƒ­z¥Ä°€èÄA4Ó­rµ«E ÑFÌÈŒ“h‚æ'jЀEâìK_ä»–Õ¬Œ(ðjò¥E-keÄ‘”†$ iJt©‹R1€)èXåk™é÷Êþ¥ò¸Ç>fÍ”Æ/ÚõcŸ´¯†ˆPdH#xxfèN–²:a k%Ĥ!1Ó˜ÈÌfÈFv0‹8lÑþÒ-]³-ÉR´F6K˜íÀ>q•2€ŠT"ùÆ3ŸšRWÀϸ´¡íh™g=ï)„FMS«h‘ªpþúYçd¦×¶TNJõ#Ñ.¨×NàèJc 8È„¤Ñƒ-¤A·‚./ ̸‡¶ímiIO* ò´§ƒ‚(¼sJ¸ÀT}©èE.Êmå¸Bä‰ÀáYöøE"Þn\8®›’£\F¨jU‹œ•sž›ÓÅþ‰JŒ/!Õ"§S÷ÍN.”)Þ~F i¸"(痔ǼÙa„ç-­ø[s·»7^¤°‡½Èf‹w¼ò=®Ñ0S]ïZ=ŸcdêÓ«ÞËs”%Ó"PY{¿üa„ìøS_hËw¾@#·a.üäW^iŒí=3jý@•gtïª5-ª¹«"o^Ç/ x#´x5~AGPä Ô¤õ~pÁÀ2âYZ~»Sù¼L¶4JŒ"¯ûˆ~oø§ëÐ'[â0„¤~%¢ï®áYY©-}*T£*Õ©,F1¦ ýƒA…b7Rê†EŒ€:0ªø]<1ò þ ü™ú (€hf&UD@ ),áUÌ´¥lm«[ß ×¸6yIÈu!È…À¨.£’R¶P{`‚~B$ ÷—ûç}Òð ¸` _’ @F•×{P1Òp1# ó Ñ$m¾` P:Qz"iÛDi\bås€&'¨m)¸‚cå}Â04clP [òÀ2z˜kRÅ>úP¼À_ˆE‚zbl ¥l¸ð 0 Å€Ó”&ÿ´Oz"…6å}`3…‹‚ / dìgvÇS+¥'ÊCP]à öÆS{3^Ð~`qÈQ1ÅRuL-U7þhH)k@ Àl;´~(qhÒUÒðUö„Kä‚9šr{8/?°i4‰àT^U—è2Þç PsÆ4_² &ã‚8Ø%V‡&ÅXƒ¥ º€smK×Y/ d‚‹}YE.½ø‹Áh&Jp–€ o˜`&¥ YD‹n‰‚ç'Âå[·å epÜg £Qî3wc&Ñp<`ZãH\Ò`ŽèêÈ0•² a€`‰P^]py;»GšàZÒ@ 0‹5±á)“§P@¦ PT€¹‘ù‘í¡Æ@`Ì€'™’+Ùþ’%™xAq‘b“þ“û¡“øÁ“õá“ò”ï!”ìA”éa”æ”ã¡”àÁ”Ýá”Ú•×!•ÔA•Ña•Εˡ•ÈÁ•Åá•–¿!–¼A–¹a–¶–³¡–°Á–­á–ª—§!—¤A—¡a—ž—ÒA“5™‡§—š˜ÕÁ—@!˜–a˜ØA˜u¦˜ǘé˜\™‘)™l ¶ÉA¦e7V­»mÒ ´x{7ïÝÄr?.îrïßÃýÙt½\8uâÖqË«-Øs`¾›)®ÍZõìÓ«O³ru*´+¥¯n§R-šþíÑ)w­®¥ä>*{òíùgÞWý5åÔWTÙWÞ~c¨àSŒ†ZaÓarbc°}s\lÍ1‡#hˆI÷¢DÌ1gcw)‡]H™åþ„dt)õ6$xšIÄc4ÊáXc’Õc“¿D4¢’÷̸crÛ‰˜å=XZ9áu>ζås©-¥vÀј&ta¦öÞS{òÙçï½ÕgY{ÒW蟈 5蟄¾gh "¸hŸòÇ(¢•âw餈rúÞ"žHaŸfê…†X ŸÅø9jª ¢š*©ÅÐÊj©«ÖÚªo°Þꉭ§T8k¨…¬xj¨†úëª"{Œ,3Ztã,bâi¦šPšyäjѶyæµSF6mv‚T®wDb+e“vZ–®7ÞXeu:÷­q7uö˜´äîo¿æöûäjõ~Æns‰\x×Z[n™ #'wKþæÉPF†H˜j²Ì’Ô+ª¥hœŠÈË‚º×ªÆÚHÆ©pŒ °=,ò"$»ÜkÇ1oƒßÊUe²©ˆ\a%ìê§{Ú¨FˆtzÍ*h¦dúSÒ{JmÖŸ†–õ´|Yg-hÓŽFÚÔ® :“²ûk»#÷_ZeU•YhAí»ðèßûñ\)×ÕsAµU`©‡”ƒm±Wµ[Qm VþÓo×x¯ä˜¦Ûºº R8ᄹ×è7b.ÿî©S+'FOHqD ø!4}ú£Žù*—/ÇÍÏpN:׎  0 `  ðsÒþÖ—·Þ¬®`‘açJ¸!=ø gHÃÈ ÄUá›”¥,k€¨PoZì‘Ý‚xÌU^G$I@„)Ì`;BJ¡éV3vÝos <¥$¦@jR3hB%[‡@\‘ ¼)‡ÑÅ$šS–>(f8ëN,:i<ø1[|œwžÿjÄ»@Ïf ´8 ¸'5a%|íü ÞÖº6ú(j@¾ãy>µ&Øi„hæ0#`bç †Å'"ΡݰP2jÚºã›Yäe+fÄt†5èàüF  vŒÛçÂÖåþÍ’Ê-•ÌTË£>q€3c„¬Îm›ÈäÒçèÏÇ”L•¨5À¸* Èjãã%©Í]¬ìå €£þ€®/c0BÕIQL“tgc)i i5Ÿˆ…(eήŠñ”ŸÂ¶)ÒšÖQ*-%˜€6³Øy€$ˆP§m³n«µƒ"Êcô!‰Ï`UPiêS¸í"”å«am̈_ôjfyÆ|%Ì%é±6–\@ b¸ËÚ˜ov5…&˜· !\ÂyÕ9õš·îeoâ;%œ7½ëíÎ _þ ¾ï/¨{YÄj Œùä’P™þÉ0Á¿S ïý[£Wñeï~a[x@@AˆÙ{„ÁFŠ·3…«x"1ŒcLâ£X *~q!\Œ‚Räx;F$ðe¿ €°†‘¶ˆe€8¤ÊÅ,þñŒELbß8Ç=ÞñЧ\º4V¨‹iìiXY:57`A"€ÃÌ:ÀCP/üxØÖ\±Ÿ˜\æX ;´ w ƒ¼€*`3l'g9ƒ–ŸMz\á$}Øö9–´eÁ 7ÍéB§yÍm¦«|§AVä X¨ÎÕx[6³dñ h qFÎ6\Ú“‹Í§w¼`€lÀ)þ|Ìd±¾ÙÊrfܰQ-RcûI¥ÆÆ–«eti„ºOŸöxëNö5°…Ùp CPèC5‘4ÛIKÉÇ^ƒîv‰é‚_¶87–`lgÒ­•UeQZ nÉk=ôÀúfâs0À€£ ÎQ ÚþªÀÈ^LЇ„&íñäS;¸uòt¨}9äN÷僳sFìjÉeÊà” ÙdzV—Dtœ6aAX’ëœÎ¨¢CÚæU´sHºÅqmuĈ²Ýy>/°ëä@ MzÚõ«n¢wy$JѪŽ‚¯>m |Bºž)|þ ß%§è Êh¬@€Cp‚¶ù®På1r‘ÖÆJAïƒtqò²­Ø’B]K@ÂošB_±:OqÜÍòµTå8Ä W}9PA n”ÝmFA·È×Ây\tF§j8¢§Çô‰0`[ ¨À´ô @Da§¿ÖÒ1ÀÑ rL}àA MHÂDÀæ_`.ˆ@9Ðàü)3ág¼³©@ß”dõR~@[Å4j>Y4XÙÇp§  0HâK=€Né$Oµ1€G`@X×$TçCàÓ=’=דÌ£Pó±< ¥‚qRAþpD4`|KTXAaR.¨0øHp< 2>ûñ{WÇB7Oµ0.@ =`W>Ð3°X4¢õó.#È.©Ô…ŒÓ k3¸B°G@ P¤r·¤p¥†©×N¥‡ TÐC@kp 6p„}»1”ƒz¦§W¤'9!Ñ@‚GD 3P˜8TAˆ‡2“uAõ7Ú×€¡8J ×À$@06¸D=@Q$g%UK(‚G×v«f‹§4ø@ ­ØI<àAe‡ŠH‹Ü7 oeGÊPí!G[Qm~âF=Á$ @ÀxiþÄDVƃ4VAÍH(s‘5Û#ÃãFgÃŒ“(²2ÇRßeUÎñ!…ØgäCp *%ÿk'E"–`F‘°F,(²LµWÍÔRŠS;çAIpy XKuöNޏùw4‘;GC˜µ…¸8‹àD†qh K@Xæ4qD[&€u_¨‹‚Ép¼äR\Uf<À‰6ùGO´CJWs¤æ"9‡öÇ Rp€ Œžä_E“œ$ŒüˆV¢øŸõ8·•)½Emºu–€~CiX°¨UXd~6h)Ç•[’b—t™)ÉÕ[ÊæÆE(Ë•+Cs,‰þ,{’D‘Õ S´Ef€´XÊÕ\ɶ\Â2^Ș”É\y*ÍVyIAåðw}tT=@ŒILŠùGœ? ˜trèv`¸Võò `iãçTÁ¤Dœe•HÕY‰šÁ ”žOQ9RPAþgNœ%MÆ'H¾)C´UpÈ8@1HHœ%¤ycSÝh2)C‹%K´år¤èWcˆ:è0„™ÂtÄg`„N²D“湞L)šl· Ó+iS*Ó+3©2ô‰O‚´I¾)FK‚dlÚ3 3ª6k!Ã3Ø,¡3 ù1¸õl€ò5eù(á8 °–ÔÔœ¥éIšþK¤*|"¢b5ÐÖn”mØ–) ©æ35iNH“ÂdY~öJHY-š=Z‹aD%LX9ŸÔ”OaÇ•(foÇxVtž÷Ò3›K>‹KeNù´œaäT»w;xÖƒÓˆ¼tðùG4ÉG«)Kc5§L”O`sY/J‡o3Bb6M0@z:L€Hœeu´Xolʤ%-¬ÑtbŠ›GE“wÊD„‘ò¨„ñOpw‚ásHw$ìQ*ÚIgzYºé›œUÅ3„Ò8 ¦Zw}çƒ÷õ1·:Iì™å„§Ý)QÍY¾™O?;‰ub¨VžÕ9'L´ž€ôþÖªD‹5jÈØ¬IZt‘6Yª±GÑ9CšJMò —±DL"°”‡–?䓵”yA*L½© T¦— ù@,Ù¦ÂWœ?¹0 ™­LäTåÊ¢å:Cè´Æè‘~rÐ:°Ø@æôDžT”Ee°Û•>ä­ÝJDkÄ=(èS‘wWkæäA€4¥«*Kœ ¢1RŒäŒgw 21¨<9»ÙÙŸš yW*K*[]dº°4D“ €ˆ“z‡))7åã@±gæÄG`T§¹˜E¥qÁ• ²Mú¯Ù`D‰úGõZC¨é´ä´ú逴9›Æé´AV¥»)C>€…hj¯m æ¶¥èþ¤‹8·Õa¶èª®?ЖJ»D‚DY±I¬:s^Æ„š··7Ùß¹©ÂôDPb^H¸¹~±Pe<Ï((ÁSO`¤Šš®gk9´wµº"m5¢e=¢9Šº½êQó¦!±ÙŸ:U¸¢‰eX͹váS¯€°"µ B¡J>µª @ʱ䜆åèt¹ts^úSŒ¨ šGèZfÍY:}³¤²é©Ç8¶¨3‹:’3¤±à¨t°_ù¥\ªuTd¾È¦üÛ_u]¦0¿+yˆ_¯‚*X¤M¶6’=€…' j¥ÑeÃiÁ£ËŸ¼Ç¼•(ƒ‚£ïþ¤°¸‹!ÀŸ¢—Œ¢Â»e—B—y©Z©Õ]ÆÅ+­"*ú—³33ƒÅZfc*@$ ÃÜU\y3 Ú]šY™ÎE˜S\á…+&#*Ó[¹ FTkÞ[]2@Œ`®&º[¿Éu¬¤K"”›Ä¹®˜Tt£Æ‹c¿Â‰‹'ôµ€kS¤$—˜‰2°À‰4@PHS:³†°9°ì¬è{L@ׇ0…ª¤óÉïJÀyö¦f§û Q°îUp™L&ûù·¹è·¸ §Ö2é2+“ ³òÃ5 È5  Òj°0½*^Ãl;ÄòÌþZÍÎ24@ͦ"^:“2Ìr4!ª£QcÃ2ê5ZS¢\³[4Š5Ú3Î霣Øf£ï<£\#Î"¼<Õ”‚² ªr<Æ «½ª÷,¯º[zÉûYÀlõ¬ ¶ß­‘ú0mÁ()ÁƒÌ“…üÐãK&À;¹ª ¯OÙpè¹¾„ ]ÆV­¥*Ù{ý Ò/­½´ƒS¤ÓOÓpW«È#ymGÖv«@==½;G=HGB½x稺ÒIÂÃÓ(ÛPÒ¦ÓâFÏ3økÐ\Â5ýÑéiˆn,¯ƒÊ„bì£]rÕ€Õ¦Ô“'=ÐA sì”ô‹Ò¹ÜÊî*©‰³É~{¾ïðǼ|þ‡jä{ú—ÑÐ×ÁmKk&W ·ͬ‡0h0’Ë¥9"4K„(&X‚IQGÅF”Ý}~¾zÈc­žÖŒ×JH ý9mыۻíX-Ö;Яy1íÕ«<°ÁרìÛ0=й Ý]Ñ AÝü¬Ö€ÌÛ -Þ»ÌÊÖ=ݘÂÉÁ“¶Œ¾Zªj!kÃR˜OçÜ…™c,Îõ*xþÍiNâ¾½qã3nÞœ,äÿœšLo®ËèÙY'ä9¸ù·Ö“]ØNÎÞÇØÜØÝéMoJ®ã+>â ø¶PÞã*Dn›>ؾ§qÇœ‚ÙMØû]aLÍZçÅœ+.Ìzl ú3?¬ë²æÍÅ¢¡ŒË®j5…ÍÃÒ(]smæ˜Âãœmcž»S½££%¼–bí^–àN)õÏ÷¬íè~4§ûíg¾êžÜÞŠ>ïÎÛÜM¼;†]Òµ½uHØúœMqÍS˜ƒï§Ý®L¸ûžÕ,þÀ³~œàÝ×Ñ=¶Mª½üéÇ¡¾ð&ãˆNÐ_ÍØýž:ÙzÜ)?;rmagick-2.13.2/doc/ex/images/Snake.wmf0000644000004100000410000003645412147515547017475 0ustar www-datawww-data×ÍÆšâÿãÿú } ^ÉU ‹Œ ` Û   ÿÿÿ.ú-.ÿÿÿ..ü-úÿÿÿ-ðV$)Ù Õ Ñ Ì Ç Ä ¾ "» )¸ /® E¦ \Ÿ t™ Œ” ¥’ ¾’ ×’ ã” ï ç€ Ô€  °‚ Ÿ… ˆ }Œ l‘ \— L =£ .« ³ ¼ Å óÏ åÒ ìÖ òØ õÙ ùÙ üÙ ˆ$ÂÇ  ø  * $ C ' \ , u 1 Œ 7 ƒ = y C p H e L Z P N S 7 W  Z  \ ì ^ Ô ` ™ _ ^ ] # Z êU °P wI ?@ 7 2 T$    bé EÑ '¸ í† Ðm ²U ”> u) e U E 5 $û ô í ðç Þâ ËÞ ¸Û ¥Ø ‘Û |à iæ Uì Cô 0ü   ú é% Ç< ¥T „n A  ¹ ýÐ ìÚ Úå Èî µ÷ £ÿ  } i ` h q „# —% ¬& À( Õ* é- ý2 ý@ ÏG  N qS AX [ ß] ®^ }] K\ Y êU ¹P ‰I ZA ,7 ÿ- ÿ$  " 5 G Z m € “ qô NÞ -Æ ¬ î‘ Ñt Ãe µV ¨F ›6 % ƒ x mò cà ZÎ R¼ J© B– <‚ 6o 2[ .G +2 ( ' &ñ%Ú&Â&¬(•*~-h0R4<8&BûNÑ[§i}xSˆ+™ªÙº°Û_ã7ìôäøÏúºû¦û‘ú}÷iòUïKëBç8â/Ü&ÖñŸŽl\L/:IúYïiåyۊԜͮÉÀÆÓÆÝÅçÆñÇûÉËÎÑ+Ô:ÖIØYÙiÙzىؚ֪ӹÏÈÊÖÄä½ð´ü±ø¯ó­ï«éªÞªÒªÆªº¨¯§©¥¤¤›¢’–p_ˆfƒn~vzvˆt‘ršp¤o·oËpßsòjêbâ[ØVÍRÂOµL©JœJIJgLMMAN6Q+U Z` fmù|ç~Հ„±ˆŸŽ“} [®;½ËûÙÜËì¾ý¦ŽAQsbpam_k^k\jXkSmMoHpBp?o<VƒBx.phbí]ÖZ¾W§UTwRGSSSêNÝKÏIÁG³D—A‰<|˜ “Žˆƒ}ÿÿwÿÿpÿÿid_!W4PWCh:p6x0+†$Š%%'‘)”.–4—;™AšHN‘S…[zcugqmnrkxj}h„hŠj‘k™o x³¡‰Ž’|šj£W­F¹5À,Æ$ÄÃùÃäÅÏȹͤÓÛzäfîRú?,$ 5úGêXàhÕ‹À¶°­Â¤Õœè–û‘Ž"Œ6@ŽJT’^•h™r“¼¶¨±½¨Ó¡êœ˜–/–G—^šužŒ££ª¹²ÎºâÅöÏÙ äï"ú*29!?/C>GMJ\KlK|JŒHœD­:Å5Ñ.Ý'èóþ   /0VA~R¥U¢YŸ]˜ad†irkim`c\YWPQMNIKGGECD>D:D5F0I*N$_(p.5’<²LÃTÓ[ÓbÑkÐtÍ{ËɂƄÆÀ†¼…¸ƒ³€œr–„Ž–~¸mÚfë`üce8dTbq]X¨PÃGÝ=÷1$(?Vömä‚Ñ—Ó¹ÕÜØ"ÚDÛfÝ…Þ”Þ¢Ö¢½x¥N‹$~püv|-F…a‰{Œ–޲Îê‘"=YŠt†‚©{Çtæd"T^Eš>¹8×3ö.+5*U)u+•5±;¿AÍHÚPçXóaÿk v  % ›, ©1 ·5 Ç7 å. $  = Zþvð’à®Ð残UjqYJ©;Å-â ÿ :Xúvõ†ó•ò¥ñ´ñÄñÔòäôõöùý'7I Zk}"“/¨=½MÒ^æpúƒ—"¬J×r š, ®@ ÃS Øe ìw  †  ” .   9 ¥ E ª Q ® \ ² h µ t · € ¹ Œ º ™ » ¦ º ² º ¿ ¸ Í µ Ú ² ç ­ õ ©  £  œ ” . ‹ = ‚ L w ^ h o X ~ G Œ 6 ™ # ¥  ° þº ê ÕË ÁÒ ¬Ù ˜æ mò Cö "ù ü áþ Áÿ ¡þ ‘ý ü qù bö Qò A÷ Hü P b s † š ­ Ô% ò) + /- M- j- ˆ+ ¦( Ã$ à ý   7 S  o ø ‹ í ¦ á Á Õ Û Ç õ ¹  © ( ™ A ‡ X v p c ‡ O : ³ % È  Ý ÷ ð à  Ç  üÿ-ð`$.B G 2 Z m   û ’ è £ Ó ´ ¿ à © Ñ ’ Ý † â { ç o ì c ï W ò J õ > ÷ 1 ÷ $ ø  ÷ ö üô îð àí Ñå ÃÝ µÔ ¨Ì ¹ x§ b’ K~ ?s 3g '\ P F < è( Ï µþ ›ë €× dÅ Hµ +§   š þ• ï àŒ Ð‰ Á† ±…  „ „ … o‡ ^Š MŽ 6— ¡ ¬ ô¸ ßÅ ÉÓ Ÿï v M+ #J úg åv Ѓ º‘ ¤ Ž© x³ a½ JÆ 3Î Ô Ù éÝ Ïß µß šÞ Ú lÙ XÖ EÓ 3Ï Ë Å ûÀ ê¹ Ø² Æ« µ£ ¤š “‘ ƒ‡ s} cr Tg E[ 7O )B 4 &  õ êú Þê ÔÙ ÊÈ À· ¸¦ °“ ¨ ¡n ›\ –I ‘7 % Š ‡ ƒÞ‚Ì‚©ƒ‡†e‹C‘!˜¡ßª¾µË[âú×µ”r#Q,.3 8é=Å?¢@}@k?Y>F<3^34¥3¶3È2Ù/ê-û) $*9GOV)[;_ObbdvgZ›N›Aœ5ž*¡¦« ²¹öÁíÉäÒÔåÆù¾¼º·%·4·D¸S¹b·qÄ…Ò™Ú¢â«ë´õ¼þà ÊÐÔ*Ø6ÚCÛPÛ=754+1"0/..ú/ð1å3Û6Ñ9Ç=¾AµG­M¥S—fŠ{„…z›v¦r±o½nÉlÔlámíoúrz"ˆ1@™MžS¤X«]±a¹eÁgÈjÏl×lÞmæmîlýlsy‡£ ± ¸¿ÅËÐÖßè÷óëþà × Ò Ï' Ì/ Ê7 ÇH ÆY Æk È| ÌŒ Ñœ Ô¤ Ø« ܲ Ḡíà øÌ Õ Ü ä *ê 8ð Fõ Sù bü pþ   œ «ÿ ºý Äù Íô Õî Ýç åà ëÙ ñÑ ÷È ü¿ ¶ ­ £  | u m d \ U Q N K I G E w y, }8 D ˆO Y ˜b ¢i ¨l ®o ºs Æv Óy à{ î| û| | z #x 0u <r Im Th `a jZ uS —. § ® µ »ýÀòÄèÈÝÉÑÊÅɹǬÁ™¾º…µ|¯r¨jžc¯ZÀRÑKãEõ@;8-5+C+R,a.q16Ž<›D¨L²U»_ÃiÊtр֌ۘޥá±ã¾äÌåÙäæãôâß ÜØ"Ó,Í5Æ>¾F¶M¬S£Y˜_ŽcƒgxklmaoUy[`’j£s³}ˆєá¢ð±ç´à¹Ø¾ÒÄÍÊÈÒÄÚÀã½ì»õ¶ ³ °. ±: ³F ¶Q »[ Àe Æo Íx Ô‚ ÜŠ å’ ÷¡ ¯ ¼ 1Á DÄ WÆ `Ç iÆ rÅ {à ƒÀ Œ½ “¸ ›³ ¢­ ©¥ À…  Æ  Î  Õ  å  í  õ  ý      $  3 % B . K 7 S @ Z J ` T f _ j j n u q € s Œ u ˜ v ¤ v ° u ¼ u Ô q Ý n æ k î f ö b þ ]  W Q  J  D ! < & 5 + - 0 % 4  7  : <  > ö > ë > à = Õ : Ë 6 Á 0 ¸ D ¬ W ž i Ž z ~ ‹ m š Z ¨ H µ 4   Î Ø öâ àë Êó ´ú ž ˆû §õ Åï ãç  Þ  Ô ; Ê W ¾ s ² ¥ ª – Å ‡ à w ú g  U - B G üÿÿ?-ð¨$R  ÿ ì Ø Æø ´ï ¢ä Ù Î ]µ <œ € ûe ÛI »- š xú gî Vã DØ 2Î Å ½ ùµ å¯ Í­ ¶­ Ÿ® б t´ `¹ L¿ 9Æ &Î × á ïë Þö Í « Š3 iN Gh %‚ š ð¦ Þ± Ë» ·Ä £Î ŽÖ {Þ gæ Sí >ô *ù ý ÿ ê Õ ¿ ª ” ~ i S > (ü ø þò éí Õæ Áß ¬Ö ™Î †Ä sº a° O¤ >˜ -Œ ~ q ÿb ñS ãD Ö4 É$ ½ ² §ò œà “Î ‰¼ ª y˜ r… kr e_ `K [8 W$ T QüOèNÔN¿O«P–R‚TmXX\Ca/hlqêwÓ~¼…¥Ža¯4ÂÔÛæ¯ö‚þkT =&÷ßǯ–}cI/-,-!-#/%2'8)?*F+N,Q-S/o/Š/¥-À*Ú'ô# &@X‰ô¹ãéÒÁG°v¡¦“× 9|Szlv€t”s§qºqÍrßsñv x |' €8 „J ŠZ l –| Œ ¥œ ­¬ µ¼ ¾Ë Ñé ç ý# ? /Z Iu W f‰ t’ ƒœ “¤ £¬ ³´ û Ô öÎ Ô Ø +Ü >à Pä bæ tè †ê ™ë ¬ë ¾ë Ðê ãé õç ä á ,Þ >Ù OÔ aÎ rÈ ƒÁ ”¹ ¥² µ© Õ— ô„ o 1Y l- § Åì ãØ Å "´ 2¬ B¤ Sž d— w• Š” ” ¯– Á— Ó› äŸ ö¤ ª ± (¸ 8À HÈ XÑ wæ –ü ´ Ñ+ \ 't CŒ _£ x¸ ‘Í ž× «à ¹é Çñ Õø ãÿ ñ    0 A  T  e ÿ w ú ˆ ó ™ ì © ä ¸ Û È Ñ Ö Ç å ½ ó ²  ¦  ™  3 r J V ` 8 u  ‰ û œ Û ­ » ½ › Í | À ¡ ° Å Ÿ é Œ w / l @ ` P T ` G p :  -  ›  ¨  µ ñ Á á Í Ñ Ø À â ¯ ë ô ‹ û x  e  Q =  (    ü-ðF$! k È_ ¦R …L uD e< U3 F) 7 )      ÿ ø ò( ò9 J 3Z Ti vv ˜ƒ » ß– ‘ ‹ ‰ † ƒ  ü-ðš$Kë P ã T Ú W È \ µ _ £ _ _ } \ k Y X U M M C E : ; 2 1 , & '  #  !  $ ü % ÷ % ñ % ä & Þ ' Ù * Ó E Ó C à A ì A ø B  E  I  L ! T + X 0 d 6 p > } E Š J — O ž P ¥ Q ¬ Q ³ P º N  K Í C Ø : á 0 ë & ò  ø  ú  ü  ý û ý ô ý ô ú Ó  Á # Ë & Ö ( à ( ë ' ö % ÿ "      &  .  6  > ú D ò K ë P üÿ-ðZ$+µ > ® ? ¨ @ ¢ @ œ ? ’ = ˆ 9 ~ 4 t . a " ]  Z  W U  T ü S ó S ë T á e á x á Œ â ¡ ã µ â ¿ á È à Ò Þ Û Û ã Ø ë Ó ì Û ì â ê ñ ç  ä  á  Ý  Ù  Ô # Ï ) É / à 4 ¼ 9 µ > ü-ð¸$Z{ª h¬ U« C© :§ 0¤ '¡ ž š •  þ‰ ÷ƒ ð| èu àm Úe Õ] ÑT ÎK ÌB Ê9 É/ É% Ê ÍýÑéÕáÜÙãÓêÍóÉûÇÇÇ É Ë Î Ð Ô Úàùîôôðûì ë ë# ë. í9 ðC õN ûV _ h q x (~ 3ƒ 9„ ?… E† K† Q† V… a‚ j} tx ~s ‡n ’j ’` –a šc e  g ¥k §p ©v ©| §‚ ¥‰ ¡ • ˜š “Ÿ £ ‡§ © {ª üÿ-ðh$2[s Pu Ft <r 3o *k "g \ Q E ÿ: ü/ ú$ ú ú û ý ÿ  ü òíéåâß ä"è%í)ò3ü> V b% n/ x9 |> B ‚G „L …P …U …Y ƒ] a {e ui nm ep [s ü-ð¸$ZÉñÊÜÌÇͲͧÌʔNJÄÀxºp´i¬b§] WšS”NJ†DwBp@h?`>X>F?5D2H1Q/V/[/_-d,d5e>fGhPjYmaqjuryz~Š‘•˜›  ©¤¸§É¨Ú¨ë¦ó¤û¡ž š• Š&ƒ$%|&z)x,v/u1s3qBCICNCSEVHXKYOYSXXVcSmPwO{OIŠB•: 1ª'³¼ÃÉüÿ-ðR$'ýï’á•ҖÕµ’­§Ž ‹š‡”ƒŽŠ{‡w„r‚nd}Z|P{Ey;w1/Œ-£,º,Ò.ê159/>,J(U$`ju~†ýü-ðÆ$aKS AX 6] ,a !c e f f öe ëd àb Ê\ µV ¡N K šH –A “: 2 Ž* " ‹ ‰ ‘ š ¢ © ¬ ° ² µ ¸ º » ¼ Ê* Ø2 æ: ö@ ýC D E F F &E /C 8@ J6 Z+ b% i p v € „øˆðŒæŽÝӑɶ‹¬‡£„š~’xŠpƒs€v|{x€u„rŠqŒqr’t”v›{ €¥‡¨«”­›¯£°«°º¯Ê®Ú¬é¢ù˜ Ž ‚# v0 i= [H KS üÿ-ð`$.02 "3 3 2 ÷/ é* Ü$ Ö Ð Ê Å ¼ûÐîäàùÔ Ç ¹3«DT]ae’i”l—n›pŸt¤w¨y®{³|¸}¾}É|Õyàwìuönÿf _ V M" D) :. 02 üÿ-ð$‹9å'ìóùíþÙű  ˆ s_J5     ÷âÎýºø¦ò’ìålÝYÕGÌ5Â#¸­¢ò•â‰Ô{Äk¶YªGŸ4– Ž ‡÷â}Íy·w¡uŠutu]vFx/Œñ—Ò¡´­–»xÃjË\ÔNÝ@çHðOúV[`d#g.i9kDmZmpl‡id³^ÉWßNóF<3-)=M\õnä}õ¯ Á+Ó5æ>úEK"P6SKU`UuTŠQžN´EÉ=Ô8Þ3è,ñ$ÿ; Sl!†*¡2½9Ú>öAD0DMCj?‡9£6±2¿.Ì(Úíü(ï;âNÔ`År¶„¦”•¤„³rÁ`ÎMÚ9åüÿÿÿ-ð¾$] Öþâòíæ÷Ù̾°¡“ƒt!e"U"F"6!& üö ï øî!å,Ú6Ï?ÃG¶J§K˜KŠI{Em?_8S0G!?82÷.ð,è,á,Ú,Ó.Ë1Ä4¼9³C´7´+³±¯­ú«îªâ»ØÌÏÝÈïþ»'¹:¹M¹`»s¾†˜ǪλÕÌÝÛèéõö!)1:C"L#U%g%x#‰ š©¹È Öü-ðÊ$cÑØ ÄÞ ·ä ªç œé ë ê sé fç Xä Kà >Û 1Ö $Ð Ê à ¼ û· ô° ï© ê¢ æš ã’ á‰ ß€ Ýw Ýn Ý\ ÞI á7 ç+ í õ þ  ûõ$ó+ñ.ö1ü4 6 9 2 + %  $ , 5 = F O X a s …  !› )¤ 3­ =µ H½ ^Ë dÍ jÎ pÐ vÐ ‚Î ŽÌ ™È ¤à º¸ À³ Ŭ ɦ ÍŸ Ó Ø Þr àl ãe ç_ ëZ ðV öS ø\ úe ûo ûx û€ ù‰ ÷’ ôš îª åº ÜÊ ÑØ üÿ-ð`$.°¥ §­ ³ “· ‡» |¼ p½ d» Y¸ O² G« @£ 9› 3“ -Š "w "i "[ "N %@ (4 -( 0" 4 8 = N ^+ o8 €D ŠJ “O œS ¦W ±Z »\ Æ\ Ñ\ Ðf Îp Ìz ȃ Ä ¾• ¸ °¥ üÿÿÿ-ð4$¿F¾B½=¹4³+¬"ž—‘üŒóˆê‡æ‡á‡ÝˆÙŠÕÑ͔ɚƠ§¿°¼¿Fü-ðH$"ôôû  -;H(V2\7b<kFtN}W†_Žg•pšzœ€ž†“‚ˆ}}wsq]bHR3A1) #ÿô2$™€~}bzFv+pmie÷`ëZßTÔLÊDÚIêO \c/hAlKmTn™w™€.$ï|ïn÷tÿy‚!ŠE–W›i¢zªqªgª^ªV¨D¤2!–…ø€ï|ü-ð¢$OkÇcÅ[ÅSÅLÇEÊ>Î8Ó2Ø&ãðüÿü&ú0ø;øEúPýZbho tz~ƒ$‡2@’N•^–YÀSÂLÄFÅ@Å4Ä)Á½¸ý­ô¦ìŸå—ßÚ†Õ~ÒuÏkÌaËWÊNÊCÊ9Ë/ÏÙæóíéõáüØÐÈÂ!¼+·6²A¯M­Y¬^­b¯f±i´k¸l½lÁkÇüÿ-ðN$%b^ZƒV„Q„Hƒ?€6|.w%rmdZP F ; 0 %)ö4ì@ãFßMÛTÙ\×cÕkÕkëkl,kAjWgkbü?ÿÿ-ð~$=ëèãêÜìÔíËîÃí¼ìµé¯ä¨á¡Ý›Ú–Ö“ÒÎʋƋо‹¶Ž­’¥–œœ“§¬x°o³f³^¼VÆPÑKÝHéGïGõHûIJM PRTY_"f%n(u+|0ƒ-‘* $¯¾ÅÌÒØÝûâóåëèü-ð´$XæxۂьǗ¾£¶¯°¼®Ã«ÑªÙ¯å´ñºýÁ ÊÔÞ&ä)ë,ð,õ,ù-ü.þ/147=DMUïUåUÚUÏSÅP»M³H¦7š%”‹‡þ„óè€ÞӀȂ½…²Š§’–œ…¨u®m´f¼_ÃYËSÓOÛKåHîFøEEEG$H*J0N1T2Y2^2b2e1h/m+p&r!ss rÿqøqñsëuæxüÿ-ðJ$#ÿùóîéäߨÔÍþÇõÂì¾â¼Ý¼Ø¼Ò½Í¾ÇÁÁŶˬҢښâ’ì‹ö†&§Î õ  ü-ðV$)æÈÝÉÕÉÍÇÇÄÀÁº½´¹¯¶­±«¬ª¦©¢ªœ«—­Ž²…¹}ÁvÊqÏoÓmØlÜlåmîoötþy€ ˆ Ž “ ™ ž £ ¨°·ø¾ðÄæÈ~$=ÏÂ!´#§$™#’"‹!…€zvqnnsx~ƒŽ ™¤©¯µ»ÀÆ ÍÔøÚíàáåÔæÎçÇçÁæºä³á¬Æ‹Ì‹ÐŒÔ×Ú’Ý•àœä¤ç¬ë³ïºï×ïæíôìûêèä àÛÕÏR$'³ú­û§ü¢üœü—ú’ùˆõïwépájÚlÑoÇs½w³}«¨„¤ˆ¢ ’ž˜¡žª ²£¹¨¿­Å³Ê»ÏÃÎËÍÓËÛÈâÄé¿ïºô³úüÿÿÿ-ðÔ$hŠ0|&me]ULD;2*" ý!ø%ó*ê5ã@ÝL×XÌqÌ{̆ÍϚѣӭ׶ۿßÇåÏê×ñßøåëñö÷ éÚÊ"¹)©/˜4†8t:c;Q;?9.60 )$üøõ óòýðöïçð×òÈôº÷®ú£þ˜ wb&M6:F'Xkô“æ¨Ù¾ÍÔÃé»ÿ´±¯®®%¯,°:µG»aÉnÏvÚ|ä‚ð†û‰‹‹"Š0ü?ÿÿ-ðœ$L|qwiqbj]bXYVPTFT<U6X1[,^(c$g!lqv‚˜£$­)±-´2·8¹>ºEºB¿?Æ<Í8Ô6×4Ù1Û/Ü,Ü(Û$Ù ÖÏ È¿þ¶ø­ó¢ï—íŒïòsõfúYÿNHC ?;74#2+02/:/A/H1O3V5c<oC{L…U…Y…]ƒd€j|qü-ð>$ &ë2ÔA¾O‘n{}c‹`‰^‡\†[„[\}^y`vbrcolfv]ŠMž?³2È&Þ  €$>šˆ wpújòhîfêdåcß`Ø_Ñ^Ê^Ã_½`·c±e«l s–{ŒƒƒŒy|ŽŽ‚…‰Š•yšwv¡u¤u§s³qÀqÎsÛtávæyì|ñ€õ…ùŠü‘ÿžª·Ä Ñ Þ ìûñæÚÎÁ´§šR$'ÑìÊìÃé¼çµã®à¨ÜšÕšÍšÅš½œµž®¡§¤ ¨š«–¯“³‘·¿ŽÈŽÐÙ’á–èší¥ð²ò¾òÄòÊðÐïÕìÚéßäãßçÙêÑì6$p…€}{yw'z>{V|n{‡xŸu¶pÌißnÚrÔuÎwÇzº}«€ƒp…$ LªL µ“±˜«œ¦  £™¥’§„©vªLªüÿ-ð’$G´¹'½0À9ÂCÄLÅVÇjÆÅ”ĨÁ»¾´¼¬¸œµ‰±x¯o«g¨`£YS—NK†H[‰_vccfPk=m4p+u"y~„ ‹“þ•ê—՛Ÿ®¤›ªˆ±u¸cÀQÉ@Ò.Üç óüÿì Ü9ó) !ý2ïCãU×hÍ{ÄŽ½¢¶·²Ë°à¯õ± ´üÿÿÿ-ð4$¥€¯„·ˆ¾ŒÄÉ”̘ÏѡӦӪӮѳμÈÆÁϹٱâ¨ë ô™ý“rmagick-2.13.2/doc/ex/images/spin.gif0000644000004100000410000000201412147515547017342 0ustar www-datawww-dataGIF89aç  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€‚‚‚ƒƒƒ„„„………†††‡‡‡ˆˆˆ‰‰‰ŠŠŠ‹‹‹ŒŒŒŽŽŽ‘‘‘’’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ùÿ,éÿ (ÙŽ*Ìø\Èp(Qv(dH‘_=MI¢$™Hñ?‹õòËX¥#?f!jT˜‘C~l jòxH¬ŽÌYoP6±ø½¨+ Ç;r2{ÁŒ™¦ƒõØð‹â² Ä@¢I’dG¬*S]ÆbV%Ê IšîHräˆÙ’Q<âØñˆB£l±u»CS=£š¢ dÑh•X\£©RG½z-þý7ˆ›l4-U¯ìÆS9ŦʠǞCÌÈ/Ž„‹®dÈŒgJˆInvô<±éÑŠ“húÝQdJ›Ä+ž¬Â´c@;rmagick-2.13.2/doc/ex/images/Button_2.gif0000644000004100000410000001220012147515547020063 0ustar www-datawww-dataGIF89ax÷ŽN.ŒŽŒŒFDÎL&$TVT<.$n>Îd F$ŽDÌbdîlV$ ®T &ÌÎÌ 6L6,dÎd,F,žLärl,,6$ f4,&>¬VTlnllîl$V$î ìêì4>4~<¬®¬œNL\.,ÞlN$.LžLüz|>®ÞljlDŽDÜjlþt^,T®Tl64lÞl$N$üzt<>,4n4^ * ”JDT*,T^T> V,¾\*ÜÞÜ6ªLìrt>$n4.|~|tþt^4üþü¼¾¼ælN$> æ,R4žN”–””FDT*$,*,~ÒdJ$’DÌfdît  *ÔÖÔ:\>4dÒdìrl<j4,*>¼^\trt<~<þ¾LªL|><,^,ÄÆÄlælÆ\d24<\^\|þ|N,.þ|ªT¤RL ìîìâlâD’DÜnl . > V,$>$>!þ0Creator: PolyView® Version 3.62 by Polybytes ,xÿ±˜*\Ȱ¡Ã‡#JœHQa+ª©äŽœt³+Sío×À‚‹°ÐŒ6ðUbQÔ|í‡vü ´Î( -·Ãï|¬³\KL²±½^ÿjêÎ* ÷ư¾¡«Öž’ oâCkk K@¾„ i@³å^-pÄ:ké瞪àZ†„_kxÐGo½·Ãv/¡ 8ñ}ÔÞÇ!Ôž@¼ K@9ÖA?uÊ„ª`”bOCm‡×zK|ò§‘«ÀQÀÈÞ{þ÷âËI$Ѐ g$,6¼š :¹CæªÚ{¾w¤îª{i±:Ѐ.‚;”|ãK`„ „à’P †×-Öé¬nLDàHS­š9/z*ãÜÀÈ¥ { Çw@.ð{!¨C–°è±¬cS^\~RºÿîgþCœ¡ÿÎ…¨ p/d¡]È@„O…Þ‹Ä"0Áe¹`Z£^Èw'Ò4VÏ+Z áv8BiÁ _¿·Â2pd£ Bp‚'/QÆB\§~5¬5(ï-ËÃ×Úô ?£™¬xBÓì°ˆ&ÊQ‰kT —ÈÆ>ØAx+UÏŠW?ó¬„p:úáÁê†C]i` €¤ ÝÈJU®°…@XÄ%ÅÆ®ÍM*yŽ™I¿óÃMþÊ]ÕcÀ\9ÉU¦’­”$ÔðLJÊ‚ÐzX"¹H—|QGm[™K¦ƒ3Ô…®|$ùÔp‡ÚްTc1ÇyIÍÕÒo½úc†îg³|2]_[Ã\@ÿTB’•‘`à L` Š Ã8ÀG†“jxÁþR†Oäé`ƒò±¦ 7\SW/ˆD™H¾tÁ. ¢ ð5”˜K, q˜E}F‹IYÙ%!=F7¥5J}Xg Õ` SZØA^©L‡:[o;$ÑU?iÔžüeõL–)ÔÁ¡.dAªÈ¹¾]Ô“L¢#Õœ•±hšRž…n"ÈüÙ0]XSÁ˜úÂP‰$™¯á€>ð5 ä€:wHpñ§XÉ (ÿó<"žlq `%/Míhmp©Z >5„ÑgÄ ‘H¢ÓB’Êúd”ÊÔÿÎlD<”2K>°HiÁ>†O‰ŽFŸì¾({ÇQ1¬QIPÃo™ú°½l°{L„¤‹NÒ"°iècÞvæ\’%$uÅÖ馺BÙ¡ÈB&·ÔFŠ!ðm+Õ°žVtoµª*&ËK¢e’QZ˜ƒ:Gk>  ~óÓ€a…ŠLñ9µ>5”èc”´ėoãYõ–0á‡&Iq™e©¼q´ œÃc956Ö]ô,0¹&sÿ‡·P‘¸¶á¼ †×¯j­Ô/¦Æb¸J‡k1DzíÙKDRt !€1,ù»ÕŽêìi]'$ûU#GsˆT•PU|OÒ4ÿRXö.,9)®º³Y†•³Zû0äR…˜rLkëVSD‘Ø‘b–ÁmyUSs"¨Z>¦øøLËh9y<ñ¢r¡¦‡06zŒghA¤(cIePsŒzB‰‹h#u”]ÓpU‚2å²±t+•‹üHïY¢a^n”²iµÞ6„d#Ú†‘$åbSŸŽ”4ûÛ9ö·X+&DúÒ0'Y³)ОŒ\zòɇfr‘gkâr ÏŸ{[§` e¶û{ØÁØ€­Oóª§ÙXc¬{j® P[‰,ð@ôNm(:á‰ÅVa4àS›ÒMÀ´ÆŸzÛ…m“ djª\\À qÿ)_¿wP4bÉâÕq—ÃæÓ¹KŒäÚAz½B(!»VÙ*œdðEÜ•æ)ÿ8€Ÿ›—VqÄX iˆç@/àÖüø( ˆv$Uc4 MÆiõWæõ Íþìuýùæ„R%‚0‡ºÏÁ/˜`Ü -®a‚½Úã‹„ºöQÔÉ“<µn³Öh ÚÒÈ›3ÖòKID÷Ö3u¼³T`Ö¨¦æzût&‡;4Z® ¼õ-,}wÔÔ\s—¿ T‰š.èF»3ä³}ÁíqØ£vå\îßÞË Qõó<=—ûlÞšë‚í[Ãmr1ɶ·÷XpítßrïFOÿâ×kGCB´8†”Gµ¨(R85'UšÄ9US:àvðu«”‡P`Y終K€7ÆÿkjÈ*N‡-öTY-cz—…ƒðÓ(i€J¦Xm‹0Cöi…¢;§,p/<ñxW9˜1‘ŒœÖf+ó„¹Ed °zø ýŠóàTZ}0ú6„¸“ªÁ€lW‚‡ã8‹2¿T,K {ro¤F‹ ø2hÈd_ßCƒå8x’Ç8Yls|Ö,YKip_N ”-@—cv¦`@<§áE<Ç—‰Â¡iyÙD&uVc|ÃÇkK –ÔY=5=ä²Hv})Bæ£/¢ä C3”ð™–7iN ŠH\ˆ¢Q†l4»ÿçe3'–Y‚íøŠs‰…v°jEç=wp3Õ^&Lj’°WŽRà-v¦5æÕnÈ|Ïùš£—Hiм(im¤@vûMÃÀ’ÇŠP5Jg0U5:•힟;·z¿ p Âã8,*1 A€BÞvýb5È’G±ƒQÒ•§DJãxÝÔú™”•dÜÒ¢H:,¹s¼yDI’ºB™k¦q?)=Å4*0xŸwpð Ða¦`Úez¦d /0°ܶrFGÄ8Ž\$hUØ|½sij‡@lyÈ›ªŽÔ¶}“mÐw(L‡cÍ£/•ÿ…4€¨(ð À‹fIZ§ÈkÙ·`€ƒÎ¸)Ëy/Uhk!*„"L,¨M|b&N0 z¤¤.å)³èŽo5œY†XÇjzqå“„2Àš—–†¶ª†‚&%ÎiQ÷YQy¦FǪÐ:­ŽI˜à9_¹5=‹l˜\Pcôgƒ…"&zŠSE—ª ´©ÂHAZÊ1‹ œLöêZ‰–®yh–/@ŽÑ:´±‹úlètÝr¼It dK!@Íâ‰3*uj ®w5)Â"ºŠ¯˜Zy@¦«=Ÿ˜±IÃt y§z9?š‡|°`úÊ 1[˜W{ÿ ñ†|ÈAW›æ“èÑ3y¹r4k­ d‘ЯŒógÏX±´z§&MÛ‰…²LúO•º¯2›µÄT›ˆû4–$áa>ÛÒ†rAULö¶ ›¯ÿÄèE©ac!‹Îfe…G–r)­€+¸qôb@ƒa9Ðî[nÆ:;…NG ®ù\†ÒN>N´¹›ËBœË¹žû¹¾ º™[ºŸ[*Щ@»“¯‘'¶g…ÓtÙöv7Pw·[»v—»¹«»¶‹»¾ ¼Á»»ÀË  EAYƒèW§C3$¸S¤}CÔ²T+où„k¦†½÷:)Šÿ2¶«ÿ1e´ BwT,ƒEL{Ÿãt–Ê›9ÉÂG°©‰=yn·f‡ S¹‹óŒ¶Iãˆ5ógQ¢€4’_t-HðzCó|\õŽÅ…‚Г¼[·ž¸èQnö‘ÅC*«e&X s·g²ÁV~Ô©ì:à*‚—Ëe®W~ß7ŒWôóZ‹¼W²—Ø3:üvËâõR 4Q{$ø! PŸf–{ ¥Æ§ÃW yL\V×{4–[@$âºö@ky«4 OÙÅüû16|gUü3ZÐq`##ñ*Ï»a`TIZÇv|ÇxœÇz|,KC@,²ç9%f0v *ÈŠÿ¼ÈŒÜÈŽüÈÉ’<É”¼v0f`z2“Qèµ£g»\&`{Pʦ|ʨœÊª¼Ê¬ÜÊ®üʰì>ÉÉ©¡lv¶y)ÊY\O¸¬Ë ØË» Ì¿<›ßÁÉFÑBpÏÛ•ÌÜÌÎüÌÐÍÒÌiRRDP1HAxà]é˼œËÁ ÎÃìÍÂüÍä,ÎÿaD77€CЃá|Îô<Ïö<Î÷lÎ÷l3@yð…ÀÍÓ<Ð]Ð}аÂÏ#à) 0 `3Êê“U}ÑѭѽÑÝÑ ÍÑÍψðšŒÐ*½Ò,Ð6°°M@Þ1ÑÒ6}Ó8=%0& XÐe°B=ÔD]ÔF}ÔHÔJ½ÔLÝÔNmÔLPO¡;rmagick-2.13.2/doc/ex/images/duck11.gif0000644000004100000410000001407712147515547017475 0ustar www-datawww-dataGIF89a´´öt!*"(($$8$::)*$/0'2/)55,<<5H@*M2U7@=6KJZYAA*CD;ZZ$jEuK~Rggxxkk?||%LKDLPFRRIXXS^dZdd]Nmmgkqinwqroitsl~}ƒ|¶ ±!„Ušc¨m­p¹w}zÒÚ.à þÂ~ñ__õbb‡‡€€™™=‘‘)©©¯¯°¯¸¸¸¸®®=‘‘C††w““i¯¯O¨¨V¾¾@ʃ֋Þç•óÿ¥ÇÇ××ÄÄ9××(èèççÿÿˆˆ†Œ–•””˜™˜œ¡žœ¦¥ ¡ž§©¨«µ´¸¹¹»ÇÇ¿¿þ··ÇÈÈÉÕÕØÙÙÏãã×êêÝóóåÛÛèééçööýþþÿÿÿ!ùt,´´þ€s‚ƒsr„‚o‡…Š‹‡‰‡†ŽŠr‘„•ƒ–Š™jj›“¡—‚¥s™ƒ§©¦Œ§Œ¬¨“«¢’¶š£¸„±±”¹ª¿ˆµ·ÀĤÁŒ² È̻ɧ¾Î˜ÐÃºÔÆŸªÑɽ³ÖÊËצ¥ÒÏÙÜÍçëÅdkäêØì­ÓðÙÞñ…¯àâÅõÚÇ,•ƒÅÖœlìØO!=tüðý#ˆ®œÁy õåËÈKNœ‘Ì9 (¯äH‘$SfD‰RYÇ|-yA»h’ã36¶m”Y±[7‹;å¼JôP¢nŒ=:”iQ¤B)=uª´êR¥I­º¡úÔhÒ3eš&ÚµèÖ¦SÓZE+4+Ó³þ]޽J·ì+ž#VÛHSe¯t_æý‡·fË}ÿ¢õeXø¡Nˆ‰Þ;8pÁÅ1*öÙs2:2žü=¶¹ ç…-3lx&$‰†[ ©,Z%kǦÛäŽ4m‰]ÿצEœßŒõò¾'|to݇O¯Þ™ìL ˜°ý~C¾øoAºp×uJõ¨Ôµæ)1]ß´|TóEݯ)ó~iyññãfŸ?~ýþá¹×]R©†H)F½FP%¸K%†°ôHHRsI‚J¦ŠL"XN…Ú9â¡‚ ùæn+m¢áH»¡æŠrš½èYŒü˜"e­•6£ j±Ý‰-NÇÜ¿¥fÚr&¢þøJw‡x!FLê¸Pv E×›_QY‘·Ô‚+7å‘Üýb4"G%•Všè† nüÈb”jJ§d—êå9žžyª·çy}¾ÇgŸêg¡‚ª·•zm˜è£)¡’&B饃Š©z‹øòžFúâ §–Fø©>ãéó©¨vZj„©²ÚiTª¢ªµÒjj¬RµjÈPðŠ«¯¼ÚZë¨~zºÏ*aÆã‰mÖäÝŽ(N äšÍ¢YÛJ]êfí¶x±1F•2&Éí³Õʉ¢ßÚfg•ÝBFðâ"jt戜›QK.’àÒÅÆ–¹å¶ÑÞ‹p˜.]¦ešÐÒi\½uþ|’·w«¥ †dj§…”:l+.RòÇ0HlʲfÁ‘œ²Fn쫱¾z<³²›<+Ì Ô³ª}.ºg{‡Šè¢y2´žG§ç§Ó½&Ë PJµ[#u¦ŠjÝ«W…¶Ç_Ôw5°Åb® ñœïö{mÜ]ò«®³DFìSôÚÆ0Æ+ì÷Fv?¬ïÂdR£FNAüö¿þâY7ºmWžœ”,ÊÔ…w¾+ØÜþ:ˆø•A®›¯»ž”PçÃ=ÎÒé/Äo¶ž7‹1b÷ݰËÛ&Uµe×ÁÃw~Á¿±YW£U•[ý5×xs1Oyù½u¶òWaÏU÷þXÁÇýõöÇ.ï©^zCq´ÑÆq ››ðúí™7Ül×ߥ}«âÆ#€(À|a °Ó_íÎDºËqiwYŒuTA PðA‚àƒ€€]€ê\”¾Ç•È^%Šæ71|A_ ®À…Úð†WBÈøNv½ƒR¡ó7úN%]è„p„:ñ‰\°Bè£êmG´ŸüT¸Åw­Á4ÇèD+ìpqÂ"žèö@o(ûÙÞSÂGñ•¯,lá^\Ðâ  Z £ oè` JÞð˜¼éÁÑyjqd]„g•Â=ð~•›+þ ò“64‚EÈÚaRtø»Òb^G9ÉY-(gÉ…#°l:&YI:è”KZ“ X0€l–³´¥†¾] ‘tÌb`ë„´¡Z˜h2i ô-—‰SÒÝb¡KÇnp“‘ƒ—ЄmÒRHÈ*¹Lõ•óŠæR $\+lá˜î¥°L"Ž…¼´„ZŠV<³*xc1ž]öÑ©P¥ P@@·éœ!¢ŠJ$%*ꟴô .QYÞzÄ)‰ž‚V*~åÒÜ)t]èçF‘9Рg2 Å…d»uÕÓœ,dÓ* .´à ;=‚=þÈ1vïP#ñ5DµYnMÍ$Ä„-s£S$ ÆxxÁ«x#aÅ®ÎÐy•!*€² Í€v“€¬ê°€»Òó$êjØK/)Wfndà‚˜°QÀÊpŒS çWÙ8#2lê€vÊ…Z6£c àÐaº6~ÛØTÕÀöµdÉ6Qš’%Ø – §€Æh˜á¶’”r•v[Üæ,dÊê¯*T3RåŒWÂúÕÍT¡5@Œ¤M+`­0Ɔ!O8ëS°8æ'š­*hœBÖÎne&¤Ò/¬<ê'œ°SÓp´å Ô€;t¡ »§éJ¤þR¨¡Ÿ-Èiµ Þµ’±¸–} À@`”5KöälƒE<ïᬿåU§…p@;<íXÀa6Ä!®çŒÝs4ëÀ'Œ·JèkŠA €TáÈH®Xìb÷+¨qê:bh3sš=b„;äYwI³˜—Üâǰ«óqbCÓ˜ÊlT¿[ÙÆXg í¬S8@—AiLAÌ€¦‚v ƒ D ¸À@œZÅÞ},¦#3Ÿ¼f¼‡ZOOLÞѼ†´âùÉ{þ$0æAúЧ@R†3¬¥É2Úñ˜ûŸ@Yr[÷mí¶º ò†zŒ¶¬¡ èþ°@ j¸1–w99˜2ŸøD 0Ð_cÖÏTu Z­ìT•š,ºõ‚§Éºy|Ä‚µv :*@Õ$HˆR5Û®2û ëK¨ Öð%²ªû†¢Ü’£0LšÐ^¡b5sØ|ÿRM·µáI…0OA\Àlª,¿h/Ïþvã‚*‰÷ßÕ «0…0e8ICŽˆFНzšF^$ÏÆòH/yM  ¯­ÝM(¬É2 âèó¸üœ=Ík(œÉ™lq ¬µM{ô0Ï`€]¸ŽL8ÏÒûÊmÛ\&¼«×_‹7ˆ  0…Šº1ž˜8ïÝY­ÎþUÍñ@H*®‰‡WÀ+x@p wD¡îGÞAh8Œ½”ïÍ*žï,9ã#()ƒiø[-|°‚hÌð4`ñA $ À<áö¥º¾÷Îp|‹¾·¤¥[“á7¬¾ $@@p šæHºo¸AÿnŠ80ÀC§åà‰U°B"qX–0Èz³ãêÓùDïGµŒoâ±Þ§G/,ц‡â¸¯‚¤¼QI¸Ë=8€%n–DÒÄß” rS¤Apé¦W@â…"ä-ŸE9?5?œ§OèD‚0/¨ãl ^àGË'@ žþ'r%bE¼}[u`G"_r ` g\à`K@«³y+ty®Ôw]9.e0z÷h~/WFp^HdAJ§3RA HsWnnCƒúÆ,@@€³t%@xJgƒ:ÓWMÎÄrùçeäQ ”X h_P‡Rd=÷!>ÌãM'uB±)0@@PˆîdKnåFQÓ~ÄÓie³iãÓsOWk‰t5 2 ¸Ds­Hiô ñà%Å”}]fzCu#!C‹‹0‹ · ­ò;½Äc ×/rð†”]ðo\ðAfP‚¸Æ„½·/þ$¶YX$c @@CìD¦%B݆z¸$ ¤¯b–°CaEPmƒT\(@ƒõ¶ˆø´cº¶€(´)fb¨ƒ4E>”e‰åKf¸ŒMØŒ„ʧœ8K&@øèIŸÔV`pƒæXïH¤€\•Bk´å\{ò{ù[uØ&j0[¶Õ’É¥’ÍUжöh'“]@S]°r]Ñ¥ü¤çD[°5H§¤W\MÄg0[¨¢,ºB4ä •`©+²_:£2µWI Hc”KðIVpˆWYC¶Ô”ƒ¤ZÇÑ; h8‚Ïô8n°$H“%þHZpUÀçDªµ‘7dKïÐŒi¹²Ó7bn;“dÔX@Fª%ZùWHŒiCÅå 먀}nfgWƒ;^剠‹7Ôg´ä˜Î·‡·9oPècEt rY®¹MÛFƒO´„ò–š:¨›~¨ 62u&3Ü52 G ×w“‚$a7¤…ÔI¡@K…tcCc+#ô5wf27#_Ò@! £)]#RºUŸ\3i”@þJöXCÉ–D¦Q³ôA#…Ÿ,ù5ž&[3ŸÚ=-åw'™1trŸô”Ç„aôˆL¢EK0¥ˆ9èm|8…é&  „-Б6¹MþE¡ûœ³Ž½É—™7¢ ·n u³´KIUî4P˜9HWõß‚ÌØŽ<¦&sùIÂ7ŽÕVOJF…k8r2gD}áä]JbX¥ÛdK² Eªu{I}¹–{õEróq •…vIF„{pêêØHÎC<äÃsrBAû)PðTý…˜¡©Zb`åˆxi|4€r¨Ð3kt=³s£ý @Èt€bîÔ™š5x˜~hYvºlsð`C — dÈ›g E}þ˜‡Ê‰kYÆEè†LD@o9ªÜ‡ƒdKýø‡Œ‘°Šk³e 9KþÝš6Ä£ŸdZÆH’•ùaW#o*«í SÈtUÇ)ŽÚzCðô2­Ê¦4š ^Z1"YÛ”Jf„}îTH/[zJꊙjGÅHogî¤$0H,Z«³¤Z$ðHó‡<ô·~ߣ<k@G¨q¡€»·[æ­üy‚Ô@êN¢Ä¿ºX%Ú¦3ë—® -ŠL|Uc4•yZ›¸H†ÔšB\bÐ:7F¦ƒô-p­5tcºSÂGJ¥©;ªÉUV6äò`»j¥ƒ¹­}–¨¥Z@J·¹—'9Oü`¶;8Þ¥´‚ÔV7ùW4IZ…ázy§éQ¸-Ðo•þ¥U ;J±‚´Hव$@ð³<5E# I”)}çjpFq­Ö‚BRéaQ<·£a JM`Ãù]¿ÕV Ÿ+=Ÿ›<÷Y5Õ3Rr´ŠxTŸžk6%Å)•°`ð·#yŒE"Ë@úÚ£BpY¿Õ™1—IÄË Ä_Aõ‹´X½$‡&o¬5ÖQ͇›‘ ˆ]ë”KžYzð„è¢Gk’l¸f¿e𷜃®Ç°e< Jn‰)Ö™¨‡’|Z°Ì·y óËa¤W+ ®ÔxC ‰‹·7³õzµàf9·,˜D­£Nm×À\piC®T&¢ã:ntLdþ`-Pf› hà°‡«uaËôÅX‚{D#ü|&l(“²)â×g@ kÀ¹…"ˆÀ‰X€«´dÜW¸ã [ƒ[”æ’Ë•[;¹Å:ÙŹ…(?#–UC2’6__Ð-¤*ö§¸P´üEKZðWt)dÜ 5£*&ÆD)]³R,…"]Ðu3“{‘jð«C`¨Àv±ùDý)±Apˆ04¥µ‰ªØª$ËEhÜ]ðØIMIYdtF€˜<Ô|Ì)¸{››†ÕU±šl@Û;/Xø:€Dà…G`Aà0„0ÊU˦jk_{«Elˆ¶A ¸þ9 Ö|§"Àa¸”ÈeÈÌE»›éÂÉÁfÖœÎh@`6–Ã9F‚€‡Þ‡µÍ9™Ìh:Sgf +4Ó2 élÍ6ð˜eÉÇíù3èŸÐ+2Úô¥Ï6m†ÏÁ‚2ûü•c“(”–Göù'^a[CÑéÜE ÛöQAœR+™5,M ªÑœ5WÜ“OSÓPG+”Yšr0Àá»-0ÐÁ:¸óÊqïëÉÝ(¹ ð`œs œ+m-`I‘Ô” ªéh´äªÔ.²Àðƒ7l0¿-0ÁC›E ÀÌ›©cH£s«ÆY‘Þ¡h—†çBÁˆ€Q×ñ€Á`Ðþf<\Õô³n ŒäŒ‚è«%ËÛÇ5N ¤ÃIõ§ðA©Lg€u±ŠìAŠg¨º‹= ;>n0Äcqm²+€’”=ʰ6ç<›*Q’,Tí9€’kAÝd°ØC­·¯J‘ƒ=Îá]Œ#À° ü¾`€ÙFý¡øöÉø ö×|ZýÌsÊaÍ=lÖ>LÔª„Bg«œtØ®C·¼LÜkí¾îmÂ÷ºœŠXj‚߬7aÐØå:Ü4«†8j½&ܸ\Û{MšaF*™ö‹y¹­± st»ŽˆáÛ™Íá ‹óÖa]€zt­þý<ß“°€L1ß°|åqî8à«)oq`c°yɾ,‚ÒªÌ "ð—„=³Šá»,|ÂI5¬´ìàà­ ×Ô¼EâqÀk e0m¢ll ÊR-Þ/ŽÕÚMÁ¾Wndð6`#àX\ÿÛ¶rM òû·O.Ö¨Éwu./xA 0205QÀäv½üÆÛÍ`N×õ3Ïs@;R0×uG6yImé~³Ü/4Æ'vq½!° ušÝáÌsŠH¡ü¶ŠFêaÆñt<Ž8ЉìÔ“sôg¢Lò籓¤ŠËž*þç*æ3 ™`×ñb @ ëIVEíDu£Ñ á2%_í#rpåT;…g)¬É§±z&ë‚QÀí,w~é}v2kÂÖÔ3JÞÚBv@~ ¿Çvê95ÏsƒÁ×8kàÜNîÌâÊŽ! @¹Þu íßJnñq,ܧØM.¼n e°q±€¨°/fS°§}«×©æžUš«ã5ûÛQ"¶á˜.pc&@¾Þ%ëÝÙ­šK¿([<™Å6íÅ^Vo¿§3_“'ƒ>É“)mõZ\õX|)ªG Öî½fƄܞÔ%Ñ­h]_Ä*†"n þŸ`ôUPp^+‚¼+e gFø[)i{ž³’]½ÏÚ…^óA¿íåaÎæª _ׂpMÀõ°¨gûEMã†ýó›ãh²ÌiK¢(’÷D _7eíÛ qðô™¯{p]Ë…pMpÔó ¿¦'R¿®ãÝo€åY½ÉàÌçþÊ ôÝðÆò¡£Ž­d³ÇoÏIÑ)s+rS—à-ð˜ÒkÑîÎÏn¦Ç£ørŸsvžé™ž}Ü3 íý1#vo(óéÑ@96€àö&G8¸ÖâFX8(ÇøÆ¸8ù¨¨˜Ù(©HYÉ)ù–¸ÙXÙ‰ù¨)Z¹º‰™Y¸H*²7Wk;÷v[›«KØK«Ë{Ûv¬;çÛ{,lË\ |›½Lmü{m}ëŒ|,m }¬] Ž\Ž;Þ\îmÞ¾Û½~¾MïžÝ¼,.®üïÙ;nýÌl_@t ϱ#x^ÁgûMdHŽB[lÄ d÷p[Eí~T8ÍäŇáê]ĸ±™.[Þ‹ñ›Í‹.Sò¬ùò\¸yöVêjaæä͘}~‰³çS’96Di+;rmagick-2.13.2/doc/ex/images/Button_Q.gif0000644000004100000410000001245312147515547020134 0ustar www-datawww-dataGIF89ax÷ŽN.ŒFDŒŽŒL&$ÎTVT$.$j>Îd F$ÌbdŽDîlV$ ,6$ªL &¬VTÔÖÔ f4 6L6,,dÎd,F,ärl,&>lnllîl4>4œNL¬®¬DŽD$V$LªL~<ª\.,î<2$N<>,.üz|>^ljl<.$~Þlþt^,>$¼^\ìîì4n4l64lÞlüzt * ”JD¬ª¬T*,ÞT^T,*,nÜjlžLV,¾\*n46$N$ìrt.|~|tþt¤RT¼¾¼LžL\¾\¾N$> ^,>,ž”FD”–”T*$n> ÒdJ$Ìfd’Dît  ®T*¼Z\ÜÞÜj4:\>4<dÒdìrlüþü<~<þ|><,^,ÄÆÄællæltrtT®Td24<><\^\N,|þ|>.^ þ| N$¤RL ,*D’D® . â,.,$>$Ä^\ V,>!þ0Creator: PolyView® Version 3.62 by Polybytes ,xÿó¨Á*\Ȱ¡Ã‡#JœHQ¡’@jh¢PŸ-"]9’¤È“#S^)yè¤È+[Ž”y%¦K‘5QÊ,9fI–-M椉§Mœ>_¢¼r'RŸJ&6 ,£ ÐÌ”FsÂÄ*“¤Öœ*{Î<ùs,L¯Z‹†õŠÖ¥ˆ´7k‚Õ9ôêH@@*m´ÂƒçY Ag&åJ8(͘k»;Tg×Çv |–«ÉË9#ú!P‹€3¬bÅú–íÛ¹¤ÉŠe YòRÓf{¶ý0dÿ‡ÖC>„ ƒN8á…îA€Á;3Ëi´Ÿ2Ü*º ø©ÒǺґ±«i[Þ4°:<ÑÀŽøá‰³®úëC¬áBlèM-Ô SÜ´ ©ÍÄy¸ˆìËîä¤f+­éø`øò« Þ|ó°îÃlܼ3ººç\y«*`&›–F›¸îÞî.½èëðÆuxàúûÌ·¿ü…û0Á9œoî«ú(ïšIѺ¼ýµ«iuCVàP„å½îyóƒôäçHìÛ«›ñІ¬îÉH$œëùÌ7¯’ePØ œçÀøMðòƒàò|‰7HŒrƪX¤T!¬ÄM`{Âÿ²Å³º1Àʃ!ü”ØÂ BÐu0ˆ€õXU7§éw ɉ„ˆÏ=mT`=ØÁ‰2xb ãW„ <¡ŠÁÊIÖ=·œ$„‚*`²Hw¹b-âˆÐ€àZÈBÄÍoˆ4¤"iÈÂy@oì£Ý"·(ÞyH.–ȃˆ>{oU^PëÔxH޲‰¤à šÀ4»¥ÍSlŒ‡>NfÐ+[ÄQF'ºÐ|°C耈bfÀ|ˆÃe? °Òr)C_°È,i’K%òœö°Ç³(X€‘‰[câ˜@€LÌ!’÷Õv°>P¡—©,œ3]…Ãòí7.ÁcFˆÿ²sÙn¢\ã GxÄØ¥Þà>€žÍƒ+]‰¯IQ35!ä’6õ§CJE¡”`H‡À„ ŒLx9‹ÔTÀ*œ²Œòƒ†H9“Õq9³Ÿ®º˜½ý%ô 4h8O¹,äOt¦ò)£š`‡B‚ h%GfÉ*mQ|ä»ÛTÿ@„54ž—pB鹲ȭª A€(ýÇ6PRššŠå‹ôYm‡–B|)Nx` P[E}¦²8t¤©D$ž ·|Q €gÁI&A¶ÏmzRMd_ËH… ¸•dxM•ö<…ˆÀs™=KfB¹¶å‡–#׆ÿÒO¨ BVÑaÝu9€Â;EŠXøÀ­Èʪºw!kn2›õò©ÚšÆÁá–uØañjERë Géá^Š8¤´¼ÕA,“S]Õg¼ÍA&ÉBÄÎ 3m•°”¦´ôNªî#$}i(T ¯ÓÔ‚3ZYšÎ‹ ¼<%ô ÇmæN©¼-ö +ÞÛ&¬ç…x™;ÒÒ½£c«àa&N‘t,¨FÇ3Qµa¾B©&*UH1×(0ÁÕsÇg¾ýaÖn1á<ƒ„š,>“ªæðÍ$wpp,ÓSºÚ2žj@€_ SX`¢é\ÚŒíé®' Âÿ…§%Œ%×ã:fȹr{/Ú&Æ(ÔÁÊ96@¢F ÇVª¬\phq<× ÝՒйéÉi-…øÊ„5¡ÊöM%HEPõÔž‹Š‚W“,RÂU`S_t-b® ݧ cF£üñ-ƒZ¿N.L»ÙÛâ÷Z8ô`‰ÛëÞ¬F³X™X¤’ W‡7ZÌ„t¾.™ö†´^†Ž@®¢òÅC Ë„ÁzF© Èk?Ð5áx»\{Âkð¼&çÁøÀ–‹…^Äèb×%®Éd,;}/Ê-ŠõUömGØcõö®&BÞ•À¾çHyÁËž£©H<ý¹zÛóµ„û=8tS²Yÿ•—íÚX8T—”ô Dkd•/—é[„ ºÌ2Þ QJ•T½ÛîñÅË·‹ø@"—N? ÌÜZ¸†ú]Kx>×÷¡ôã f)ÃæÞÒ£¢Ôf‡‘_—èT7)jdÊ=Á¡ÌD%[·þ9‹Úʇלø¼+E?_ÙÃhç`4í©âÛïíO…sá±i>wÝO€Òd稅) Àýï/ÄQÙ]Ó!–õTØ«‡É:D@Ë îH"¾É¬bxÊHþªe°G^méÅX¶ ðU˜Áô4~ìkð0š²RDµÙœïÉ(èKÇvÙ©7k—0^”,Ú~|cµm À^ d¦RéHR`;›¢¡(a bxsùò”£(‡ËcðÄJ¬A@©ýé×Ç’Ñ·,?öÄf4®Çfêw) ™t:„(J§KTFvcÏ7šcq«Å×€<…¨¡Ã*¼ª|JTŸŒª­£'k+)}ÆÒjA”;š³¥_Â’ …ËI¢™6°Ï¹…Íi8.°ZÀ"luÁ†Ø$vt6mkjÃ…¢#:¢YJê:| †’(q`–‚…@§* @":›Š÷®¸U±Þ ?k„&®ÿÒ›\¢Žš:Ué"t³;i†§õ:T@tPãÙ<`?Ǧ^‹A¦Ù9Âs2I,à Lé{5hHT@ðFÜIH}ju¨CU‹šŽõÄQM›/ë4<š±p ;E¶¬8PvÄ2tjQ¨Ad;*[·—*Â^L¶­Š;APã)l@fÚ<%P‡Úm­Q¥Ë667I‘ÈN°Gù¤´FP@pK`}?ƒ€NO³‰?!™.9›š¡¼^ä, `¤À |i4^/çdÀ Np¶ ÖTŠæ:ßšš9¸%x£_ÿWSúr-+ó(Å«@°vоì+ˆ@sðOP66¾†À‹òÃY¦«£É› t‹Xµ¯Ó—oØX"ˆƒ¶“À¥2+ëTÐcù•=gG’†b_˜ ä»Mù† ˜@¡ú9^õI€–5E1”žè€•b.Ø1ñ7:úS¸Ä3*T+2ð70äPu¸æ¢}ænVê[ðƒÃgLQx¨ÄüšÉ’±v`f`ˆc2XÁ´‚^ö39Á‹¥ì4µÀ3¼n¥ò5óõ;xE¶2R‚§Y Šm¶ö“ÑÃýDVk&‹Û“«i(x ÿM“‚‡ع p¶þÛIl÷Vˆ„9ŠÉUµ2)RÀUˆŽ{p€jÉ(Œ±¬tg£6¡bh"f2L¬*°,BÆÅg45€ÂãtñGË•‡Â §q$‚:LË7Ü( ¢A…¶¨+§Y08¸Á‡ÜSÅ :ìE¬ÜIÊ m²\,9\`Žß#ÀDÒ€\ÓÎîüÎðÏò<Ïðü €}Еݻǃa°1Ð=Ð]Ð}ÐÐ -Ð^€ €^’ÏOÀµÄÏÅÑѽÑÝÑýÑ Ò"=ÒÒ}cÏÝͤì^xIYÐè½-ýÒ„Ó_Ü9Ó.]Ó„"Ñs¡ „@ ü\Ó+ÔB=ÔD]ÔFŽ+0ål `%-ÍP-Ó4 Ó7MÕR]Õ6}Õ2D°"WÀ65ÕZÓX=ÕYmÖemÕj DÆ1'… Þ{Ôv}×x×EmB@ñ“pQ½Ç„Ý€…­S‡Ø†½ØˆÍØŠÝØØ ‘~0?` ‚Mˆz½ÙœÝÙE  !„@ž}Ú¨Ú‚ PÙR‘&J°´]Û¶}Û¸Ûº½Û¼ÝÛ¾ýÛÀÛPPQ¡;rmagick-2.13.2/doc/ex/images/Hot_Air_Balloons_H.jpg0000644000004100000410000013674412147515547022053 0ustar www-datawww-dataÿØÿàJFIFÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ³¦"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ãñF)Ø¥Å{ç”4 \S±F)€ÜQŠ~(Å7m§âŒPq]Kx‚ÜèMnS22lÙl~UÌF+9ÓSµËŒÜvŠLSñF+K7bŸŠ1@®3¸§bŒQaÜn(Å?b€Š\S±KŠã1F)ø£XbŒSñF(˜¥Å;b€Š1NÅ âŒSñF(° ŧâ“ÜQŠ~)1@ ŧâŒP1F)ø£ÌQŠ~)1@ ŧâŒP1IŠ~(Ř£üQŠbŸŠ1@ Å&)ø£ÌQŠ~)1@ ŧâ“ÌQŠ~(Å+(Å?b€#ŧâ“ÌQŠ~)1@ ŧâ“ÌQŠ~(Å!‘âŒSñF(2(Å?˜ b“&)1@â‚)ø¤Å ŠLSñF(Ÿ *¤´ñèjÓ[[ȸxcoªŠåx”š2s]Œ˜4û9Q.-üÈ›±VäJšKeuÄØcýð1Vⶆوv£žFx±§ºzqYG8Kš æ«FW,ÕÑ…>Ÿ$|§Î¿­T*A®hi<™þU^âÍ%ðßÞÖ¾‹ží ÿyóxÜ‹yPûŒ2(ÛV&·xkŒzÆ¢Å},'Çš.èùª”å rÉY‘âŒSñF9« bŸŠ1@ _•ƒuÁÍljº×öŽŸ ·—‚¼±ìqŽ+'m¨”jO¡JM+â“&(ÅY$x¤ÅIŠ1@ˆñF)ø£ bŸŠ1@â‚*LRbâ“&(ÅGŠLT˜£)1Rb“ÌRb¤Å!€b¤Å7†3˜©1IŠf)1OÅ ñIŠ“˜¤x£üRbŒÅ&)ø£€˜§âŒPx¤ÅIŠLR˜¤Å?b€#Å&*LRb€#Åò(  œQj~(ÅjHÌRâœ.(˜¥Å;¸ âŒS±KŠb.)إŊ1OÅ.(ÌQŠ~(Å3¸§b—€Š1OÅ c1KŠ~Úο»Ûº4çÜúVUªªQæføz­5…ÅϘþR6»zÔs\GmØŽdn=êðªY¹5]s4¥Ï~žÂ¾r®6u>× –Ó£ºŽŠ,òI$Ó§Ähun¿J°Š UC™¦gíÛé\»=…d¹íV íNŽ0J@XÙ½CfÑVE&;¤cÛ8,j}(H±V¢Œg¥&ÇéNkFËK‚â14…÷1<éUÕF+jÂ=¶±ösù×-y¸Ç@© ÕÑ­1ÒAÿ¦¶‡û’¸úàÖ¢­;mr{i÷0çk©RÊkB[vÖÈ8Ç𶦣ÇïŸè§ùÔŠ*$Ûw%»•Ag­÷‘†îG?ZsŽ)°Œ‡?!t¹ §b)Hç¨àÕ‰½D8p}x4ÓäOH¦9Tôö¬ÛÍ=í”H¿<,q»ÐúÙdÈSŠœ·c¦$ @~÷_¥>!P±Ì§ÛŠ™å7¡ôpW‘$ˆÏ©â™€)%9Ú=óNZž†›È*íœ q2Æã*y#8éTRµ´•Ìì}±¨íÍ'¤M(ôÛ5[§ãÍZO³#þ=“ò¤CÒ¬ÇÒ¼ç9w0mØ…´»2îÈã³-”,QÙ@«.vÄçÑOòªðð£éIɵ¨“orÈð)‚Ÿšƒ60ß÷ó4à)¬ÿÌÓ :* Ôh6Ëõ_åÿë©sÇ5xŸˆý)‰eT ™È«=ª0y¥qňàE[Ó&û5êäü’|­ý iXZ[Md¬ÑÀO4é4¨~ì²7cœ×™WE¹Qš±ÇS ^TÓ“R³xýèÛû­ÿׯ=’&ŠFÔ«)Á±¯PP|±’7cŸ­r^+°Ü¥â._•ÿÞâ+è¸G5jo 7£ÛÔù¬Ë¥h·G3·Ú“&)1_¢ž (ÅIjLPx£&ÚLSÅ•2x-Ô ÑŠêÞnc™œu®˜Ö„¶fn nIŽhÅ;¸­.HÜRâŠ1Å;€ÜQŠ~(‹ŠÃqF)]–5ÜìGrqMó¡Ø_Íhêw Niu˜¸£B]wO‰Êù¬äwEȪRø•þæÜ2ú»`þB²–"œz”©Éô7qQÜJ-í¥˜ôK…`ÿÂK1ý }2j­þ³uu”ëDìÚ9=ëž®6 ÇE 4§R(§;––‰É$»{ÕÔ#ŠËWß©¸þâ…­q@M|ÝF}î%!‘ß7©&¬(ªÐ}ÅúU¥¬¤vQصo`÷ŒXHªŽE_CÏ[ŸÉ?úôiC÷oþ÷ô­x놭Y'd.gÌÊ+ ŒqsÿŽõêÌ_b™”É¿*qZ½C1ÿKoeQ\£.R{-YAÅSSVÓîÖL™l:s‹iÝ5g¥>èÿ¢Iî?­G.‚RÈ5 5§Ž”‰hcôŒ°?™©BßñòßîæjPi±[BNµâDÿ{úS³ÅXÓFíFÀ»¡úÎ¥Og.ÄÉòÅȈr*3ÃW\`„ŽbCÿ^K W'0¨ú W“âx³Ž8ØõE}·[ȾŒéZ­Egm³H#Î ©ÛäbjÆuœã³8ªÉJ£hhêj–±oö½"xÿˆ ëõÕÐ2Nj1žàðk«/ĺ˜Ô]fU"¥y‘˜«#»š À˜Ü®ô5+÷jUऺŸ%8ò¶™(Å?b´¹$x£üQŠ."=´b¤Å&(¸ Å&*B)1EÀf8¤#Ö¤Å&(¸â“&)1EÆ3˜©1F)\±F*LRb‹)6Ô˜¤Å„Rb¤Å&)\ñIŠ“b‘⊊LR!ž?âø^_yNËæI» îéøÔÞj 2Ì­òò®9úSøïð—^œàü?݃ äЕ &Tp=«õœ¾¤Ö/¢<:ч´i£ _Çå’ÚD9ò1ëZ0ßZÎ G:(b3Ò¸õ¼ž'ó=1?:–=EI–ÙˆÆ@Æ}I¯V8Ú«}NgBfvJV@0aAÎiqë\_Ú§Kª`m*A¨ÞÆÛ ’àÏ"¶Ž9uFrÃÛfuø£ËÅâ˜G !u*:¹‰”´–¤cº8þF·Ž.›3td¼QŠÊÄVL«æoF=~\W#Ôì% %ÜdžÄãùÖŠ´̇º1F)˵ÆUƒcš\{¾blGŠ1Oŧp#Å&*LRb‹…†b“üQŽh¸âŒSñIŠWÌROÅ¢àGŠ1OÅ&)\b“üPE2)©1IŠ.x¤ÅHE&)\ȤÅHE&(¸ÈñF)ô˜¥p±bŸŠB(¸XaÜT˜¤"•Àf)1I<Ñ[&ù¤T_sÖ³×UûK•´‹rôÞý+ØŠt•æÍiÑO…¤ÅgÜjÞA`ó’£€Ÿ_ð«6w°Œ<Ó>Š8çË6…¯¶wÑÊêÔêOŽh¥‡U†öI °©Äco_~;ÑXK9švöl§•´ísnÖO>ä<3˜c¡ÍJÔqp¼0;XW:÷Ë+n3¸>À€*xµk•¢ó„±·ðÉÏëÖ¼ÜDj\­j{/,œ_4Yz Ò[È œÇó§éQ«GN=ª}:âÜÜÅç#Bíc»#ƒSMb‘Êʲ¨5âÎ.;£ Ó”¤@V9ã)"º©¬ SD’ ¼ d‹û£’µÒÃxÁâ­½¬¨·µkC*/CÒSGš˜—8äc¨ïAˆÀ'#Ö»nÛMK:êU·”œ”åà+–•<­Œ®¯Œ«/qï^þ«Ã™+}HrJ̬"aÞ¡ÏÝ&¦-Ô2zÐ:¸é]W3±_c¤Ó—ædvÍNcŒŒúSB±Ãpqšw eÁúÐX/s´u¤bÌ3Оy¨†@äqÒ’ ,yõ å‡JŒ±ã­ž˜¦ÃãÁ;ásØ‘O'Ž‚ ºÈ‰[ÃVu>§íYéÍ‹Ÿ©®ˆ|Ñ8õSü«™°R×j'½vÖZ_™ó€¢×ŸZj;ŸY…’³D:ÿ»AžÕÓDù®;MͽËÀOú·+ùê!n5ç×ZÜÓA~vjùÅ7óÒ®ÛÉ+?Xùom$Ï/äsýjkYk6¯j´›FÔ-Y׬WToxÔÿ:¹nãß5Ÿ©ºŠïD?Bkîk5¥Ë=h+p+"Ý#šÒCòŽiHih3RlYqÿ=ùÔp?JšxEÊG1PÒ/"¯Ã p \þkÿ×®j˜ªt´›3•HÁÚD©Û«@h3c‰ã?§ ùëëX¼~ùŒÞ"—rÖ‰ÿ¬}d?áZâ³tÈ|‹a`pÍÈúšÑóx™sT”‘åWw›hy _SÏçLsNÚ+±Èxcêk+^Õ›H²K„$f&Ö8ÈÁÍj–5Ù®3Ç7e¥¾{³Ÿä?­z]×ÅFWFUçÉMɈõ%Õ5ë«°ž^òLçP+xÜsš|¯æO#sËQÏCøšýJŒ#N Ù¤äîÇ,¸ÀÜx'ƒé@pÄäõ¨äÉéÚ†\ílI)9ã$ö§,®™Ž#œf¡Brð}M9ÑKdö+»K·{3Ù9Å4ðܯÓ#ƒH™XŒsNTšo•P¶ 84^Å$å°ŽCŸ— =4¡â¤®ÞØš·˜ïŒ¸¹¬cÔ醼ö‰A^DèÅqϦŽòæ>âEú1­3¡€ëÚ3+tP½½Kyá‰-Zk˜Ï˜¥º*V.ùSÔŠ˜IÃâ)G¯êžfÝþ𬧉î—ïÅþU[­K"Ò…Ý÷2­øúÔM§¹Ç—*? ðkª5çk¦ìeõW%ucrDÜO&{¡È«ÛºhPLä{l•f ± ﳺžŸýj«µ¶’ÐTnY¾X¤Ç¦ÚÎ\’V‘J0š´‘ÒÀðÜóŒúwÑ¢[e$|Åy>õæ…æ…Ⴢ+§Ð|N ­­á †^ÇØÿy¸¬+·5=O2®“XjsHM_Gš£ÎÛ¾#þÐÿ•äh¤%x#ï-{”RN^Gâ‹E±ñ5ìqð†Mê=›Ÿë^ŽCˆmÊŒ½ONÉH¦$¡°zS†ÖnÁÏ]2¬P}ÖŠ“Ëb½ýÅ{µ!ÊÎ –à ñ† …ØO¶ÕùÕ`Å[ÓÃn ÔXw]IP3sš`ã¨<œýh.K‚>îNGµÛ•bǽ# à–4nöcµ4 “×­8‚néô4Ä42óÇ=©— æÅ'ã T¬»xÀ=ªÖ—§¾§ ¬| X)oîƒÔþU3iE¶kJüêÆ åÜ)÷®óL¸ß6z\5ôe¾šmÞTŒ‡|gô®“D¸ßÅyX„¥£ê0ò÷‚÷ýÄ7 v?Ÿñ­ëgÊ Ãñ ”»´¹Ç… ÷?ÈÖŽŸ.ø”ûW,Õà™ÕOݨÑkZæÎÒ_îLTýõ©¶¯‘RjHdÐî}cÛ üøf©YÉ+%¬ ¥¥C µo›SXùn­›Õ~¢¥µ'p¥Õ`yů–»˜9Î;õ« ¥+³iü ºV´G䟟x1þ!ú Ö¬W[@û<¹ÿv²jÌ…‘¶â©ýä?õÐZèíÊ3XasÅ+ÄU«’Ú·ŠðñóŒäœ]ÎT”§£4TñRg¢CÅ6Ø$8è¤þ•äZìàkR 3û•>¼þup§l6Æ£ÐV–ª{ŽkPv¤„ü¬}XŸéý)®Ø½iÑ ±¨=…M´´%-ÅBì[åOç‹ „PŠQß¹zÞ ˜%Afû½ÿ×µP¡¤eP¾õÆ“q½M¤rÍ ÈÊ»Ðã½DãËï-™Ã88Ë•”0HèéMÈçœt"­›[˜󭧉øÜZ"0{v Á,nCÁ*±ä††*..FUÇ"—fFqÛµ*.Ö*AûÜPÜ^(˜ÅÞã©=V*¥7dHjòkT¹h‰êÊ2*[?ÌpÆHÃzsV¯4Dz‹2 d~ˆ×¦Õ“\%X´ÚÐÇ–Vp2M1P….~”ür[ðb(ÃÚ°õ5óUë^nLö¡N)"[vòíÙÿº¤ŠÍC™2zæ®ÎLV… HUKhüÉTë)ÉZçUÖ‡A£ÙµÔª3µ3É®ƒÅöVöçMµˆ`ˆÙÙ»’Oʪh ,±€8cÅ“‰u»u H ™É¯*s“«§CyÎÔ™›kÅ•aƒÎŠÖ¶­ûK¢ŽÄœQV±é/y;™F²¶¥Õ†5ë–>õjÖ5,Ï´axU\’kZÞ.úšä¯S–'ÐKD3ËÝÏj±mn~fü)Á8«ñD1Éä×›R«Hâ¬íƒBµsº¤+ æc*­uå=+Ô¥ßÊÕhú+£UÊDa Ü™¯áímâ"Êáò„þíÏcèkŸñ’-ƽ$¾tJv(!Ž ân¤Î1ØPjÖ7wò‰¢WžVo™TeºcøW©ƒ:x¯i{]~i†•¯d-¼ÎÊ_0©çaÏ»rŽöïš»aksm9Yà–,¯ñ¡Ϊݧï]•mÄ⽉US•–ÇÎj¥f5Á`zdŒßÆsæ~•·ÆˆH¹8¸ | qÓ½$6²ü  ¥@ÆzJ±RU¹ëRG.K…É<Ó­ ÁÏ^´ å$’H«ÂÕdPò;zÓ>Ë´Tð  1-¸ÇáW4}Iô™e¹…Ÿc,8¦ªùx^2Aõ4Æ9"¸ñ’\œ¯©½ îg4%Äþo2,ÇÔ“Wô{*ãa<ŽöÛp[¸þð_œzZ¨åÊ® s^3އ±„©xù£«Öí38å¡a út?ΠѮ2›IéV¬d[«bÊÈ¥OãXzsµ­ãBü2±CŸj押\ORR´”»¤ L –T(ŠÀÓä`¡[†_”ýElZÈNÒ+&é ¶µp˜Â»y‹ônžknÑÑWe#zÙÎEh\œCÿvE?ŸÖ±í\9­—æÓ¥ØŒÄ&î§?Ò¹+5ÔÖM:mv2eEn[œ ®gM“r-tv§(+åñ1³<~ƒu~,ÿÓUþu^Ùø>±ÿ ÜúH§õªvÇ¥E5zdÀØCÅGzqi õüÎ)ÑýÑPß0òyÇøÿJÂ+ÞAmGÂ~Zœ7Z¸*bp´Ij6†ÊÙP¿Þ`*`Õ[ïN¾Š üøÿ›8š@ì+ŠÖðþðô"°ÚÐGpc­Áb21Øý+²–63Š’Ù™F”ä›Kcge8`PÈ#Ú²Ôý¦üdqœ×A¯ÚµŽøæ‹ÊN¯¸÷¬ .KCŠèSç^éÕ…J>ôW2ú(1îS¬¡­±òîù\àà\ÓXÄ0M´‹´õ ü)aI£Î@Èχ¥²ô”®Ëú¸15Ÿ?{s!ZZlpAèáUµëi¯.ížÖ’%*ž9ïZš;E )Ω08dfûW¿.‡µN¤%U«œUÊÔ§‡B>œÔÅÛOŠTõO—êi×1ƒâkز ¤¥¸4š¿Íh²÷Ý·ð¯F’æ²gÍTnß/vr26]½^· Ï@+9ú±÷¥óØ!Eà ¯¡ƒI]XÝý"ì³t''é],Z½µ¸ ‡|z+™µ8fúTÄó\µ½éjzWÉ £¯¶ñmµ»ƒöY¼ej:¥´ú¬—¶Ð°óÊ¿cÞ±3Fk¶:¥^RVfÜ~"ž2†/Ç5ªÞ$´Ôôç´º¶1M·÷l§#wô®;4øŸdŠÞ„R‚¶‚öÒµ™fsäFKvýiÚdþd.Œ~`Ù¨5Vû˜<75FÞf…÷©äWž©{Jo¹ÍVµ¤‘ÑߨšÞ 8` ÍQ·ùG~õ,w qe=8#Ò©Í7”„÷è+Ž—ÀΚsV¹¾u¨´Ø°­™ˆàvûÖ,º´³ßý§œà“’k%œ³Ç$÷¥Fë]Ô¨Æ1å¶ç%Zîr¹Ñ}£ÏQ&âÀúš+§€¸Áìh®Ia$Ÿ»±J²¶§°ÙAçܪãɭõE¤Z•¥#—8JÐòÍ|ÝyÞGØÔwv!†òÇM^e©m£À,{ð*SëŒzóªÏ[Ýåc'SŸì¶2Ê8lm_©®%…vú¾™%ôq„•T)$©\íÆ}H‡xõŒîÿë×~¥8ÃW«;0ÎŽú•,â;ZB:ð*Õ¸dœ2’¥yÈíT<É¢m¡™HêøT©{ÏÎ?Þ_ð®ÉBR»Aˆ¤æM{Tk»(c‘’Ã=ÇÊ‹7çÎ æµ.£ûD@«Ž¹ö#½1ì1^–[N4éò£ãq´§ ­É`ø€ÍI¢•ÚF1ÜŠÓàœSp Åzg!Kì  óŠXìäM_ÀÍ8ŠVHUTr(•9ÉjÖÑŽ´Ò9¡›%²ç=1YDó] Æû¤‘èk”¹•á¾hHÇJâÄÁÊÖ:h+¶^ÔÆÈÄc§>•Ї‡ŒýèØ©þ•§í³uô]E'þ †ê+’Žî'UòTõ7t;¼~ìžG"iZgýÑ]4 ²BÑã†R§ñÂøvì_Ž‚¾ÖNTâ§R<c*©6™Ók-“X·û4v² û‰Çjç&`OZä‹'©æ¡‘ðzu5߇ÃSÃÇ’š²9ªÕ•Wy§Ë=ÛùR(ÜÙ'LwÉãðsM·[›Èã¸ç÷ö­üÌÍ m$5½¼®B»–lð8Çõ5=Å’-äåUUO~rMh\Ê¢âÿ`à~5 ²«jJ¹ ¿Ê°rlÖtä¥Ñ/Ø–Xäò挨õ÷©¬„úl±ÜE4jQùËpA×eY §?ckºí¾“jå’áŽV,öÇSíYòó®F´eN¤§>ynΛ_»·Õo£–9¢}˜ÜàÝùÿ=+–šãM‰"Iu mÊJ®Ž«ÏïuK›éKÜJ[Ñz(ú §æñ]0q§ôEB´¡.dwþ3+.ƒg+3£˜£[9L}Ò{ã·§5ÁÙH«pr žÞÔôº‘àko1¼£óϱ׵F9<¹Á>µÕJËÝGf)FÒ4l®?ÓæeàN+bKÉ6Å–$oþ•ÌÙLñXôÉ­™ÝLk·`Ò¨¯©ëÐ’PqHë4ûÆ(¼ó["ïmÊ£€v¤}k‘Óæ^kNêl^FAÿ–Kýk̯ÜßÓ ™è3+D8» À¾¹VÖ¯¢dJFvŠ—Kº8A»¸¬{¹ kWž³·ó®\j¤ŸÌîѵ ©•Zg#¢â¹s ÜÊÆÉvî}O½oÁ.Ö OŸÊ¸¨ä9ϯ5õYBÖLòSÐ݆[|IˆØ,çkû\ÓŸÊòÏ(Ï|ƒý+.96ÛÎäöU‰Ïô¨šåØ$@òì»1/ß=\ýÝÍK•™ÿ~3€PúzDŽBaco˜t~zúVeåà øîÜU»&/{kzOáÍ*:FRò#+A#ŸñÔ¼Kq´µQH>»k–Ü}koÅ·BçÄw²Ç™·òV,Q´ÎG×Ú¸ ýÔ:? -@Ûž€f´­´V¾œJÀìÆ1Ð~u6›§ùŒ Œ“]´`߬c"4LãÔûÖnNúIn:-¼ (Xý8®ŠÏOE*{QÀª2ì@P2Iè+2ÿ\¸—0ØŽ>†^ŒßOAXÊEÓ…JÎËcvëQÓôÐDò†˜"A¹¿Jàe4ï+³±bO½Z[9˜ä‘ÏrjeÓ§í´þ4¡]ÓØôé`#mLÖ±óùÇÍÙ”GãPÝiz—‘³Í3GÉ Ü0?ÖºHm$ “.ubx¦=ÒuU-õàWD1»´*¹l7‹³<ÚX^d‘u 0E@EwÚ¼:…¹ ü.+ÿÖ®6òÂ{6Ä©Çf {tkª‘º<FTåfU‰¶Hn†¬U©£“pÁëUQ_S:3·ºÉ3@dræt½µh-KA†sÍ87<äÓ$€Ã+E,&9ª¹Á¦ìàÀר¤|³V,n=…*±ã,N*ôzvÆÇñþTùÀ{¾h9ã4ž`aÐþUÎXñê*H ’wÛ ³¶ Àô'ô¥Ì¼ƹ+ @Lå¢ç#ÖºÕ´sh÷[q 6Ö;ÆG~™Î=ñXºÕ¿Ú´ödÉhŽñÇnõw7 Üe~†¾ŒŽCg½It¢ÿN`¿|r¿QY¢'v%}Fjý‘x—®JŒ=èîvT‚µÑFÊo6-÷ÓõÔhW€ võî+“¾ŒÙ_‰cûóê+BÖãc¤Ñž:ÑV*Qæ]NÜ%}ëUMÖš'Eh÷nMÃøOùý+Õ4w·òÇk‘ÙEymö.¬¢¼‹™"ëîµ×øGS@¨Ç•õô¯ŸÍi9Óç] äÜ'e³#…?²uû›µ•û§ê%¹ÐÇÒ¼ûÅõ劤KY¶¢FŠPŒ©8ÏOƽËõ¯×.>Õâ[ùsf`>ƒé^†IB5kË™]$rãª8CFtpøòò8ÿyi:‚V³5_ßj°µ¶È¡…þø@I#Ó&°ä;cúÔQòÌ{t¯¥†[…„¹Ô5<¹bêµfÉ÷RMWQ¾_n¦3`üébqêy®û¢Ìý©«„Œç«SçrOÝšŠæàF…ÏÐ ¨AÉò¡\¬r… Ÿ§j±£ß¾È8bv¬Ìãæb=E\Ñ⑯¥d ¬?;ž™ëúÖØ˜Ó‚åMËŒN–òí¾ÙmÏü²ÿÙB÷dx€óÆÿA^ô¥Û2?õg¿ûF£*[^$åLs2ã8¢Â2÷*Ç…BŸåWu b^»ºŸz%ÜéÃO–V3â—Ëœ:qƒ‘šÜ{‡kW9ÈûØÇ½säa«VÎO2„öÛS4zØyÝ´oé—måŒ7AZ—S²ÝBÌîŒc剮cH—i=+zý²¶OìËü«‚´u:j>l3ò:í6euCåFyîÖI_Q¹&8ÉóŸ·¹«º!Ü©îEbÂÙ¾œçþZ9ýMqáW¿#ÁÇü5&¸Ž+‰|”ùbcÔŽØõ®Z9`ã6ËúèÃúÖÆ­.Í"AÝʧëŸé\ê¶kë2¨Z›‘å­’ÏÈT1Ì»˜·Ë =8î>µ,þÒ®²Î¦1žUXÛÒ«Îá\䀱. úuýs\ýÆ´ø‘ ãsd¹ëØQUÞMžÍ$¡M&tom ÏûjŽ™Þ„,ÖŒönõG’9#…0¥?1íÍy´³É#îwfoRkEµ™‚ºZ¨ æyŒÃ©ö?LäÕ'ÔåÄ/i4RšG¸¸f9gvÉ÷&¶­,ÒÞ¹Œ³¡£Û eyß„¡>¿þª¿‡R¼8âÚ?¼{W+×ÝFñ÷Q¿f£Ê@£óÍiYG·P‘°pTdž?/_­Tµ_”ZqXÃ|n=«*’Pˆã'a—ROvþTCl õ'øS Ò™¾ô€}jõµ“Ÿ¼@­kk#–c^M\TWSÕ¥QAZ&\:L}åoʤžÆ+XE‘™”d)ζn Š g)Ÿ0c’zVdè~É)9äVP­í5G]:Òmjdʦki7œ¼²öç·6ÚÈÙ5–±zWm7¡ÛkêÊû?vßJ˼E™Z7SÁ®ÏLðíÞ§:XÀ‘ÇûzÓ/< ~¿ê$ñÛqþuê`ëÂ1´™âf®¥‘äwV’Û¶N àö5TŒïµm îÑ;ÛW[€ØÈüâ¸yá1HÈÃq^½:ªkCÄ«NÚ¡‹/füéÆE®jJ®TÙ—¶’VîXûzSihªØÍ¶õaMÆN)è…Ø(ëRù~dS¨ã=êkRæ¦åØ ýä‚h°7¨ã¡ªæµ" ]xèÀÔ3ØžZ#‘×䯲ødwU£­âQ$õv”Æz‘×Þ£†"¿3 J±úÑøÔÎ}‹¥FѼŠ•a‚(­)âI°[·qE5Y5©”¨;è{VãKºº7ðÜ%³Î÷[šÎ»Ñ.¡fò‘]{a¹¯™Ž&œ®}´14¥³3IJª±wœv¨ÓV™~ñ=úÔi¶.Œ¯neëTI­ya3d“7S†A†Ê~”æÊG¨®v*H§xÎU±XË ¾É.šèh»`‘MûbĤLà èǵgÝꪉò¦ç?¬I®$÷HÄŸNÔ©àܾ"+é"‹ŒÇÄg©=MeSœÒÕéR§jѦ”lŽºÔÛjÞihšî&Ú¦N öüÅr;#s!ŒÁ8P3À§År`³k¨\6éS$c°9éëT%»U’IÈ`ÝŠ>Úï„%5xŸ‚…iDÛÒtkVC¼ñDꥈ’]œüê‘2ó<ÀFâTä¯=:UË)-¼õ{Ø¥YI![aŽ>nsRÛZZ´“y1Ko€¿N{k)TåÕ³Ÿ•òLatm¨Çv0rx÷+yhæ#9S[r[As‰làaŒB·ædCiipßfFØeGóæ ³é¯ ´9Mz¹T§8Í]\àÇNPiÅÏ‹µymØ}¡b\så Sù×+ .w1É<’}jÅÓbÍÀ늂ÜakèháéQ¿³ŠG™:³ŸÄî>fß„ö¨‰/'ãš|­¶>¼ž+td3ýd¾Ôé¤H'´‘‘î=O5—¨Ýmäõ­èQuf¢‰ú¤‘HUT2šŽêV¸Éû®«™ªk•Ì­×µ1ähî¯`óô¯Oìè¯q{ÅEj?ícìÛw]Ê+¤…\€Þ2+6åW"DûÈö>”¶“ys®O Á¯*qæ‹:çi%$Y¼’T”fW#ªäôª¦æQ&ÿ1·zçš±¨ýEg3S¦®µ Is’o,I'$žµnÒß Jý?„Ux­7“ìöª;€úÓ©u¢"_)\×ÜÑ-#…Q’i¨ 5z_ÂÿÙø—Rž=M§Š!’6‰€,CÔƒZ%¥ŠJÈæm´˜-Â¥ËÌ’õd@ ϸô÷­}âõž·ºx –HË=H‡µt'Ð4ï øÉ¬á¹ß su——'!qžõÐÁ£ÅáÍQIâc{¤¨n<BÆGLàòr¢j)n8E¶x­õŒÖ— ñ1¸Ù'\v"¹C62ŽÇ +£ŽF“K”©9@sèkš´OBæ„¢užsû½À€Hê+"Õ¿}+z³:ÔðÄ,KózÍÓî$e?1ê{û×Zr<ÒNsZ3ʽّ{RA"J¢ î ÓáÚõŒEæxGʬJÔ­z—Šõb¨lmÛïÞ8ôþèþµÁÝE¹Fk«UÂ~Líú“tå¹À°ÌйfÖ·O2:©öªž[W¾¦piì7ôB,Çæ„…ä`ª¤±8µ´šݬ¸’-Î:…9ÛíõªRMÚäªSjéÖ:%µ–먖IŸ®{{UyR×ËÿEHp’áG¥fËi}9a‡T^›¨¢Ò/¶ù¢ vޤ)Ç¿"•NEœˆö5RjÄ×Â=òù]sŽ™î*¼2ü»·CW¡…d‚(˜aN@Àä£ylÖw-;€û­ŒnµâNÒ“G£Fi®W¸ÉûÓblN‡¶i¤’½x¦”ÒÒÆòÚÅüx ÑQ1ÜsëE.QW»cš©4½ª£j,PÉ.Kmó_á#×ö3] ¤eò˜¸ Ê ýk"çK³™C„Ë©Ú?#ÅºÌ û¸šTcwðçúÖ5ÕÌ×ѬspsÁ?–:WN ^^õùNª4ª-v(]ùͲ¼áê*œÒ0«²[ªç§ ªo1ãšöác½_b”¬[J‡5}­‰oÒ›öFã¥]Çb–)Uϱ¹éQ-³Ír±(9oÒŽdµdObزŽ_HóÌ€gŸOåXm¤<×1î!`ÉÜAä{cÖº¹ÐGE(]¸¬ä¸Xãæé#bq þ½<6"²§.M®|žiE*ª]Ç´#,dFÞZ$UPÅ ¯q{Æ]çŽÅê·› ¬J¼/P$¬Ü'5©çí&ØÉˆHÆŸi§¦¡x°È| dر³ì§%€<~5RæúÑ7lÛ¹Š¾y¨?µ,v•PÙIÃ;O|gÖ·ÃÒö{”·Ô»©;Ù±ò®ž#µÍmÀîŸJ†æI­­»xÒmÅÛw>àY¹Èî>¦¡‹VÓâtuº‰„jP$±,€‚1È"¦]FÒi‘¡»ThŽTE±§÷qŠêæKt>klB$·hc–k»t·¾ì,íAœ`ç'®qŽxª7‘Û\Ä÷Vrî3Ò¦î?ýu©wr5üù®Ã0*Á£ Ž; t5èŸîŸCèj¡ù”ƒô¬bí©¶èÉù­.H›*~doQ]†¬ˆ&Y‡18Ù*{w®4þížÞSòîàÿtúÔ¶wMg>îôa[â(ª°³9ò»‰o7ö¾¯k. ŸU=?*ëüMn/´Hï¢æKS¿>¨zþ\à­$žöO½4`ÉnßÞ×úŠì<©­õ”šuÇÌÈ¥H?ħŠùŒm9AªËxïèvÓw÷{/†ïþ×§FÀüÀ`×ã¹Ñücq%¬ÒB·g>ðçõ¶¼9pº6³w¤]J¨cl¡vÀaØóê1Y¿.¬næ°šÖå%™G&Îp3‘ÏOZçÁÒöxÛ%xÉ|»‘ˆ•éoª(\_]^Z±¸¸–\¡ûîOjñ;¦Ú´m›Ì²î‘úVvž?z¿JúhB0Ò*ÇŠäÞæ…áQüL?J…~XÉ=j[¦ã€&«Êû#Éã¿Ò´I½,t|äþRöà*œu< ™æŽ8r$\cÍbÞ\g.:t_zîÁáœê^KDKú„ñŸ.9\ò? ‰\L üÌÇúÔ¬[§ÌO&·ôÈímFé%݆һIÛÿׯR´ãF.IjÇ©ÕKáMûÃv ¥êv™7ÓNû³màq’g§|úשÙIg{,/ÉC·wfÇÕ×Ez..bD™s#„n2IÀ®ÚçáWˆ%ê–RqürüÅx’I;´tèÑáÀQ¾éý­W`U±ÜWGâ-m'[šÊH•eW*Q9ޏªÚ®i¼/e,ÒH¨¾p’2£v2vûþ½8ë¨ôZóËçX«÷TI©ʤˆz0ÏãPÕB6É ]ó¢öÏ5%ÔþlØåUxäò÷0ûØÀ©-ÕUÒK…@O%G\u›Ž·b[?ƒ´û9µ(®õHe–Æ&¢N ¾ÙÏÿÕ]µö±cs©\ÜZéQCæ+ïL” HÂŽ›xàqÀ®KOÖmîfK[4xÀS°àô5½ö[±:´¿"î,ø;Š‚GàI…`å=Yqen>ÑÒùÓŸ)Äžk m!1ŽqœWO©x×RŸKšÂY!Ën‰¸FîÚ œ0=«-üÈŠhÛ CŽÃÐg¿•E+C¦»·WQ¤ò*=¬¯kì¿¢ëóh–VÏl#{ÈÌÛžH8Qzžàñšàõ{6Žc7d%¸Ç5ÞxnÂÏÄÒÏÕìl™n8ÞqÚ´åð:\û¯g¨Ÿ?쎑FÜ1É<÷^¿Sö‹VЧ6šµÒéü³o'dxõpjˆt™´Ë±#BËo37”ØàpÀ} &Ÿuû˜åæ·`¤°NAüGâ)OÞÏkÒ“Lí<0X¤ÞpIcéYösÇif÷¶Ø×æ'×éU-ïÓMƒSù°$GT÷Ü8Çç\ž¡ª=ͤVã*‚Ï_­rРÝI>ç•‹¦¥îßTA«j2jrHI ÎX/¦j‰8¦ç'4‘ï^Û}h%,B’k³ðºÞèRBß)rÈȬ üªFÁïïX:X·µ‘'¾uÃG´ýÒdºïí½>MÉö“–û§+–´ä½Ô…+êP\j4·#Ì’`Häàcé\uΟ=´Î’ÆÃi#v8üëÙ¼>žþõºÕÅãÈÅáwXÕâÜàÀç“´Ó9®OÇ6zgÚ’m ¯%µ1;KÕVÏDZ©ÍÅÙ²áIÙjp6iºæ<÷a])˜BSÑA5ÏB ɼ ÈúÖ–¡06Xýa•tÊ\ÒHÝSqÌãpò;;Kš™ðOʾ´ÈQg‰¥žBÊ1Ó5ÛlŒeMÚì׳š!t®ÓÁ’«\]mì‹üëÎmó]ßÉxÄmQœ{ô¯5‹”%—‡ÒI³»•˜Ä¡$·åSDì¸çžæ©G9ú{Uˆç9ä×›†Ã{(ûÛ“¬ä¬¶4áæµmär+Þ`qÀü«V)P(âº%$•Ù‚W-´«´õ¬bå‘8Ûnüå»ãÚ¬^Þˆå©ã5‡©^‡¹Eþê×$±îÐ=L9)LÂÖ#HäŒNÚÆ›aV1W5›íׄ`ªdÉ;N¥@ ;û×fâÏS›¦Ò9ÄE0ÄTÿ:ç¼Ì•Öë–ìÚ\Ž9•cíÎ?­rg¥{ôç ;\ù¿Z±>½ BÅ–O6C“Ò¹ûiä[s ´œž9§4 9•šdGT,¡Øä ñמ•Õ*tR»0§­Ê*þÖûR·‚áþÏ Êªò1áT‘’qí^‹¬x¦ÓNÓšÏBÕnlî,¦’¡[ñ¼%ˆÜ®¶}ëËô?ÜëV·²Û›’Cj#¡ù³|½¶÷=+ÚÐÎ-^ç5<kq$crt>ãÚ¡>•»}§Ïq"Ʀ dݲ'…€YqžN+âÞk{‰ ™ Ku=AS^gBš’#íEoJ(*ç»Üj€ŒB¥½ÏJÏ’âG%‰=‡j€Îƒ½=pÕâS¡l²QQF}ª@6ŒžÔ*Œg5²`c5°K'j\¨-Mb§½4°éž2¯aw)åŽ#Þ¢óQ:ã4°H×3ˆ¡‰žF<3RÚJì—$·%PMLƒË}Ê1Æ3ZØ—¦æ’&|r@V[;˜ÁÌDöNk¬S–‰™º°{2ņ¹ýcO76ãÉQç+a{f¶g „îB+ßY†öôCµ“2ɯc.äTæšÎîåŒYt=A\'xìêES›N½€üо=@¯A1ª@ÝùÖˆ/®m‘VåŒv™[¥a ò“µ£>ÖÚÖßO†K‹x§’Rr¬Ì¬½@ä{ÕI-mË3ˆ‚Ž¡Cœ ©&©u#n”¬w¼UWžgrÂsþé8èÁÂÚ’Ó,^ÃH®¹^q€OõªR0d‘qØÍË<ÊVàôÅWÇÏZmÄi4ZŠè«.q¼‡šÖ‹ÄWD•eÇ:œñ¬À)÷æ†0L·#ÜóYÊ–ÇRž!´»¶xoál°ûÈ;ö>ƪJ²Z8Žàb¡”ŸâSÐÖ)LFvrq·úÕ©5糊Ú]Œ±£ó(ôÏ¥c:vF”åbùHß煮úŠÍ»ˆE.ÑÓ_ð«AL¶¥ó”Še”dYS‚3ó ÎíÝÍ^ö'Ò5·•Sy\£t×]¤Öº„:µ¸Û–ÄÑŽÇ¿àz×q•3o­^³Õe‰|¦Ã)9î+FU\Ë©¥9µ¡éž7¶Kí6Ï^µ!¶¸î§îŸé\ÅÖ.´s å“ ùõªm Å Æ“{ šÚá ¨ ¹ÿëóU4¼â{YOL¡È׌èÁÒžËgä:øyÖ’œoK}ö€f¡±9>€ 4ŸÝ«#à⦳EŽO&».`²úïì…ÁÌá}ÀüÉþuNí÷?ð«ÁD®Í’2Oóªw6M:±IBîõu`çN5¦ö˱Ê`HíqtýÐp?Æ™)2ϱ3µx­¥Ñ |‰:Ãælrµgê(šZ¬(û§aœ÷G¯Ôþ•ì,e³"¦µ5Í%¡7ÙΠ¢ÈFwä1sÞ» Äz\ZP³™’9"D.†÷ ßœðFGËŽq^u¿´á/½pVœªJ÷±*±ê§\°”e!Ò·WtÎp{WEkñãHIÓQß“#*\8.TQÐãw#ÐW„¬¤'Zžgc; p;{ æp›Ö‡]¤š÷‰çÔ.nV¤c,…“*A“Ó®¡êòÎövÑñ†¸sŒäãòãð¯2bê9gÚˆîe‹;$eú)¸JÞë£ñ.€–¯ö«EX휱˜ü‡êz×0 ïÉÅYmBâD1Kq#FÝC1#5[rÿyj©ÆIY–£¹¥§èzŠù‘4A1’K޾˜ìjäžÕT*Œ«Ð,€ùÕ];_¹Óa0Â#hÉÜAëR/Ķ£þÿãYMÖOB(®‰«Û¶å†@@ê¸þ•gNÒµ¿%‚@•-"¼Œ“Zqx’Â`7;Ä}­hÄÿk@b‘eLç ŠÏÛÔOÞ@‘Ê\éiwÓÂÍ*4R²’¤•$ÖwMÔ´­DG~Ê.$‰&0*Ër=«¥ŸOÓ¼ær7ÈIó7ò¼çŽzÿcj°é·R‡]IceE@¤dp1Ú´X½FÕŒ’Tèä~5§eâ-GO²žÖÖqÌÊìè0à®G ÔpNqÖ³ç‚ÇÉ žÁXJ¤ÒzÝ;¡rê/-¤vï’vÒyÀ'?‡5sKjÛ€;d^ÿÄ¿çùU)= \´¼TزÀ³"6í­ü¾•2…–ÇM*²OVK%Ì·´‡'+×S³¡•ÅLJÓ<ó Ã/n8úóXº¼úuÅÊgY½²ƒÉ¼–îj)IóYÆÃ«û×33Šê´Û? 1svãRgËœá#_îSêk•~Ò1âº%e£9[Ôë.4­ZÊÖÚ€i@CH0MM¥{3°¸*¸ÏÓ­qfgþñüéâv$o%”v$ÑMnË„Ü]Ó.œqži™8ó€¤òi ƒŽzŠ)j™ê$¤‰ž4Hxäâ¡~cZ°›2 `â´ô}!.Ü=ÆD9ÈÞÿëWE*¶‹rf8ˆ«hÑdÔ̘íÇVîÞ½ÒíáH`@‘¯@*„1ˆÑQBª¨À€*ìdŠä«SžW9£Xw5f2Çßð¬kZÛN\Ï6¨ŒrÇð®vÿÄ÷wÁ¢‹÷t!OÌßSP©I«ôšZ…߈!´™m­‚Ü]¹ ~ê“ê ®&eP r@¯6ð•¿Ÿ« Ü|.ïøàWoqp òxáæS½EJ'f7ÕŒšäËpïž ãéXsÝožI‰ùsÇÐU›‰¼»f üÇå2™b)¼(þ† ¶ûü°É0†/."¾^q’ü3UI+ɱ‰Éçš–4V<þÙ'†4éÓÍ•HÈÛ&@¤‡KÐ4»±. ó\Û„fò¢”+3 m]Ø8É>JÄFR°Ñ›¢h®¨1chó)p‹‚Xô$dû ݇ÀÞ žavQ¼Üþínb-Ç^7gŽþ•ÞøW_ðôêÖú?²¤bYA9,Ûs–Ýߦ0;TúU¦…¡ø„êöö—&ä™C†Ûóä÷­Œ[-6xýݤÖw2ÚÜDVDm®:Ó­d\Ú4m¾5mzt¯HñÄ qö=^ k”¶›}¸šâPÆfŒã u9ô¬«++khaºšñV  £.qõ9JÁIÁ³ŠŠfs†"º { íêõÈŠaüTñ›icun–›ÊÉ Ê\·=‡¦:RiÖ­,2"LÈù†3š¹ZJç¡„©+ØÞŒyz„ƒ³áÇãRCò+7¦j¼vWlù{¼H£F8i4é ÞÏÏ`«åX;Äy»c ÜñJxúÔÓΗ)çûBãÜáiÐiïÄO=ܲD­¹ÑPd¯p=ñÞ’³ 9F7h†Fhíî2­RŒNÎ þ]phß¡£¦ÔT»œ|Ú„Ï”í½Lõ_dŒ›×s޼þU¥«éXÝ,p´‘² èr8 ÕÊ£2È»X½óN)=ŒÚ±]Õ—©Ï¸¦âº‹?Ïyá ïG,bÚÒhâd?y‹ÞÃ"²!°iõ\ª47H\ôÍ]ú ÏÚE^Ó,¦»•ÌxÛî|ÿw¿ä9ü+©¦ŸxƒS]°½¤Í ÂÛ„’ û¹úŸÊ¨éz]¢iwwSê¿g”§— ŒZRÇÈãn3“øVRžš£fdÍbByïu,Ás•çg—ekCT‘£ºX¡Â, bWN žO¿5V8XBX"»ñ‘žÃò«‚Ðr“)æŒV…í¼+u²Ü0Œª‘¼äçóõÍ,š\Ѭnó4~bª‚H#ŸÊªO—FeËs;G®ýŠM…ö6ÐpN8Ò¢š%Üž´)&¥|QS¬iå°Á.HÛôïLhðØéïEÆ‘rÞ–%Ú¹8­K{$k E-°òW†‹§$w«YHÐF ¨~äwǵuÚY·¹O207…*ÀŽÄrµrU“Zô=Œ4Si3“–Ù­dà †RGQëZ6¤ð {¸¥Õôã§ÎžQ“ìò( 8ÈVÓ(›=jT¹–†•)Å;I„Zý¦ÍÒ Ó5JëÄÓH Ú¯’Ÿß<±ÿ Â’Pñ®;õ¨¤`.p[ùW] )®i…?tœLÎÍ,ŒYØä’rjÄ| ¤¹wP íêâ°…Ô° ƒ’µx™YY0ÕÜô?Zý‹JBˉ&;ÛéØUë·%”VŸŒl\ž7·=8ù—ükV=fÊä~êêöÜèkãê´j¹Î'¯F¤"•˜ÙV9€ ž:qUZÍGÝ”þ"®;Â݇>†š"WîÊ+jsrvIkÊ·(5”…°²+Ð`Ö•šièe‘ƒNGQÑ·½"Í °%3ŸïÍr$ñIì¶ŒÿËFíô¯B•)7©Í_9ÆËbgÄ &¢Ï™6ªG~œv¤×u[m5áK;HžiôØ’àÉì9ä²úcŸ^ÕËI|X™6.òzc޹¦Þj×7³G,ÁwÆ¡™¯V8ÅZÇŽÛ½Ëw×>‘o:!YÌr¸^qýj;ýBYíPÀ¦8ã!2¨9çNsúU(/&[sf_Ò8gsǽiêÒY¢Á‰m¿gW• m / ðsž1éÉ¡E&Tß>¦®“$ðßÌÑDn¢¸Hã˜ïóUYXü¤vî;Ö 2'›$^`e‘>uÏ g'=H¢Âòëì3X Ú;¬² £¨àzãšé|Si³é7Zx‘RH·> °ÜN3èI<Ó’}‚.ÛnsºdR]ÝXAt¾e°×8Ç98#Þµ†íþY:}±?´æ·—eªöO›ó»¿ð^¢3øVU#RNñv3f”¾ƒþY¼£ñ²µ- ØB²eØÇ `~F¥ ŸÊÅpN[$=:㊂çV’îD@`ÝùÅ8Fªz°² óÃ6/CÌ#O-c”nØ3žéßó¢¢½qqxòlò²É’pqïEt«X~÷CФ›²Ô9gn,z]¯„ìaù®¦’vþèùüjãéz~6A€ŒÇýkæ%˜Ò½‘ö ¼o©ÄŦ\IËÿk¯åZö1[°`78ä3 þ•©s¦]FKDVUôʲå–H›k£!ôaŠÖ5ãQhΘNcQu)€ýàž/ã¼Jýk®›š…®÷©–2I N¬§ñ¨l\ûÎzæ¢K+mF#ÔçSõO3®ÆÃ<—"‹–?¦µ,Ñ-P¢ár[¹>µŸ§…†ÍˆÎ\òÇ©ÅJ÷+fž¿ÈW=H¶ùËQ¨E·¹ÊøÚÿ|©nl‘\K°Íiê“Kw¨I#ƒ¹ÏÓÚ³^6_¼1õ¯¢ÂÑöTÔOžÄUö“¹ 4™§•È<çÒ›ƒ]v±ÊÐdÑš\Rcž)…$u™”˜É§ˆŸa}­´Ž(mLnà;SÒVFÈÅGj™âeÚ»T±]ÜqéE®¥Äˆ0®ÀÀõ«–·í´oR#>eîj¡–Mñ²áäc¥!bC‚c;-ëNV|²G#pŽ?jÞ­¨XÚ X–#0uÎP0<çôë\[Dð*dƒ½sÇj\dÑ–%·w={ÖN…åvÇcµÓ„šÃÛYÏ}v4í.Öe@_o;’Tt­¹ìŽ;Y¼p³Û±Œ° î õÎ+Ï û]“¨{g È %OCô®Æ×Ï+1¸¸ûTÅ÷4¡‹d9玕•dù-SNÚ™~&ŽK›‹1³¸F@ˆ ÎxRÓa’)]ra‚õ®ªO³@b·X ²]~÷Í.CGŒ ôªËáá'ŸF{®Ùßêvrùö®ðÆc8•&˜góÒ¹Ú×S×þÓ‚‹Ijj_é×lâ •Påw|­ž?Ȭñ籚X"™Œ 1drÆ;¦M¨\^ÈÒ]Ïw3ÉrIÀ÷ô­-S–Ý/"°‘aó£*w¶Ýý€\ñžNIíšQÙ†#0öÔù"µ(¥ŒÚ̦ò5º»¼Yd0F žÙ tÆG>õ`’ùãk¨-°ãi¹bªç#åÈ“×Ò¤Ò&×4=Ḵ¹Š ¡ ¬ªÀŽ@Û×·>Õ™3¼ú‚ÆþXÔ¿?.ࣞO•É]¤µh³x’A{\Œr=O5]ô7Ó¼? —ñ=Ô³:O•‰ AçíÒ®[YCsOöà“(pñ*’ß*ä=OÕTõ;bIìŽËÂúÆi¢øŽÛY±ûUÇÙÚka¿"0FQü7$޼W!j×Ú…¤$o&,ᇠy ôþu³{¡Ý¥” dé³´¶Àá‰@äpHÌS~ɪéöi0Iò…XXûÉ?_Ö¦sæm-Í)EÆJrZ"–¡mÓõ-=ôx#Ô<Õ•n$,'` œƒÎzÖzaþÏ• ‡ÎGßå‡éÁÇ~õÑÌ r\ͨ™$šP‚Mƒw={}*¤RY=í´e¬ÉöǵÂä’®j©K•Ú]ƒ8ÍÞš±.¯ámfêÂ?J­4P.db¨\†#ƒÛê>µ$7k§YÍ{ ŠóÎoš8ñòq–`1Àè¯Bñwö<T¶ú*Gå8¶u2NueËs‚qÒ¸ ô›ñ§[,§ŠÍSd2ï*¸–$0y¥UK&–ì)·¹>»þ×gƒN‡J[UYêy–i`r)êÀò+‹ºÒ­n-ïÜMæÍDê «r¸>ý+{@¿¹°Ô…Л1À²¬k1 »p!†;ÿúªÇŸbžžÚ;‰wl1€ªCuÍDeN2rkR%Íe®‡1á›Éí厱·¸ˆÌáÌðúãŒýEk뺨ø†ÉtæþBPùq È I< óŸB*†¼)wâFâ;ˆ 1¶<ÉØ…'œ Ôâ–îÒk°´¹™–ÕY§ýÛ Ãwûæ¦qNjQfŠO‘«otÙt}@ÙÞl-Ë„pÜ}Aô­Å´†Öå&³ÖÎâ È®Á¼ÐúƲomÄöòLΫµ·í0òã·ÌqZ:›ô»¨ãŒ†‘£L0ä®yÆ;ô­RN›MŠ5Ú©ö:iíd“Ù^Û}žIcE÷ñŒ¡×·é\U¼s]L¤ aX˜3ì%Tíãèsü«¾øy±âO6Þ!,vÖÐÄ’×åÎyç¹®BؾŸÆ–íûÂUÛ<#3Éäÿ“\ðŒÕκ˜é6œã©Î+ÙÀǦjÒÏnSkÇÏb:ŠÛ·µÎ"†Ú7l÷À99è*H¥·b?s P U¬D¡²9gYKVŽy¥rq ±÷#šè¯ê>Ò£²¶d6rH·ÅpYˆ9Ï^ØÇJ²2pV?lRî³]ãc¹3ÈÍ.r;dvÁ¨ž'ÚYÉlgkØç!Ófõ·6è?Þ,JÑ·ÓlU–iföUÚõ«áä<ž*E¹f?.Ò;âJÊue.€¤‘jÞæ Eŵ›¯û[Oâjþ™§^jÚêÍq$îf±µ@'ÓpXp£Ú£ƒ¥Û©é^Œ%5NóÜíÒ0¼·/,€"ÄÆj´"÷ÄÚM‰?¸{È£”‚A8Å5¥'÷Qó+ ŸöE.Ñ ÉB62ÀŽsŸ­^Fç’¡ŽjÒS‹¶¦T&¢ÕÏ'Ùõ¥i]¢òð¼»~oεî´-BÊUYm\9PØëŒôϽgÉ#md ƒÎF k‰ìÌ$—R¦'=i뺒¨ÄàfœW¥Oku=¤›á•ÿ²i¹>‚±4„ìNíSéð5ÅÒ(BÊHÿÕ]qnU–öœ•Æï$ð5.o5ݽǑå+ìeSµÊŽxì9ÅLj´ï$4›Ñ:š´1¥½ÉòBùØé– Œ¯8É vïW•`‘5b˜…RSï È©,VßRÕæ¹ —l"E'Ì*\®nö ?AI)UгTI‘AyŸ£›œuÁ*Ên¾¶*R’Ñ¡ÞRÛÙ\#Lê ƒ½x+ŽEs–—Ú„v27”îûUðp¤õ5ØxP’×P‚óT‚'³]ä’¹¯û'¨íø×m£?„õÈ5[Í7O¸·—̺uQ °Îç¾3Žj)©¸¹7vI4™äÑÝÊ—S@Ó1 UqÜ àm†+rK»d[W1—~Ì «ÇÔ?kk~ñž‘¯§ÙV4Û8Ulʱ.zqŽœ‘\œ3êZ–­ Öò­ÆÅU‰T†#Ïã×ñ­]%QGØ´•ÎûÀ§L_–KØaUX÷Eö•bTàªô#ÜôíÖ°|Ow£âÃ=‹¥‹ý¤¢´hÁÜÅ{äAëšzê:ãÜ[]º5Ê4J—C8Œgh zã§zźÔjÏh Þ®~sžy=«šmÁòG¡KOxÐï:$·&y‚ãÍ ³aÚ¹½aä}PªeÚHÂ(úœ`V÷‘B‹#Æ3‘³çF›¡ÜßêŒêXÑdJrª¤X{…gE®~fO4¤G¦Ãuekä]¡I‰çVøÁÃô55óÇ-ôáÖA"¶ÖãǃҨùaNSq?P+*œ®m¡sYY“ù ‡\ö$b›5È@ÌîW’KUcò—'®IÕ{˜ÀòV&ÆÃt?ˆ¥s;!sëbêܤñ–W8p0Gá\×›xuK›¨Ý"qMÓ¯ŠèÄšp6¦é$;Ÿl‹Îû=A<Ö²KŽ]vâDùíÙÎÌ® Ó_jè„}›mŽ~îÅ׺voÝ^Á×îÈ¥Iúf» ?ˆ·Ú>‹ca¦ØÃöëUÅIJÊÊÎHîk”ŸJŠÖcm{„ki|¶ˆ#pÆG½V±¸/gù¾|“œãÞ‹›fû4©·˜Êp3ßJÉ’D• R:ÇÂî §±¡[‘£ÊEÙ^ÞhÚØÈ¬›ÕÚßnø?>}F1øÔ[ZÉ—F0„ާ=sïéU¤Ru%”8L c?Ò£è÷ï´‹â£8àvük®—³KWЊŽnܧi«^XjÞ‡O6ù ¦"»ǽr6ÖÏ,vRÍ3º6q’»®jbéK¶ëæ•=߯Qiur‰ôvfa¸wnO¥E)Â] 'Q¶š:I,®4K}7RYPI {9P±!\¼Wèx>¸­lÎ|-m²hÐ%ÀXò¸ ¹Éü2ƒó®bïU7Ò]O xçê*+íjæãì(å 6³y¥¸ç‚}j©:wmno¸äúVŒµ%í´ÿc´œ2 ÚÈÄŒ‚y'õª¥9)©ô2vq±FÖíÞêKYNÙCg$çw¯59mîè%8 sŠªË4W?ju«–f$ £ü*µŽ±-äÂ%¶K–>`_œŽ¸'=)Õý䜑|ÜËW±Üx+Ä–>½)}æ"K¸³…ÞuHüÿ:å.ü¹5kŸ³•hšâCÑŒ.ãÒ™q »ª†Á‡Lrô©$QrÞqŽ~þ]ºUü?úõ\ÉÁyVú"M§IÀgòôL1Ç·¿ª´…QP‰ ´`äœã¯5Ô[ÙÛ/‚®<À"¸û ºeÀp$#õ#=+—aA "yrì?EjqMX¨Ý«“Í¢_Ûi×ÚqŽ(äT "üíã©éÖªÜi0E 7±Dc1òÚVys’¼t¨ÍzGŠ5[y>éÖ"ý©ü²ª¤ŠáõY49Ãίeæ"\Æë‚dÁ+€}ê+_a+ŽRW²G#«Â-f‚X$P¤l|àŽ í|-¢é±è‰©]<ÿiȸ“h^xý~µÊÏ6•;Æ F¼å˜¶¨cš9L¶ŽæE %»,Ç÷dŸ—ØŽØ>´¨½,ЧÕÓ³,뺋Êîc[˜Ë3HÍ&w3±çžâ¹Ðó»1k¶ Ž1ükrÃN¶²Ö£M`Ç4Qó, .ÖoAº¶ïìô;qo4Ztr€n—M†~îÍŒŒ`¦µ¼V…JR›»g|ã5‹çß¾i±ÈÌŠÏ»#œñï]| ¾¿….íŒQA(܈òTz*Ûxa´->[½B8ofr º ã,ÌF=M?iyYÎéÑË*àùÀã9a€sÇ<稥í´ìm”50¬µBogR¸¸ey’I¦WêF6–ÇaU5fµ–æãQ…&ŠK‰Ý”'„'×®žkRÓÆvÐx UÐÕ„÷"?*e `Y[¿n d& —ú\=Ë[ÇÝ$7ï©ç ÞÆºa6ŒÜ¢“¹äÃiFâ m5è>“Ãéïö•½¾$ ™&âEŽg¡'Žk‰Ð­£¸•£$ä‚0zëáŽêÚÕIínÖÚé•°’£®ô“æ?)ÀaéÀ§§7)¬©ÍSö½;T1Á}"YÌÒ@®Á$n\ðqô¢½KâW‡|=i¡h‘舷çwšÃ9@9/Ï]Ç­6ŠÑ‡¶›ÖçmsötaJ$vË;äz{V¼É"î™Âç Zœ|>ñQaÑ®QËQÀõÆsPæŒìV €OþÅ¥g ÎÌ)$ÕFNâÚÞ&‘—!InkŽ»Öoo&'ÍxãåD;@Ô˯k*´aË!ÀÏCÁÚZ¾±ä]ÆÿgYœŒ8íÍsa£§)šW¯íd¡MøX½‚I<ß6kP3'V)ïZwº±º_.-ËS»©®RÐ4«=>â;{o Ê£Ìääç æ¹/컌ó2þé4¥3—=µ*XáÿˆîE¸™áPÜj+ ’söôpè峾ᛞƒŠ«¢«¬IÇnÉ-’O¥kJœÒdV̶i®[[á)>s—‘°I?OJÝI7 uÊFCJä-´Û‹Éã¶Dibã€1Ô“é]Ž—5€h®+,g^IúÖ¸šT¡ð½O6NR÷Ù}œ¸(QpF1Ï5]ì·IJǎ›\ÿ#SÏyJS Ÿ75È´"ì-K[ØIgæ;+0ýþdÛúu¨££…cK‰7¬L…‰êÄõÇÒ›;EfŸbp3ïUàÔ­®]Q‰ˆãó‡?Ò´9É9$Rªû›z}ûÚ^Ý\K!)pR?—‘Œ{zÕrTrYr=ê# r:O&1ü,sèk7f'6ôc̨[*YH#<àŽâ þÔ3k"ÝÜE´giÎLŸÌÔë¹'w™óTvÚdÛQKàòŒqœg?¥o‡åçI‚víp܃,YØXà‘Œ\TR"Lv²£g e¯ÞØÅow$.)•tª†TR¼³/·½L’çj ““+Üé!öÍmœv\*ΗÃv2sIÐä~µ~k¹æ ­!u##éÇÒµCdª u#ùS“>¥T¤àÎTøZ<·-žß»Ï5¯áý2-:W D“2÷xëžõª‚{g*Žæ[÷)…HÎÆÝ’xÉãÒº0¸‡í–Æø:Š•e9jí ÆÓRÖ„™™J²¤ª™Là­œ~F°¼R©¢kZ¥„S<±Û¹HŸ‚q´wÁð¤ºÕõ_B·v7+muò«PÇgŒƒíPE·8’hDÒ\Ò9”–rÝOךuçK™w.ª«U¸«ýô–¨x ¸‡ŒÐ×SiªF4V·ŽÑ-\Bª¿ÝcÎX÷äUf±±ŽòæÆÞAsckrâle»g8t¨¼A,·6ÑÌ8ã…U QÆ2ƒßO=éʪS¼NÈeµ%AÔkK™âÁÃÓm$R%Ýå°… ƒíÓþuÁ'Ä ŸøLaמÆÜ ¶ˆmpî¾õ™ã[ؤ“L‚v[YF=‰ÉþX®owÌ=ëu5Us4y2N›²g´éž.ìuK›-8]Ay0‚;Ln‘òÜãÓæ÷â°$Ñu+KY¤‰tù˜Ç¾e·HŠ;zŽ?@kŽÐ¤¹Ï$M ޲HQ±´òüÎ3ï[rizªZ^ÝIª‘mHXt`<óœƒ\ÕÒNÇ©‚£ Þ[ŽŽU‘A€GÚºmU’ÖÞñí!‚=Jì{ߘ¸ÉêqœÈôÅÛ^¥H¹gr‘Øäö«sÌaÕͺØ-°›HÈ9l±<äqÓMeM8ÞÇ=j ­‰|@Þ^§§u~×ww'lÛ—oÌ8Î>˜ €@ýÚZ^"Ó´Ëß Ë¬F] SbÍ™þògiR=z·¨úTœpÏ¥èÚ­¢l[ëA梱®üMiWÕ%Qîsb#É;ÎÅ yIÏ|VCIæßÜ:…b…éÀÁýjÔÓ¥º™'”ƪ9,úÕ‘m}÷2J$Cô—µ¦]Þ6s¶hü§äqÃqRê-¸¶˜L¶ÉÜ[V'ª…+qßëUüØvò¨pÕ‹7­Ó@’(–RU²pê+ÑÅSŒ’ºìt°xªçÄ7rÜjNy€^BÞÇÐb©jê]\XE#¼Ö¶oüBÙe\ôúûÕ õÒj)-ýÙ¸šd(«»Ìœ gµubšŠKa½QCPŠ;›È'’@ò4¡]†9àc§ÐV–ÐT.ðHþ÷jÌK)#bD2¸…Ï‹åÄüv)“Šâ”œ’W#©¦#«šCP0ßʳY—÷ÙcÊ4w*.IÂ÷Ê‘­gÈÆ;R¾ŸL(#p<Äul¨?)ãúÖ¦‹{-߇n¬$Þ‰n¢XJÇ•-¸¬¾Ø®oR™ç·®Ö ¸'ºxï.ôïÅ ÛOezÞd°Æw®8'¯oÒ»©ÁJ‹AÍc'TŠ[› ˜U¾æ2gwzÅÐã]fÕ ù†@­û7%ÝÓF@n9¬í6ÊòÊñ¥’0&>÷½:Ô£FRNèÎ^{ébøþÐÎCBÕ7Ÿs€|µàtÍ>ß7¶Áãmù; `àž¹•ÅÛµŽÜ3§Î”öfÆ‘§Ë%ÜÞ¹QB>ö3Àà`ÿ:ìµ_Øx—O…¬¤[}J%@žd‡ËhˆáqÛê+Š;»=^Ú;­Ð³ÊP†ÉÏðÀ?…wws=æ‹a&‰Wz’̱ª2åJ‘†ÎHÆëžÂ»i%kIjo‹8Ë÷OCÏuÛ-íÓK¸pnìäè„á ©S†î:Q«]i÷:Dºh¸IÍлy áâ`¸Ú ìrsT/¯. õÌ—@½Á•¼ÆÜ[<óÞ²nµXb‘ch³!ç ŽŸZåJ\Ö‰Èê7¹VûMµ´·2­ÄŽKªH Ó†‡ks SÁs(VR$*˜PàýÜu郓QêWñ-ñD»÷®¨ã5¡ 4Ô®c•®$g’$9+î~µÑsöm·© ­Šƒ@ØNËér;íUë¾°½Žâ[‘v©–#w.Ïîàö­ëï -ž‹ý©orÒÆá]ádù£Ü:äuÌ´ñ±Â¼ƒÕ5DírªBPve¡¬ßÛN¶O¨\DŽI…#—`QžœvëSÃ{©[Ü­ÊÝ\Í*«ó§Þ#œXZÞ4w—³H“§ÈqŽG¡ïVRîìE©F,ÃŽ•RRI4Äßs[öQŽâF¢À›UPY‡®z çšäï'j”Uv‘ÓœŸñ®ÓÃVÎ7`Þd· µ±Œ.•±ðøèÒE¬ nIcQåä¡-÷”ãå5Ý+SJDBno”àìl¼ËmòÆüž8¨5]8íŽH¾ÖÏ¿JÛ×õ˜×X½CraY˜DdR Pp2;VXÕ–yɪվ˜?Jásœ§ÌËi'k–gðƒiöo}-ì3¤ ¡âˆ0lž@9W'u–·‰¯^ñ0t‹ëçý| àALŠò_³¿˜Ì£å W?¯ò®š“º’GEá{9¥_Ý@Ò3°  ϵoëaŽ…΃/Û̵‘°„ï`ã=²k_À“Å¡øz+Û´º¸Hm|ç¯ÐIü+—ñA{WZ±µÖØÝ°³•àóøóNTœZ©s©ã½¥amÎÜ\Ÿ³Ä<©åÜ™Žùõ4S¬vx’oEaŸÆŠ•Ît² ¬ެ6ƒ1_;jQ4zÚu 3ŒúòkkUÕnæû`7“0‰þ°œ€>µÌÜÈ@P Éä×<¦±3QJÁR—³v¸×” À95sO×®ôÏ–0rQ†ü«!›®i2O¦+º8jIZ„åx³JMMî¥fšFŽvö †å[#Ú³~µ=£'ŽjæÄ`ãÊåsrwe½‡ûÊÅÕË â\€Qw§M^º¿òÙ’0 ¼OAYs'Ú¤LÌì:sÇå\T¡$ù‚2IÑ5[­6íî'°ó‹¥Éä¥t…„îe.„Éó}sX` ˜©ašH[än?ºyu)ój·ªÚ³6Ld¹O\ç†&ÁÇ–ØôlÕhnüá´€¯ºiÎÞVvÏ–ìy1¹_ƹœZvdÜ¡â+¾ǘxü+*@DcÓ95¹&š“I®f‘Á*\>¿Öµ, Ò,l¯¶k«©\-¼—bûœ‚þøâ½,6&è¸=Ì'MÊi”ñt±©A ä ©~F”Or¿~Ì;£ƒúU£:Œ•ðÆœ÷p}My­Ýìo¡VKÕRK£!ø‘«KC¸Yu8²°äî=ª“K'r‡>´Ôa âEeð~eëïZRjRh‰;“êú½¸ÕîfhÙ[©ÇVmÔÐß”e¹†8•X™[8rÏJ¶Z7êàúäTÚÊSµ¢…÷œO™sóX¨Ï•ÝiÖ“ê÷2„*–än)'̧áR}w0K«…`xÃdb¦·Xí ­¸ò÷®<ŠÇÞ…)ÍÉÝR§;¹LÚL[þ>ËsÉ+ŒV–ŽË >×+¥¹Ñ™Fò2„®)„)æÏ=©¸ÝÅEû“4î‡êñC­K+ÚD!C‰ygT G2rA§A"ißh_–é"NÌb*zÇ=³ÅBLc©<õâ«jr‘y ƒk*ùÃU)_Ý{Ì۸șw¹8m¹ãPë-(±1F›¼Ò#¦ ïRXÙÜZÛ,OíŒ+Ó&µÝš ü»†p}kGNQ÷­¡õ[¥õ&”•ìaêö 5˜vfY"QÏ]Ý8¬ëh!Þ“w†5·«ÉB¶ûIi•€Çl óXŬ3Îvž=³]ø8>cãª6Ý&lômY6iïV"`Ä{“€)éö©¡û ¸ŒFOš‘”ä€:íçùRiïÙWtȬNHÏ"ºK‰–=Êô_ ¯n9Cþ ¤§ÌôGE,]J)(õ9«ÈF‡¨Z\_Ý8&7ä*ã¹ÿõVF·wi%ÜmË;J >Ó§ ýk_Çí5;•p±·Ù‚2‰;n'8öâ¸?âÅWÕãܵ‰•DÛÝš‡P•¤O#<+ÀPpõÖº½&k¦ðÅ­º(I4jß(@͵†{ò þ5ÀHåd €0p+oÃw“D—’´nð¤|œ+õQøâ«ù©¸#&µ»5õ @¬©ksd{© ÿº=½kâ{‰¼Ô„B}#8•Á¸Žyf#‘‘Ÿ|„€X à{œ`S }è§×š(ÁAYn"kH ‚t’TiTU›5ª—z|zÍ­ÒBQP ø^ßf/=+jÓÃÐÞO žl‹Äb᳎¸>‡ôéZJZÙ’ícBù í„pÂÊ»=[­VÑ| u“Í’X噣$Ô)Ï>‡"µRÊòÁ   g8ÅuVíoáM&h¾ü¯U™¾Qõ&¼ÕU¶Úv4§ÕÎ^÷ÑÛÁæ-Ä“GºGÆáÙ}†j‘˜®sn€c9λìØ‰2#ôÐ×4+äHÉóá `uW=Gyj&¬ôY^j±Ç5»[Ãl†ä–úÖ½®›Ÿl×w—I0VpØúäb©Gvïz6¥Ð…Àäîé•ÏAíZ ²Lê}J S-®;Œ’4+Ÿ0Ž9«CÃñ¬GÈ¥U‰û”ŸlÕ4ŠM˜£Ÿö—gM•¬õ[{¦HÙcÉ;-ò‘ùsW‡šDؤ®‡évsÚjš=Ü÷mr÷ó»ø~m¼ùֵΫ,Õ’Æi­§ûi $gi]ğ׬Ñ*˜ôÀD–®[w .…W•"{{èN6Ï2É´ 9Ïâ+JÕW´¼Yµ&¹=íÎjºžÔ¼ta•+‚H55Ã_92–ePåß<öëÚºeÓ`º+§9`¬y¬ÝfÎ [Y$]Ò0PKgðúS¥Ró²êf­Ôç®.žY XÚŠpÊ{kVÚö7Óž#ÂeVNA>ã“øÔÚÍå„—ÑDå¹ÀÈ Tò_p#ƒžÆ»*.†±‚Ñž¨xŽYtÛ[i#–Ý„lñ’ dU=7²k…ºÚÃÀÓ*K1“5ÆInxö¬»XŹ>æ <‚8«€$q}ŸÌdFl…lrÁ¸Â6’ÔêÇ;´Ôlg֣ѵÿÜ®œ šÕ x€ÌE0tî3ìk®ƒÍy#º\!‘Ë6$çŽ8«ð;ÛïXÛ`aƒ·#pô8ëJÓ36Jr eR²–ÇŸäXÒ6ÛÅlv÷ÌbÝ—oz4ÃöEÔ ›i ã%°ÙÇÖªùÄ °l‘ÆZiw' ¼Ï ™â%(¨ö.Gtvó\]Ï7Ú]ZG.qÈ5ÚJѶn[§?(ÍLAf ۆь¥!€c,\ƒî3X)1½]ÍíRkÛ9mˆXÄg ýÅÛúõ¬1bUƒä9Þ\ôÁÈÅZ6ìèšàŽÕ °ÊÜ6ïRÍk =¥®æ­Î¦³É¥¬VrGk§cʉ[ œå‰>§kb/ ^x•ÿ´% wr4™êÜ·?Nµ/€ü!&§xo¥‘Þ yU@ÆçÎOækÔm­¢µ±“È(cRœ3ôät¯Fœ’”ÙŸ¡ÉØ|,ÐŘŠc+ËÆ\r}±ÒŠîÑö‚¸çƒÇ¡VžÂ µRHðö¸S«å°’I<ÆrÙŒc›xÍÑä’å§ ÉÈÈǽG?ï¼¶$|­šópÏ–¢lnMî5¾jUSîèjQÅ{ 7p9¥IBr8Q“N‡‰c’8ª7Ž(ÈÞvÔÏá`WyIw'øþoΜ‡ êj äŽ@}:ʃÜó^m„J_ö=}.ü2Ÿ^)RG!»{Ô/÷CÑ©»áÃw¤ªÇç]œŽ3XpÊÄö šÔ…˜ÇÁ÷¬êÇKic;‰(½:zÒ”!³å¨8äP‰@ ´¾o$ä’zs\Öc&'nH'ŽœŒüÀ®i<öÆà8#Ôl CGëBD±X §n é‚y¥ÁãŠjÆ t#Ö“ÊÊã¦y=)ˆ”D¹Ã…÷ Õ{í5¤Œ›;ˆwáqƒùÓ¼°8n8çúÐ#q>ž´îÆŒ‚—­Öd˜gk/N;uª3ͨÙo=›xç#‘íÍtÅ1±Q2¾¤ô¤™b+‰#;HÆqZ)Û ®r±ëWŒÜª±cýÚ•5Ë‘¿Æ9#€­Ó¦éòaŽ6ö>ÔÁ¢X®àªÃ‚,y\ðì;™PøŠá[-忦åÆ?*Ò‡WóYXÇòž¾[‚sô5º (îöÒ)b8W–m äa"8㎠õõ¥û¶W1ÔéÇTŠæ42pÜH¸*I<~_U¹š-|¥Gß“‡lÜ{š]ý´[RÛ É“¹Y²H<~•_Wu¹[vF`FNÕþOzôêU‡Õùè‚å›ÙÚÒq%ƒ‚Q†ðAÀÅPy´ØÔ“æÆÞØõ«wk#DPÆ:c®qUM´†8áw«†Éî1Œ~µÉ‡”c{¢dîjÀÖn‘´— +ÿoê±ÚÜøoIiæ(3ŽÜ×6Œbe«&1÷”«w„shÐØÜ Ä.΄ô;»~50¨¹g®àí¥…·—….´ß-å $n»NX.rX}kÎ%ÓžÞåÑãrö 1ò“Ûž™®‹DÖ“D¿i!Y$Sò4FN?çõ¬-cP¸»¾uŠWû9o0C¼„FéÀéœ3[ó¹(Ùô;&îtúè>߸ŸQ¼!¼öqû¤'ߥbh¶®,˜Ú¤í6üL2<¶^ ã<ç¯ù5‘g2=Ò½Â4ˆ¯ó |ÆyÇÖ»íèõâ0éö¶P@‚ ƒ<(ɉ嘒y5…DáO»7«5'¦ˆÈ¼·ií¤ÙàH;1Ž8äÉ·Œ¢ —âºiï¼ËdU]¥ç¥iøáÔš—šÚ”P•À+å³cõ§†›I¹­v9 ¤zzWC§_móU‰H°xþUÕéÿ ´¿3˺ÕnÃ`ˆ¢~dšÆÖôØ´ÝbêÂÑœÇa êW殥xÆÍ!J £)'/Œ£¡Á®§ûCoƒ"„J¡„ánêH®p»¢ü嶎֢݂»<èkÏR°Ó±Õx¶sw5”èF ¾<©Ï?Î¹ÔÆý¬:dsH(AÏ\õÅ5¨§96j^¬MœÒè:³‰d¶·–X™ú®üÿtV·„-¤¶×–)àt•—*H!ˆóí]‡‡íCYæ66ï 8$sßÛ¥E¦éñßY4ד?@’Aó(ãæŒW©_¥F˪ C…DßC^UÉŽôÖ‡íV70÷thÿ1ÿꪺU{Oª¾£ƒøŒÎà-^8Ý$ÑüÜäóž¼×™ ™é³dþÉÍInÒ:±R¯å(œŒ5 –Ø;<Ü{—滈:lšoŠç`Šè ãÀà“Ã~¹üë“gu BmÛ׊R‹ƒå}:RRw+ÍáÌáyẓQ.žÅŽ.°[æÆæ­DÒH̊ŒqQ? °r£Â•ÈÐ’(§_›Ì‰€$¤þ JóFÒ(O,“’û¹ééM /Ë1Å&&R7)úÕÂnæBvjÄ“(•¢;B•mÛØŽ2*LBJ±'#Š«ÔcöëÍ$|„¯ÖœªJQåb¶·4'¿¼¸TY¯e•Tåoºx~@~œÑ»(“nìäSíÞª|ÄóÓéëJC±Æ©ãŠJR]@°·_gc$s•rƒƒœ{Q-ì’„óne ‘÷Ø?:€y¤Ñ޹ÁÍ0; œuãÛÞŸ3îce” Þ%]¹üè ävÉÃ}ê cse©ã4å_˜mXÛ“Œi60%ÎG¸jPÁFNâriLX1a˜üÛi¾Ró´p{dçëSp°ÿ=·’û+HT¼ÀéùÔ&´¯˜Û› ŸÂš²ŒLÄç?ZcÔ·æ±eÜ„‘œv¥ÚÁƒ¸c8š¥$síù&Ú}wUa-ÔQ¼ä)Ï!õ¦£}‚ýÍ;—ŽÖÕ®&`èrO¥s2Éu­^$QÆXž5çcÈÔu¸ç`·RÄ“ô¹úWwðÿÃâÒ½ºŒ-Ä™U9Uïù׫†Ã(ï¹I¥±¿á­='EŽPX§ÎÎsÖ¼×Ä2éúÕÔ.SÉ“æ‹æÁÚz}+ÔuÝvÏúQy]Zb»bˆ\ÿ‡©¯Ôï/.®MõêÈ Á%\©±éì+¶Q§+A»1á¥:oš×F±Ä¦ކ’î_-¡¸V•À ò¬Ë[²dXãY…U''ÜÖ埅5L·˜" Œ;à)ÏqXΚøV§­WMÑå’Ô-®ÌìÜm#cÜT›F~m¹#3QÎ,ìX‰Žê2#•ŽGzŽõÔ-ן6<ë^MhrËÝ<Âp˜=éàH݃ÎAèj?·CÂtö$T‚êr%Màr3ŠÊÌ.7ÊgB¾aÚG'Å@læ'i?«Šä€Û—•Ï\RäpJ¯QBl4*¥”êFˇ#¸&«ÍÖʬóoîûVˆ(  {qQÖT‘œÿ¬ÊŽøŠÖœµÔ4±í¾›ì‚/.4–s9É HF[928?JL¼ó¼#ûJ5ܯ0RÙ#sp3Þ©hš¦Ÿ¨xn;W– ™Ëš7Û· ôç¶}k;Áz´ÊÛérIh>ãƒÔW¬š{kDﯷÀ–ò¨É1…lQV¯Wz ¨­|ݵ‰åBÌúÕtü§iŸZkÆÚ2sØrkŦýåb¬È¢Œ*iÊÛ›Ú–hdŒ3Æñ²ðU† 5ŸÀ öÐîI·lŠZ§¨FB³‘œ6F]?0²*¼?6ÜãÖ8‹ò]ÌK*ˆŸhœ¯¨5j!´(†)·Ö²E"îU+¸ÂLžõšjàOŸnoCF³‘ÃpiÃÁãò E;Y°òFà|®F­ ¨Tcß=úU°–K·—ä3¸dæ´¾ÌB:VuØ.9G®rFëïMóTpÊ@<óLòÎÒy=©æ"»”¶}+$®>GU^¼Æjc¾]T.@_»Ó4¢ $r3Ÿozl¶ìSsF¬È¤zQd%bK/SÔzJpPÙRzcÿ¯Q¢L¹ÝÝ9jI#”/ÝÏ~{ûÑd;’¬øm»X‚y'¥,¤ëÏ'³ÓŠ„,±  e‡§®)Yßo òòI#9¢ÈW!¹•á‰qÆJ“ÍeÏ«üìUËUþu¬î&Œü»ãî)¯i Qºʺ‘Øp•Tl·y¡mÆ ÍõÀ©ˆóÁ„uà†äU‰4«YaA°þ5›u¡È„´zuh•6;¦­mr„¨hÃ=3Ü{UÏ0`ãaLÒ¸w²¸ŒaqÅ {ˆ¢;¨ ÓšNŒ^Ìgk YFIì9Á mØ€±#Ý¿Jä#Ö/b#©È=óW-õÙ¸°èBò~´:M ÇM¼Œ£ðqŠBHbν{Õ }jÚáš')Ð`žçÚ­ù‹† G²pkrExó7n3P9Úäb£ƒ»óŠy›æcqJó+ Ø#¦Z-`#k8üòûpÀä÷êô¬-U;˜ŠtÙƒøÞi˜I€O“ßÚ³5åRʇòÿëV”ݤÆŽ $œâRß´#±{ˆCÇ0ó·§J š‚¼…În;óÒ½.ï[³°Ñ¥—ŠâXÇ¡ùúf§ŸCZI½N‹Jˆ\C ¬6–!¸<±õ¯0ñ¾¯§Œõ8þs²P¤vû¢»›¿C¤i–—b×Ìk•ù¾Ð¿¥y޽*ëzµÖ©$f ê„áxúT^2ܺ¾îr×-XÒ8äzS“T· ƒ mÇ8ÅeK¦ÀXì)ò?úõ$ºBG+˜ž0ñɵ.9ù™¥äW8ܽª÷™/3ŸóÚ¸ømn"–Xd 8\zzÕÔûM¼³c©ïŸqC¤»…Ùê:KG…î'r©œqóƒøƒõÏ­6Õ£·ðŒÒDH"1¹ºî$ãƒþzVF›xÐ|;¿,AšY…Ï\°Î?R}°EðúeWGuØ=~jôܽÛy¥©¯á‰éwê¹%#‘r;ñ•ü²GãUü\‹«7÷¥N%XcùÕ߬0êsc÷LÌ>‹U<7wäêÍp0E“Û£SYFV”W‘} ¿ˆ.õ#o§ i,Ä¿»Á÷Ï¿”þS®#u@ÛwpyÇò«^&e‡ÄwѮҞqaîõ¬Ã7ÊÁ"LŽœg5æU¿;¹²š,Æ$VäÞ7pBòÞ¤gyI 8'­PÈA\üƒ‘Î*5³ÎìóÈ#†ª[¡xÌ­Æö#±Çó¨ËÇ!2 HÀà7¥VXbLð~ï4’Jü0#Ђx4ìMô,y ¨bí€p28Ç¥#6àrzãáPf]eÆs“‚0i¤3¯É$ˆ3è('˜“ÍoâFþ÷4á¶@z’x" O: 7œ?¨Ïj•®¹Á7‘øÐ$Å·î³tÏëQ® ãöŠtw(c"FéÅJ“™ù,¬OHÏÖéÜcßtcühò˜ª£#ït¥’r±dmSÁ=³QK6qœr>”ˆ$ícƒÔõÖo› ±úz»·dñïP±¶3 ñÇ_­2XðB¶ýÄìGJY$ ‹–ÆyÎ*?4œ Ž@4…\©d”ŸÇ4 2hÌdáNê+\…ƒï¶…Ò“áwg¸­¤ùPXðÄõÅCtMÄO ,a\uûÕÓ—,®Zµ‹zE‰ÔìÒ8í­=€P­Ôzdâºeñ"Z#Hf[ÙD>\q¤{îîÄúœq^~G¢/š‘© ê žØ«I$CÏšT´‡ùŒ×|gR÷:™Ë‘³§³ÔçÔ¬ÅÏ“ óc÷‹°d{s\Ÿ‰žó_¹ŠM¨© Xòxç銱csq§êl²1ÈÄdÚÐŒâ³b¿Xâ™n0³«cÝ’sÈÇç\œ³Ss;§]J’ŒMO x*]Nî9%p!U>`C–ëŽc^žtYtoÞ5ÂÍm#æµ”ÿµÛŸZà|% ¶köÍì²±ÎAÁ«þ ñn£¨°}µ¾Ì¬xó>¸ë[ÓÆòÈή*|Ò1üK Sø’òF…ï žÀcŒúm”Œ3^s÷±V÷ÉsÉëŒâ™•b@ }ÍsN£”œ‘ΕŠ¡ÙSÍ#Ý…5´;S´,’#¹­2 ”ƒêx KÇ>¢§ÚO¸Ï¥¼r]·Éâ¤sìýåÃ9ÇÊUÏZÕfS ¼„S±*œG¸úŠ~ÒL ¨a¸ŠFÛrÀ)ã95¥Ü… 8ÎâÊHÀÉê)ê±$TÛ‘Ó¯çMhã ô#ý ]Ž]Bâi£#à«ãiR»Xœr:TÇ÷D +žxí\ÕØ&:3¾6ÌX à{Qå)u*ÄòEG /:qOYŠÛ³\v‡¡3& Q†á÷ºŠ2P'·NÔÁ;FYIÀgüö© ]«¼œc?OZEY”b1÷H4å]ц-Û#OW drHÏÓð¦†w¹M™ØÑqYŠñŽ™ãëLäœnhùÏzt¯–àäü œH‚AQœàšw !$VÀ ¯N˜ÏãP†Ë”ÈÎéVNÆ\‚:SK6ãÉÈëEÅd%1“…*½I÷¨ÝT&æNðZ’2"v‘Ie´×²¶•|¿-X2*F òeABªdf›#܆j|Ác9ô[pLn§98öùWJȤp}yãô­–Q¿{2„È!€¦Bä*§–#¨ç<þ4ý£LÉónÄŠÓÛå[21þ5+Ì·fÁtßZÓ-‚¸ùI#¨¨ü¨†ò@]ƒ“‘ŒñÚŽeÕ¦|z„*¡z€2¹ìjNQqb\ma‚?Ͻ[66óǘÝrTq÷Mt^ÑœUs1Ô>Í1HÀàÊ{:Ž=^çz÷$t¨˜ÌöþxR"B°ÏôÍ:ŒðÈ P¤:Q¥‚哪[ÜJdi†â8/Ôöÿ twjQZÆHÈ篵dÏalC…g#$zvÅT“KtÜÉ!À' ÜÑìâÇs¤óÙZ"΃ûÄžjxÜHò»³Ž8üë“û Ë“æJ@\Þ¾ôy702(œ…o™A$qëúTº+¸îu ±ºòsÞ˜ö1È2U@ï‚k6Þþx$LÀg“ÉÏZ²o2YU)³Ÿz‡NHw¹+X“Œ2:ƒHÖ·"¶L–9ôõ¡nÄ€V§Nõ2ÜBBÿ2àg=ÍMš 3)Åì*7@O%3ŸÊ£[™c”4°È#9’pk}nC«Ì‡ž§”£2ãäÿõ>nè9Y€×6ì—pñå†@ªÒ_b?.+Ž~ŸZè&°‚ddÚÎî*ŒÞò‚ή2‡PåfoöÔ:¤ÀtÏ9õÕd 0ü§#×$Þ’=í ÀßçÞ¡EòûÎ[ô«½6+1W]›’Ñœ•ÀÛëJž$9>rsR¦Ÿt±c÷n3†õúÕYt¢ó3< …³òç€M5ìØ¦¹ò(Ù‚x&¬µòE™0mÀ`~÷¦=ë9ô„Tuù”/ Ÿ×ùTº}‰ò¼ù 8'÷j{{ÓäƒÕF‚ßK#+ÛZ±$™3ø Œê“Û¶f†Œg’Aö8õ«7V³ˆ­ï­rý\«ü) ½˜r?ni<×ê¯*NÖÿoÄŠ#tCD°JÚe¤Ï›B9Ïz`~U°š;Ê,š â–ÒéÖ%™†Ñž©'÷HýG#5Ï6§%å§Ù]# ù .ÝØé»±aœëØäTº>»q§Lûã[›iT,öÌH(?¡Cu®K™Y$ÍÍ@¾ðýçÙuu@êLld‘sÔJ­ÿµµ–aªM2»‚FŒ2 ŒSúcÞ½LÕ4ßømtVQsüXÝ’Daÿ,Øãåuü˜{W‘ë¯5¶­qksv·_cv‰gŒ|®F9üøTòò¦“5…“ægO¬\5¼6Ö¤*ºåŸ¦}í\ô·0Å–üüª–Æ}+dçRð»¼x3Æ‚DÜ3ìGõ¬[dÜ–Ö-:2y¬ñ¼ƒÌ#=Ô‘ôŸZÆŒ#%ÊúbÛæRè61w3–M>æT#ù}©¬‚6ÄÑIƒ²5$ÒËÒše*pWqqjÒ›^¼»Ó—O¾—í¶Ë–C(̱gû¯ÔnGµ7ìr]u3–ʘª1ëœR‡A·cØùr8ª`¼2´++0?20î¿ýj‘™˜nn0GO✡gasX™>é/Æß›¯•1ËÉ#p=08¨]äÊœmÎ}Fj'™–soŸ¯Ê2ëI@\ÅÖ}ÀNqÍ#NJ®Ü3¹¬ùn Eæs÷AÀà“ßéR™–;Uvl?Vã‘éõÏ5J».<ÀÛ•|ÊAÉéÁ¨4(¾ÄJ¤¤˜teç²Ëœàm8ÁçÿÕRøQÚé<¹FáùO·¥zXÚæ5[°kS‹]`4¼©‹n=sýhª~.‘Mé#;„ŒéEuÆW'”ç „LÄ?ÞïK%´±à”;qœÅEÈ=«JÆþHO—&*y®96µGaAFE ¤Æ»íÁ6Z«]5Ì‘¡åT(éõ®WSµ·‡T’ÞØ±hf9'Þ¢5¢Ý‘«¦ÒMõ3¿`nb* !‡Nk³‡ÁúdZ3^Ë$Ò>ÍÁréÅ`èú”Û¢p©“Ãþµ²iò¡T¦ákA`‰—³{ÓÓía)嘑†8AȬT¸YQ\#<[ú4«5¿Ìpc$)îEi—üN,ä¬îˆ.ìm£»·Ùm)V' Þ¶-Õa„°B©cŽ1UîÊ›Øgî°õ⨷“¦N2êóâ½ %ɘ]¶‘ËËÃŒÂLA¦³ª—ŽO¸Ïo§áMo•1Ž7ƒÛ¦)d™h9޾yê΢5ùìÆ28ö§ep¬«Ð•b;ò)¥<¸£¹SÆÖ’ádP„m'w©¤1dÝœÆ7~C¯Ö&ØTËF2Ài_Å$¬§îœõõ¦LOÛqš7 –¼Øƒ!eb1óm(3°ŠÀ|¥äàzÓ@U²;œöÈHÉDÎÜ’wêI¥aóW¨eBúžÔñ° •òÀqÍ0)Ü@FpùÅ2)˜îƒÌ “÷…¹j2’§ ö>´‹1Œnp„îgêOŠŠIT*ÀgŽ¿ç5\N”•9l‡¥]0¬È…°Å‚îþ÷ù¤"…2e”÷Ãõý*¢Ë+®Ö r¸æ¤iüÇÆ “ü>¼PÅtXVG•£u @BÀªd€ äšb*Û„‰6aƒüU+F§*¦D(¼ô§àÆê›C™ë×µV`U%Ø )Î1ÇZW¸h9 „@BnÚã õÙžŸ…#ÊH˰°·Sê) Y¢Ãù„p»AÛ3(dRÊÒH=3éøSÔD^l‘1“Ž4ø§ó ±¡Q¼C>7S‚IóÈÈþ´ˆ…di| 3Û{ö4î­<¢á`8^ Î{QÁ¤Á1ÚÅBœíÈǔܻ1;8pùb©2Ë–%³Âç¡Í5¨6]û0*XQ÷)d´PÁVLmÏ'®=*6¹2€ççPsžÀ昗-™XŸ›'ëÒ•˜®†OnKÆpiù³Èoóš±5²˜Ðî ]ˆÞ'ü)ŸjY_z¶¡ãõ©#1ö³ €pIÇ4;¡û¤)ŠV3 ¸úàTm4‘JQ£,¸ùHî}*â©oÞ†è*‹lbgä0:ñML—ÐŒ´2Æ7. êF½4ÁŒrØÇlñRåg &˜°-ž†˜ñì}Ês¸‘µ»jh\­´%‚ªœ!líÕ¶‘ÞäM9ˬ¢GC´ Ü™=ÿçRyÅT<ˆvŽ¥{zU)v JžCÆ ³äO$Oj†o9YˆxãžÂ´å–3Ž¡HÉÇSHÆáKËÀì1}“M%­TžµØè?4|ÿxÑEu࿊Ï*®Åû®n£=Âä~tÏ4¹ë•þtQ]õ‡#îŽ_qg ž'ùUKi®ãŒçEà…¨ÎdPy÷¨îI68ù”qõ¢ŠHC‰ž=?þ\ÿ¬ÿ€ ( cìÀû\©”cñ¤˜‘,Mžs×þEžâ/ çúUvýÙ}¼`œ{u¢Šž¢Cdþ"Ã'ñ$ß#  ãµS ýÝÆ`ž@ó±Ž2ßΊ) ˆ»(BÁÛÚ¥‰Wæ||Ù?‰¢Š] D€ýßsþã˶yÂŒfŠ(ÛS¼£°€nqéÓùÔÁA$sÉÉçÚŠ)õ%GBB±töæ¦éduàçñ¢Š`À;§ðîaŠ&”+rªp¶(¢’6ùã;¹ýÙ?¡¡]‘˜©ÁÛEÆLÀbaÃmê>¦¡¤d޹#ž{ÑE$e°$~ðÃ"•Ép¨üªŒŽù¢Š`Ê'åÁßüñš™ m 'yç4QUБñÈàÀ¡ŽAnzóW ±3.x(ãµT½ÇЮŒRKu^gwjgâpLÑE&QFçã¢`T6ÜGø‘úQE5°º‹j×@ަa‘ÍgMùÒ qÝ{âŠ*£¸0™nŽ ç5l“±Çû@~”QV÷2“»©ê?•D€Hî]A ŒQE42‚%ivÆ£z}jŒ_»m©•RÄ(¢­ ®óIµWy+¿'µJ>ÑŽý*(«{ ALž­œþ*h{ÑEfÉd_-ÂH/ÜõñRË#ªÀCI"Š)ôq‰ÝPàeN=óIæ0Œz“ŸÎŠ*E†ì®{‡oJ¹á8Öç\û,Ê ·yˆz ü¨¢Š{²‘Záõ„sϨRFY.6îǸn(¢¥ĽvÚcÏÈà= ëY÷ &ý¹WŒj(­žÈ qM,„rÃýºV‹;Jm#v%d¸ÏÞÇ­SkÞAE.î’‡Îl€dç=)ÚÄkBñ¬ñ#žäsEKbäWÉ.œ–ˆäúñQDKÉ'ñ¢ŠÊ;Å´b×3±9<óSðÂ@ÆAéE«|LB”V™ò:ç4ÈãPƒŽ¹š(¬€M£9Ç$ò –Æãš(¦³¤ää)Ç4¶ä´nI$çùQE>‚dIć¯'ñ¢Š(ÿÙrmagick-2.13.2/doc/ex/images/Button_C.gif0000644000004100000410000001155412147515547020117 0ustar www-datawww-dataGIF89ax÷”–”FŒLNLœ D<&$L $ŒD,¼Z\bÌL$Ìd\&,.\ ÌÎÌljl,,\,V¬<64ܬTärlL4&LL&$rììt ŒFD\<<,, ìêìNœ,.,,$¤TnÜ>|l4, ¼¾¼¼,DlœL, Ìfdäll646l|~|<4Z¼üüz|F”\^\,*,jÜ\, .dÜÞÜtrt 4ì¼\üztd4 &Tü|œNL<üþü, ,<^Ä ¬®¬TVT¬L\,”D<ÌbdfÌT$Ül\., ÔÖÔlnll4<><äìrlT*$züüt ”JDL<< ìîìR¤<.,|><ÄÆÄÜjl|<\<rä<,<Ì<D|< <*, 2d4*T^¼J” ¤Lìl<Ä\!þ0Creator: PolyView® Version 3.62 by Polybytes ,xÿ«8cK*\Ȱ¡Ã‡#Jd˜@Å‹3^̱cU¤A3°ä@-kF0àðdHË'/cºt “æL˜/mæ”Y³'Ï7uöÔ)ô&O£;erÈ1B…“‹àPô'ͤF¯bÅyµjP®>³µz4æX >Ÿ¬Qa2Mœ²h½’»•®Ö¯sÃæ…‹4iÎ)ENÚ `FoU´|Ë5 )^»goEL7ÏÓ*14!Ìø'Y¿{óÊ¥œxrWÆ’gª°£Ç†×ƒòDŽ;VìcųK‹Ö[—vbš#¬¡ÑDHq/;x–\›wo¼@/–¶ú麊xÍ]ˆ ,ýBÿÆ­\¼óÉå…â¶ÝœzŒíÅãoÿu<û!Ói­_“=ÖÛ¦™]Vl×w€#¢Æ#s<âÀ#ÎÄ„^!…jhá„F(!‡‚È!…‚(¢ŠŠ8≶¨a‡¤¸áL^€€ÀgÜÅ%ØÆÜàˆ! JJ±dL‘ä’N:9e”R ie•P:‰%“ZR)¥—aNf•c¦ù¥™S–Á‡;¤öR8ˆ|Œ %•]BÉf”IúÉdŸR.™æž[ºg¡Mªy¨¡Jvyh¤V:e’|¸aÖ¦=ééfHH:(™’^Ù(—ƒbi&Ÿ‰F9jª®ÿúꪢ¢Ùd ¤Âij Ag¯±A¡e&zi¬iæZ)®Éâz¬¤•{ì“h>û%«X:\Ê'ÀŠ(´«¢Zí™ÐB:- ®nù'š¯J /¥Ó Ç… ØÒ¯ÀÀå¿|¶ëç­­žª§¹zªªåºî’9iÀ3ª&’W¤Öí§BÌajŸ·Â*p¼¥ž:®­ÄB:j­ :k˜â†ù\ürWœ¬l2È ÏKn®6‹¼e£-7ëð™Û o’ouñ̯5QsºÅŠy%»7 fº/j.±¦&\& è*Ìq/_ç«ÝÍüÈÖ=k¼VWš*¤JjwÏÔnœhÎKÿ|mÒh-ýãk¼Ëæ¿«ÚvÇËn°0PÇ“#އ02µ ‹Y0¶±.&}?ö?ë¹Ësb#C‡ N˜âµ÷Œ$ýùXÕÌ^»`@cAþÑF´G ´2à ND6ð%ª¾‘ù+:F'Õ4`åÍÒ¾] @‚a[j`0JI:¹p‘WÕiAŽ!T{ÝÙfKfEmuWÿ ¹k“†æ"4UŽ(± ñiÒþÒ¥Œ›šhmfr¯†šÂ¢t yI¥hÏ|Ê<“,B«,Ï—ÎòêR"ÅrÙëŠæ0¿CŒá­!´çr©o±Fª>Ûd¶SS#Ú½fHÀÛá_§4DƒÖoÿSK—î s‹¦¤µ3\=3ÀûƼÙOt­¢¹˜¡gP•lWãä9Z+ücD¶‡­”'Òd.ÎJñʇȧñÝeœµ‡ø…K«sw˜›3Ûœ{‰ÝÇœ|áëïŒÚŠd×Ô1Ê%æ¡Ü¥T*}î×§ó³‹×T«Ÿ¢æ&k!" ˜—:ò¦4.0%áÞݱ‡èÿØýkßÞÛ7Ù]^YÎ7,ñ¡³‚¼É^¯¬Ä*®écχ%Œ÷„ûA%F·fÌ´.£Uy%uPƒW(ø7n:DYÌFfÔ0blÇ´BÖ}^%ZÀGw®×I(ÓIt„:]c/!ðǤH—`Ö—€ã†J8ƒ2ÐXM`u–µ_]´h¶¢‚‡ F1u%“.Š6ˆ£P%8iô%8°Mp‚QWw ‡7&ÇyPW4y·EH3ÏX°M …v”8DD.Ø:;v°²lGñj¨c[¨¢|‚äŽpl|Ós¾å9dwy®å{£~EÑlK-^‚d»ÿ‡5å‚Gz†= R6Õk­å$þGh`KrO}Ô¡Òo¦7Ô7V·Þœ4&D˜vxìÇ€¡#?–F…) ørèg, XR8Hc~q0E»X7sC&#ˆÓôgÜáE‹³$ß×GÔaé„]L2{s¸•ý5@­Ç$`PdpâÓp“@WpF ¶©@:Š=÷54d£/û¢˜Jç—+³]&)™HJ ¼?Zi¨zÅÂAèzbhs9+!@@¦eÚJˆPSìµ8ØB§˜ö÷¥ÿÔ`y‹yŠLá3ÿàlÊhÀE1§Î¶hÚ£AU²I€§eKw°ª†sôT–{EHoPGÙ‘‰êªÜô…‰ôçFi’_ˆqY8bìÙ( PÕ`Ò¥@GpŒÀo%—êÈ2ævh×}%#~6˜$ЪvÖ‘’‰Ÿ. ` 9h-!©3ˆ‰R”Ú«™õH`ä&Q€­Š «âs<Ð{¹ZBaWªqafuWŠhr5j)l=…Ÿg> ßÄÖX“"ÊRØ# J}<ªy6XBP€wÀ©ás  ÀZ~C/6å|ŒyCM¨EOðÀr¢)SKÐÿZ–Íå&s?.pAÆô³Aà`|°£8%j8;¤×‡ƒÜ† °i¯U–ö7ˆ£âNÀ!‚"\Ë^»þô[‰ö ƒˆAI2Òt63ȩ̈NQ#’ ˆ0ùOåÇs^§›{–8|Sv‘i0Šó :"ˆb'¸lxc9d¸÷Grl4 0§Á‰Y6à¨Ê3Fˆ`§54Xˆ› ’ 6×¢`T°#_q1£€b7(§Îw&¶76n6ž\㺑u5¼š$$Û2 ¿Â4§C$ >Zs3þ*›6U˜sç¯Å˘Éû¼Ï7wX;8ð,¹qÙ4ÖɃ°—ÿ9^¾ä;¾æ+¾ç[¾è«¾ìëµë›¾ðû¾è+¿ä‹pƒ  BG!³À›6rÀÞ"À<À\À|À œÀr¹¿ÖÑ)Ü’<Á\Á|Á\' ²Ñ#l€n  ,Â$<Â&\ÂL' f±K@œÁ2<Ã4\ì'p½O€Â'Ä(,ÄD<Ätp½y UP0l6ÅR<ÅÜ4@m° vPp F\ÄbÆdÄB€Ä& qÀ§CÅpÇrü°`J06ðÅsÜÇ~<Ã`x ÆPQP…pa°ÈŒÜÈŽüÈÉ’<É”\É–|ÉŽlEÀÄ%;rmagick-2.13.2/doc/ex/images/Button_R.gif0000644000004100000410000001110412147515547020125 0ustar www-datawww-dataGIF89ax÷ŒŽŒFŒŒFDœ D,&$L $ljlŒD,&LL$bÌ\.,,ÌdL$Ìfd,ÔÖÔœNL.l V¬LD<64L4Ü,4\rììt,TL&$,¬T, &\<ärl¼Z\¬®¬Nœl,$|~|nÜl644ìîìl4, TVT¼<L<.,trtœLT,<äl>|^¼üüz|F”L,*,\ |nl< &TjÜ 4|<<ìêì¬VT6llD<><\^\^Ä ”–”¬D<&$\,lnl”D<T$fÌl*,ÜlL$Üjl,ÜÞܤRL üþüzü\><ÄÆÄ\LL<\¼\|<\<< 4R¤rä2d<, 6tL64üt<,<|<ÌT*$ *T, ¼^\J”bÄäìrl< \VT¤L\,ìl4!þ0Creator: PolyView® Version 3.62 by Polybytes ,xÿó&G‚2*\Èp!€† BT(q¢Å‹-&aca Ç,Æ  ¤Â‹/&Sª<ÉeË–+cÆ<™¦Í™5]âÔI³'Êœ>{ª tÇ ‹Í@Pq“¦Ì9£¾”铪՟MyjŠu+L{¬|\R†i× :wÂL{ujÕª\ãÞ”ÊömZ§*§X¡!Œ %Ìf¥ë4«[µZ£EŒ÷ð\ÇiÅÀÈÃCÀ%å&öÚvëÝÏŒ?Û},º3P4ø¸(º‘#•8GÓöplÚœŸÚµJºç39tÁ2\#LFàî^Ε4î®Íëâ†ÜY¹Ë1 .±Þî"ðf S çÿ~”¼ÉÞçÓ'G\ríœ7 ŸÏsx¼?uçoÌ6?lÿÂ`€ûõç_aú¥d€|Û±Ff?]#PThá…f¨á†vèᇠÎA™æ…#òGÜvX`vA>x¢…"3ÒH£3Ö˜£"8ÞxãŽ6j¡ECÚØ#‘9YdŽ8I¤B6¤PR©… T Ã{ 2è }E4RB'VòÈãŒVR™¦™h*¤™Rº)ç‘hÖ¨¦™r™§šm®)§6jç@ò_Z(‚Éb:8°&“P é| Údn.yæ”J¦©';^*e§U ªH'à¶`ƒ*:È„§‘fÿz&³î¸dsêø¤“¦úc­£Êú䯼vê»%Ú*‹p‚«¦¢êØë U*I©¤Fb-¬–’ê­Øj*¡÷­Ú }0Y'­™>:ê‘Òªk©Ö+-¥ÖþY¯­ÚÖ«È V)«( D ©ºî k«½|&\-°ëN{i»˜+mŽ6Ðfî¢Äùád‘t^ªäÈÛvj2Ž$G©²¿Ò>±µ˜;¯·TV±“À+n7CÌ þéóÏ@-ôÏûhq©¿Êºï¦˜ÝÆ{,)®CWmõÕDO;«Ìø–¹iÈhŸI8ƒ™ Ì™Jˆ l·íöÛpÇ-÷Ül·a‚ "äMô³^Oÿú­©‹àô\PŸ›‰›´šÐŒ7îøãG.ù䌷 „I±Ø`w¼3W òË´ö8øge·š‰Ë8š „°Ç.ûì´×nûí·ÃA„BƒçzK1½eîkÃbFÞàÙÁ*â:îÐG/ýôpa€ x‚8Âê&9¼¦6Û•ú|3ìy& B„0ýúì·o‰e˜0çÏTΧŸNÃF“òÛy¬éŒÏkŸˆ»Baòë÷ö´0±Aç$ã#ÎáüÀBð‚ÔC 0 ¸lSœRN7þ±f‚°B_¡gA=´°….\¡І\•®_g:[ÆwBwi!€²ƒáÿ…XÀvÁ€ą̃äÀ™ðO‚hã º ¶O}VŒ~·—}­bZÐ!LxX„ò…+?˜€ 81‹Ó#bû’ |ñ¬x6ʘþLòÄ"øV¸’ |…×ð…-è€0d"(€!„Ђbƒ…ˆ?65UydÜYÒFW&DBŽëÀ nQI p@ªhE!ÔðSxÒTĨbAjá²G@"©“S¢Q|ðCÆ€P·N¦¾…ŒÌƒÖºÔUTF¯ A0Xœ*ƉHX"ƒ¨!ß®%-=nEy+šàðXW#a€X"¨&¦ÿ¤ ➌A'ÂU¼Š…O*ecÑáä'}  ì+Äá—-=e+P~ðæô€°=6Ý©]4ÊŸLàyÂXñ-_m€(û²©tH€»PG¦IR:„ 6Ë41†i„`äõ¬ï•É÷Ô(î*á,HËI" JÏö«˜MÌyÎdŸ¸,@aª$Â@X£–ºé“qÙé̪º) ²o¨ÉÌWµžå€ó 2㤒¢Ê…·¢®Üº>†Ÿ £R*qWvñF9íIÿÚ·ú}*M*`–ö¦íáqF™ ðÚÉÀ¹)áñ+UõÉVfµ°8ŒŤdÿЂ£5Y×@zPMvuàjÓË;=¸ªK˜º•ÕTÊ>, ²® iX¢ÚÎþ¯¨Ä•Þq(±"½Á®B8yV«v5q-“-Ÿl/ë£Ð¾õ`y ®ÐpÁ2f€BíYüê?’µGÙžÔŠåµÃ*¢ -8¤û±#¡•+¿õVUƒåÞõm–fø²#Ž$ SVB~{© xÙ¥s-/Om“¬Ü`èMžÂåÀ¥Ö†€)…5+ý"*Eô‰ç»0µ´ßN¢%»ª%À…“LðUâiÏâ¨åì¯!†—.|;ª Wy$áÆöÁrøïezP­lÿQ”õ¢pùTáéqkyã Á\"!Lf¸ôë+³È×%ò›¸l;.ÜíѾÛ2a*Øv……xIçLdÁ% È+ZÑ [º"ÕYz—Kµª/Ç8Ç1v €ãJ,^R×K¬ò£”Ëh8bP€žÅxÆÙ„Ò²Fã€_ëkLÊNÕÕåëézaªðuj¾zÝlñ mØæw)¾JÔ`*ß¾Š:¥Sw›€NHA+‹JàdÉÖ(ñe©¶nqûÝo”„P½—¨­ŸÍ¨Jiljÿxí„  @Ìúº û¾¯ëEI-Šh«QÄ%»D &ÿðÞߪªÛ%Z3& 5 ¶f´¹ÛÛ°»¤«m'I ¢ álèU?[TO"Š¡·³Ðãz5P#wÚ«ž)™“ì\TRòæ/•ñàÅ,³¥Ç8 4¼„CÂYêKزÈ.RÒ_²ôŽ}+Žº4ˆ¾¯M$Ä ¸{\/ÑHF/º4êÐ9ܵB »×Ž }©†\Z½¼¯WÝ´·VÖ›ãNžEZnnš¿é긬5•!¸x¦/ÐT—Ò»qÓ4ˆØY~v…H@Mã;ÛÇ3Ä')œêÆv‘]ÀQ”2Ø‚aiÒ!ØäÔÛœtñ`:ÿLŸ=ãÖJõ•/{{î:1W«T´U¶vÔ¢z÷ò®:ð{ÛQÁ%nÉvu$ôc&¦3ôF3Öbz·³YÂã H°BIrJÃ4‚{H7{7óñK˜DX5@€,@~q„55dFõEˆG‰r€eDl%%bw[«£/{Õ±C\Àop'bÐ’)ð÷òdXöEîç|"Xxz"/Àƒ´Ó @zVQ6Umhñ}ñätœVJ&Ø€åp¸BgV']Ò±t=:,è#ù·Oh“YRXy‘à Jvw Y7d_EÓä)e€¶3TvR4‚~aUÚÿS|že…rWse•… çoah;µM¼"ü—ADV8J´&s€h6ÔÒ2cˆµã€r5:4â M°B-€Dô‚4šR€=Q‰øGžhŠö$‚•¥#õ A•A’0o÷0ÒDn¶ŠŒWq51Å(@7vE$¡ˆApP¨aã‡k‘|^ÂÛu2ø%6PfíÓÓ`CøLD‚@| 6¨(:³r0f-~@@À ¦+ e¸80F,£äc¿ˆkó7` #nTx?ð-ˆ51œpi¿†DÉÅIMr^ÞW{¬!J¤D^ZàŒE@Ià}ƒ…¿ÿ~9 9aVç‹UÖq_²Ux´bˆCcÓ‡A@À e•b®‡#Ÿ`ED@CÝHQ4·pr"è–3GzyC%&}v[T0p7žðˆÇè&%hE…Ð ài9†S€½$”óAU| —£wˆ;Œ# P…9#pNøP• T˜…|ZÙfÃ)T¢BƒÙ>D ‹Ee-YpIp¤ MÕDe|¤—‚h*zWL§¹Nu ÐmDhIƒŠ³•LçR?´‰pt›ø,€`[¤9Dzð™uZïQ]!WA:é{GF;¨ÔB¦YjIsh'Ü9=ÂÙ-ù¿ÿEl›I~¿GD¨¤œäö+žð :7ÏôB²s›¢Y£¡Z^è:Ç)qßYŸI›¥ h`”1‹ÁCX`X èL—tœXÔ ±Ã ²Cš¦©KòZ"ù êw!uŸB¹"—-°˜Eô95™CމA!p›N¨Gפ’Š}&€‹´HP£7Z£@£<ª£9j£>j£›(ƒ"p? ¤8ª£K ¤CzRÕ„ ûó¡%ÕiÉÕr&z&ƒq@Bx,(›_».xÉØÄ&V¹IBFÉS_ó¦þi¤!æ•ã¶‹ÐE(žÁqØ1zu-š™XË™€Á´b•-¹rЦO¥Çÿ3]—ɬ¡ýRtWšŠÖ¼¹"PivsÕ|„8WÁº†Ü˜utJ:­°ê±~¥«  ˜„ú¯½¢51v/ °÷"°[“¾R$&B{˜¹,¬q `}§±k³±Û± ˱"û±#²${²&›²%[²*ë±À`±M¥õ:±Œr: :˳;Û³@û³Bë³D´E;´F›´H»´GÛ´J;±3km“u³T[µV{µX›µYµ@qÁƒ¹Š³a;¶b[¶d{¶f›¶hËp”ÐW= ªµt[·v{·Wë'^  j¶j;¸kK¸†[¸ˆ;¸°fqG1™x;¹”[¹t«‹€ tÀA\ð¹–¸¢{¸¤;º¦[¶‹»|%`‰–ûº°»¬ána{в»»¼{·-r«‹yÀKnp¼È›¼Ê»¼ÌÛ¼Îû¼Ð½Ò;½Ë[cp;rmagick-2.13.2/doc/ex/images/duck10.gif0000644000004100000410000001361312147515547017467 0ustar www-datawww-dataGIF89a´´öb +'!(($#:&::+- .0$0,$77,;:2=B7A*M2X9B>7}JJZYDE;iDsJ~RggxxLLCOPJPNIRTMZ[U[c^\d`cb^eieoyxsrl~€†W›d§l¯q·vooÇÕÞ)þüÂ~Æ]]‡‡™™©©°¯¸¸……z¥¥ZµµIʃ׋ç•ñœÿ¥ÇÇ××ËË4××(èèÿÿ‰ŠŠ‹––—˜˜™¤¤ ž½˜˜§©©­··¶ºº¯ÃøÄÄDZ±í¬¬ÆÈÈÉØØÖØØÍââÖììÝóóåææçööýþþÿÿÿ!ùb,´´þ€a‚ƒa`„‚^‡…Š‹‡‰‡†Žƒ)‚`‘„—ƒ˜Š›ƒ™ŸŠ až•¤¤¦„ª¤«Œš¢©£²¬“•Œ­¶±³¼¹’Áœ¿¯ˆÄ–ĺµ¾Ä»‚”…¨Î˘Ó½ÃÖÕÙÝÀÛͰ·áàŸ´Øß¡Ìãìêå§ÔäîæñÚôïâ© ®×öˆûÊ䥃ço`±ƒ^ãöO Á€‘á+µpÁvÆÐI³˜ãA‰÷<>ÃRE% ªÉä⼎Þ>ö‹92äË“"GÍüç%aÏ.>{zéÒŒP£GúÓ¨¥ŸL¡MÕ'¢=‘EŠt©V ZµÅµh®UÁfê”ìW®þR™ Ë´ëÒ£c¦DX1LËWvÚ·'M Ã\ ¸ £Â{k2Þ-eäÄ­kìðrgÉêÝôœÓáǾ£ÏyDY´Á½yïU}33$ΫAN 7MÝŽ]7v)ûXaÉŠ‡«Ä ¼¶pË®Pç»—rÒ¿9eŽRsAä³G%Ýšô®¥«`ß%Ï5ýSµT¹Š-ú´iЫlÍMÏv½Ù£we¥zg E_ÿH×€XÕG^Œt1˜#û¼Š¿–#ÂzcÛø“L"§¶Hv#<´ãñ^~“–…ƒi±M3æ7â Ç/éØM‰ $²«]å¼e>¹e+Ý7ÔzøÉ·V}Æå“yP%ßZ"¿;ò ^­àX^=ÿUJýÎÞze½\»kýPþÄ«âyâ€SÙá¦ò…YYþølËN¸8uþM®_¿]H& ÀÿüŸD0…¶Žtðã·ìsü‚ (€ à@:ÀÀ¸ï5 KŒ ع1…„}KŸˆƒ#,á…0Œát€ÿ9À}´[êrÔ¥÷En„(œEœ ÀÄðˆH\‚,ð?€N6¶ÛÒéèF&ýáæ|šÃÀÿxÄ.Ñ5Dö™gAÊ ƒ —î…ï.Té²·. P‚÷ÃüÏ å±Ê~°7ÍgQÅ ïÔ" èõÄ_ö2#ÞÈ× 0Ô|Ì$ yþð¿‡fŠ@ä{x?֥핉¤ î¨Mºr =øßBGBÔ)p:lªÛè(Ù‘“¯te,°8PÂMЦ©ý‚xÀJ<ƒ ¸@0ƒ™xàE:aêœYÂ*J·=úÂÿ¦9M€ ðÃÓûnI-IŠnp°»-´hDr¾R fý„¸Ïˆä‡l¼Cä{¨Ö»öˆey^P%ø£ ùh °ç4q'xM-¢^Sæ3µµå(ƒÜ“}V®ùâ–YæÖ†»NxFh0ñ)€ÍÅ,v‡pYC.¤&õ°Ÿ¥M §SmlUã•Êxu–FZA oÊüºLÙ‹øØjvezÙrÀ‹øD@¨0KEÑ­ÖÊebÒŠtN6 Dœ/}¯+VþÛbV(Á~gZ·«›«ãe:Õ4Ýzzõ•NBZ° ÔðÁv[ç^Ãa™ß¤e6 ñÚX“(@vÌã"a6hÁ L<[—À VØ‚J!«a*&tXþÁÚÞØ•·mA·Ìå¸Ä'®+ºDÈ9Ý<+U¸âXÊ6ѳš±ìYaP¨š¹é,àÊš¼ˆÀå>A6`"0[ @ »™Ð`¦,iðŒX‘²ZÕ"å´G} £ ÍŠB§v>ÝÏ™@º hAz¶x€ šP.$R¯îÓòU ÖšJ›D]ç jtà0LPÁ >b,_äAþzªvBúÛÖcŽòÅ&—-‘7k½ö¾ÁN"‡P×PÀÊfv®CÉNØÜIÀ·3“p×l/Ÿ(BNtZ}žmlT—„6|±•îÞ$lÀc!L@€Op’‡tíâµfø³o,-ìðš“Ï=Bþ'ðsßí\©´Á9IyŠ‚ˆµ 8>3Ðç" a\­Émù×Nèî?vÑž#·GGE:ˆ,*xu§»÷0øÏÃÁ¦hZÎc®v£F߸HL#ï=WG÷Ç4T#‰“ÝîþÓ·Ü~€ÙÌÄæÌ©ØðgÃsÊÙ˜.ØA}ÝH`.Â0Îåœþ˜XM›M+ìX·ñÕðÝ€fÚm]ÀëÆl&°‚aï;¶Aþ×€,°X—‚C|¯+—X&§à.ôª8xMBh LAÂ\×d€/Àÿ Y2·8™;œWGhÂö¨œ ˆÑ-LA ð_¡`àˆ—›”j¯ðĪ­¹,Ô0ÀÖäÌ )Ü ]È‚Nà°õÎ.ów¤^—ÏE.Á›µ°Ÿª´%A%=AÄŒ—D=@~àjùçHEPTãÁH!¥<Ì“ °z1f0]÷Xñ!@  GpWJp; g6ÔYUraVä‚ãb&0þ:C¥J½ðY@R wThdh÷{2ͶMôr dƒßð;(}>0 €(@©|Æ”„í¥unç{ƒg-]0/@` <Ðj¸yÿSýµp 5`§Ts'z¦W%1`_ç¦M#Ñað¾M€ènôŽH‡t¢pØ·aø{çkÿcë¨r²„V_Xç§:(qró Rð}Ð8Mœ„m{t[@nJ˜NòmPÔ^L2†wTFy ¹GL„C¸&|¾w%wødC8Rà}õŠ®¤*¸YÀÄGdeVEÈXøV‘†SZ–Æ4º¨“¬…)*ð?)SƒÈ'ÈU®ð“½uZ=9ZP¹“>¹(ݵ1ËÅ*¦gä¥\ÂR^°‚A¹ä”| z·…t{¤gWã,¯rf‹€\·Ò1˜âhâU2ÆŽ<“z•V¬á?>À’x‰HKb©þYœ•‡YØ‚YèdjÇ—Š —ôåTÇwD›˜HU~Bˆ“)ƒÖo‹u[ ”GµYÑt€~„™/t[§‰®/gn鯉ƒ0šÔ%S±x ¹zöJ·'©aÁÙk…gJõð5äaHLã·E|dN¯´ç$‘Y8œ-…16C2ß3á*>c¨RCÕõB*Ð’~ôK˜ðJ~´4C9Ã(Cg)ã3#ó]ñ)k63‚\}‚iÅ[OùQFC¹å™I¦™GIQ®ÄAþ¹'¥5"5i™òŸ < ‚„v²B)C êE`¤”»™D••”ðŽÉ¡‰oþ•$[å GäøV6¦Iøô¡|t['ˆIs‹É¢ñPs‡£ƒ¸Tä„OêEN’X8|CH’1ÈVL€–{$U˜âw¥8jhþø£#)¦‹¸—22]Òô ÿƒ¥ÁK% C›Õn%’¹…ÎÐSJRC¯¢ïfe^%\ŠWpˆ¬“CiR7wu%t:ç€ÎsºG|ª¤–E™˜¹Y' ´ˆsÕ3Š›šFkd¿C½¨=þò_01X^ħd5žädš€™—5m+›3›Þòo|ħ·õ¦]”›¾úBzÖ{>Z '›0&î°nª C€:M͉” °K½v“þF +Qz32š©IÕÔ¬ïvž:šI—5FPÚ˜‚Ç­ú†«¦ƒ05MNÕ¬ZÊ ÁdN™Xüö¤PÖ¢6) þ£I|ÊDš4¢àGN~dV®‘†Ú…-HóÁ©žJèv&°1ÄA|¤`µ¤š´Y>mdŠˆÄHýñj ˆFË=Ô3GxšÚX UV®]ħëEä*®1ÄIKY¬‡ŠˆZH☮×5†±0„G]D–ÊG±‡ ÛvQ‘\8c·ÐaäߺG ˜2•|´&™vÔ |ya 6Mø“廬±%S¦¶ŽI´,晡`̵Ì)­K@WFyT~þrûyz¨‰ÿZ’œÉoY©™¢½ KÿsM«IL„çeEfJ›@{Pši´¨Q‚ `Peiº«™­®jOdPPcá;µQPÓŸ eê õ¹¡J)º ÿˆ"ßð5¤I)§†åU¦iŽ1û!ŠàWx,ã:,‚S?u'ϰB¾Z¼/äG±ªzæ,Ȱ>R“Öë¯â£i™”2ôa¦  ³ûJrf‹·ÞÒ‡Áze›pÆêNYUí:¦óu:+QGV&°™de›}YRœó;Ðtg^ô^u*øqH§7n ܉©á“¾õ[•¡–0vV‰ÚþkOF@~ `QIÂbÃ#ì)Tù[»"Â6 *Vy^Ìõ–ëõrÉ,¨B€·‰D+|OtPÎ2*@œ Bì,D¬*â5—n™,YÙ•Îb3Ž"ŸÅEG`r§›G”Ä«—pÈ—‚·—Ãy}-êÁycøK©'™{t<@™64fÙ÷Æ“ƒ˜ ô™üÁK¸BÿC4@3°jØ< `´gMRàHˆ×ø¢LÒÉ&¿|T@ÜÈ€j" ÌÖ°Xñ{;Œ‰?x“¶< ¶ aËLàIRÀ¶Ì¿YÌ·,*p̼¶ËÄ4 4N þTàÇœ’µ*`Ëñä¹ŒËż˶ÜË‚ðËÁ¼ŒÄ¬ËãÜÍ)°ÌÐÇìËÄÌ¿[Ï*Ìí|ÌÔæÎâÌ*àËÛœôœ0 èdTÐè‚Ð  MS€h`ƒ]‚°½ÐaÑ‹Ñ`ÐÌ4SÐP­ÐÍÒ Ñ¨òÐTPÒmÑèËÑ–€ÓÝЂÑ4ЭÒ:íÑ/]@… Óˆf´Ò+MM©)¿è5%œÃPÓ5^€Î5pÃ<§[Àu4R5d“ZXs4:P‘Õ<)Œk©—Rë³êppkW§ïD¨V;§Aê%‰þ‹û0RJnvø¿dj}3˜ ×Àð×£'Ê„ÌdV実c­„ Œ qÌ™Ý^°œ­UÛØ;rÙ‚Œ‡†[ØbÛd… "Úªm«òS¨¯mŒ¥psn=¡Èj`Aç$²lÔshA5¶ ŒÅStka²s·ÛPÉ]Û‚d=ƒ„<Ÿ]a9tÙ³ìÊ =’¨JõÈ­=¬½u?kœ@ ´Öʲ\«â}˜ÖíØÍC”­ÞóÇÞä2Þx]„ïýÖ ¬vºÞwØ].` PÞ˜K·Q‹‡Õ­Ï€ßÞOŽ0K\Úöíˆ-hŠ{÷g 8IŠSSþ0Ãc \ð¬`eŠ>§<IJVñ€ÇPÉ ªŽ,» »ØàšÛ .\ þâ<¦{_ ˆÖ—ظ?’¬ÙªKø]àINp[&l̈$ãÈࢼßà ÚX@ðc§{IÍÝñØ×þ;Ù‡üäáð×gþ? åcW\N“…œàNØ®¸›èê°¸YÎw{¾cLÎß_nÞùMÇ ½´¹¸¢æоè‡[± ›¤ 9IªØ=¼} ¤8ÜF£Ü^a!ø? €éšÎc \ s'»F7>R¶¸ã¤º»þqP£^6ÀÈs‹!%eŒÜh^ÉXS È—žéþ}ÆåË÷!ƒÍMÈÈ":³¼Ú>Î ]¤tá“7‚`ÎþêÐÎc„†®TN¾Ó[´sÀöÛ¯Þrƒçë=Æå(àå”ÍÁÞ½@!IŽw’~ùŽq„Öäã»àµ$ÀBÄ^è ß÷žïàDþN·¦­˜@;é•=%’õ¢Í@å ¬¬tþéyBýµòNIÃ…²Z_cÂ}¢ƒ?Ùòa\"|)‰2Õ6ÿ“;Ì'Äå•Y<ÛR¬2ÄRÅWY,–p2߸PrùÅI¿+èÄã•,¿òÄàe—êÅ*xÙÅm©f°-˜qØA«Œa:Æ.ÛBRíˆöäèвßÙ-¤^„îäeÛýÀyÈsñqrQ:ÚÝñù–öuÝÁ¦Íñd?ž¤}cÞÙ÷6ßvß2Ú¹^ó)ÄÀ» — >,+ó î2³^.“1ÇÅhöž¹—söùFßf¢_ùÀ°9S\+¾…4™æ(%ì4¥*¡¹ Rsø“ƒÒÖó\­û2ÛÊ[3,•IÓû- ô/7fÙnnèRåÙ:ˆÜ‡ý…Nïô+þŸ´ña^÷D{Ú.jøtÌð¨­?ž<ýé'™ñçKÖªþ–ãé­Àéý€6H(HXx˜xhxè¥ƈ˜9Hæ8¨Rii‰ÙøøÈ©èIH:h9):9ºª;rmagick-2.13.2/doc/ex/images/Button_B.gif0000644000004100000410000001204512147515547020112 0ustar www-datawww-dataGIF89ax÷žNŒFD.”–”ÎLNLL&$n<.$Îd F$>ÌbdîlV$ŽD &ªLÌÎ̬VTdÎd$V$,l64j4>$ 6ärl,&ljl$N$lîl œNLîDŽDìêì~<4>4\.,Þl^,.T®T>üz|^¼¾¼ÞþtlÞl,V44n4<>,üzt|~|,R4>¾”JD * \^\T*,N$> ÜjlV,žL*¾\ÜÞܼ^\$^,|><n4,>,ìrt.trtN,tþt¤RTLžLüþüælæ> ®N”FD¬®¬TVTT*$~,*,ÒdJ,Ìfdît’D  *®TÔÖÔ¼Z\dÒd<\>4n4$>$ìrl,*lnl  ¤RL<~<\¾\þ^ÄÆÄlæld24<><|þ|^,.þ|,N,. D’Dìîìâlâ > V,,^,>!þ0Creator: PolyView® Version 3.62 by Polybytes ,xÿ±(# *\Ȱ¡Ã‡#JœHQ!™)mj ="ª"²ŠÉ*!Iª™²åÈ@.O¦,Y’dÉ”(GÚ9çÌ—"oÕi’§Ñ 8‹¾ÑcŠŽƒ8 ódÕ 6­ŠXYTeו@·Â ZÕêвXwÚËÖìU¤/µzÅúRÄ @í<"IU­Q“TãÒ¬K—p\¯8ÉúœS¨U®YǪœèNª>]á8&€£¹WÁê”|UìZ¾sWfy2kQÓew2†k–kiÃ[ݪÌó‹”{<¿½˜¨eÂ] ƒ™XhÍãY™ÿUÛópQ¢j¿,„¨Ï˜=àÇäÿI>ôéȶÓ¶}y%ìØ,G³[»0kÙbë=TààŇi1ÁEÚ_ÈýÔXeÑ͆ÜzºWÞb9QGœ`$½à܃øá}¡†ÜW±½f¢i*¢–‹¥­¨^nòÙF#z4¥$‡vÀ 7 vY8žEdyƒ y¤’C¦çtòET_#qÀã‚÷cJ~˜ðÈ/„)æ˜d–iæ™ev€&™j®é¦›‚`pE £=×#f‰¥–@^±ÆYB!h І ‚Òpè Œ.ºh¢‡"ʨ¤NJC£ˆfj©¤„d)¦Š Z© e°ñ “a5ž=¶ºÇ ÿP(£´Òšh¢¡^*i®—Ϊ襵êšë¬û믄ëë±ÂÞÚë­…¢@…\ɱÚa–ÀuÁ‚°ÃB*ê·¶Ë©­ÐŽ[¨³ã¦Û즺.ú,·î ŠÂäIɪžjñB r‹®¥ŽvÚn³çBkh¸É&|.±¬î¸ì :„úÝy¥‡>Rðp»Î†Kë§ãÊ«º•z3ÿü¨ÎU'ü‚”²9Ýj nÜ2Ðw7nìŽGùÏ-÷›¬ÝzÓ0¸u!á©g–nî¯ä¤—nº±rç³­cº´”49oèpÇ« ¸çŽB¸óîûîÀÿ.<ðÄÏ;ñ¼³¡ä"ïŠòÛƒnÝèÉšË×—áO¿À÷Ðo£0à‡/þøä—oþùáà„u¼à JÐMyèO/èæ8Þû4x´+Ž7 nÈ ˜p€$à ¨À&ð€„ ™€‡8´€eÀÄnŲM¡-&&YÆzD»„5+Q(`B˜Àº0‚Œ¡_(CžA-8BývµwŒøs öÿHˆ7¯‰ X W8ÃÂЉK|áW(ÅÆá‰P–ÝFç1ü©*†pBW2žEK…M¤"ØÀ6J±…jlãê€Õý{@ |ôç*í)+p’ ŸøF5ÒЉ‡Tb ™& aìÑ Dµ ±C¡ó™ýhÂ8²ŽŠ„ #E‰HB–r€gX„yÆEt¡í:W #Æ÷(³1 ‰…<$)uÅ&ê’—\$Õõ6wÑ ©êŠç\Å¿°‰+Z$0å%èËE²Ð“Ól¡^À<œ™Ðƒ4‰Œì²ç¿2*¡à‚ ÎpÍAÊØ4¤4?YÀ3ÔÑd=Ó\…$Sÿ…Kòï›bÛTŽ`† DÓ—î<¥¬ '8¡¡N ÎðKRf3q(ƒÜÀv«W†S$|!íÆÖAZeBhg L`P‚Leʆ# `f@@KyÍwÖ³ÅL¡ÂÈ“B;˜3'ȳŒÂ"Ò +o ll0 ¢0ÈS2p€BÐáºü—GÆÄŸ{ å®@®JM€• 05ˆ-J jˆ¦O•(G¬Uz%\qú™'¶aÉèêÙÎÕÔQ¶0ØýÆ•… À”ŒD`вÊ£êAk U†, ‹N å¡È#ì°´J•Ô Ð¸Fžÿ"2ñ³\_¹O“ÌáJ³C–ÙgÕN)à¢=mä¨7Iæ¢!È å½-LRÈŒLJ.9FV’­ªà à`Í^2Á¯¬#fÇÒÀ„ŠÎ ÷”^¸ÎõJÊœµ°#LkôŠÉ)b!Ø¥EÏkBƒ…lh‡z€âÚFøjR]A´Œhß0gº+ô0…´ÌÝ *u'|)ÜVD¡M0)ù­a÷Ô¿SO“p¯j)º©1Wb¹ôª-€Ųˆl‘Ï„WbxU .äySö¶’~ë•nGìaKñö8Ë\±ö®ÛÊÕ *Æñ”¢ÐÛdo Ö|' ê˜5osÿ92nö~Ì®6'мÉua—,6bfí¸ Ôñ0L/?y8¯Q13õ»_lt„ø@˜¡8e#Øa°ÅÕ~W.‚É$­^â¼'Ãú¶ëW¡ðŒÐòY·IMÔ<GOâAâý&Ê>¨œ(š™‰ó™C¶)Iú«¤1±ÙjË p:Ð0`)2èbW^g.ã¼–¿&°Ô¹‹Õå뫬¼ pl#°T—ñ˜½g–ó›8&3 Wÿ5¶mù:A×’NdXƒ(ÍDj~`³ÂÙÍ.a Ò7S,¸/ªÈ%›n(8·Ža8 “¢38©T’™íoÛÛÿc—åôÐ2½Ó]î" 4A`§jsL@0àÆÄv2#쎘º…ž¡JMôoã]õ)ÏÐÎŽÎl#jZF2ï¶]½kw ÙÄ9ÞòòF½‰nè@ ð8ªážø-÷]ña;ÉÕI ÃP]©<±)u]’€ÂtýºX!©qk4ô`<Ï('ôØ' 40r¬Ì€ÍãµIM³´fÎ]ñâ6’yžÙZ“Þ¢qAn­ººWo-Dáá-½æ5e`v|ûŽÜÆi€dÒÞ-tíä¨ÍìsÐm‰¨Ñ—]Àyq è¼€®¢+îȼ(”®“°ö*G—ÿÂ'>i¦§ÑôÓ, ê(µìʹ‰{~ûÌ•ùÝÎñîÏ®n²?`u€ó]÷“\w1m#lTƒG`þwvª%}Ï—@g°/žÅAC³4¤Qtø%RЃ`;ä+³‚a¶µZÄ#FC°‚F0-8é„àx½DiÄ@À/Þ•kºBTQ²WjÍô]u¶A4f2f@cfBC+‰ 4'PPÔ„JÄ?·x “,';òlå¢Tö&_„€d˜lè¥)ÏbUh`*p€…¼wH·¶39#Xis€#$FnS2ó%Yoã€ÇS¦TƤ.‰ÀVÀSáÿæD °zGÓ,CcØGâWcJH$¨…'؆TC\“2\ûF@-–+àâQbè}ˆw9t‹f“{{µBŽ´l±åe40tX[ǦØ—i“²9Iq‰b¤_eÃzù”z÷B‡~d*‚¢°w¹ärP;²e':ar è_yCwƒ²t¦èr•·Xlµ.ç²üWHÀ:/ö?‘gWøæ~ã•wƒÄgć:¶D€FéÆq„7´¢u}aÙ ÁŽ©Óg’¶¶èZe¨Š¡^J@¼‡l$±e6aØ …€Ú¦IÑ(´BŽÑÖôj<#7”S*ÀK{…cµ7¼ÿ¦`‡ŒÑSK/6=ŒÂ„YHHd–ÖvöW`ñ‘uØ@§V{Ä"„{t1ÇXo¾27éØ(jÈ’×H`, ¸VH˜9EýÃE¬è"D3ˆ”‰X_¶pô„L&‹p)(úöˆP™r 3t=q‰^§Š¦ÕCêBŽu@­åCáÇ+¶2v‚v@ÁV˜ú$Ý(g¥6Z7ö…àH‹í¨\/æ (( ÑuQQÉ8šG8#¹h>tBµ_ãå‹Ò´aÕ¶xxéåˆ,9@?Ç”ïgöÒ%‰up˜rs9È6@Oø…KyyîÂP—nŽ·-vç:&2Èç“ý˜9´2“‘ÉW;ÿèoã7öP”gCìwyy!%G’ ¹3@Ø_–²›¸@¶éœã+iD$eÊùP!³9ô±“ó÷O„Ù Y*àTk¸ƒaYe•2* à”é—w*@Wü%,¯“H3c¤ŽDf„¡¹BQš@˜‹Œòk@kùIHŸ&r&¤¶hQ‰9^æ.Fpƒ|'A‹?šäz‰¢oUˆ¦wÛ‚†öZ…ç #Ià8ˆò-@k‘7u •,G0@£ŽçS* Q4*Ä(þ„8óh"óF B¥wQxðlà¡s)2%à\ªœË™@EÀ}#~W–*®ÿx„ã£ÁR-ðzW”¼™°ЩÚ¡N@[SüV@@à(—@$!EqT% ‹›ä. À(`qW­všÔ7>ƒ*H@XeµÂkµáß^·‡p ªÓùT§ mº×iÔTHÀ/ZK­Š‚IDÇéC¸­‰Y^§}^9@Q ×5xx?ñæ É HJ+DMåªg¬"öFú_7V‰Bò¦£E)ƒDùšfÑ÷™Ôj@ÐË’knæ®…7êyïR4Ô^g“6®˜…\V°Yð)›X5Wö°ê“$ƒBÔŒ ‹¯Ê ³Og(ÿxÃBnØé|h„˜ô`Ë2(áú€Š@FÛ›…líDB€A©8 ±D’ˆ÷<ã"H·Zðô•—ʵ];@L»(ŒËÖ~ª(¥³?,¦„-#HÑö¶p·o r[·+i·q 9°PB°/0¶øXd+‹‚RD”^#ƒ(pŒË¸û¸ë¸”¹•[¹+¹–‹¹—Ûm²;Yze1VÊp5axTûO—Ö˜f§l{B°ûº*w°–)”?臬ªEÛ»¼û»*ã»Á ¼™Æ=¥õ¢Žùy¦+D‘eÁ•OUÃ\˜ö-”}(Y¶l‡¸Ñk½)«ÛÊhÿE$FZš4%s¾ÊW,£‹›èkc°j¢R__txX’·1©sÞi’.Ö®E”¿ÝÆEð((0s!q×y3`’¤[í«}—f¾éû¾ýu¢ܽÜW`V=»  `¤Í%ˆ•PÙ”Ø;Y%¸ÙÛ§ À"б“ºÀ¡E%{“OÛe†–jx˜Ãêމ À)Æ“³×!>Ài9§³ÄLÜÄNì8@†=#Ú‰™®Rc@/ 2÷Å`Æb<Æd\Æf<Ærð03°Pņ±Áj‹/t\Ärç³x\Çj{ÇzÌÇv¼ òÆ~  Ú“€üÇyŒÈ}Ö|È{ÌÈ~Üȉ,ȱ“Çèš–|ɘœÉš¼ÉœŒÉAL€0>0Ç}xÊ¥VɪŒÊ«œÊ¬üʮ˭<˧<@0È#q pÐɾüËÀÌÂìÆ=€ËyX¥lÈÃÜÌÎüÌ®ùÆ"P) ˆÀË´,ËÚÜÍÜüÍÛÎÞ|Œo<!mpÙ ÍìÜÎî 3@°Kc°ÎïœÏú¼É3)ÐP!PÐ}ÐÐ ½Ð ÝÐýÐÑ­ÐIȬ;rmagick-2.13.2/doc/ex/images/Button_L.gif0000644000004100000410000001146112147515547020125 0ustar www-datawww-dataGIF89ax÷ŽN”–””FD.ÎDNDL&$n<.$Îd F$ŽD>îlV$Äb\®TÌÎÌ & ljlL6,dÎd,N,žL¬VT f4>$ 6lîl$^,ärl,&îìêì,ª$N$^,T®T~<4>4>^¼¾¼œNLÞ\^\\.,ÞlN$DŽDþt.  |~|l64lÞlLžLüz|> * TVTT*,V,Üjl¾\ÜÞÜ*trtLF4ªL¼^\4n4<>,tþtüzt.üþü¾æN$ žN¬®¬”JDLNLT*$~,*,Òd’D > îtÌfdÔÖÔ*lnl\>4dÒd4N4¼Z\n4,>,,^,ìrl,*þìîì<®^,\¾\<~<<><>|><^ÄÆÄællælÆ\>|þ|þ|ªT¤RL. âD’D N$ V,!þ0Creator: PolyView® Version 3.62 by Polybytes ,xÿ£¸'H*\Ȱ¡Ã‡#JœHQa$cjˆåN9 HdH'#E¢<èäI'%I²4)²æK—*YÂ܉“gI˜:Öl3§Íš)K¢©sè@ŽQâİÓæÐ–(¯fEª²+V•[?ìê¬Ð±d³îDºv­X›hKu;T,Pw6šÁA2%Ê­Y –k0aÈIþLø,Y¹Š «ºØèd³‹S܉# +7ªŽ•K”rÛ˜@é~=Z÷ì×Âp¿µ›zui™ } 9·§Q Œz¦ß•–‰NN;YçqäËiÆmÎõg[ç­J÷ ö¥v'âìÿá§<@YƒR®îº:칤M5,ÿ4Ö÷ïãÓÖýýêÛC!EyåµÈKÊõ%“Q ¶–TO8ÝfZ„ ÒU„ÒõEØ`II§1”QÞšàCU]M—Xj¥Öbv*˜^n2æ†`m/޶â~ѽ%YIP@àˆpàCP°iw•|ºÅŸ“ë-~ü‘–Ÿ{\­åaH€@âåI[ €0€Ç™xx€æšl¶éæ›pÆ)gšgª¹¦q&r;¸µUW]øåˆFî`ƒbCŠ6º¨¢6(Êh¤6,Ji—B:© ˜Jª©£Œ6Ú©¥ Bjj¥žRÊiª‘nêLøÿXÙN9(Rð¦¨VJi¦¾žªê°½þêh¯úÊ믿ŽÚ*±É2kl°¨ª\?zës4à(«“ûè¸än:j¸æ¢º©ªž*ì§ã²zj¸ž~Áƒ–I9Q+˜$Ž@¯œ"+ð·Ó&KðÁÅ òî¨Ïûíºê²Ûª»Û€B8Ö´/·Z1Ȱ ^úlýš o¹¢ž|챓Ò묩+OËì·~´‘¢r]n;¢?;pÂñ ,sÌ@“p¤îÝiÅFœn¤xXå] ûn{…Á “š5¼G“ŒnÊWêò°-s q©%'M0,¶1˜x í³ÑKÏ=p£ÇLpÁLgÿ­4² Ï]· K¾¥­ #Æ´Ú?ëëãC­äÐÊ\vÚ[ M,¥*ô¤ÒÛCƽò¹~Où騧þ¸¨#C».ÀLóšî·*DSÕp‹»÷å*ôî{*/|ðÄo|ñÈûÞ»ÐôõºI·lCíÊ)×—¶&žtë1ËÑÃ߃/þøß‡ÿ„øæ“¯>ørdÎ=¹]ë.È„OGµ`(úÒ“7©÷çßúʇ¾ó€ŸX4`½«ÑRXà:ç \HpcÜÃR%ðð€4`ÃGBñÉ!~¦‚æô¶©®­~ÑþÇ1ÅEërÁjTÈCúÐ|é` ÿ ؾbÍÌR"ÓTÄ’µ¬NÏ'Ù¹žÎʳ¿°ñh6 8Ärñ‡&d]ÚG2÷ÉMŒÏ"œ¬dHCý=0…`»èÊð‹è;aÑÔ¥6Øñ~b3õ,ô¶/@t[ÕÀµC!ã,踖%X%²Jf–kÝ:Ùâ„­2qNShd˨Ì%˜µ¬OX‚ F§7c©ðˆÒԥȖÉ#¡Òµ¨BéÏ"¥ˆД=Ð,µ¢ªÂƒÿÖÖ¥s”-µs’OæN§ìÊ›ì~jYÌâq [([ŠX¯ §¬Ý'SjH<˜ó°—ûlkOYÖïm …eÌLÖ:bÍr&]¾f¸-¾o”•+Öv™šÀ<A‘•;ÚghPtþñ‰f1\JC·=ˆ½Ž«Ú®L÷I@û+pþ£›DÙ*RU5Ô1Ÿ|l4{jTǵ–Ž‘tðH79ÕiÍO§ d¨l†‚K*ì¼Ê5q××Oð¼€<ðâ$ºR°­°W‹uh‹á HŸê8²Ó‹€$·)>û2©þñsA.jh½¬n WáwíuˆÂ<Ÿˆ È-c.¯KDây…Õ´ÜoÿŠDö¬B%,3D€¾Ct0,ÓšZ´Q4*Œ+LûÎýÓÄžÔ^ChGï1T ©Í–¹T•-ŽÍ²ug‹ÅtJkzÅå._Ÿàd`Í/r}k5?+×fÈî-ó`ÑF/3š‹y𙓠ciâPš×})’D’³Ó®•ÏiÝÛ‡o­¾¿ICU¿‹°ßØœ›êÕJgÖÍmì–86P×øÞ÷õl”v[ü"4U›Z&3+ÞFÔÂo¿©5ze>nðV,¿¦†cÄo®qÙDŠ*ï*™…5ËKVy 1Gú(YNϬò¼4K²­¿ü¾¬íYS0ž›Œc©ž˜Ó~¤*Ð ?êݨ±vãØ¨ZÎbbÊÎdÝg½tŠIPñT•à+SÖ´Ð_Û:B½Õ—gEN‹Õ§Z´=óÖ#ôt肜Î)§û ¿„ï5ä²Óûvxz+¹ã¨$7Ù’_*§9‰ë"mÏÝ»xaÍωü)ÌøÈÚ'[\ålÞÿm8/Ö΄&ÓðHå¶û¢×{ë4vòß›&Z±»ut?ª]ˆ-¤)Z]eÐÃv3†J™Iäæt»vläµI'“l×°Æ=VU79UY ÆCá†oþVmDC.@_ðÂU2œ¤ÍÄ/µn‡Aðò~ÝWBަcuwd1cgÏÖv³[SSlC•Kø§Kx÷SJ–py^htT)6á2 ð=!(0©å,R÷')WhÕ:ge0n°e@¸ZFÅ|xp|çg0…v51éåÔW]`Ç_ñó+ïG{áSj#öw:Æ@6 g`JD€_pLô†rÀGd³“x4AàÿvYƒýÆ„€×43ðâvTÈV/•{×…–o¥ÃoHq%¢t2u—)õ† t€üK¹eE cåK ³Ffµ$\y+gp¥W…vøˆ¨´>z(0Ÿ5y•âM@{MP†?µbY?ˆH:7‰ªå‚y@7–€æEb6°ö¨MO@ã”sôügÓ˜DNãJa#xáˆ@3\ôÿgNEð¢Ö2Àž’hœÄFW‡Ôov@j³bœ7ðâ?p‘…(KuÆca‘ƒÂzA˜“ÁEo®‰‘ˆ„’ulÐòoàŽD…÷.‚Ô3kXùFÙ5,í‰yøq¢5a gPGÁß7X‹u>øn>Un~˜Nkf1>„p_¼¸€#P `(Ià-.cNRÇ#Ù¶z«ã jߢLÜa[ŠH˸˜N¸™K&>D@r&|60k÷(n$(@:HÆsri6pÛ8ŠX3¯xL•É•o÷ÿDÌwT›¨œ£^-±›ÙÃz$¸k¢„*@Y ˜4f"€JÀ—~ _U !Œ4ÆWK@†õu½¸´‘… tpÏ5*EPJ€"ðˆÂ b!@yg " šcfÞù2ÀŒ›uÒfßq’×S‹) פ¡FxªIÎù=b  -aµäfEùNGù|y¥C¯µ£Á$›M…¢¤gHé7õƒî‰A±v›óg"Àd/ˆ¢RÚWd:D€q¼¨wŸÃ^¿å_=H¥¥§Ô¤aV•¯õúè7•Cê!pÏdC¬˜4r„GuÊu§X¦†@%žáÿ‡00D(KO÷?ªY¨)¦<úED€ EŠã2qÕ“…í%a(4,½t©ü4¦´¡Ù$~0‚¥T£!p¤ù\gö?~¥y`v ×Csš@!À€÷:'5˜yÁ÷z(&0qZ>dõAКyÏêAÒºEÏê¬25­å“…Ø¥ ™FS÷PEdLJr®êZêÚ®íÊ®îê®ð¯ëJ¯ï¯g:g0 zœ4½Š „–œEtt'8!óUa9;1ir7µ˜K؉¥±|‡‹ÃXš®gD›óiüu:l‡±ÕvDˆÅ £¥Ј¬j‡}4(sÇ<†`ƒ²ËêB·)(ÐÚÿA«åQ ù2Ɖ»æ°<ë³ä²vD[‡6ÇS6à4QC–@9múŠW %Œ{3a£G†%e.~"®ÛœÊçfWÇv0Ãxüu¶uÉt¬(U ÀY"CªG$ `–ræ@Ñ&8÷7Y\HKa‡· ;~«(3p0üGWå1@Pšu$F‡]Ö|dWi{ä(|Ph`!*‘imdz‚ª3º¤[º¦{º¨ 9JÀ\öC}(8\Px°Ês»¸›»º»»¼Û»¾û»¸‹x \pPq«UÔ¥¸ÛÒ¼(˜=ÐËU?8®Ó[½Î½Ô{½Ç{º¦Õûƒs⋽Öû¼Ò«½ÙK¾ç+¾æ;T "[AðXŠ;¿ô[¿ö{¿ø›¿õk€1`qH0 \µ¾Œ¾ã«¾\À¼À@à¾`$ÐHšÀÌÀé[¾¬Á|Àbv€Qgú{Â(œÂ*l¿b²+ qƒ"¿4œe6¬Ã@ÜÃc$7°1>`¼+¼ÄLÜÄ+ 0aZ@N|ÅXœÅ‚+`ÄPlàd\Æf|ÆhœÆj¼ÆlÜÆnüÆpŒÆG"¬;rmagick-2.13.2/doc/ex/images/Button_A.gif0000644000004100000410000004333012147515547020112 0ustar www-datawww-dataGIF89ax÷ŒŽDŒ|dfl $lrä ln446<üþüüþt¼¾\œžL,FD\,.F” .DjÜ >d,*,Z¼ljÜ ÜìêìLNœ¤ªT|~|tzü\,.L,.<ÔÖÔ<äæl.\< ”’DœLN$L&&L¼¾¼fÌ<6lÌÒd\^\.,, 6TdfÌ.\\f<,>4ìît<|DJ”trt L$&Lzü<>|,*<\Z¼ü¼\^,ÌÎÌ<><,R¤üþ|ä,.\<>ljl¬®TÜâllr4J”^¼ìîì |zü <<!ù!þ0Creator: PolyView® Version 3.62 by Polybytes ,xþyðàÁƒ rh E -ZhÑ@‹Z´Ð¢€-´h E -ZhÑ@‹Z´Ð¢€-´h E -ZhÑ@‹Z´Ð¢€-´h E -ZhÑ@‹Z´Ð¢€-´h E -ZhÑ@‹rªðàÁƒ|øðáÇ>|øðáà EvìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vì8Àá(JGQEqd@ þ=1ôèÑ£'†vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØYÒ#P7zêÑ£G@=z ÔÃÍ;vìаcÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vD‰ÅQGQ¢8r€=zôÄÐCvìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽv준ѣG Üôä&P 7¹éÑ£"vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vþìØ±cÇŽ;vìØ±cÇŽ;vDq%JGQ9‚ †žzôèÑ£'† ;vhرcÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vŠ” ä¦G@=zôèÑ£G=zêˆ;vhرcÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;¢D‰â(J”(Qp˜@=zô艡G;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;F ôèÑ#Pzê¨G zþrÓ£‡;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇ ;¢8Š%Š£(Ž™CO =1ôèÑC†;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±c‡†@zêÑ#›@=ÜôÔÃM nõè(€;vhرcÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽQp8r%Š£(Q G=zôÄУÇ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cþÇŽ;vìØ±cÇŽz¸ ¨GzrÓ£G zêèJ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽQE‰ÅQ”(Ž ˆ¡'†žzôè‰!ÃŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±c'…Žzôp¨G =zê¨G@=zrˆ ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽƒ(Q¢8Šâ(Š£(&УG=zbèÑãÀŽþ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìаcG‹=õè(P7zôä¦G 7=õèÑÃG ;4ìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±CÃŽƒ(QE‰â(JGÄÐCO =zôÄaÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ¡A¨G@nõèá&Pzê¨G@nõèÑ#‚;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;þvìØ±cÇA”(QE‰â(Š#èÑ£G=1ôèq`ÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;4ìØ©ÄM =êÑ#P@=z¸ Ô£G z Ô†;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇAGQ¢8Šâ(Š#Hb艡G=zbȰcÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìÜȨG =Üꨇ›@=õÔÃM =z¸ TF†;vìþرcÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±ã J”(Ž¢DqÅ‘€ôèÑ£'†žzô8°cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vjTèÑ#›zrÓ£G =õp¨G@nõèÑ£‚;4ìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìа㠊£(Ž¢8ŠÅ‘ 1ôÄУG=1dرcÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ!XôþÔ£G zê¨G 7=õÔ#P@=õth;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØq‡£(Ž¢8ŠâÈ@zôèÑCO =zرcÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±CÃŽD]õp¨G 7=õèÈMzôä¦G@=Üêу ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØq%JGQE‰â€zbèÑ£Gž2ìØ¡aÇŽ;vìØ±cÇþŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇ΃C=õèÑ#P=¹éÑ£G =õ訇›@=zêá;4ìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vì8ˆ%J”(QEÁa =zô艡'†=ìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìаcÇŠ=zôä¦G@nzꨇ›ÜôÔ#Pz¸ Ô#;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;4ì8ˆâ(JþGQ¢8rd@ =1ôèÑ£GO vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±sˆ›@=õÔ#P@@zê¨G@=zêá&PzôèQÁˆ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vD‰â(Š£(Ž¢Dq€=zôèÑCvìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ¡ñ%PÜôèÈMZ2rÓ#P@=¹é¨G nõTæˆvìØ±cÇŽ;vþìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vD‰%Š£(Q¢8‚ †žzbèÑ£'† ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vì$‚Ñ£G zêÑ#Ÿ5@zô訇›@=zê¨G =zê1ÀŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;¢8Š%Š£(Ž¢˜@=zô艡G;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vì<`Ñ#›z¸ Ô#Ã#(zþêá&P=rÓ£G Üôè$…;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;pDqÅQGQACO =1ôèÑC†;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇ ;ŠøôpÓ#Pzô$…",zêÑ#P@nzôÔÃM zêQÄŽvìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽQ¢D‰â(JGQ G=zôÄУÇ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cþÇŽ;vìØ±cÇŽ;d<ôÔ#P@nõèAˆ†Dzôä¦G =ê¨G =¹éQ†;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽQEq%Š£(ŽLˆ¡'†žzôè‰!ÃŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇ%õèÑ#P=z”)b‡ =zêÈM@=z¸ Ô£G zôðaÀŽvìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽƒ(Q¢8Šâ(JGУGþ=zbèÑãÀŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ¡aÇN nzr¨‡›@=zT€`ÇŽ,zôÔ£G 7zêá&P 7=zêqÆŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±CÃŽƒ(Ž¢Dq%Š£(ÄÐC=zôÄaÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cç‹=zôè(P,\رcÇD=z¸ Ô£G@=zêÑ£Gz¸ ÈŽ;vìØ±cÇŽ;vìØ±cÇŽ;þvìØ±cÇŽ;vìØ±cÇA”(Ž¢Dq%Š#èÑ£GO =1ôèq`ÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vhر“¤K@=õä¦G0Ù±cÇŽ/=zê¨G nõÔ#P@nõpsÀŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇA”(Q¢8Šâ(Š#HbèÑC=zbȰcÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØIãÃM@nzê¨G3vìØ±cÇΑ-=õp¨G zþ¸ ÔÃM =õà#ÆŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±ã Š£(Ž¢DqÅ‘€ôÄУGžzô8°cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽvìØ™Ð#P=õèÑ£‡vìØ±cÇŽ¢!=zôè¨G@=zôè¨GÜôð@Æ ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±ãG”(QEq% $zô艡G=1dرcÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vjèèþÑ#P@=ÜêÑ£‚;vìØ±cÇŽ =zêá&P7zêÑ#PzôøBÃŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØq%JGQ¢DqÅ@zbèÑCO =zرcÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;4°èÈM@=zêÑÂ;vìØ±cÇN¢ Üôè¨G Üôä¦G =õð`ÀŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vhØqÅQ”(Ž¢8Šâ€zôèÑ£Gž2ìØ±cÇþŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±c‡†z¸ Ô#P7zô’ÈŽ;vìØ±cÇΗ@=êá&PzôèÈM nõ8cÇ ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vì8ˆÅQ”(Ž¢8Šâ =zb艡'†=ìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ‡õè¨Gzô`ÇŽ;vìØ±cÇΑ'=z¸é¨G@=õÔ#Pzô ÈŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽþ;vì8ˆ%Š£(Ž¢Dqd@ =zôèÑ£'†vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cŸ=õä&P=X±c‡†;vìØ¡aGL—zê¨G nõp¨G z¸9`Ç ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vD‰ÅQ”(Ž¢8r€=zb艡GvìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±c‡‚Üô訇›@=¶ˆ±cÇŽ;vìØ±cÇ΃=õpÓ#›zêÑ#›þÜôèBÃŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽvDqÅQGQ9‚ †žzôèÑC ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vhØ¡‘#Pzê¨GmìØ¡aÇ ;vhرc§=ê¨G@=zêÑ#P@=zIaÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;¢D‰%JGQ¢8@=zôÄУ'†;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ1£G z¸ Ô£GìØþ±cÇŽ;vìØ±cÇH—ÜôèÑ#›@=Üê¨G =õp`Ç ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;¢8Šâ(Š£(QACO =1ôèÑ£G†;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìü¸Ò#P7zôä¦vìØ!aÇŽ;vìØ±cG‹=õÔ#Pz¸ ÔÃM nUH`ÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽQ¢DqÅQGQL G=zôÄÐÃ;vìØ±cÇŽ;vìØ±cþÇŽ;vìØ±cÇ ;vñ ÔÃM zê¨Ç;vìØ±cÇŽ;vì°C"E€zrÓ£G =õè¨G@=z°HcÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ8E‰ÅQ”(Ž ˆ¡'†žzôèÑ#ÃŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;E|ôÔ£GÜôèä@5jÔ¨Q£F5jÔ¨A&G nõÔÃM nõè¨G z  a‡†;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽƒ(Q¢8ŠÅQþGУG=zôÄÐãÀŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±CÃŽ#CõèÈM @=zêQƇ†|øðáÇ!>|øðáÃÇ•zê(P@=õÔÃM@nz1`ÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽƒ(Ž¢DqÅQG&ÄÐCO =1ôè‘aÇ ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇN-=zêÑ£‡›@=zêÑ#PzôèÑ#Pzôèá¦G =z¸éÑ£G=z¸ Ô£G =z<°cÇŽ;þvìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇA”(QE‰â(JèÑ£G=zôÄp`ÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇÎ2ÜôÔ#PÜôä¦G =¹ Ô£G nõÔ#P7zêÈM@nõè¨G@=zð1b‡†;vìØ±cÇŽ;vìØ±cÇŽ;vìØ¡aÇAGQ¢8Š%Š#Hb艡'†žzôȰcÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìаOzêá&P@=zêÑÃM =õp¨G =ÜþêÑ#PzôÔ#PzêÈM@=|±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±ã GQ¢8Šâ(Š €ôèÑ£G=zô8°cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±sÀG z¸ Ô£G zôÔ#P@=õÔ#PzôÔ#P@nzrÓ£G@nzrÓ#P@nz|±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±ã Š£(QEqÅ$1ôÄÐCO =1dرcÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìˆÉþÑ£‡›@=õÔ#Pnõp¨‡›@=Üêá&P7z¸ ÔÃM zôÔ#P@=zê¨G@=Ô°c‡†;vìØ±cÇŽ;vìØ±cÇŽ;vìØq%JGQ¢8ŠâÈ@zôèÑ£G=zرcÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìȨG@=õp¨‡›@=zêÑ#PzôÔ#PzêÑ£G =õÔÃM =õä¦G 2„ aÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vhØqÅQ”(Ž¢Dqä€zb艡'þ†ž2ìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇ ;bê¨GnõÔ#P@=zêÑ#PzôÔ£G =õ¨G 7z¸ Ô£G 7=õ訇›@=*$²cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vì8ˆÅQGQE‰â =zôèÑ£G=ìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;5*ôä&P zôÔ£G=zôèÑ£G=zôèÑ£G=zôèÑ£GzôÔ#P@=õÔ#P=ɰCÃŽ;vìØ±cÇŽþ;vìØ±cÇŽ;vì8ˆ%Š£(Q¢8rd@ =1ôÄУ'†vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ%‡õèÑÃM zô¸âÇ>|øðáÇ>|øðáÇ>|øðá£G7zôä¦G@nzrÓ#P ø±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vD‰%Š£(Ž¢Dq€=zô艡GvìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇN >=zê¨G@nzôräH#5ŽÔ8RãH#5ŽÔ8RãH#5ŽÔ8rƒE =þõèÑ#P =õèÈM=|±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽvDqä(JGQ¢8‚ †žzôèÑC ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ¡aǃ@nzr¨G =z´±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ€¨G@nzêÑÃM zêÑ#P7¾Ø±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;¢àpÅQGQ¢˜@=zb艡G ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±#E=õè¨G =Êþ°cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±ó¥G zr¨G nõ¨G =¤°CÃŽ;vìØ±cÇŽ;vìØ±cÇŽ;¢DqÅQ”(ŽACO =zôèÑC†;4ìØ±cÇŽ;vìØ±cÇŽ;vìØ© G =õèÑÃMÄØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØIã£G@=zôè¨G =Üôèá¦G ‡(رcÇŽ;vìØ±cÇŽ;vìØ±cÇŽQ¢D‰ÅQ”(8L G=zôÄУÇ;vìØ±cþÇŽ;vìØ±cÇŽ;vìØ±(›ÜôÔ#PmìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØP¡G 7=õä¦G@=õÔ#P@=‰±cÇŽ;vìØ±cÇŽ;vìØ±c‡†Q¢Dq%Š£(ŽLˆ¡'†žzôè‰!ÃŽ;vìØ±cÇŽ;vìØ±cÇŽvèÑ£G@=z¸ Ô£vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØù¨GnõÔ#P7z¸ Ô£‡›@@jرCÃŽ;vìØ±cÇŽ;vìØ±cÇŽþƒ(Q¢8Šâ(JGУG=zbèÑãÀŽ;vìØ±cÇŽ;vìØ±cÇŽ;vd”é¨G zêÑ£!vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ9â¡G zôèÈM@=zê¨G@=nرcÇŽ;vìØ±cÇŽ;vìØ±cÇŽƒ(Ž¢Dq%Š£(ÄÐCO =zôÄaÇŽ;vìØ±cÇŽ;vìØ±cÇŽ#'zêá&P7zôÄ¢ˆ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìˆ9Ñ£‡›zêÑ#P@þ=õèá&P0Ù±CÃŽ;vìØ±cÇŽ;vìØ±cÇA”(QEq%Š#èÑ£G=1ôèq`ÇŽ;vìØ±cÇŽ;vìØ¡aÇŽ2eõÔ£G@=õè;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØyУG@=¹éÈM@nzê¨G WŽØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇGQ¢DqÅ‘#Hb艡G=zbȰcÇŽ;vìØ±cÇŽ;vìØ±cGL—@=z¸ Ô#P@nz`ÇŽ;vìØ±cÇŽ;vìþرcÇŽ;vìØ±cÇŽ;vì(Ó£G@=zê¨G@=ÜêÑ£G |ÄØ±CÃŽ;vìØ±cÇŽ;vìØ±ã J”(Ž¢Dq%Š€ôèÑ£'†žzô8°cÇŽ;vìØ±cÇŽ;vhرc‡ƒzêÈM=õp`ÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìˆÑ#P@nõÔ#P@=õÔ#›>رcÇŽ;vìØ±cÇŽ;vìØ±ã Š£(QEqÅ‘ 1ôÄУG=1dرcÇŽ;vìØ±cÇŽ;vìØþÃ'P7zôè¨G @=¤°c‡†;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vì éÑÃM zôp¨‡›@=z¸ Ô#P@_hرCÃŽ;vìØ±cÇŽ;vìØq%Š£(QE‰âÈ@zôèÑCO =zرcÇŽ;vìØ±c‡†;vì¹q¨G =õÔ#›=‰±cÇŽ;4ìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽvìpÓ£G@=Üê¨G@=õèÑ#P@رcÇŽvìØ±cÇŽ;vhØq%JGQEqþ€zbèÑ£Gž2ìØ±cÇŽ;vìØ±cÇŽ;4”éÑ£G =Üê¨G@ìØ±c‡†;vhرcÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vùè¨G@=zꨇ›@=zêá&P@’رcÇŽ;4ìØ±cÇŽ;vì8ˆÅQ”(Ž¢Dqd =zôèÑ£'†=ìØ±cÇŽ;4ìØ±cÇŽ7êÈM zôp¨G ŒØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;4ìØ¡aÇŽ;vèá&P@=¹é¨G@nõÔ#›þ‡ÚаcÇŽ;vìØ±cÇŽ;vì8ˆ%JGQ¢8r @ =1ôÄУGO vìØ±cÇŽ;vì°cB=Üꨇ›@=õèá&P2HرcÇ ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;‰|ô¨‡›@=õp(P@=Üê¨G@ аc‡„;vìØ±cÇŽ;vDqÅQGQEq€=zôèÑCvìØ±cÇŽ;vìØ±³E=õèÑ#P=zêÑ£G@[(²cÇŽ;vìаcÇŽ;vìØ±cÇ ;vþìØ±c‡„@7zôèÑ£G@=zêÑ£G=õèÑ£G =|„H`ÇŽ;vhرcÇŽ;vàˆ%J”(Žp82 †žzbèÑ£'† ;vìØ±CÃŽE5°ñÑ#›@=zêá&Pz¸ Ô#P>øÜÐP£F#vìØ±cÇŽ;vìØ±cÇŽ;FªqàA…+zr¨G@=Üê¨G 7=zêÈM@nðy@F‘;vìØ±cÇŽ;¢D‰â(Š£(Q9@=zô艡G;vìØ±cg¡ >ôä¦G =¹ Ô£G nõþ訇›@=zêáà >9ìØ±cÇŽ;vìØ±cÇŽ!0`ÀðÁ¢G@=Üôè¨G 7=õèÈMzrÓ£G =õèá BìØ±cÇ ;¢8ŠÅQ”(Ž¢@CO =zôèÑC†;vìØ±C¨G=õÔ#P@=zê¨G zê¨G zêÑ#PBvìØ±cÇŽ;vìØ±cçˆzôÔ#P@=õè¨G zêÑ#Pzê¨G zêá&PvìØ±cÇŽQ¢8ŠÅQGQL G=1ôÄУþÇ;vìØ±C¨G Üôä¦G 7=¹éÈM@nzrÓ#›ÜôÔ£GBvìØ±cÇŽ;vìØ±c§†nzrÓ#›Üôä¦G 7=¹éÈM nõp¨‡›@=ÜêÑ£G #vìØ±cÇŽQ¢Dq%Š£(Ž ˆ¡'†=zôè‰!ÃŽ;vìØ!Ô£G =õè¨G@=zêÑ£G =õè¨G@=z¸ Ô£!;vìØ±cÇŽ;vìØ±SÃGzêÑ#P=õè¨G@=zêÑ£G =õè¨G@=zê¨Gþ ;vìØ±cÇŽƒ(Q¢8Šâ(JGУGžzbèÑãÀŽ;vìØ!Ô£Gzê¨G zê¨G zê¨G zêÑ£!;vìØ±cÇŽ;vìØ±SÃG zê¨G zê¨G zê¨G zê¨G zrÓ£G ;vìØ±CÃŽƒ(Ž¢8Š%Š#G&ÄÐC=zôÄaÇŽ;vìêÑÃMnzôpÓ£‡›=Üôèá¦G7=z¸éÑÃMnzôèу;vìØ±cÇŽ;vìØ9â£G7=z¸éÑÃMþnzôpÓ£‡›=Üôèá¦G7=z¸éÑÃMnzô訆;vìØ±cÇA”(Q¢8Šâ(JèÑ£GO =1ôèq`ÇŽ;vìêÑ£G=zôèÑ£G=zôèÑ£G=zôèÑ£G=zôèу;vìØ±cÇŽ;vìØ©á£G=zôèÑ£G=zôèÑ£G=zôèÑ£G=zôèÑ£G=zôèÑãˆ;vìØ±cÇAGŽ¢Dq%Š#HbèÑ£G=zbȰcÇŽ;võèÑ£G=zôèÑ£G=zôèÑ£G=zôèÑ£G=zþôèAÈŽ;vìØ±cÇŽ;vìñÑ£G=zôèÑ£G=zôèÑ£G=zôèÑ£G=zôèÑ£G=zôèQÃŽ;vìØ±ã GQEq%Š €ô艡GO =1ô8°cÇŽ;võèÑ£G=zôèÑ£G=zôèÑ£G=zôèÑ£G=zôèAÈŽ;vìØ±cÇŽ;vìÔðÑ£G=zôèÑ£G=zôèÑ£G=zôèÑ£G=zôèÑ£G=zôèQÃŽ;vìØ±ã JGQE‰â( $1ôèÑC=zdرcÇŽ;9u!þÔ…PB]u!Ô…PB]u!Ô…PB]u!Ô…PB]u™@ÃŽ;vìØ±cÇŽ;vŽ  Ô…PB]u!Ô…PB]u!Ô…PB]u!Ô…PB]u!Ô…PB]u9bÇŽ;vìØq%J”(QE‰âÈ@zôÄУGžzØ¡aÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìpÅþQGŽ¢8rä€zô艡G=ìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vì8ˆ%J”(Q¢D‰â =zbèÑCO =ìØ±CÃŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽþ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽvì8ˆâ(JGQEqd@ =zôèÑ£G+vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;v8ÂáÈQ”(Ž¢8r€=1ôÄÐCO 4ìØ±c‡†;4ìØ¡aÇ ;vhرCÃŽvìаc‡†;4ìØ¡aÇ ;vhرCÃŽvþìØ¡aÇ ;vhرCÃŽvìаc‡†;4ìØ¡aÇŽvìаc‡†;4ìØ¡aÇ ;vìØ±c‡†;vŠDq%JGQ¢8‚ †=zôèÑ£G“vHرcÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;4ìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±CÃŽ;vìØ±cÇŽ;vìØ±cÇŽvìаcÇŽqEqÅQGQ¢˜@=1ôÄÐCO FìØ±cÇŽ;vìØ±cÇŽ;vìØþ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ‘"8E‰%Š£(ŽACO =zôèÑ£G 4ìØ±c‡„;$ìØ±CÂŽvì°cÇŽ;$ìØ!aÇ ;vHرCÂŽvì°c‡„;vìØ±CÂŽvì°c‡„;$ìØ!aÇ ;vHرcÇŽ;vHرCÂŽvì°c‡„;vìØ±Cãš(Q9r%J”(8L þG=zb艡'†ž=RˆØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇ ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vì°cÇŽ;vìØ±cÇŽ;vìØ±cÇŽ;vìØ±cÇ ;vìØ±cÇŽ;vìØ±cÇŽ;vìØI¢Π(ŽáˆâÈ‘£(Ž ˆ¡'†=zôèÑ£GOŒpÈ S£F5jÔ¨Q£F5jÔ¨Q£F5jÔ¨Q£F5jÔ¨Q£F5jÔ¨Q£F5jÔ¨Q£F5jÔ¨Q£F5jÔ¨Q£F5jÔ¨Q£F5jÔ¨Q£Fþ5jÔ¨Q£F 22¼Àa¢‡Ë (Q¢8Š‚Ã‘£(&УGžzôÄÐC=1ôĸ°gÏž={fìÙ³gÏž={öìÙ³gÏž={öìÙ³gÏž={öìÙ³gÏž={öìÙ³gÏž={öìÙ³gÏž={öìÙ³gÏž={öìÙ³gÏž={öìÙ³gÏž={öìÙ³gÏž={öìÙ³gÏ&zôèÑC—AQ¢8ŠÅQ”(ÄÐC=1ôèÑC=zôèÑC=zô艡'†=zb艡GžzbèÑ£'†žzô艡'†=zb艡GžzbèÑ£'†žþzô艡'†=zb艡GžzbèÑ£'†žzô艡'†=zb艡GžzbèÑ£'—AQ@8ŠÅ‘#HÄУGO =zôÄУGžzb艡GžzbèÑ£GžzôèÑ£'†=zô艡G=zbèÑ£GžzôèÑ£'†=zô艡G=zbèÑ£GžzôèÑ£'†=zô艡G=zbèÑ£GžzôèÑ£'†=zô艡Gž+$Dq%J?röÄУGO =zô艡'†=zôèÑC=zb艡GžzbèÑ£'†žzôþ艡'†=zb艡GžzbèÑ£'†žzô艡'†=zb艡GžzbèÑ£'†žzô艡'†=zb艡GžzbèÑ£'†žzô艡'†&+pDqEM!€M„èÑC=1ôÄУG=1ôÄУGžzôèÑ£'†=zô艡G=zbèÑ£GžzôèÑ£'†=zô艡G=zbèÑ£GžzôèÑ£'†=zô艡G=zbèÑ£GžzôèÑ£'†=zô艡G=zbèÑ£G=ÞàˆâèföèÑ£'†=zôè‰þ¡'†=zôÄÐC=1ôÄУGO =1ôèÑCO =zôÄÐC=1ôÄУGO =1ôèÑCO =zôÄÐC=1ôÄУGO =1ôèÑCO =zôÄÐC=1ôÄУGO =1ôèÑCO =zôÄÐCžÞ€P²ƒ@‹ň¡G=1ôÄУG=1ôèÑ£GO =zôèÑC=zôÄУG=1ôèÑ£GO =zôèÑC=zôÄУG=1ôèÑ£GO =zôèÑC=zôÄУG=1ôèÑ£GO =zôèÑC=zôÄУGþ=1ôèÑ£'†=z.¼1Q…U1ÑC=zôÄÐCO =1ôÄÐCO =1ôÄÐCO =1ôÄÐCO =1ôÄÐCO =1ôÄÐCO =1ôÄÐCO =1ôÄÐCO =1ôÄÐCO =1ôÄÐCO =1ôÄÐCO =1ôÄÐCO =1ôÄÐCO =1ôÄУGO =ÆôáÁ <0ø£GO =1ôèÑ£G=zôèÑ£G=zôèÑ£G=zôèÑ£G=zôèÑ£G=zôèÑ£G=zôèÑ£G=zôèÑ£G=zôèÑ£GÄ=zôèÑ£G=zôèÑ£G=zôèÑ£G=zôèÑ£G=zôèÑ£'F STðàÁƒÓtÝ¢£ €„$Ñö3t"B±ì§ö†Æÿ ý£LÚ!&±‘GÚ4ÑT&„¨@! >У7@„!0„ …@!@!@!@!@!@!@!@$ÂZ!@’EH„&Ù"„ƈBÁB0¨vPAiUl=2;RN,{‡i‹-I<½hô¶A1H±šÍœ¡MËmÐ=å* òÅuŸ‰CpG>•0þÓP"¹àžÒŒªKmÌ6¶RÑhËJún%–«­d²h÷‘DÆþš™Z€ö‘]¤žÂA¸M BsBš&äBŒš2„H\ÔYBZ!@!@!@!@!@˜BZ!C!`„!„!„! £ÌiLBŽDoé0PlÀ%%!lXŠ;˜Ë\–i*¾’Ç´óǎш¼ó *-B4Z2A0£&¦50ïM`–ÿI4dw¥ñ½‡±(6cQcÛ˜Ø@Þ×íÄ€ 9„¤!=Ä»ZRŽG™c LjÄJÔàP'‘ :ä8‰%Wq9¹jzïsQ«ªñÚ zT­ìä%wÛ¼›.µ@ºkGo™R0’/tl–En%¤}DAàŽß3:o-*¬pcjæis|&/â2qMÇ´­5ÜtÎ[ XðD@ÁØs3}W&ÌÓ§ÔiÆdúßQVÆâ p#£‘–ÎP v §?Òtú¦O¤È¹pê×Q‹( ¦q9Oê`+Ì´ÄYzšAÏÞ)¥Nt­·äs5–#UíɆˡßqäÆÙÈ?Sµhv¿‘4'~G&Qˆææ”¢Ö¢ëÞc,—Óî@w —(*õñ4€Ä|\£'sæ “iú}¥gŽòÛ¬v{Kj*…ìdѹ+[L,nø©°Òž {G`8òvvÞaÑ æ@îdº2µTŽð ƒr#|Ȳ„ ‘fÔD#-m ÷‹R’Uù‰¨ $]P!Hh„!„!„!„!„!aM!P†BABh’"I6*E(ÕÉ‘óVÏÖo0DiŒqéi*½.n“¹J€0•“ÍÈ „´b]ÁH¡b lž•ìä%‚Œ{Gy[ØòÕÉŽ«ÍTÍ ›Ò9^\RÛfÆ óí2«Q̼¹ TéMª`µ÷3JpPî´LV+t½HØ@¸qµˆ£šñ2äã!>šý¯}æ<¶®WÞ ›Ò¸”äÌÙºSþ:±ïâfZl‚ýáÖ¦+DWb9€[1ÛÓ–´• «0íåQ7“íúª¥j,±Œh²x†¡‰Ë\ôwæ ,“ÜH² @R ‹F®jä‹®Ó9öù™fÖÈ^ò҄ݪF-ÂèçÔ9ñ**ËJ³@\ˆÂ¯žÐ"â$qùÄIÊËBKD!!!!!'À‘æ7‰ub.D ‘hÕÈcmE@! „Í £u$ö“D›+Že¤,|FP/`æÄ·e×i)IMÜ“PóRø`«`’,øŒªHm¼ÁÆ:Sgí5;Ø*Ñ®×(´ Ûo÷ŠÞ­©¹‹“4d!ŽÐ¶+¹˜…Ð)ÜO>Ñ·úG“,Ê!Oè&}Þ¡÷šAó*ŠNÒ¤£â£½¾P<Åúl€‹Ìt@-ÜPKdÆV#ÒÀ#“dÌj¶ñˆ³$SZ2IáPWy*¥rôJãé‹„ª N%Zäw‹·b|“5Çž%d ÍA5Ï™§æv'‚8•*ƒ@Í*a_a ’– ¡KL\XÉrÀoŽcíþ¦mIDƒÈ~Cºø°AîjÈ©Kþò—sØx‘k:V¤v ÷àJÈÜxÀ¶¼÷¿3n‡¦juùþŽ›äp-€”|û~³&b¢»sÂìcœu;ºßÃC¤…mn›é+þVÝ`þ£‰€à (w™Ù‰lk‹rUsrWOx‰ Ø©¿M§,ûHª#™ÓÃÓ2&0Ĭœñí58#MHA$K²è¸%nÈ Ü=-¶c¯ÌO#ÚkÏÓ2`2ê}¤v؉—Ž}#¯~äLa ‰ëstÜ›ÉecC¸8z½n$]]%VäĹ$s¥¹× ‹¯1wqÚZK”`{üD„nMC¥‰Õý@KqÊMÔ£L a;™£í-ã´y#ð6žL©ö}P@¾%ù¨ e4*f=Іç´ÖÔ¾¢ãKÌ£†Êyâ>FbÔL­= Ÿs5Ú«\$“UæVX…Ú;w¹™aÅÈeÜþžx€ÈŸË±!ÿé~²áfâgÊGå¯0˜öE$X÷–.Ònþ%t@¿”RÙísVg«àø•ñØÕüEZ=âY UÐn£_š $%hA7@v”™öC[¸ñ÷¾Ñˆã‰8ÄÅ%q“ˆ¥v:@íÜÌ3•ÛYØ„!!b„„„„„¢9“bÙ¯Jѯ3«Øñ%’—p‡˜Ã' ­BHˆàHón¬vŠxhÔ2dbü +æ¨ÚÖ{7[†>ÒêÀÊ;‘pzPß¼ ~Oi-Ké÷¨U´Äí{ÖФ×lT1€’xâRöXWp%È>š“ßÚk ƒoÔg'€;˶ƒKÉ©@ãOC†fŒÌøBãSlÜž&$ýÙŸ°_ñw™‚©;‰®e¹ %÷iKø®ÓJ¤)$±1Ž2Ü“CÞJ-UýÿH™sPgÙÿ ô>“K‹E\¸ÐÈ;}W=Ùž8 >9ˆãÇiö¯£›¨t®•“O‘±buC™—‚Ú'÷ž|³:}‰™ò»­h4z•Ôiði~– ‹`v¦ÀŸ/ÔtÇÓjÛö÷ŸU6® šœ¨©ò¹#ö©æõý?ëkÂ…»üÜNt¶•òqÄψpºgHA´H<Ïw¦ü=ô1*9Gpµ.èý%4ÈŒÕÏÇièU1€ ñö—÷âÄFìógðî$¶Yñ·´«QÑð 'g&®ÏyÜÖåtÓ–À¨ö&yýO^LW§âcÙ‡*Y–—^+V\ý3UB†Ññ<ïXéx²'¤ÛÚ‡'ï=ZçÇ™2d‡ 8:òlÔÍÊ-H—ͺƄéóXó9,¥Z§®ën®X'G–ÊuJHOafdZnŒÓ¨rYìßåE @oƒ5Ug!™˜û|Ë1) DyïÄm°HI*-k·aí ´éNÆ l‰Ô–Á&‰Œ ’K1qØ,Þ ZÖÖHü¼ ›%ýAÌÕD-w31\mAãæE‹p=Œ°›;@ïÀ•¹Ú6{raAÎüj|žñpdžÂ@4¤y=„•ã÷†­Z¯ÖAõqØa…,5,úa¾o±„+þ’¶bI%¶™Z)lGs …ì6¨ãš˜§G%}Zø"í „!!ÐB€B€B€B€B€À`ðÇ·¼EîDpF¤ΰ‹ †Ýß¼„RÙ6ûš’AÛù¹’§g#¼Ûm`Ѫ+n,.(nàù—@+úÃ{™5Ïþ‘<¯sý oËC6“Œ”,xâT‹¿!¿ˆçsKPZ·îäƒ2“ Œ¸ìm É&¬8Šã9sÀˆ‰Cy¢a4¹ô ö²!»–wb ]™*¥²E<¿ÌÑ€…7ÄÌÜ…ñQ”ð9ŠFç&XÁkh= @ Ù-ý̨'`2Íì¬v†o>ò¦ì€x£í%¿~ñIÀ= C.0·Nï&CÐ@¾L¸(ª^ø•ºÞJñ9ÙÒ§Ñá9sc@?9ñ>éø\..LÖΤ")òoï>cø/¥®¯©ýfBéŒp'Òòt³ôvãÎqä^QÄòd—ÐøÞ?'I·hòåÆ7†² ƒÜS™±TÙŸiƒ§¦\8N,Ù&`ìÌÈ´¤Ÿn{ÎŽ0jëí9½•ŽüË¥ƒÒµî8³Vøì/‰¯<8‰¯Á‹ørê,Êwšþ.k1ê5ˆd+‘y"ø?ï9}_&›ê!ï¸öûN7_\úMBçÓÑöA÷œ ÝSU­Q„©úŒjÇ›5²ã0îtí{iu §ÈÌËÙž(Ëõù]ÀÍKøwQ‡¢bÍ94n»O'ÕºŠá'µ‘r´ÍjåõB”|¯yÂÈêÎH%Ú¬§.R宿c=«Ç{Ì|cù‚( j¯¯·‰Öµr´¯Æ×~lj¨£`n+™ŸNIj"Ôv1ܰð-ø[Œ–ÍÜFjØ£Ìe$=/jæS”ìÚ'½Ã`Ø)bI;¹'ɉ‰= Os_X ©ÂË®¢•;Èö†qlø™È¼Íî9š„°íÚgRNSÇ'ˆmA±Éˆ×º¼˜Ùî"ûDæ¬÷ñ ¨QüÏq ð+æOµwù†™9÷—Q«Ý*@(ß´7“Åñ˜ ùkÌœ"ÜŸˆ¡nÍÇC´ŠäÃe}©Ž}ç:tÚ︜ù1ˆBD!!!!!;˜è ©¡E±–ƒô×»‰Õ¤†ÄcÀûF>ªdkïB Ø–c­ß›‘Ú&ƈÁŠp¸Lò½Õh¬¬{£3¹þ¨=ØSdÌf–…(ÕŸ™Nn¼ÕÀÛ2 ð9—c@øÉqÛÏy¢¦fj ßÚ3ö'uY¹ú´8=®3 Ì®G ÕBv¬¨9–csÜwŠÛ1¾ÃĹñŽËÜ÷Ð+ġϨ·dÜA^1‚ x¿hûBãÛtnPè¡í¨¾âÕt£Àó4bÛýGj¸ªR+™.¨ŠlY= C²"³s¸ð͆˖¢cd;œ{Kl_æ*ì1á&½mÅJqbÜÛ·1Å·©ÙHÆ1<“~&*¨ÇnÌMRŽÞ>[ˆº±-p8•í|†ØÉRR‹ò“.«R¸0c-‘ÛÇÌú_á¯Ã8ôJ™ÊÕ¸‘ÚqË}zz0ã›Kgá^‡ÿ,Ñ*×­…±žƒ:Ö|ÔÔ˜†<`àT§R·—ÜO,ÎßJ´ŠÕÀÀ” îI3«ƒò-Îvú›î­Ìë¥"ÞKÓŽ|E%TÁ©rŠÊMüM›Â‚Iï9ÚÖÝÀ¼ÊuyÎ¥§ú¶xüʺgBÓgËLn“#ªgd;Gr{N÷@ÒäÒè±gÉŸçË|dp?±<͉y­ZÚÇüM‘´ß‡rm;F,gßÚ|PÁÛ#±6X’gØ?j:V«åÝcÔA±Ú|c3#ÄïŽ/“>u ¯KE±;ÃÃeØ’ùñï4¢‚6Þ¥Z{vàâ¥Ûʃ´ðx¹Ö®7564 w•çf.°â7ô‚\±•IÝÜÍBÔô(bÖ¿ë39Ý‘y¡½lùñ37’!UhÄwЮ‘JÄHÅèQ\Ü‹$LÂM¿Ú Cd ŠÜÇ5¼æ±Úg"©‡´»!ô(ÊIíJG;®)6cË&U±Í÷ˆâOôטQ£p,ôíUóR£ÃT 6 r Jð¿yf V³+ÆUÚíï4 Ûd*‚9¸D Ö;Y»&s¦ñlw“Ç™‚E׌Bè!@!@!@!@!@ÑVÕUÙôüÆ`@»ñ,°œààÏ´€Â鉘sé$åí¯´Ñn%M{ò}¤r‘ØÒWsëé£ÚI`ÂªÍø„­L,}UÏx.ÒÄ7屌—mB\6•ÜMyí Ar7Ð¥ð`ŒÇ %2ÆUãm_ß¼\XFF¶4;ˆR 9)ùov™Ûù™ ·3hÀŒï‘EîáÖWôQXóÈïp)E@Áx*ƒ÷2ŒÍ¹ûTº‚ï¶Q}¥xñÌÎ(ñ0 [4{Ç<¾Åç‰Vã¸×ƒÄ½C Q'’j6€@7CžÝãã*Gcß¼­Š–$Ýñ/ÃêCf¹’¥«³v몬jÜsÅË-×3_Oéún cÓã.ÇŸ÷3­§JÄϦtÆ@ÜG¦:¢)ÞHýLöZÁªiµlî{íSBçgá½£¢CòO3•³Äzv® O·Ï±hõ9ËKÒ¿2âb?z•æÓº|Nÿ‰Hÿ9ôã¯×hÊ®Ÿ[¨Ä©ÙÈûÍz>¼º³ô:¶$É J ÿÕ¸çâp·É¼³§ÉÖ}„½4îV“fÿêgÕõ]-4¹ØR¤Ú‘DïÀí4i´8ÍR¯è&×åu…×ãíòœ='_Ÿòé2WÈ©×Ðþ×ê² Á1/nM™õ =5_Äé`ÐbÄ¿”7ïK­~4<çBü/¦éxÔG©Èõ÷öž‡!U42ØÛu ¼g9½4¬SÐÊk£ºø¹vˆÆÁ˜bVs-Sé ìeF€¾æ:“·ŽÝá2†-¶îÁˆH¸cez ;}¢qôëÍÜ6 Öy’«f®Bú{F-›…79øâá»ÕcÌaË_´BS/x3"—Š¡!Ÿê8q  =îÕ›–ã µÒö2´ÛDBY‘‚ãT™KE}ª`›xúvG>&)U! ‚„„„„„ ˜Ú©ÁïRçA³‘Øpegk"§G(ìÀÑ"¾ñÚÊÙ2¢§‚GèW7%’…H$wíh&·sæF<´ žÞ –®4<Ñ'¿¡21)ÜlÖÞnÏrI¹nÑêÛçÌVJSóÉš’!')$vâ » q.E!Ô@ï2o6ž;À·oòÁj¡ßæWõàÀƒµù€'éÐäv2URÑÚEÀŒy[klAºì™£@û¬Y¢ f÷ ªñïôcBÉ>hîdBPÐ'‰Vòü:ü™€<€ Œ[v⽌ û—#ºÐ¡æVGÕåSÇy)@qVLf7§±˜¤ª„J¹ó/k\±»C5 XT’wï  ŽH˜*ÜiUy÷—¢óC·˜«Œ´±½xó%Ò«ÈêŠ-˜€Ìú¯á¾§ôôA[²Ù»ŸÀþÒGYÇb ߨí>³£Z@§‘Áž‘y‰ÓÛñ±îvÓ‡J=„³.œÚiÀY &å&§ïå㺞ƒq, ƒ8 ù1¹F{QŸBÕéU—¿?iäú¦€:“^ x2«ðó䣩Ñ2³Ð²é•¿ù:0|œg…SÿŒ»¤êF|Ì)•а=ìNà½bhàÇ•Šâ· ß`|Þz>¥Ó²h:†|úaÁzt3ÏM×/)Ç.þ˜ ¢€æ\ËdW¼âèzš½ø3»§Ê™“Ìõ½ ™k“ÚT@ÝÚN¯T˜×o{1qÞÂíÈ®ÞÐ1êµÒ§Õ¦ŸN~¿¨¢æ<Š3ÍuN°û §7ív¶½4õκ˜•½Cô3Ãêúæ\™w ¢ Ù•ëÛ&RÏ‘¼ÎKlƒÇiÚ˜â^\™%ôÏÂÿ‹ÓQ‰pç¥Ê|‰Ý×çÁ›LÍéí>1Œ¾&ŒU‡gLuIÆQÝÈðnTãÚñü½x“~"ÔãMòÀ±ÜO+¨Ê]ØžænÕål¹™ŸóÎʧqâtŠéÊù:• y‘Kd¡>;ƒÇ¼éXq´®úgñÅC±·C#ýE°;)÷^i "÷F.Vuf@üÕ#'¸šÕ$óc¼qÆ=¾L¬÷’ 0è‘Àæ!1‰â$É¥’rsÛŠ‰cm@övr}ÑÑ¿iL`Ô~!<Ø6Oq!€hûÄîhAÚÈÐi …ªýdU‹'›‘ó“´q @K5Ǧ1ô¨'‹Š£Õºî¹€á XŒËé *ÌA>ˆ„‚j¡äc¥´N@ í¹«ƒµšö¥Á%I˜æœd)æf‘vÐB±BBBBB‡R¤[ƒñ¶šÜÄIÆP¸Lìæ†f&ˆ¯2Uls$ãÞÇ›®Â¢}7Ûï06@»Õl;™fG ¡{W‰WÓÉa4¦ „oí1–ÇÓs,TšæGÉU¡í4ae5ìMMAPRØ>©%ŠžÝã²:»„y”¨a”Ù$ˆ ­½h 7ßÞ^ªwZƒC€H•ušïÅÍ »Ö‰¼ß™‚ _+”Ƶ|=¡˜¦U?’<ƤlÜG><ÊÝ>¦]䨊šãh»äC>FbZÛ}¥ÀÓl¼«!Çõ«ú„ÁBb6 Ô½±”Æ)#ÅH0á¯Çiñã\{˜ LQ•ÉÆ[±®ÆrŽO<À;3(_"8f,ìÊS¸ÛGÇi)ÁôùîbîyæêlÐé¿‹ÕbÀ¼o}¤œçiþºR6ôÿ…tí„.£ §ÍãàO é²~P=§™Ã€bÊŠ«[T'JH¯´ùù-ÕŸStîà¾%½ÐµÝ *ÇÄ_i¢êÛˆ²æ‘Wñ2íÜ‘xÙ²}58ÁõIŠ’÷)ýàY€p}@xûËaÈ –㼡;ú¨(öš0„Ø w¾f¿VÚ«ód.Ym¾ðd"É«ûÅÄž­·ó"ΕhÇÕ&ÃãÄô?…4Áúƒæ4vc}É©Á· n'¶ü'Òõ8º^^¦Ei²gú cÍ\ášüÕÛìîç@ ìh:Zn{x•À5vC`Ž,‰:%H?™x"x,úUñ.í:Ø€€Ñ3§bH3­e'“ï%ꫢ < ÄêIé"vU…rf ~0ÊOÄèË>kø…}&pÿ±Fl§°Ìþ•=g_ÓoÄÄ~gé Èš¥•_q_´éׇ‚ÿ³ÝáÎ ý&û׉ÇÓä'‘Þ®kǘÞ[4ƒyÅø‚âSÕZߟnÑ~­XòeÎv¥ù…Ÿ&]Ïg´Å¨Å"˜¹3Uó3œÌÝ¡–—?MÇüYosí6è€G¨:± ÜЉ­.ÇyÔü-¡ ­É®Ôó‡Müű2ߊ8òç~,èØµ=Eñ…Ú¤Ÿ?Öh_IŸf[*;õÁ‰µ¸²ê›“‘­>@ãÿsÕz>=F&FäËøù-Ô¢Øw|Û-v£g‰›7 s:½CC—Eœ‡²·J~'7*Ùâ} Ûo<×–eÅyöæ3¼ûGE;﵎ñJ§y³Þ]\¬¤nrXž%,E™kOQ©à.ÙÒ®Àï1Ú¥g¼‹.¢„†ˆB!MH„!* €ïðÞ2&(üßymµRª›w$TSǬ‹â/r.hoé‡Á¾ÒÀ—´Bª<5À‚G´¿´.pp>%Õ˜Üʤ]µ„$(B€B€B€B€B Y©jÓ §‚"ÕA¹Ñ–>.>6+Œßƒ+>§â9ü¥[¹<¬[ˆ'w°Äدå;jîGs3•£uPï/TuV'Ô˜EŠ­»!oØIm¤|)‡;`Ù¸<×ìD³´©þ¡*_ʾônN»X°&æ`Õ“>DÈ ŽÞ$¦Ò¥ ž÷)S¶ÇæÝæHZí|@O*ú¨þwŽÂ¤oo7ñ”‡—Ÿ…kÉalžå£¯©ýJ6ƒÞ3V4Š2¥;˜òh 00óÅÍX×b GÈ™>˜-A¹›FÅBý¼T Ír©~ înÿé)G‹›1 $Ž';*«q¥Y*j~†ü+аgü½S¹ ¨v#º¹7¸}¸Ÿü-Òߪþ%éÚ Ü¹s&ï°6µÏÓǧéÑ)M£h*hýçÃú¦[Dj%Úžöù¦·ðÏVé,r./â±-ÿ7 “CÝ{ßÈœgΩ¬R-K (AöŸVÇ—fØ_/'Œ›0ê}3RÐåÄø±älŠvdØ- plO“‡êz·6zë‘à4¹xù}>NÞ©æqÒjŸO˜ɉÊ>SC™ö"ÝFÞìvÛ´¹´¯7©OÈ”â{–5°5:ÕÑ约\2ø©áSKü/VÔa^ÙA©ôJ ­Ï!Õô¿O*j}JyûJŸOZ©Ò¹lIf¶Ø54¥~Ó ý€¯ý7̯S¨*§žÒ«æ6ã[:Ú\ã&z'C# O9Ò3}LŒ@ÐYÅM™t¬©È,ËpàÜ.¥ƒNx¹«^A?òz_.~}0í\ÏAŸ¥åÐt­&€)VÕzÜù®ÿå.è]0ë5k¨ÈÅènìì9¿°þóÕõü´xò÷tÎ Ÿ­PøŸ;äfÞh¢&|¼ca\d¢pƒÒÀó0ë4ÊØÏùœ¸«%‘ÄÉ¨Æ Ï¡W¢Õx^±Ó—>"­T;qÚ|ÿY…ðjðxùëšý=¡ Ožþ#Òmo¨;“SÕ†ïlo:BŒcŽ@735B梄fgÈÀ7ÛW†Ð¨²­¼Ê™Á„— ·¦WØ‘-…ñ1‹"˨„!%B„„ÀB–‘$ ;ˆÇˆ*Ç2Û zM2›n‡yi”½Íön§ˆ!Çx0$ñÅbÄ ³n9ñ´˜Y¾,ñ @6HHìd-÷啽Àî{C/M¶Û>>ó,ÝT6Àóó0Ⱥ¨!HX„!„!„!„!„!Ö¶AæXå•‘çÄéd%-ÄnCsâ*^î |ËKô°¿‘6 ^ÓçŽ|M8‚ÝçÌÎ0–6yñ-$ªYå%ý~¡B-P ö2i²¯&ª.â2ðx˜Ä©Í/w‚/p§Ì•V.ÁOqP`£![»÷˜£@ ÝÉ]>LÀÖA±ì%v°±ûËð°Tú`µwÜ âÊ2S"¹+â*¨,X!|™j>Db>§ÞGÔ ÛJñ}Äl[€;wnâψ«óGÌB© û‰H‚ˆŽfÇŒ«Ýìš›6mMšçâQŒH,lM@Rm¾ü“í0Fž§ #©`™|>kÕ:~N‡ÔÛ!°d%±?´ûßLù]W‹;â¿.Þ Á¨{ »!¹œM}À‰ÔÓêŸj¯dNϨ “^'ŸêZPØÍÏPÌæk4êèAó:"ÕÛæåÑd> wccâpz¦GÓnÇ”È87çæzΩ¥|N3¡õ§#äÉ£ÑuÝ*®©J?ô¸üÀýû÷œ»œvÜúxm^läþÀNÕlyž¯/HµûÊzE:@©×(½çatYÊ€¸O#Äß¿I÷.´ˆ†'UQ¸òMT·G¥Ë®Õ.d©îÍ_{ŸöóâmÅÑ592ÖVtº$€Oéÿ¾'GêáÑáþB‹g–st§Üžì°ž\ÿ*"5R××§gJ4ú@º\8Âéð¦ÓÿmrÏ2­n©3ô2ËlsGÌàåÖåê„íÆssùþf-±²³cvµÀY{ù¿ö3çàÅkeêS†½Y¿ ÚeÍ‹âBj÷ä4@_óšÓù«Ú}ʽöˆp5˜FÃÇ<'â-0lmÇcsèúÄ'rÿ¤ñwØÖ'j{xó×Ãæ9†ÒÂû— Ü™ÐÕãÛ› "¹˜³.} ¾m™‚÷>¥¿5ËÜíÇ^›2Ÿ£™ó"¼'9P„! „&„„Ô‰6‘2F1ü°„ ÇäÙ€ 2{ÍJÁ[~;ÉR(žbP#–¨VÓDý¡)[®þe¸ÆÛfjö”«6ÍÇvì½È†7QbÜ\Ç6±‹^f)]! „ „ „ „ „ \œ/±¹$¦wraTYOzâ%Åó: @1èšsL1× g¹¦–„SôöÕS©Õ`KTý2¼1xeÝDðËÚ‡ˆrTˆIµnÑÈSnëbnë´1c8Æðh÷B¨'xaÞb”ãW MÕ÷1»›«›­¶x>eªTnQψR¨¾ü÷ŒìÄ¡‡{Ôm¨¨\†-FúeE| 16`¡Ïö–.„)ǻۊ•³¶1¾ïÜGuÉ‘Ec·ÚûL`ƒ;@žOˆŠ3l­€©k³^<ÄP?WÉ¿ìŘ‚Àñ*sàx–¸Ä©Ç&ts$! „ „&(B€BšÁÞd…7 L ¿›žÑ˜sÇiÑ ‹Y|K(rÊG#‰©ÚµEn{HÇu·"XÇŽ8‰L@¦RI¨i–Õ,ƒœƒÞã2öPxóMŒyýa†*Iç±™&í[‰¦U! „ „ „ „ „ hbÀñï[4¾$õPUbÔ93«›J‘‹"ûÕÇÈëŽöþcÉ5Wh yoòŠ äžÝ„Ä®Äö§Š÷¿20¡Éœ;SÍvŠ8ݸXøŒM#m5bbO« °]ÀíäJŽÀ»‡µT\…ŽÀjýá°I³ @ü¥0`1v£àÅÛ`«q,Ü-A[ª`å±…f®{ÆB©u_<÷‰’ƒr¾šâ6·’*bõw¾ ÐŽRQï2¢®þOo‰¤)+Ax®ð‚¡Ë·<@c_Q¡ˆ¸Ésråâ¡Àÿ8iž–€7ij-ŠûÊU7=“Çiqú`Ð>$‹•·7¸{¿øYr~?ÐWlk‘ÿP†xLo´ú/ü%?Œ®¼¦•¿sÄñü»k Ê£Ûî½K6ÌžrË]æƒPòeºçß­*½U{~G¼üÊÉÕžØôÂý+1õcÕ×ÄÇ›G¬ÇÉÎNþLß½†>M&ä 3<ÕȺ¼ÖeȧÔGé1äÎØøýNŒ-FŒ\õâ¼O·J¹Fñ`Î.bTÚ õ™ÜÔèH‰ÈÕi˜|O©ñró>^M¤qö¡6.yRôÏÿ¹ÚÓ>ò±>Õ-¸ðõã·N‚=±B{ñ>Œ>:ò;̈ ä>D߈µãŠ2ëeÚ»yž©ÒÊäÞ£Ö<Ž&-6³a8ØÓ¯¼õºäWÄ,Y=ç”êº\²6×_#ü¤åÃy2âÿ¿íêñ2êµci?ë8c^éjÞ–^9ó1jº‰Eó<µÁ«<¾•õ]X íä]O$‡ùÊÞígâkêZѾˆ÷²fbö0ãæˆµ·:}«¢!1ý¿Òz­:©P~'•éôØOºƒúTõQü¾óÍ?³êbýUë£ôžñÖ#ØÏ ë}2[Ú|ûñ:‘ƒ%yÖ®yÿWÊõ‡vw?3qýÅN†s¹ÞÇ™ îiï§êù7ý˜rr¼JIäËòüž}¥™Ù„*Q… „*BŒ jDk›=¤ÄŸ$Í‚ûÇ#ox-¹ÛQ–ç'$lü¢IÛJ<žñµˆs߈ؔrç¸ì"íæ»ËX…áWŠþð+ Ѷæ?çF•Ý›1«Ó`T0Q™¦‚8³ÄÏ"ë „!!b„„„„„ ø\•ÜK,+îST.¢f”p#¨þe×¼èä~B˜ßÚiÀ›Bïó3"—ÊÇú@š2'mv˜Ä±ÙÒò;üÅ«înNR¨æ‚;ÄÆ×fè0âf €nøŽVñ£WGˆåÕBòNJ>¯a+\¡q…,[›™³H#Ð~x»Ë(m îb{ÜŠǽÁy<öŽU(ro˜Pk2Z@y°%Ä’?5 •¨–#Šæ:–ò@=ÉÚ=£!;UUH“ri»“_Y(E’;“'l*)û“,Ç‹ÕêïJÐ2ì8«›¹BÄP¤3è¿ð¿~«P8á1†ûÏž(/Û‰ö_øuÒŽ’”ll¥³?EãýW/etö÷xCœÌÖ7üÇÈ êª>¶"Ÿ÷¯#ûLÚ\J8nfðqãOÍCØs?mÚÛÓÕYJluþ[¯ÞC!»í3äïÊƆŒTÏŸ ùU&”0¦¿ãÍý7p¹±è“2åéè2“óQ2ê²ï4å¿íQ3»ë,£ï:cøwÿO¸MGKÇS‰¬éift³ãÎEýL–DùÿâŒ~Œ¢¸®'Ñr›ÅòDñ‰0–ÆàžàË©ŸÍ_Ô‚2¸®ÄÜÕø¯"uº’Z¬«\Ùœ|Ã÷žúú|‹GäÉÙ•ÇÈ"NŽbEI„ÐB’µEÊ"¤BBŒ(À›TȘê6›”í]Ð KòLŸOƒñSRR(ƒq·m ÊÑK8шõQ€Å˜ó"ìIzP˜«È0”€6î27]Ù¨sØp±OxRA³G´¦\+p”Ⱥª!HP„!„!„!„!„!£‹ÜFêÏÌ@ Ý  òeÕä:Ùó#"IÜ5ûKqX•‹L”–6em“p­µ]¥eËð ¸{ªûÈ ]Ís ß”nüIV92U75TeKí. V‚›¹-#Ê$„>ÒÅ^äø›ptÍn¦Ž&w±k÷œç$G¹ T;Áqžxž‹á³©ÿdÔ{o ¬íh¿áÞ· ÅfÇ„‡'÷œ/òñ×ú§‡\'ØË*l݇3êº/øÓ°rcl¬?©›ý'sMøW¤áZ=?ä¤Ï%þ¥Ž=7O‡.ÍW, J@3ïÿ t\†›¤hëßeF?ƒºD*Ý/J¿øØÿYÇþÞ‡/ƒ"y¢@øŽ@Øy}Ÿ/ü:èÁ٥ˈø(ó—¨ÿ…kõGðÝAÑ/¶D„éOªa±ÃÄ~è¹z×ZÁ¤¯I å>*û~³ïú ˆ&E?_»O ;Tä~ü+£è:vǤJv¯©™»Ÿa=¹u+Nn…UÎTÐbݹU¾õ=;sµwíñ޹ӛM²"Ÿ¦Ç¹Œ;ñ>¡ÖzkfFVBV§Ïuº3¢Ô66’mg«öùÙ±óg¯üªÿâ¾(}û\úV‰ÎÐ~'Ç æ8:£%lÏ«ôÜÖ«Ïq8e¯½ߋРlbyŽ»‹r0©é0šKœ~±Œ6#ï"®÷ý_üG€â×1ª³<æ`g¹üc¤ØF@<óÀÒ<ñ5Ï”¶äTaÉ Žˆ| +‘¶Zˆ|vŒ‰Ûp¯¼Ý¤Ðj5¹F-6ÈÇØp?Y’#ÛYUúSâoÐôm_QÈM„°òíÂ×ý§°é‚Ñ6å×°Ë“Æ5áÞ{-'LDEƨ¯dÆ)?YâÍó"?SO)Ñÿé´î¹u+üVaÍõž»‰‚®ïHQ@j,z:P;àK~ˆÇt¿™óošÖöºÕF, R©ÿëÌÕ1àþñW7õG!PPšyrd…ê §€‡÷Œ){¾ÑòeXôúœâË}$øÍ8ún:¶ÜO’ǼòZe\—ë`SE÷}Œ¿O»)'0ÝÇÿË—/OÒb`Ϊ8±ó4#­lƶ>Gyí¹o(LCâíl£uxý%X·f,ìÆ¼ n«Ô~In.W¥åó7DO”Ù£ÙFãî¯Ìž{É éôÉ´öÍv•ˆC/x+€Ä0€E @ÆTMû¼ œD{–´çÜ›“»’IrqÏv¦.§lˆ^Z—‘ÞN.ò¬d‘Ï"hÁ@ß´ôÚ9ºÂì­HÌÎZ¡‘ùf¹C䦿 9Ÿœù6œÙ<9ô¼·2I „i„jͯô W‘¨xéÄyWL™Ô³Ò "+/ÑŵöÙäÜ×—'Ó"Š÷ž[®uWÓ†ùËãÍON,WË:«jN¹®\˜†‹¦ùX1~ã{Lš]U:bgÆæ«zþVÿÜóÚm6¯_ÔÍ“&Âl€*z¼¿‡éWQ£S¹¶2xaæ¾gèþ/ÓïöõbÉËN,ÁZŽÓ^ÜÇ}=6Ð}™ÁÇ“&«‰¶ì#ùlE1÷Úttz¯µó:Î9¤ê^Èüœn«¤ Tß<øž3«ttΕôU”ÛHó>«›jÒ™W·y¾§Ó¾žJT¯7*¶åË&.¼<7FÁ£Å©ÆF“ åF£éí=þ›é•RAúgŽÖôö\§>+WSuþ)ßé¥Ôâú3ÙKRñåå¥g´ô˜r­Tͯ"¼šŒžñïÝX5@‘“ö¯EroÛçߊôm“E‘ªë´ù~Qù¯Þ}Ǭéþ¶•”I|g©iÎ f\ekk¸¥ãÏ_Ën>A(aSfA287=5y‰v„$B“@!y”‰!h@Ža`x””è*ÙìbL’I@ À’Þ=äÌ•îoÄЭù£X‹æ 5x)ÌY4x0[XÙ07rÆ’×Èí')-•_=á*˜“Ħ^õ`ù”Hºê!HP„!„!„!„!„!¬J*Ð䘊–{KcToÛÌèè:F¯¨¾Ý6Ët]¸Aúÿ§yÊ÷ÒôÆi·G Í«}˜0¾FöQ=¿Jü €}[œÄ Øx@ÌÏ]¤ÐaÒªãÓâDQǤWþç“/ʈô§‡é?u9È~ ë§ÅÿøîfûûOqÓºN“A‰pé°AÜÿQXE‚{öšÑ1`ògÏËžmýV¡N-5@WÌÖ…1ð ·Àˆ&VïéöF-7øTßÌòÛ&½)¾NÒìx,[v–ãÆó$6£0TY3”õei`DUª»¸ñ´L¹5»G¦—ßæPÝDŽ¿°™f}®µu•Ñ-d7)ÍÔ•8Æ ·€{ÎzF¬Ö58×Ë7iÑÑèWÜ-åÛó~Ÿf±UèiôÙs8Ëœ’ÄúVûNŸ§Ô^[ÏĨ0E;H ,±ÿI›6Gú;0òìy'½OíÔꨛ¸ÔdeF#;ÿìÑ4ÍNGé .“"é™ ÝŒUR­g’¦¦ã¯)´C¥ý2QÉ5Ü Ÿi[-ÅïªZÁDÅf?J‡kïXm¶4"¶@þ« 8©¼u:d™{r¶Écã´,Ý Nãõv“ÄõóªºU¿ íAæ_ºøü‰‹ ÙÚf¬l>'“åäæž{ibÛ7Ä®rŒrO&.«RÌh{ð#iÀÅ¥w<³òiM¦<HÂx>£qzk$ÅLÁËÇÄœú¥Ò`Ü»@žÜxz+ÚzލaP˜ýYî?§æyœºdwbÀ—ce§A‰fg,w7z‰‹fþ£?Oð¾1WsíÒ<§h•r§¦Àªˆ‰ÈÀ›x­ƒ   í>½"*×'«ôµÔc¥Jç›#±ðgÒk2¶ŸR<È}hxûÖ{·§ì üçºçCÇ­dË!éÅÿO)ò¯8üü¡ßn}Ÿ[®8#¼³U¦þ'º'ÄäißS£È1ë0”®Ì)ù´ìàÊÖOa>lÒcÛÛ¼ÇP鼕"ÏÚyÌørèõ_ÄéW¸ðDú~m8Ô%P¹æú‡FoUdÄÍ\æ‘f>ŸÕ1ë4Ö8 S/eå–›pá|Ï/©Ã—Aª90‚}›âvº^¯«L[p9¾Ó݇'^%ãɺ­ÈɨÂÈ{3åߌºaèþ%Ei§ÒN,̤ב8ˆtÉ«ÓeV¢¥{ÉÉ^-²ß|¾C•yìf\‹Ìí?KÊ]‚² '‚bŽƒ«Ê8úGõ›Ü:—ߦmžö¦°¨õ"¥“RhB¥$ÑG=ãaÄЧˆ|À‹1ÀP s î|Bë´g¡ˆ{™B¸ð«’@,*`‰r*€ 6}¢(I2lÂ¥h²åBäפJŽAÊø`s2© äJIæfÙ\ufxÖnÁ‹"óµ@„!!B„„„„„©t_Àï.^¤=5c ñûŸôžßIÓðéÑU1¨Ep?o™¹p5Mßq—cÅ|/àO|÷±Ì)LL» §%QÈÜeøôÔÈÛA—‡j3Í3k7Jqãfü‹SN='õdp>%­NÐ&LúòE]™œ/—_êiðö#‰F^§\ ¯™ÇS“($p%ØônâÍÔ¯¶¾Ve׳Mý¥A³å>‹Í8ô`JžóZ`Ûe¨,®!LXt.æÜ’fü:\XE…Üц\jF<@»MÔ­3ræEç–¬T æ—ÀÅ?T”€çí(f%«Ï´¼mÇ‹¿É3Á–Ó2ÊœùÅOÄ·O‘W%/&¿iÌ9NMfÁÈU³4ám¶OxÅrËUÔW.ÔÇŸ#.Ìì¦ ˜}AGš“‰Ê[wz•–œ§Kq;< 9ZˆaÍñ)Åe«t¹¨b£ÞvÁçØ\.Ù ¾ÂXÕ'Ï´Îôõx+rNK;¼O}b#Ò´}äúSeYs_i*Á’å šbYš¼HˬL°#ƒU0špoÔy"q BTrI–œdòÝ¢¶@TÙîhËÇFXËËRŽIöœœšŸâ³ ªƒH¾Âg×uÔjN?ËÆÃyÔ|IÓ«þá?Aôÿ‹ùÙUo~ iv˜±û]J³õÂ_§+Çêß ûüN˸+î}¦\êO•>}§;â­Ý1äµYtúÅÉÀ>°h¯‘5€¹×šœ|ØÎ791 ,å÷û÷štÑ‘M©F³gÏÉñæÞâѸ`ë}L,Ê=_iã?ƒÔh³¶L"œwâÓê¹q.dŒãëúReñGàN^cÓ&+xÔ¼V}bj0†ü™Wó)ÄækX¾œ‘ÈžÛ/JOË—7±"põŸ‡Ân};„óŒöý'_½ÔjÎøöO—ë°ý-i ðÞ#`$¼ôKð¦¯!-‡"–&é„äž•¯Òæá<ë8_ϧ“&+‹´¹7£†õh©‰Å꿆>¦íGN˜ú°çÜNÞ›h{³GƒûMO†è+pg½±ËÍ11íó­WF×hÆìú\Š£¹«õ %xŸKÕjr!8*̓úNf· i5«õ1§Ìúö'äNøþTOìÍË”>ÆFÙØÖô-f‰‰|%“¾ôçûNqÇÄõEâ})›l‰£eƒ\ý¢ì—ÒTš¢ËYy‘¶oA8¹*{É É‚€2ë!@õsÚNZ$Wi Þ+7"kN«Ä±7›0-b®Và5Ð£ï ší ;ȸèÐ&äB%¢D™e¢„ÀB€B€B€B€Bú€(z¶'âkÆ£=ȵ+Å‹“Ä·)ÚžžÓó¼¯Lù36ÿQ¿¼¥ßyàÈÉlb gtʨ¬®OñéD¿ ínDØÐKåDçLh(z¼™~Òæ„RèƒÔlʲ;8âW0£äÌ1µ 'Á™ÃeÕe* ±çÀ–cÓ¶oKp.÷N–ð`ºÚ£¸=Ìá“$Gˆ ¦Ó xèwîZYõU T_Urf]F°ÞÌf¿ÖíTY²y3Ë’&<È¿’ÃÜ™ì¿OƆǓn@{ٔꔵ æç>?•S¡FfËÝìh-BsÚjÃŒ.’»?OÔk  síâ.]P/ôÖ˜ ·ó=7ÇV4ã`2s,Ë•xUʆ۾bæoH>Óž¹†c¼Ÿ5 1Ù_2 ä‚d«O|(1;„Ó…wdQãóÒdnH›ô˜É@[ÿÉêû8|‹ýºm––¬¤cÓ–’( ç4Êu]@(69&u:¦­qèreìqúðï1ôÌM¦Ò‡qY3roúDøØkÔÍÑWG! ô‰çºïRþðÚ~r¿ƒØ·¨j²aÀr ç°óÎ&‹.lŸ&@YøŸoàü)¼õaoÈäŸs:}#3n$?“p;Þfþ ˜½hší:}*át該~Ü™úJbÔjÓnWÿä8¿3N œ'3M‘³gÈ2d³»ÒÕâw4ÚTJ$–jºžŠÕ[kÀÌÀTؘ SP”£JQB6ã¶‹qæt­UÐ}:#ð×S¹ýâ³cª'ìe\)ÿÜÞNš©%YlÆý¥g%nU—)eö \j¹U‘€b*â 8È·Œ…Éለù> x3F„/´žwíÒ¹4.§"ä ¨ZÈ=»7î;FdÊ1çK<8æ#«}+Iª»ž\Ø"}=5¼Kn«H¹.‰¹Îˈ/qÛŠ›0õLyWÔûÄÔ:dC°úüOë§«̹íÑ_í3ý=ïÇŸ ¼Sñóë›/óO‰ÏךšœgqN7"C´Ö±íçºóàéï´`¥Èvîu±“Úˆñ8úlðnoJ‚A'âz÷Ñ'[é‘…,޵Èjï<žmðØßM–Å÷•¦Z»|Ï—Š'òˆs/ëê(¯w:ø•±H¯"fÒé îßÅÒL*+iæpšéòíí §Æ4í蛎÷<þoÁzÙr:j2ã•P?)ó=8VX¸ç äü‹÷‘÷&¿ÑóÝgà­f%-¦ÉP;€4óúm6C>&ÆÃà ö¬}=ˆÕö5,ÉÓ4®€eÇÈòËfoý„WÚ´øIÄ.#b$ûV«¢tœâ²hñ+ü§QøG£ä ³ã?ö´íO¨VÞà|¤­w•»W‰ïuß‚þ¶=ñùr<Þ³¥gÒ5gÂPŒ ÷cÏKzK…dó ‹Ó¨iIĵ÷žƒ¦:>ÆDèìUQ¾üÊò¡ÈÛ€¢ŽYÓ0Í?HP'´WÅ]‡¹ÿë{…–}3äŒ}„Î[Úš2&µT>’kÚd™hÑYØ„!!B„„„„„ÕkÀ>Z&vô!Ÿ`ã“*A¾OÞ|D.>lË8#È\5Ò¥®ìL­Z_½Ãê7ôþ±ÃnñPúa›ï:ÇjVr‘ÞjÓâf¦séÿ984¨­dYš úHY{xœ²LÛÄ C&·ª„ìÖ6A@Ññöö”ê5;Í1˜ýlÖ{ Ë{SN˜6lÌǼ~³s°Ré)Ò L`ùnLjfÈMp'–ß•´É“«S¼¿Ç‘ýiÛÍÌ×ê4àÇvÌhNüDTÚðKн¨?¼«SŸf-‹ ™,ñÀÞbÔ>æI¥XAD“æ]›ÉâR Ëñ 5=<íkËRó%Žä¯5*ÈÛr€x‹scÚsÃ_3T+-¶Ö.ó|v“m_Ÿ´¨­y³àNÚ‘¯Ùök\™¿TçŽÇ¤ä;WâOOÓ9Äå¾I0|k—¨c¶µÄ/õŸ7äEòÏ?Ç9`Ö`}f£ƒ}L¿>Ë,ÔeM>'Í”îãhâ¯Ú]›:¨< $ÿˆÎ³PúœÛßòJ“é|ƒìS“&MN£ê¿oâ+Q@Q¹ í^ÃÇÄeÀJï<{™ú<ŒX‚Exù¯ê$ðoŽjPõ«—zØ1ÉàYï8n¦P lE{΂ëñå–¾òºkk0‘ö‰õÓ›<Î~]h¨Ü>&7Ôçv; ÷ÇMܺí©@{ñë1d‹žkS«l Œ¹9ö˜ÿæ€ö¿¼çk·§¥Ë«UÈvS!5á¶žyueûž#—ÛüäýÅíéÇRpG13jNTõUü‰æ—XøIµ4&œzöÍ·jÌEº]lÓ¨|Ø}a Sþ'=ÿ>¢ÚÊ(þ nçGêåÉÀÄ ö¹[Ðóëqú°cV=‰œ¯Ž¶v¦kU×ĸº®s¥3‘uí2t\¸´šœ½?PÀ©¶ÆOõ{‰çº6.£Ðú»«ú´¹‡«k^Â>#þ$ë,scÉÿÈV ñ\Ï «Ížìyz®åÝÔf=ªœ•»F ›ÚfœoÅúÀj4íjÂÁAֺΑúbÃ~ÀxoÍbyÝ_â§oØeæ;‚ßâJ2ZºÔ“§jΧ<—BTŸ·‰ÖÆ ¢EO-øwVʺ•zÜro³ó;Øó¾Câ¾ ðü‹Ílø·¯äé¯Ó˜‰«E¥÷œüHƒÔÖÆjMù|ûͬj5BåØÕN3cÇ™e Ü–>$QŸÙ–ìeÇºè ˜ß[$WÉ›Z1©¾O€<ÎV|¹µ eʯ…žü ù<¦Ò½Î-ßõs2gÁ‹:2±VÎ-d:–Zº#¹©Óo-Œe$=Õø7¯õyž«Ñ—M»6œ»+xû|NÜ`‚ï´ú¦›:”tω½ûÿi纗áœÚ|ªÒ²êp±ïŽ÷ºÿ´÷a¥«âɳÎe@ „{Ÿ‰R‡=Á›TÚ²øaFVY¦}§£HeúaÛ„¯Ÿy[¨K®o‰©ƒƒuÇÄ ÿÕ96Y öÀÙ dÚ·t"Xw»nb@öQÚ FæM{͘±† ßâs¦öÆCXnO‰‚EÝ(!Ht„ „ „ „ „ ~¡f÷•—∊ZûFLv,™ð´èŠ>÷ì%øA°ž>Òq ,*hU¾*V¢ìM™£ ndªŸ0ßÍ9ÍfÒ£´›âeÔfõm^V[•½P8&eÈͺåLöA"¤³øý§ZãVÚq1«±6cŠ™‡NŽÿ—_È©Ò\Cy¡S¥qË:S©Ãšö0¹QÜ_¿¢¸±¢Ð.å]ïÀñº)ƒòé=3Ôw¿§ã™£GƒÕTšþ£"‡“Èð%ƒ Ó&Ųç™×$EkàoÔj†ŸNI=‡öœ¬9]‘ó»QcA~=æ}V¡X€æÐrLÏ›Tïa`pNx>,ä¶å‹u/õˆõRù{~³í$ì¶>þÐÈÍš™¿/øn¢oT꼟*ãŽa‹ãþ¢c‚w¨üÜð³(Î[!¥$W4ù±äÕ Þ,ò6xÿ)×pºZ‡\x˜«Y#bøàyœœ™ö©¡ç¹âsº§âùÙtøíTí³çÞq2êóê\¶\ðo´Ë_^˜ôYzž,5y,û(˜2u–çf?Õ¹"r_ŠûKqãcÍ#¹[_¨ÊyÊàq/Òê57¹}¥X°àpIñ2õ§‹Eü¼Kõ2ùPxýdM¦?ªzdêútÆ#Œjr|Ê5wë.Ý1 y3çz­Fm^o«™Ë7~ÿYµù´ôÉ‘÷KØeÊ]‹fcܱ”6R¢qpuµs·/ßÚnœyTpeEºF¥ÑŪÙ‹R¤|Ï<ù9±ÄlZã…“PšÞ^Ÿú“~Xâèuˆàüô<ŠO‰uv­ —&\€“W=N‡¤a(%·®r´9Q¡;ú}B• 83¥aÓroBÓjp+&@8*?7ÁŸüCø[¬6»*aèzÇÿ£‚=ï´û¢æ?ÚXÙ¿§žÿûœmsåQ’Ñ~dë}v=Z'SÐçÐ` ù’¯žÓŸ¯QÖâÒé””ðxô·YÒ>³Lp 8òï½mhü3åŸÁ ÒúŽMV‹z‘Ð~P|•ócöœí‹^—KÌûx™Û¥uʼnQ·WyØÒõMô®‰ÿ`f_Å]]¡×¦­ôy1éò¨dr9o“íúÏGÒú›©ô€r¨ ¯ç‘ Å•´Ùóoˈú¨÷&³ŸÚ¤´ñÏÆ¼Ï‡’ÿŒér®Mßõ¹ª¡+˨`N,FßÉ”—lÍéwQúK°é±ddýüÏNƒ;Ý™µ+¦n]ƒ÷¹,WùΚ¢ XŽ˜›’‚çÕ®.cÂ-.Y6;v‚ã,lð3^AŽ56{ܨ²8 Š+äËå$eÅ\›>ló2ý,˜\æÓ»+lMG6 XÙÙÛÕÞsòë_3m µ|ˆ «ÅÓú’‘«Â뜨)®pz‡á¬«ŒäÒ8Ï„s]˜¼ì>/¨¤ë38Ë—LBîe ÷RòGÆÅ9R;†e86H¯¼õú¼z}v?çRfñ”Yæ5¸›9LÀ—þ“\ f.T^Û_´MÀÊ\¸zñÏôÄl+ŒØï’`%ód ã’gzTRÓW¿yçäYÓ„!%ÐB€B€B€B€Bút-KK|HUL¼zG">,º} x—iHô nç°Œ§y犙­†¶v#²É$(ªíØÜT [›ì%4¥Éï*l‚ûÉw<؈wiP,LÑ„m%ë‚"&6±}¦€·BÀÏšËJTY³-éãìMË4ØK Íù/¼µ¶‹·¼¼?gÚ]_ <í_˜©§Æ ‘Ϲ”µ÷±î`–ݧ¾˜«V¬8±íü«ûI ›ÅØ@I—¦“#Ó=}¥ê«1á7TÓ‡P_'oå£ bP9?2S ¾iÊö×FL¬Çjòaí*6ä %£¾%_QvQægÉ­DµÁɧ9ÍCåúzu ùŸÚs3j Í’‡“í)Õë-‰cÅæ`úù3d%ÈôöAØ|Ÿ™Ó äϦ/þ¹bþ#.[PJò|w©UÕôúPUŸsŽÉާU×5:‡#új;3ëÒµÇ]Bmg¢ÏªD‘ÕEy?é9Yúæ$m¸É“ݯlàeÊÙ³¹g>^Tr_“¼§§S?TÕf½ùJ¯…Nšt™‹K¨Ôqõ âR;Ù‘‡ÒAcgÚlÕ3*aÓ¯%Ssþ#–2’KÞã 'Áý¥˜´™r~\nOþ&t0t¼Àe G “bË Ûæh-N›³¹Uñ·¹ûM¥%ßɇÚâ.FMì¿ø?ÚE­¯KÓ•¨Õk5`¦ŸҰ=˜ÌG¤ä嘎{€y¹éÂ)ï âúg9ž—ËÉ¿LaæeËÓÈæ{Ó«LË—D ñ'–öq‰>§øˆºœnµøS¥õu'6LµÿS A÷·_ã/òøÚqçŠñ5ãÔ y½Õ?ëú{Ò¸ÔâîðßûžW+ý‰Ð®E4PðGé:DræÜu ªEUór¦ÏjMÎ{äÆÈ–üÔE*ÄmÊ@ÞÓzKVg7L|X‡Êª8ÜIùœÍ^» rq¡È£‹T™øÞY‘¼î2z²ýV;òÕØ{ PÉê5#¹Ì§âSYb—~·<йXSËí(¼dðËÿý ”2/ï2aRÄŽLz­/×À1dõ­Úµr&Ó”ùoô™µi†F M_´5ŸºKkÿŒålSþ3.‹1ñûÍ´5êÏAÎ0ÊØÅŒ›Ç…iWõ_½0é2+Ûɵ™ œ{TmQâbl–v¨5ï4³†üÀך• *¿g5| é¦z4´„sÏıJ¨ô ¤S…ö5vÿÝ/îǽ·gÆw5YæiYûûÌ›¶óÀy—>zºkœ/òcø7äÖ"Ž;̯¬vj×Éó9™5‰ÔÏLjŸSS©üƒhÿN1¼øcV|èìÙK!Ë“9#*Sý^?xé‡"¿™“þîß´w?P‹jÝ€ý§»Å×›.µbÕéÇýLx†\ÕD¡öžSY›¬gr‹&%¶5à~³Ú,¶¼ þó.¬’’viơ“W‰ÿ–ëšÓ·ýÞæF>“®Í”âM9±ÞÚ„öZ`Y‡›æj])W\›jÁ 3¦}¨y,_…µYùÚ„Æ?¢æü_…´ÈU²eÊçµïšQd‰ ¯t8†]E€q€1ðI¹kâÄŒj¹XùõXÑHl‚ý„æç׳>{Í›D†¬º„À;}„çfÕdÌH¨™²f³}î'Ôærµ÷éš…ã1¹@pc«IkBñwÄ£w1¹«]b»JÛx’«ó'iö”–,¸Á‰ÏϧR;s;91ÌÏ„ñ¤Ùçsèû9˜u:B Pà÷žŸ&œx™_׈KÉdÓàJriØ2šî8žQ£ 3|ÔÍ“J2Õω\³§•`Ak÷‚e`jÈ£¨ÑÙc~f,šb±£kqu Ø¥çOMÖ2oœ‚g i^*Ñï ÓÜéÿåÆ!#¼úÖ“ñ›HÓ>G¢0€ÿ1Ÿœ±êY»¨þ“ævðu‡ÔfV|ŒiU °Ĩ¶Ž¥÷ÝâRvsDç°íW:ô¸í€ŸÓçÏ¡ÐàÍÈl¼œgº=§áޱ.›*v¦nu®§Û{‡Ñ"‘rÀŽÓ‡ƒT¦çK •5SFDWZ3ËõïÃN¢­“.g£ê“_qæzö±\€³!“]¾-×?eÓiuþ—‘µCým>U¬¸€ò*÷,ñOŸ2aÉ‘ÈVoJ%U&~„ÖéHÎ5:f {d®Höa؉âÿÿÃü]i©t º}X³©ÒÈÇÝ=®e«¤Z¯’.| õÍ ù .7Nm!Ñçlz¶úYQ©±ÌÍ›]³tÿïØýý¤'GMLœªì÷qÑ:Ÿúø¿yË~£¨¶ ‘ònUÿ8ʇ­ÿÖ6Kªpå[ü¯ö9W$€‚a?ˆ3'OˆŸ{"T߈2yÓ)'æCù‹Å<Üœº€Ú Èß°×í9ÍÕdãI±¿Å¼ÄϨe ±AÜ(ÔÑÄ\D’lÕžf…ÀN î|MŒ¨€î`/$&e hŸO°ËK?ÒC7$|ÎT럦Ù7÷³Þr$YxÄ! .‚„„„„„Õ`Ñ¿‰`rPDÊ\‘[»ÇVT!œY=ç†öå«ëhÒprd7g%?˜À¹ôøöm©¶¼Ï<ßb8Úv„•$ñ+ÜfÈUxœÛ@Èä •®AˆÎO1 ‹äÔ˜‹÷Øä’<ÂÉŽ|LÇPÉmh_ËÞ¹3u lGÌ8Wýĵ_2NÒé9 Ô6Î>g?QÖ€;Q™ŒÎj=;k€<¯?ù “7RK¢@yžCQÔòn7)º;“ìµ×ŸË«|ŒÎ=8‡vøñ\¿ƒPìæêÊXªÃ·¼T]Nª‰{“9úf8Øf|[[ú >~fŸùƒ=Ý‘óâz±üHjðècÒàÁê'sù1²jÕªS‘—¨(¬ óÌÄúñ¸ò/ï=•ÇZþ­ê®ÙÕ©óÌâÔt~'žþ)Ù®è^M~Gù™¿ne3·¼éúþ›“K³XÔ^‡f.ªšWÖ6M' OÅOÿ>À‰ü´<ž ñOâWU*¬ªU ¬éìzv›6¥7aÄ_iæ¼N¸Ñ.O¯«ÁŒ^îNâ+ísçZŹºNMéì&Ø_{L:Ä.ù2do%·~ѸgO]®×é”§f9‘ˆÈ±âr²ëÙîÚ¾'–^°_2‚ynæZÚáï’:vßRÇÚPÙþg+øàªHÔƒýBaÓ r_˜ œ‰„f³Þ^™“6+KW3"äâ?ÕñÉÓXËfZ¯SÊxß\lJÒºn\”c&a‘}įo‘(í¹šTH>f&×$TÎýAõÞW)éÑbµÞQ+ s3uLkgê¯#õÜKýkûÇ)ê] èØ‰*Àc9zHc· Û]ˆ•åëØ˜ws5ZõÊx`Æn[ ©ÁçÞfÍnªròëS;^˜y¹A뽎A·>%S1äH‰ÿ3Ç“ó+)>LQœàŸi&åIrÇaÞ:e*á•`lh¹RK0{ ^åðZ9SØi?N…´½DÊ(ãÎ{ñá§_ðçâ,z]hRãcðMùŸ9WÒüyŽ2 ‘qÔ§—èþ—Õ× @Y¯3ÒáÖæ¯iðºýN¡ 鲜™YÓ±þaëþ!ö¹îtˆœ€™Åªñß±ëm•¶½¾ˆuÄvn#.­˜Ñ›.›'©^à÷ž?¬tÕÓõFÙŠƒcQÁö”W~X‰öüç¬é¹ô¹N<Ø[¹å ¥ »ó_¬û·Uè5˜œ²+‹æýgðî}»bPØ}½¤Zœ¢Ø¦=tëõ ¾0IàwŠt¼ÿÒPcs Ø“#Sc*GÞâoL!”[­þV˜á>\¦ ŒE¥}ålÄ÷Ëú,èg}3)_¤Ï`f˜hnØ6üMJ(`Æþìn^šudÈßU@$ñ3&JhêSg)…Äž®üMbFŸ`SkŽÖg vÎ]ÅE2ÄâH³¦1BK „!„!„!„!„!õ dÝ~¢2.ü„¹¥™Ï^ <`z •gĽíf;#2)vƒê,q8MÕÚVÚ÷q]®O6ÆÔªòZQ“\¦öÙû™Ä9‰îLGÔãÇùÜ/ÜÍŒsýWÕ“Ý«í(m`^æp³õí+YM{s9ZŸÅx+Gù4ëçünÞ«'Q uÛÞdËÔr`€¿â&„ñ¹ÿj§“sŸŸSŸSêÉ™²*Z‡ö—_3ìéêõ}s+gqý+Àýç/Q×59½)·);Ÿ¼âaÇ›3ìÇŒ·Â‹šÿ€Å€^·Y¦ÁÒ͹¿a=øÑÓÓfƒ^0e9‰/“`y³þr0u}F£XÎ1ä͘šLxÉo§ö'?/QéOF yõd÷Þ~š~ÝÈ™²~%ê-3¦“ VÝ:í±ò{™Þ)ʺ{DMJ ɬ-¦ú[-ÖUŸ®tü^œºä±À\lXŸÛ‰óüš§Ï“vVg÷ÞIç÷Šr×({†ÿÔ¦=±üI¤&•]Ç»ñs>_Ŋ‹ŒWp/üçú€‘WúÆú€"©cž(Àïj?dʶr9ûñþS u¬¥‡§‰Ï8Ü«ù JŠ¿3F‹UÔ•ë:Ùþ³c½“e©zËq¬¤ƒµ¸ ;üÍKjuAä¨ÁÖ5XTû’g9\¬¢¿Q5(AŽ‘H0tÓ—ªê© ŽÈùˆcSgê¯pLÈ\² ¦Žà}å{›ÎÒ=«´t‡Zrh]ÊòuMK)*êýÓžÙ0)G>jEî>¯k46«]–öåÅú4Í‘ú‡’+ïqVïϵKðæ'($ ]ßâQÓa×8³Øù¹K`ÍtÎ/ìgeë;Pd,*üWÄË•6,˜gL?ÃØœØö1F—{Ù(å6ã;å|ñ5À2#€G`éÅÉ  ÿ-¬ü›™ÛLêySÄô²¾"›x³R¯á“uQoƒ|ÁÓ‡ôÍŽ9>%é¦!·›x§\é°ïÚ™’#àÇ]¯ØAOŸ´9tûÜ‘|wf—1/à‰³éä†:a|Ñpw kgµöƒ¦C¦¶‹³Û‰'M•<ûNjPîpª+ú(ÊÓê>N\²“McÄ“¦}6§.—><ØñdNQ±±ÿ ñ>¡øoñƒñ0n¡“ƒ¬PQ@aÔ×mãú[ç·¼ùƒãÿä2ãáGšôÊ¢Šø^—í÷§Õtìï#ßáaà©ó:º]A®|›ð×üDê)„×8Öè*¾–¢Ûhö ÜO¤ôž·ø«â\˜3äÑe"Ê7¯ý¹¬ï[.±C8 sÏÚiF$]ÌØ´;ÐdÓêôÙ—¸!ÿÞ^‰þ~«žô¬'M¢%¯H~g~çŽ íeéÚ}QLŽƒxý§ˆê_ˆwd8tÊUÕ·ûNÿáÞ»¨Ö·ÒÕ„pGõœíî/â<5çè(ú&ÇVÛ¬㺷AÚ*Ø>*}0GJ³éqjŒˆ̹ÿ²+“^ß›þ)»&`G5<.©[M‘ñf:žxçô÷Ÿ§:ïá–!²`ƒwc÷Ÿ!üW¢éÃC[¬YÆãó)ÿh˜„Úµ÷œÓì_Ù‡ˆ…”úäôÀoå°c~d¸uïªîKÏb²ãGŠãȉ•˜©*…v¹.(BçÞÌ a;÷X 9”Å-“wÿ·z3:˜ñ³;„ æüÎ\‹:c„$ºBBBBB>Œ06oíø¯0·é8XôFýw¶kEʼnjÀnpÿW>Qø«WWôæ/ÿÔÚÜĄȊ~Ó–k ´ÈJa+Șnr愯±S§G/W×äR_RÿýhLM¨É‘¿™‘ÜŸ“Ĩ¢qU10·Èv—\b¨‘7ìÔèç)FØ«Å]š”dÔÑ¥|Å|y¶¸,{«Õ+r«ˆ}2>­òfý¶t³øü…(a<Åÿ˜jbƒà¬L.êÚ >ñÍeïˆñÜûMåC'QÖå'LÄ.ÓJhþÝæ=ÌêRO•5: ‰w«V;Ç“-Ôhð`È,»¥X+TIC”M‹¢`¤Õ/ì9›+dî>vö‘b˜âÇ´ø#¸?3YÒ‘ªÏÒÇÇ·*9=̽ð)Ĺ~¡ ò/¼¼iQQ j¡È«›ÉÓ˜1³9ûK1a ®ò§Ž<͹±}²ŠÌGÇùK0d Œùï³¥CÁ±ÎàÇó"“€dÞ”“ÍËscË”†9c)ĶÄuäÇ'Il)wv½ìÅ‘òíúb¾–qtH¯h6m¢îèvªiÒ¦Ób|Ô ó,m"};W_Osr¶Õp›H÷7â6ŠÛ+Ѱޞ* ªUDc¹ÅÛÕi6î"¡˜m'‚V08‘—fâçÛ´ QŽ2HU#È#™f7Ç“6æ]¶6Ô‡'%†ïÄLjáì-‘Ï0/Ì mh€l߉Pf b3 …¾£ãÇ™*çð©GŠ0Á“&P¶r{Ìv{Ƥ’[Ȩ–ňôÔ±[p§‚óÁ”X‚TD–Ëêõ/1Â]²ùðDg—ßäCÊ» ‹û÷‘“õ)º—ÚT•ve눌ÁÜÄ’|iÍUP«‡òÔ! I_>.?§iÚ¤3yc#ïuɸóºäºôž öh™±°RWÞTàï›>.9Ô²QÁñpÃ":â$ŠçÌMçx@)Ïæ7-Ç—&A9ßcÓÇc¿.@¡œD9 ’xý¥,r>B'Áš/Ö-µ@aÿêgÆ&fØi—“~Ð4›B¤“eOiS!-¹ßúCPÛHÚÜŽÕÌk(¿Ì{üÃéÿ ‡>Џ®¬Ê6(Ú,Ž{Ån[`JWa/Áx˜¯Iµ Þ§dñL}ìÔ¸"äÜr)ܣdzeq+ mç‰NõÈ]‹2Õ\â$Ö2/ÍÄɧ|yAkkÿ |ytã#„V¿v=äfÕ¹?Ë„+r¬i~°<ì®nåÚtÕé2 š\ø÷|=ö”’Oç½ÒàÊ€>Õ éë:Wâ>¡…TåÔ#|¸ _¬é·â Ù[yÔŠÂ(£<:¸|Dc g´¥¾®5ÝF´Þ—eô<=NЗʧ#c}ý«í:oĘð¦šÕ æÛ™ózŒ×ùnþe£PÌ)È#Ü/#ï+£ï>áÒ®]f"¾C8ž»ãn‚ØU³õ]>0Ÿ˜‹>¡æÏ´§ ú`]ûö¸™3Ï»ÑߊôÃÒ—OÓºž›6M@ œy”ÒŽþ|Ï€~,êÁòý y ê3•¸¡+Ê“ä©V]™³(z©’tÃ¥F ³p¤ö'¹‹¨1äL‹a»ìðj_›Rìã­¢–‡h£]‹iúÀµ~Q•u?\ý,¸Ïõ,Þú,XosdX[˜_¨*“´p|Lyõ/Ñb¼ÓN©Ã‰Ù[«ó<Üô#(ÉWiányé6V/è„!%ÔB€B€B€B€Bêß/¡ûþiIbÍëÚcj6¡Q68¾Þb+¦F­¢€ækηêmÄ(ÅyÆÚ®¹©\,±Tði¡\°%_-U_Ä >ÂFÜ„ Z¾(ù™ŽD$l9‡e˜óãÆúlÏFí”-,خǸàJ][:~PÉP9—fNÝ»=C½ö‹·`õ:’;…aØYJ‚lŠãž%,ÄÈù3ƒGÊ{¦Âöl#ú‡`$·l8Cž½­ì‰yËôÃc6×äÑŸFp¨eÌ…¼)lY ¸Ø°ïóìÔ²µ¥7×Ĺ—Àèö÷T83á˜É(Z TÍO¥)üÅB«Xý Ø ¯q6ß§[šý¼Éþ1ŽjÇŒlQVĤeȈÊnÛ‹#ÄDÊQ…jäØÃ ¯“.ðÇ‹»> ¨%½K!˲Áqžký"eËŒò·áKqfLˆq¨#%ÒÑãí"dFþaçãšýf1×¥h]ËS;‘´|ãæÅE“ÉðA:¿-êKv.LLèJu÷ù‰‰YÊ®5³±aþb,û|K·;}Eä#Ÿ*•±¶ëµöŠ þb‡€±æ|¤8ÜE7 †¥xò&åc“íÄ¡ÉWÛd“Ûæ;ì8.Àµ‡=ùŠÙ €ñýæ¡AW"ã‘FB¥ÊŠ?òñ*¦^K]Å“QÀÄ †÷S`ÍêªéüÖ)ýgs§àÌ£¥XíªãÌ…äíì°š­ nxÊm×Ôx<ܼ˜Ç£°ï-9ŽD€Ó5s~ÒÌXI¢E_¿ˆb¦EV±´©ïcbÆœíí4*ãÜP¡cqûpTv»âÊ„^2}Œ±OÓÉêe G«Þ;æ M×Ì­r£¼Òà"…GVK&è;IÉ›)l|ûÆÝÜvâ1ÈáEí¿ˆ‹¡fbˆ d&…‹Sh›¹/mÌÖErBÈܺ™ñ¾[b¯{¯ƒÞBãÐ ¬rLœÏ˜¸ Ä9ILY^we<ŸíJ ÌG!«ŸÕP}Ä_ª¡h)~y,cÿ̪ ãÅAórÞ•“‹Êâ™G߉3K2nÞN-S6WUmO!©ÈOärAÊñØJòeWE@(ãÜÄ9~®]ÛŽ)GÞ:ÐÞæ¯nÐÅ iÜFáØQš1lL{þ˜¿û3IptÊÉ„ìLŒH9͘#ùRüÁ³"+ª6J½šÿ0•æP¤°æC0Ônz  Wò±•vì~ô\÷‰FÀ*ÇB§÷=ŒÏ‘J´÷í,ÅŒ®AõH¾ð¦´{ dìÝÝIC‡ê ƒ+Å•\0sTxªæCåU´IÉæR[q»ý3{vŽlÈÏ€¶Ÿê`a^RÿÊblÇ=¤r{˜s¾,»|ŽÓdËidp yC¡uܼ“6åÙ¨M SÝØó*lÔ"”÷Sçõ˜®˜2¹UI?s(Ïcº§¾Lêb@Zëx&©¼JuÓêí|d¬ö=¶Ÿö‘“]¢"×5{m?í-ÃR”$’c¦SõMUÚåk­Ñ/5õ?íµš@ö™ÿR‡ý Ô´0w#j÷—áÀ:Ø l{ÎüÇÿù·}”ˆÇ©á²FZRHà|y1QtÌ''ôîòîœÑÕ4Ê”2Ç‹Úx´OùŽœp™ªû§ý£g2èóµ—5)^l’p·œ"Å™‹V˜Êÿ?ÿf2ÀÿhúŽ«¡|Ö¯|aM°¨ÙÌ›U§bo‡a<Ìì¯PÃdœÞxàÎ4›:ã‰BK¨„!„!„!„!„!ÿÙrmagick-2.13.2/doc/ex/images/No.wmf0000644000004100000410000001614612147515547017004 0ustar www-datawww-data×ÍÆšâÿâÿú ú ^OU (  Û Û   ÿÿÿ.ú-.ÿÿÿ..üí?-úÿÿÿ-ð$îÇ y S -â½'˜0s:OE+P]åjÂx ‡~–]§<¸ÊüÜÜ𽞀.cDF[*rŠó£Ø½¾×¥ñŒ t(\EFa/¼ñÚÞú˹:¨[˜}ˆžyÁkã^R*FM<r2–)»!à,R xŸÅí;a‡ ®Ôù!C)h2Œ<¯FÓRö^k;y]ˆ~˜Ÿ¨¿¹ßËÿÞ ñ< Z x /• F± \Í tè Œ ¥ ¾6 ØO óg ~ *• F« cÁ €Ö žê ½ý Ü ü! 3 <C ]R ~a  o Â| å‰ ” +Ÿ O© s² ˜º ½Á âÇ Ì -Ð SÔ y×  Ø ÇØ îØ × <Ô cÐ ‰Ì ¯Ç ÕÁ úº ² E© iŸ ” ±‰ Ô| ÷o a <R ^C 3  ! Á áý ê  Ö = Á \ « y • – ~ ² g Î O é 6     7 è P Í h ± € • — x ­ Z  < ×  ë ÿþ ß ¿# Ÿ4 ~D ]T ;c q ö~ ÓŠ ¯– Œ  hª C³ » ù ÔÈ ®Í ‡Ò aÕ ;Ø Ù íÚ ÅÙ ŸØ xÕ RÒ ,Í È à »» –³ rª M  *– Š ã~ Áq žc }T [D :4 # ú Úþ ¼ë ×  a­ E— (€ h ñP ×7 ½ £ Šé rÎ [² D– .y \ = ð Ü Êá¸Á§ –‡^x<j]÷PÔE±:0i'E úÕ ¯ ‰c<îü-ð$îÇ y S--â!½)˜2t<OF,R^åkÃkÃy¡ˆ˜]¨=¹¹ËüÝÝñ¾Ÿ/dEGEG\+tŒô¤Ù¾¿Ø¦òu*^FGEGb0€ž¼òÛßû̺»;ª\™~ŠŸ{ÁmÁmä`S*HN=r3–+»#á,,R xŸÅí;a‡ ®­Óø#C+g3‹=¯HÒSõ`mm:{\Š}™žª¾»¾ºÞÌþß ò< Z w 0” G“ G° ^Ì uç  ¦ ¿5 ÙM ôf } +” G” Gª dÀ Õ Ÿé ¾ü Ý ü  1 =A ]Q ` ¡n Ãn Ã{ å‡ “ , O§ t° ˜¸ ½¿ âÅ Ë -Ë -Ï SÒ yÕ  × Ç× î× Õ <Ò cÏ ‰Ë ¯Ë ¯Å Õ¿ ú¸ ° D§ h Œ“ ±‡ Ô{ ÷n n ` ;Q ]A ~1 Ÿ À À àü ÿé  Õ = À [ ª x ” • ” • } ± f Í M è 5     6 ç O Ì g °  “ • ” • w ¬ Z Á < Ö  ê þý Þ ¾! ¾! ž2 }C \R :a o o õ| Ò‰ ¯” ‹Ÿ g© C± ¹ øÁ ÓÇ ­Ì ®Ì ‡Ð aÔ ;Ö Ø íØ ÅØ ŸÖ xÔ RÐ ,Ì ,Ì Ç áÁ »¹ –± r© NŸ *” ‰ ä| Áo Áo Ÿa ~R \C ;2 ! ! û Ûý ¼ê žÖ €Á b¬ E• F• * g òO Ø6 ¾ ¤ Œè tÍ qÏ ‰ê ¢ ¼ Õ8 ðQ i ' C˜ D˜ a® ~à œØ »ì Úÿ ù $ $ :5 [F |U žd Àr Àr ã Œ )— M¢ q¬ –´ »¼ àÄ Ê +Ï ,Ï RÓ x× ŸÙ ÅÛ íÛ Û ;Ù a× ‡Ó ®Ï ®Ï ÔÊ ùÄ ¼ C´ h¬ Œ¢ °— ÓŒ ö r r ;d ]U F  5 À$ À$ à ÿÿ  ì = Ø [ à x ® • ˜ – ˜ ² Î i é Q  8   7  P ê h Ï  ³ – — – — ­ z  \ × > ë þ   á# Á# Á4 ¡D €T _c =q q ~ øŠ Õ– ±  ª i³ E»  ûÈ ÕÎ ¯Î ¯Ò ‰Õ cØ <Ú Ú îÚ ÇØ  Õ yÒ SÎ -Î ,È  á» ¼³ —ª s  O– +Š ~ äq Âq Ác ŸT }D \4 ;# #  ûþ Ûë ¼× ž €­ b– E– E )h P ò7 × ½ ¤é ‹Î s² [– E• Ex .[ =  ðÿÝàÊÀ¸À¸ §–]‡;xjjö]ÓP°EŒ:h0C( ùÔ® ® ‡ a;íÅŸxR , + à» –(q0M:)EPã]ÀjÀjžx|‡[–:§¸¸ùÊÚÝ»ðœ~a.DECE'[ sð‹Õ¤¼½¢×‰òq Z)CECE-b€žî¼ÛÛÈû·¶¥;•\…}vŸhÁhÂ[äOC+9O/s&—¼á , -Sy ÇÿÿîîŽ$EtÍ \± E• E• /x [ = ñ ÝÿËà¹À¹À¨Ÿ˜~ˆ]y;kk^÷RÔF±<Œ2h)D!úÕ¯¯ ‰c<îÿÿî<c‰ ¯ ¯Õû &E/i9C±OÕ[øhhv=…_•€¥¡¶Á·ÁÈáÛ î > \ -z C— C— Z³ qÏ tÍ üÿÿÿ-ð$þaòaÔb·d™g{j^nAs$x~ë…д•˜ž}§b±H¼-ÇÔúàáíÈû¯ —'h7PH:Y$j|ùä¢Ï¶»É¨Þ•ó‚p_4NK=b-y‘©ÁóÛæôÙ Í'ÂB·\­w¤’›®“É‹å„~y;tXpul“j°hÎgìf g(hFjclptºy×~ó„‹+“F›a¤|­—·±ÂËÍåÙþæó/H`Ž=¤N»_Ñpæ‚û• ¨# »7 ÏJ ä\ ùn € $‘ :¡ PÁ Ð —Þ ¯ì Èù á ú  -' H1 b; }D ˜L ´T ÐZ ë` f $k Ao ^r {u ™w ·x Ôx òx w .u Lr io †k ¤f À` ÝZ ùT L 1D L; h1 ‚'  · Ñ ëù ì Þ 5Ð NÁ e± }¡ ”‘ «€ Án Ö\ ìJ  7  # )  = ûP æb Ñt »† ¤— ާ w· `Æ HÕ /ä ñ þþ å Ë ±# —- |7 aA FJ +R Y ó` ×f ºl q t cx Fz (| } ì~ Î} °| “z ux Xt ;q l f å` ÉY ®R ’J wA \7 B- '#  ô Ûþ Áñ ©ä ‘Õ yÆ b· K§ 4— † t ób ÞP É= ¢  |ìjÖYÁH«7”'}e Nû5íàÔëÇѼ·±§‚žh•L1…~ùxÝsÀn¤j†gidLb.aaòü-ð$bòcÔd·f™h{l^l^oAt%z€ì‡ÐŽ´–™Ÿ}©b³H½.½.ÉÕûâáïÈîÈü° ˜€(h8QI;Z%kk~úå£Ñ·¼Ê©ß–ôƒ q``5OK>b/z‘ªÂôÂôÛçôÛÏ(ÃB¹B¹]¯w¥“œ®”ÊŒæ†z;uYqXqun“k°iÎhìh h(iFkcnq€quºzÖó†Œ*”Fœa¥|¯–¹±Ã±ÃÊÏäÛýçôô/G_>¤Oº`ÐqÏqåƒú– ©" ¼5 ÑH å[ úm m ~ % ;  QÀ €Î ˜Ý °ë Èê È÷ á û  . .& H0 b9 }B ™J ´R ÐY ì_ d %i Am ^m ^p {s ™u ·v Ôw òv u .s Lp im †m †i £d À_ ÜY ùR J 0B L9 g0 ‚& œ& œ ¶ Ñ ê÷ ê ë Ý 5Î MÀ e° |  “ ª~ À~ Àm Õ[ ëH ÿ5  " (  < úO åa Ïs Ðs º… ¤– ¦ v¶ _Å GÔ /ã ð ð ýý ä Ê ±! ±! –, |6 a? FH *P X ó_ Öe ºj o €s s cv Fy ({ | ì| Î| °{ “y uv Xs Ys ;o j e æ_ ÊX ®P “H w? ]6 B, B, (!  ô Ûý Âð Âð ªã ‘Ô zÅ b¶ K¦ 5– … … s ôa ßO Ê< £ ÿ~ëkÕZÀZÀXÁXÂiØ{íŽ ¡ È> ÝQ òc u ‡ ‡ 3˜ J¨ a¸ xÈ Ö ¨å Áó Áó Ú ó  '$ A/ A/ \9 wB ’K ­S É[ åb h m :r Xv Xv uy “| °~ Î ì  (~ F| cy v v žr ºm ×h ób [ +S FK bB }9 —/ ²$ ²$ Ì å ÿ ó ó 0å HÖ `È x¸ ¨ ¥˜ »‡ Ñu Òu çc üQ  > $ * 8  K  ] ío Ø Â Á’ «£ •² ~ fÑ Oß 6í í ú  ì Ò ¸) ž) 3 ƒ< hE MM 1U \ úb Ýg Ál ¤p ‡p †t iv Lx .y z òy Ôx ·v ™t {p ^p ^l Ag $b \ ëU ÏM ³E ˜< }3 b) G - ,  ùú àí Çí Çß ®Ñ – ~£ P’ 9 #o o ] ÷K â8 Î$ º §ü”çÒoÑo»^¥M<`H0ÿòñÿäåØÌ̲À²À—¶}¬b¢F™+‘‰óƒ×|ºwžrnnckFh(f eìeÎe°f“hukXnXn:rw|åƒÉ‰­‘’™w¢\¬A¶A¶'À ÌóØÚäÁñÁò¨ÿxa,J<3M^^oòݔȧ´º¡ÎŽâ{÷i i X#F96P&g~–ú®ìÇëÇßàÒùƺ,º-°G¦bœ}“˜‹³„Ï}ëwq$lAi^i^e{c™a·_Ô_òbò‚$?ZÀIª8“(|e Mü5îïâÕêÉѽ¶³œ³œ©‚Ÿg–LŽ0‡€ùzÜtÀo£l†l†hifLd.cbò_ò_a.cLeii†i‡l¤qÁwÝ}ú„‹1“Mœh¦ƒ°°žº¸ÆÒÒìßëìú6Of&~6•F«XÁZÀüí?-ð$#Ôs  .Íú#Ô"$&Ò$×u p  / *Ë÷Ðø&ÒÓÌþ! /t Ó&Òü-ð$ ;`»b¾! > ;$` û¡{£~c þ` ûrmagick-2.13.2/doc/ex/images/Button_7.gif0000644000004100000410000001171112147515547020076 0ustar www-datawww-dataGIF89ax÷ŽNŒFDŒŽŒ * DNDÎL&$n$.$Îd F$ŽDÌbd>V$îl f4ÌÎÌ,&ªL¬VT,^,,ljlL6,dÎdärlª . ,6$$N$ 6lîl~,œNLî  ìê쬮¬\.,~DŽD$V$T®T>Ž$ &T^TÞÞlN$Üjlþt4n4LV<|~|lÞlüz|4>4>ž^”JDT*,n<2,žL^,n,ÜÞÜ.¾\¼^\<trtl64üzt¾.,>$4N4tþt v<¤RTüþü¼¾¼*æN$>Ž ”FD”–”TVTT*$n ,*,Òd’DÌfd > V,ît  ÔÖÔ,*®T¼Z\4^44lnldÒdìrl®¤RLLžL\¾\þ~|><^ÄÆÄ$^,<^< ~<ællæld24\^\,*ìîìâÜnlN$>!þ0Creator: PolyView® Version 3.62 by Polybytes ,xÿµ¸e *\Ȱ¡Ã‡#JœHQ¡™'nj˜â #Yr$I‘(•DY²¤•*E„)SäËD1cZ±éÒåÍ‘(wêLÙ’§Ñ¡;…ÖÑ“§JŠ „($T¨M«IwŽªÕ¦Wœ&ƒ² ÖdX )Ó’Mª’«Ö³)±ººh!=6Ò9ѳ&N¿iÁ ®Z³jV´IiþMÛ÷¤`šˆîz’0Εb]x$0Å Œ ©½ÌvkÛÓ¦g–ý«úñ`ÔoÑŽ6 ÔôåÛ¨ÿbeMºtm+ytldbèº>ãfõÊÖìÍÂ\WVf¾lc–«}šeÞø§lËAå<ÿú³bù”ªË>°X¶bÛ[¶Zw7áïß%«ßÍšò鈡æ%0=Ÿj?õÓP­Eˆ›ƒºAö `~I]‚ÒÁEÙ!H˜'âø@v±µÜ\Ô]åÜ‹ÛmWß[^ÍøŸs.ºuUP»I'ÒìQ܈øPW|ú%9Z{º-æäkO*ù$xM:9ß{EI"iB‘.±€Á$/”if™" yæšl¶éæ›pÆ)g›_„ÇËÙÆÖ–#ö f1ÀAÈ ŠJ(…j(¢7Ü€¨"Œ2Z¨¤l,šè£•BZ襊lª©¡‚ú©£2Jê§’žÁÄ 8¼§ÓH ÿ0dŸæIÃ*Zi®‰öÚh¢¹‚ši°›kl°¦6ºk®»^zì³Ä.«È “ìHV"|¨­Rq褾†*n¦Ãû+¯ËR ê¹Å¶Ëîºî’*,¼Šš‹FØY‡-—´ I‚¯ëšjn»äÜé¯Ï+î¯ÃZoà [ʰþJzC „Uß¾BnkLPü®Ä×+/§Ên:l²àž+°¼OìnÂä†ËPŠ”mŸÅ•Ñì¼ ÷ZðÌçÒkr¯áÒ›0Ñ4'­t¦/üwÚδa®ÀüpÊòFŠò¨¦zÝuËb—MvÅ-ë ,.–ŧ—#¾ÀµÓ‹º®ÒïÞEóÿ ðÌ/‹Üî ViÉo—æ½Àt¹.·\2°ÀìÝIÿÍëåæJ¾´ÈŒ^1I±ö+¤Ü*×]z¼Æ2Ý÷ê“›ì:ѯz:Ë®ÎÜ_o{¼‡Ü0oÞ;¡L 2 o|ñÅ’üò$(ß<óÈ/}ôÔKïüðLü-ö§Š\ATMT÷©ø»¨¾kñ"B4¡þúì·ïþûðÇ/¿û¸¢nù ¶ÓTøï.;×ìb¸^…(ð €4 ˜@ðt`!A &ð‚ ײö;Ï!É [‚[ÜB¯v-¬WK` -ÈB R‚0T¡ ]…,ƒš"\W¦v¸™€wus”²ÿŽ5,'P°‚ ”a¸D&:q‰Db ؇ËM®a¹DYξY)Nu[úÅ2‘†,4ã ˨Äöav&{¡¡'ÁìlV‰Û`Ú^f*#ARTá׈Æ’M°ÀêÇ(-:¦$¹ãéX—°z ¢ Q$¤3¹É)ž1*l‚Æ\y®9ûëaÿÆ;‹Yì/àä ùÉYNP¸ääô¸APåO-ÙÂc#%2Ák 4c.W¸Lf®‘…¸åŠå=®ðЇ#÷¶)'Ø’–‡ä¤,?YH$d'ƒ™íx¤3UvŒw£²Ü˘°>ÓžmÄå7ÓXÿN’ÁiÃ_nPrGñíe{ã-‰DqvŸüÜäÎ 4…ËvÑigÿÄF8¢ì’ûÜgÊ…FQ%ÈÂzW®Ÿ9r4ü+ïGs!M,gp&\ > jOãðS¢6Á¨@ýiOº¾[Òp/ ߎvE£Û+…¥5þ*–Œ¡ ¼àƒ¸‚ðÒ*<µ®õ­pu+[…G t@ŸÀXÊU‰a´9<%×5f%jMdã0ˆ–fu+ëAFO&° ƒ½[Ã’uÊKx,é†FÕ^¢à´ƒBF²¡AŒrßÊ•ê©Ï(ÿ8@c슥Ší$¦yL#‹¥ÐNVÀ±i›jæâ9¹lÀ¤ 쀤JÚþ Q„ÓN;C+¢Iž†j@ jÉÀAšÓ­Ö¨ üqÜ@öVWQØV3?íÒøÔ&Äíj˜da 16ƒýŽ¿w‹À ððÐ(t Ž5Bc;G¬¸„ î¦ýЩ*61€U¹YÚ†MàšTàX;.£‘°eV½V$·5Ét¢l]’xfÎë®í¹ÎÇŠ:Âx#(œ÷àº0Z¡Àn4ÿ«¨náM6hËmV¦œf*4 À–Œ+¶8cV³7¿ÍðM7avÁÿqHC/°Á‘Y¾[@ •ɃT@ªöq õK¬t±»H3…%¼LÁ è*@QJš.“”žÉ9A' ÷Îq´¢¢ªz;ÓÌ8nI¾áÙÁ„ð˜½YKVà¥à„zÝÓŠ…)_¾Æ$ù}ç ³l¹pIvõÚ\¢^ËF0mx¥GÓ¹OÑÑ?8®ÿ®¶7i³÷tý•Ý–Oµ(CE€Í&2 2Aë oÆÒ¾¸›8g¡ b®µ6…81dYq$m°KQÿLWÌ b¡:û*'Krß³¢ˆ)uãJÎ,Q~Ìgtß۳ؕê­5±úäÝ‘ÒÆ}ÿl{Laæîjà³U°€q‰Øh(–cê Ñ{¦ÜÆ´ØF 6€¶¼a4xÃ][Á ¸Ú@–Ú–l”°hÛ»ûNnß&\:ØÂ–Ùbua$A]OaN€ZÞ:þ¬YªÍjÍgû¶5[ñšw%¥=¡ðôˆŒëx³*ŠB'Ìz“ïµ-VYÅñV÷Fá¹É|`$~¹ëªŽÍv$`?˳îók»%_r?²Ø:¤Ü@b۴ŠøõU%ÌJ‚I«ýjýÒ]gýÁ§®ø\¡ SD£ ^ m%ÓË•¼&´ÔRI+­ºbZ7:ëé~®AáÖö¤yì€l·ßõ £˜á¼ÿîLNæâûf+«ïÐÅ„"(v“˜‡‰n÷ôš92=Ü/õ˜üäŒ÷+„`W2çF+•|(G7Ìu2…3æEw-§kü¶Mþ•( €bWAiPè_¯3nyCJ!g-•aþ3‹4qú–9如„bÞ$s*¦Hýµ,£–iÈâ,áÖ(ô=â·Q¢5u»ÕR°ÖuASpz41°r˜{–f(;—"gP°g6x?Ê6CæPt\9F½÷]£r_À$+ØTo±V9ýfoºYæ\àTfä»$e’CL$´r»Çd4l£ƒ.RhvÆxu¿çDã¤,ÿFb¾Strþ‘W·\r؇S…`–cE w ÞÅ8rot.iödÎÇ=Dˆ–5S7,„wECœ4hà8éÄ8CGq¥¥C:Q¡#X#£4wPAƒ97°ÐOQ¤€¦ŒW…HBÞÃN«¨;?n“ÂK~ƒi‰V(gÐ÷d‡<0ÆVlT¥.‰Hhljˆ8ÁµŒ8—x¤[ÄÔ^ fƒTŠn6¼ˆ^#sf9‘m((7|”\ÉXI”D€W¸”ßèb¥uŠúˆ€:dZØ´U nžR~w.‹nšC°WðRâö’Ý×W†’Êq…^ÿt9É3=è2üµ+Œ†|‰ÅFðjÅä“:j.hI R±RxÁ…xÐ÷†8…ø£’€tA0(´#w/¦p@‰€kgMI2µ‚ö؆2¹7„ð)H°U yŒ˜hqXóR‡“ˆ&ìˆ^å@F€`¸P%°zØ–îèPØ€'XrPÆA,cwJ憄"ýdK@s£vÕV4ÈW`ò"r”aÖ/¢Å”)cqH“…2˜Ð¥F!F€w`…ˆdÓRGBáv¨vy 8DÉ(/1 R3„u…AG0ÊiXÌ9-&±!qjˆFZR'3 O ã\)†‹Q@£dgzx{fÿo?Ø$AH5V2â8éæŠ…Žõ•Æt ÙW¼U³Ç/„u®ø—Ç97@î·’3Ô`7â‚ÌõbFh• gMÒ9ˆöX9Ûc]^5rŸ,Ôy˜p —eI>#r¯qhlu:hlÇDÃÙ`µÔ0žõÅ‹‰šìrm¹qžXeIIrä+LqyH]38D}Ö¤ÜóWbB“šAtpå¶0Xô‡çlO„@ð™‹w•K‰„þ,§Ä<Ú›ûd¼qK¸v£Åƒ÷ž›…€DSh¦JZe¥Œ ‰[g.yßÔ¸… Š{#&e%¨# ÿÙ?x4X\È“·*Lp}±‰FQЃ,u9jm¶GBó7?XÑ©fcf)‰×–Ë(.)ÉPäÔh@9–GnóqŸ§(UØpW7bjwÇKHKQ0óiˆ­‡ñ‚ˆóm7ýÙ–{covw2ŠPLŠq:l8h2c9jEwFx@x †¬Vÿÿÿþþþÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþýÿÿÿ­Ä8l 3i@t"=n6e:i>pAsGwFwc”'ÞèÊÿüþüüúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýûÿÿÿêïâN~ 7j/b6m>r8g=mqJ‚v›<ûú÷þÿÿüýûÿÿÿòòäùøóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþüÿÿÿÍÞ·J‚ P†R…O€Du0a3e;j8i9h7k:lBu?u4g9n;r5k§Â„ÿÿÿÿÿÿîõâ³MÚæÅÿÿÿþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþüÿÿÿØäÆQ…BwL K~!K} =m7i:l8l9h9kAt?t6n0d5i5k9mQ‡£Ás¢Àtj™+S‰ÈÛ¬ÿÿÿýþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþüÿÿÿ¿Ò¢Kƒ=ro2e0e5i8h?qAu=r4j1d2h-d ;oM‚LƒK MLƒ ¹Ò˜ÿÿÿüýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿëìÙùùôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþýûþþúrœ?7p>s,a4jBuDv7h/b8k7g8l8n8m9o6h7j?qL}FyM‚Nƒ"H{!I Œ´Vÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿ©ÃmãìÑÿÿÿþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþüÿÿÿÑÞ¾x¡CL€8l9n2c-e3l:p?q4e,a5d.b6j=q2g2bGzI~ByAsI~H€ =rJ`”ÆØ£ÿÿÿþþýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿöùïr£0ÄÙªÿÿÿýþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþüþÿþÿÿÿÿÿÿþþýÿÿÿíòâvŸK/g>r?s9o7j4g1g9oAu=m/b2b7i:p0f(Y9iEz@v;o>sD{ Ay:pCyH~f˜"êòÝÿÿÿþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýûÿÿÿÕá½Pˆ³Í˜ÿÿÿüýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿýþüýýûûüúÿÿÿ¨Ã‡@wGw4h9n7m3d7k@t;o:ppF{!I}'BtrI}Qˆ §Åwÿþþóòèÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýüýûÿÿÿø÷ì¯[@w¯È—ÿÿÿüýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿîïäÂÔ¡øüñÿÿÿýþüÿÿÿØçÂ[N‚ S†)?o,` 4j3d/c3l2f/d:o:n7g,^3g0e.`:n@u u9r ¨ÄŽÿÿÿüýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿ÷úóa‘+iš-²Í‡ÉÛ§©Æ|j›)LƒAwByFzBq1b/_'[ +`3d1d/f6i3d/`0e+^2cAu@u/e5gvEzBu*a–µwÿÿÿýýüÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿÿÿÿÿÿþýþüþÿþþÿþßéÉÍ߯€ªI:t 8lBzÀÓ©ÿÿÿýýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýüÿÿÿ›¸~1l@xK BzCz@vq:n1c-a0a.^.b-`9k=r7m/e8lBws>v8m:o „«Xÿÿÿÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþýýþüþþýÿÿÿûý÷©Ç€ZŽPŠF:nDwG€ÕâÆÿÿÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþüÿÿÿÑàÀLƒ?q=rE{E{o0b/e2i6lCt :k6e5d+_.`=pq>o/a(]*_.c6l;p;m6d,_7i7l6k/b3f=t6o6k1d6i7n/e+\ DsAtF{ÖâÄÿÿÿýþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿüýúÿÿÿÌÛ¶ƒ©VçðÚÇÚ®©STˆE@v=w3l+_Eyt;sp3c4h8m2h/b*]1a=o4i*^ $T 9jEz?u;s3j2g,\*Y Ar>us?w:v7o(^ 5gG}D|:v …­Xýüøÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿööîýüúÿÿÿþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿúü÷o?AyCzBy=p0d3l4l+c &Z $\ /f9o7g%X 1g7j4f7g4c7i4j2eEuEy7n8p1h0f/d7gExI~I~F|BvCwd•,õøîÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþüÿÿÿÉÙ©¨Åws¥+N‡H~;q6l;pBw;r9r0j2fAvAzF~CzWŒ!ÝçËÿÿÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýüÿÿÿÊÚ©ºÑ‰ÿÿÿþþÿýþüþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ†°YIG|DyEx2d.d.e,_5g/a'Z *^3d,\&[0e:o6k3a6d1e>oCxAw9q+b-`)_.c5g?sAvHN„"FzBwd—%ôùíÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýûÿÿÿßëÈ]‘D}JJ>v4j=pDz?v?w5o*a :nCyC{E~=v^•-ñøìÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿíôægš$ŸÀk÷ûíÿÿÿþþýýýüýþýþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþû}ªKELƒ!K‚JAr+_0f ?tCyDxGxAqCt>m%U +`1g/a-[9g;mAu@v6m0fr=o6h=oDyEyBxBx=qPƒf˜#ÞåÊÿÿÿþþýÿÿÿÿÿÿÿÿÿÿÿÿýþýÿÿÿ×ã½l&H}J| C{:t1i7lH~>w8p5o-e/cCyAy@y:uAzz©Iüýùÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþüÿÿÿ°Ç–?ylž1½Õ–ûý÷ÿÿÿÿÿþÿÿÿýýüýþýýþüþÿþÿÿþÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿ§¾{Fz ?uF~F|?v?s7h7kAv?uv4h6l7n6n/h(^ 5f8m7l9oCyLƒ#6s °jÿÿÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýüÿÿÿ£½‹5q:n9t G‚P…w£G­É‰¬Æ€Îá¯÷úëüýùþþþø÷ïÿÿÿÿÿÿýþüÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿt M.f)Y R (^ 6oAu6e(] (\ 6j=r:p>u@uDw:j([ (^-_8h;p8n2i1g2f:o@s>q3d5g8lEwFzB{8o5j \‹ñõçÿÿÿþþýÿÿÿþþþÿÿÿõùën›0=t 1f7j3i,g/j-f.d;r8p.g%\ *\ I|EzF|I€B|2l)b¼ÏªÿÿÿýýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿëñçH(8o1d2m@x;s D~ E~ U‹qŸ&‰±I®Êw†­DÂÙœÿÿýÿþþþþþýþüÿÿþÿÿÿÿÿÿÿÿÿÿÿÿüýüÿÿÿ»Î¥0j2e5c-\%W ,a8k,^ 4e;q8p8o6l>uCxEx3d&[ 2c7g4j6l0e3hCv @u =s7l,]=mEz@v4j)^ #Q Hf‡Gÿÿÿÿÿÿÿÿþÿÿÿüýûÿÿÿ³ÌŠBz?u5iBvAws q9i9k;k1e5k7lu:o>p7h-_7h4j1g4h=q:p6m3i/e,\:o6o3j4i(Y 4b;o z LÿÿýþÿÿþþýüýûÿÿÿØåÂ]!t?w@wAxAu7k5l*`&X ;ntBvAt9k:j4i6jBtBx8n7m3h'Z 3d=o3h,b 6m9mDvH ’¸^ÿÿÿýýüýþýÿÿÿÃÖ¥P…@v8l-c 8l4l3l3m:q8o3f+a#S 4e3l-e*b ,`.b=pI~BzB|y§F®Ê‹Ìصÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿîôè^”-DBz>q2g2lq0_#T &\!U 1fr;r:q;r?u7l.`w.m¤¿‰ÿÿÿüýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿÿåìØZ)Kƒ!I‚!I€Av-c0k3l2k6s@y!;o/h=wD}KAsE —»dûü÷ÿÿÿþþýÿÿÿþþýÿÿÿãê×Q‚&=o/d.e2j3i5k;k(X R 2b=s3k-c ,c +a 1h8n>n7j8o:p6l;s;r/d*Y 1d/f+a 5iGzK}7i+Z 2ag-“³fc’(KDyH{KCz?tuT‰*êñåÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿòöé[Œ..l 9u?yD{At*_)b3l1l1k8o-d1l>xC{?sAwOˆx AàêÍÿÿÿüýûþþþÿÿÿüýùf”8D{Bt,] "R S (^ 2f2a2b4j.e0e/d 1d3f3f1f;l4h4j2h7n3k-c(\ ,\ 3b/a4fBvD{?v>pEvIy9lnI~E|G~F~BztExHyCrn=n,^ +`*_'\ 6hAt@sCwCvDt6f0e6k;p7l([ %T =lL‚K€M€Fz?tBu?q=qEyK~K€ ?u?oK}G~F}Cy=p8k7m9p6m*_ 6fL}CyD{C{>xAy:r3k.h-c9mH€KƒJƒÐÛ»ÿÿÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿÿâìÖX*G€ >t8n8oBy?r'Y "Y *d3l7l1kr=r9n;q=r;m9i4j5j3h5j0e5d>p?uCyE{H}G|MCv3fAwBw3i1dCwAyBy>w7p2g;nCx4k']-]AsAwE|@y@y8q7p4l2g9kAu@w@yC|SŠ$ßçÑÿÿÿþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿöøðkœ@;w;uB|C|H€ F}>q(Z#[ 0k5k+a/j>yE~D|=oBvL€G| ZޤÃjêð×ÿÿÿÀÕŸN„9k0g,f 4m6o4l8ln5j6m>t?s5k4j2h4h7f1d4i,b%Y +XCsBwD{J€G~DyF{H}Bx>o@nCtL~KGy;n4j:q9r9r1f,b&X 0_CvAw>vuCyEv*['] ,d /j9r>v9o3g7lAwF~G{6f/b @rK}?o2b >u=u2h6l9o8o8m8i1f5m6m5l8m4g2d0d;j/c(]'Z!O 8d?tBxC{ByByGz6k7o-`?mOƒCzE}I~G|I|?s?uq'\ 'X ApBw9r.g*a)^ 4eJ| H~BzE}EAz9tE~VâìÖÿÿÿþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþýþýÿÿÿ¶Ê™-e)[ &X "X '_ *c+d4p9q?wBv2c)a 1m6o2k9r9l1i;u6p7o9l0a9q@x5k0c&Z #W &Y 1h3j7n8mBr7h+a5k:nwC}C}EAyBzN‡³aßçÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþÿÿÿ‹­u.h >s0c#S !S!U %^ ,e.g:rDw1e'` /i0g,b2g8m7qu@wBy?u6m=u;q7k5l8o1g%Z :jAr:j>mEwH|L€"@w;t=v=w5n2m:t:v0j6mBx5rŸº|ÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿ•·t7tF~Ez?q5f+Y$U $Y $[ .c5h'Z %] 1j4j-c9r>x?y@y9rp9j6g2c /a7h-c*a*^ ,_0f2h0f7h5d)Z@o@t>uoH|K~ Ez@xAz;u9q=u6p4n:q-b,d#V +]Dz=x‚¨cûûúÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿÿõøðg—<9tHC|DyH|Av@t:nr?p&Z (_-d4j2k0j/g ,d'\ $W 1au=t9o=tAu2c!S +X?sBx@us;r@x:s4n1i:p:r6n8p6p)] ,Z;mI€ >{ ˆ¯eüýûÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿþýú€¨R4o 3m:tB{>xD|G|F~HJ€ M€#?p$X +a 2j6p>v;r5j?rF{I|?p-`8nD{D{:qAyBzBzD{CxFw?m4d.b/f6lu1h.e.e!R +\8k?x7s u Sùû÷ÿÿÿþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþüûûõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿÿ ¿D€?v2jj8k2f1b3e2d.`([ 0f+a8gCtCx9l,^*] '[ &W 2eq:p8o:s6n9q2i7n9q8q#T $Q 3cw;t=tEy J}!=p,`0h1g2h:s6n3m7o9n-` R *] 4jCy=q.b >sAv;p8m:n8h0_&Y 0d3j0e+^7crCvEyEzEz6i#U %W 7e1e6lAw>r3e(V +\ -`&[*_,`"R (T=mCu :n5k6n5m%[ 1e;s1j%[ 7hGzBzBzDy,fr™Wúúøþÿþþþþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþû‹¸MÝêÉÿÿÿþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýûùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÿ‰´^C€G€Ex1h?xC~s7g'[ ,b1h6o9q6m+_/d5g0c?ur4e*^ /g.f6m?xAxBup8n1j0i)^(]#V %V -Z6cEt@t6l6n?wBy9sްhÿÿÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþýüøþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿþÿÿÿþþýýþýýþýÿÿÿ¢Â}=| Êܹÿÿÿýþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñõ씹SúüòÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿÿÿÁÔ£P‹Bzs9oCw@y “²qÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþþþüýûÿÿÿÝçÒ—¸müýúþþýýþûýýûýþüüýûþþþÿÿÿþþýþþýÿÿÿýýúÿÿý¹Ò–D}GßëÒÿÿÿþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýx£@¾Ö•ÿÿÿüýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿüýú}©S;x ;r9pCx!Dx 0a#Q Q "X $\ (c&^3k;q;o?q0` &[ (_&_,c-d.`,^-d4j4k0e ;pDzG}JF{G|K~I~HzAp*\.b-a8d2c/f.g0h0e*`4e@o,a,c0e0e6n6i4g=r9o8m8j#T0Y7g&Y %U 'S 2]BpHyKH~D}D|D|G€IO†#O„ K…޳hûüùÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþþþýýþýþþýÿÿÿçðÝl—DP‰Íà±ÿÿÿýþýÿÿÿÿÿÿÿÿÿÿÿÿæíÙöøñÿÿÿëóà›½qy§AC~-fG€!ìòáÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”´vR‹ ßìÅÿÿÿüýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿÿìóåp¡G;xB|E?{9s7l;k;l*[ O O !T $Y-d6kq0a,^ )[ &Z /c8m9o4k7l8m;jFp!9i=kDsHyK!J AyF}Az?wBx:r8s4n;t7tk˜CøùõÿÿÿþþþÿÿÿÿÿÿÿÿÿþþþþÿþüüúÿÿÿïôçµÌ’nž?D|T‹"p¢-Á×–Ôå·Éݧ¸Ï»Ò¡‡¯dV‰*ž¿x’¸^X"=z6u,c0n kHþþþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆ×¸;u i&ßëÈÿÿÿýþûþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþüÿÿÿáèÕS‡(+i/i *d .e;sKƒ G}BxEvx JƒAw?xD~M‡ T‰Rˆ=u uByA|>x@xB}FI$H~"@wFyCuEvGwDq#P #Y ([*Y AvG}H{I}G|Ew9h+_ $W (W 1d7j0d1h;s=r@p4b1\8g+a)]O 5aCvAyBxxAy6n0g6n,c 'Z =pE}{£[äëÜÿÿÿýþýÿÿÿÿÿÿþþþýþüþþþÿþü°ËŠI€BzN†!E{6n@s?r?u6lDzA|3j2k?sI~%C}!;v,f#Z /eE"6u”¶xÿÿÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿÿÿoœQ-h :s[–¢ÂlèðÖÿÿÿþÿþÿÿÿýþüýþüýþýÿÿþÿÿÿÿÿÿþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿýþý‡°`C}3m:x8u6p:u7r5o4n9rAyCzAxBxH}@o$S !T 4f?u@u@tFxDwFyH{>q?mGx7i+]-^-b2i3h@r@qDn:i*_"S 2_Fw=s8p7p=v9n5i;n8m@vAs,` %Z"T ,WAsBxByAx>v7p8q:s5n9q+` Q ,Y=n-e>pæëÝÿÿÿüýûÿÿÿÿÿÿþþþþþþÿÿÿýþû—¹dL…EzN„(I‚By7kL)N„+J€%;s>z:v*b4e=t:t6q,g W -_;v?|?~¿Öªÿÿÿüýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýûÿÿÿœ¹‡-m3h7r E‚ h$²Ï€ëðÔûüóÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿþþýþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûüúÿÿÿ¸Ë /i3f%Z %^ 4o?z?y>u9p8q:t9s;sD|E|Cw?n0^9l:p=s?uAv>r=s6kArH{CxEu2b,\-^ *_4k8m8kDo?j"V 5dCuBy:q2i-c+a0e,_(\0e6muE|y!?y5t,e*e)f#U Hw$H|#=u 1mR+^H!D}CL‰ªÈ†ÿÿÿþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿÿÿàêÔPŠ C|.c2n@{Rg˜ oŸ3¤Äv¿Ñ—Ðà®üþöÿÿÿÐà²ÌÞ«ÿÿÿþþþþÿþýþüüþûýþüþÿþýþýýþüÿÿÿÿÿÿþÿþÿÿÿëðç…¥s>uBv8k&\ ,g ;v:v2k6otAv@u;r0f4g?r>t7k0b/^:kDw:o/e2h4g7fCm1bBu=s6n0h2j4j,] ,] 9i._/f7m3j:p8k=jArAt=s8n8r9r3j4o,b$V .]I|T‰ H€|¤Vñõìÿÿÿþþþÿÿÿÿÿÿýýûÿÿÿîôåu AP†I‚N… L„%7n2k/g?r6o2o3q7t;u%[ O7gG}%@y"4rV *ZAwB}BKˆ!Gˆ¸Ñ¡ÿÿÿýþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿ÷øð\4>}xu:nCu?t0f)]$S (S 0b6k:o6j0f1e/aSz!Gy9o5l/f,a(Z &X 7kFwIz>o0c/d9n0f([ qw9s3l9lH~!D}!@{!y2hBuAx!;s )b$X @uB|B{y3p,i'c %` -e6q­Æ’ÿÿÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿëñâQˆ*4n.g1j&Y "_ 3s=yEz,f3t>{C|@w.h 5r7u?y:q@zM…I 8oG€¥ÁzôöíÿÿÿþþþÿÿÿþþýÿÿÿòöïožI6p7oG€E~ D|F}I~$Hz#As;m3c)W %U (Y 6g6_H']+a8n5l2i9n*\ #V 'X 5a"O Q )^0e5k.b>j3f.e,c(]#V %X 6hFv7f:l=o/d-c+^.V;g)\)[,[,[Bp%N,J€$u/m|£]ÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿý~¨T=|H>w>r'Y#a 4q|C}$=t)a +j7t7pA~@~8s;rG~H€~¥QúüóÿÿÿþþþÿÿÿüýûÿÿÿÈÕ·@x5m/h7t5puG~Nƒ$FzFxFyHyGu(QG'[ 2k-c*^ 'Z (W )U 2`GwIu7g'X )]*`(]:iqFxEz?q0d;mCt=s&W =fJx"BqFwL~#O'?t">v$C{"F|"=tDy'Aq5l}Ÿcÿþýþþþÿÿþÿÿÿþþýÿÿÿëñáož9I€?u>yD~7j&] /j)] zB|G~7p>wHÁÙ•ÿÿÿüýûþþþÿÿÿýþüÿÿÿºÎªF1g)[&[ 0k9t0j:s@y:t>uHJ€G{As?l%K $U 3j4i9l2bu9rsD~@{?zB}F€!CF‚ >w9w®É›ÿÿÿüýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýûÿÿÿ©Ç8w 4py@y?tExGz?l"P /f@vBw;oBw:n3d/c0e4j8nw3k.e3l3l+a*_(Y 8oC~ÈÚ¶ÿÿÿüýüÿÿÿÿÿÿþþþÿÿÿ|žZ:q Q‡$8n2k;wD~D};q,\EwDy8o7o?y9q3i5n0k-h 3eFz!I"@zAz@y@yA|@{2oG~K†ÁÖ¬ÿÿÿüýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿÿÿ«Ç‡E…>y-m 4t>zC~{C|Dy3i,h;x=x9r3i @wQŠO†IŸ¿hÿþúÿÿÿþþþþþýýýüÿÿÿÓàÄg•>C}9j%Q %Y )` %Z *` 4o4l6oAyH~ =s>o0YK 5k7n6j5j7j;k*Y +\ 1g.d.d3j5k2c8g)^ )_*^*^-^:kCv2g1f8n'Y /TGt ?rBw"?w5o)^#T (Z$T'X "L5f|B =yE}$I"UŒ%¤Àÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýûÿÿÿ¸ÒF…Oˆ#=w.m +k1n=wAt.e*i 1p 2p1p4q7u>zF~F{/d$] 1l4l/e >x?}m2c +_ 'Y &Z'Z+`-]Bo3e5h:oDwBv:p5j4g:m5i&W @f8h4j6o,c%[ "RHBBK*Y 5g:m ÌÙ·ÿÿÿýþüÿÿÿÿÿþÿÿÿüüùЬ]KJ~2e>rE~F~B{9t1h /d:s4o2m=u?w8p-d%] ([ DuD{B{>y;x=|;x?}:y0r0m8q>yBÂ×´ÿÿÿýþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿÿìïâw¥FADƒH„C}?y?yA{N… Gz(a &c 3n9s7p-j5sE€ EAv3e(b *c/e ;w8t.h tEw:hH 1h:o6k:l>l>pDw?qs:o1e8m7m(\#N n5_ 'K "I "H ::@%R +Y1_'N J 3j6iGwEu1c 0d5f8k=r;p4j,aAl8f,c3j0g0f0e7j9m0eK /ZCuH|Czw6m4k0j,bEv G|&;v5q6r/m+g -i(b '` 8nB{6v4r/lœºuÿÿÿýþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþüÿÿÿ´Îž<| .j/o 6x/q,k 4t=|A~D}5iV %` *d0iw:n2f I\“—¶Xòõìÿÿÿþþþýþýýþýÿÿÿ˜¹jD{L}H|DyBu>o=i1Y*Q G H +V@o-R%U @t>r8m7h-\ -^ 0c0f3i6l/d@m=k4i:p8m4h6j9n8n)[,Q?msBy8q5n8o-f$[ 8h:o-d-d+b %[ +^sGy&9n4m6u8u-gC{áëÖÿÿÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿÿÓáÀQA~-f&` )c 7u>}7w6t6pxs{:w;x+b %] ,g 7s «^ÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþüÿÿÿ¾Ó¥B@}J…C|4l0p5uwC{H~3e V &` /k+e+h:xB~;tsEyDv:kBsGwHzICy|9t*i 4r8s7rJ!8o?sH„‘¹iÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿíóèV"=}@@x=t;m3j6r2p0k4i>qBt/` 2i 4j 3cJv©½‰ÿÿÿÿÿÿþþýþþýþþþÿÿýq”L"X&R K$T#U *a 2l=r=k7c +W ,Z#J 0e:o3f:p/b 7iBww=x>yA|?{C~=y8s5r@}>{@~8uH‚O‹t¥?ùüöÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿóöìc–,2p 8w>}G‚9q#^ )g -l7v5r9sC{G2cNT +c4q4n.g/h4i&Z %] 4ml=o7k8o6k*^ )] >p:p2iP2_Ew ;st0`*` 6q?y>z?xCz@s+Y +Z CwCwFyD{s¡3ïõàÿÿÿüýûûüúÿÿÿŸ¼x;uF{7h=sDzDy;p;rk>l=k>nGv>o8m?u;s4h3bHzJ{?p 8l?t 4h ,W /X 1] IN*X ?tx@wAw7gM $\-i/k=v=r4e"V ,h3o1l5o=u5j4fs0c1b2f3f6l6k0cDn/`,`4h7m%U(L>mAvH|I~J€K€G~ICwK€B{=v/d%T +Y .a5e9g8g=p:kGyNK€9j%R 6f4j)_ '[ ,_!R *`3h+^#T 7cHy!Dz#Aw"Cz I$E|2k:qG€$@}3n;t?x;vB|@|:w2kC€I‰MŒPލÉ|ÿÿüÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿÿáê×L‡6uB€K‰D„GƒHE|/d U U-j1o6qAxCw._K V )c9s;q7k)\ '` 0h1k;us?q4d!R"U 0]@mM}'?u9q>v?yv.` 4g@u=qq8hAq5f1c8j1dDmAj,b1eK *O?n5f,^ #W %Z 5kBz>t,` 7p=uAy-_ H+U ?oDxK€LL€L~3h 0g 5m.b2i1`Eq!J~ H1h0f2g,`/]Nx%Hz(H|.I}$Cy5o5n=w:uq2c$S N!T +`8l/[G V -g4k/d 0h3o2o4o5o4m)[1d>t;pu>w:u3n.e,[ I"NAu8k)S 9i Mƒ>tG{>q'R /]8j>k8g?n>k @n:k,Q#M;n:k:l5g/b4h8f?j%Y I3Z@pAuDzE|E|I‚Cx3h/eCx)V BDC ;j9o@vI}r;q5l.c$W >nEy"Cy,Cy,?u#9q:s=v9s,g0l.h,i'b (_ 4h8jL~&O…'A|BC9t%erœSüüøÿÿÿýþýýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿÿÝêÏ]™!S’C~3s@€>}6s:w5r9x9wC~FF€IƒH@vBvAl!O V :l.d -k 1n5pBz?s8k4e ,` )_ -f .g&\ (Z Dx=l$P &W !N $O ;pCz7l;q7k .\ -_8p?vD|K‚LDv2c :j'M*]7j5e6i6i5j3bCl#X +TCpCuAt=s=u7p6o=wA{;kH~>r=sCzJ2b 6k0e,_ :r8p=x9s8k4i2j1g(^"T ?nFz$H|,>v#9s6p1j3m4q+f,f'a &[ &V 1aEw$I}&=t9s@{!E!Hƒ@}={„­iúüùÿÿÿýýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿúý÷m£1=~ A}/j +j 0n+h )g+g 2q3r2p5q6q-g*a2hDyN€ Ix 3a-a.h *d .i6q2n:r?v5h+Z 2h>w6m0e D}?w3f;l&N C:i;p3g:pH}Ey,Z 'V0d7m:p>uv9q>u6m(] ([ 3j5l4j2` ;h7o=tCy8l 8o=t6i$T &U 3f-c3i5l-d9j4j+a%Z M7cFz!Ax$9s6o5o2k)c(c"Z '] -`1a>oGz"C{!C~"B~D~ t8k5d 9m@wBv2d/c *Z 9i'R&V &T 0f=u8n5l7h2` 8k1W"M5j:j7h1e-^Ip[|0Ft;qAvBy?x:q5n:t@w1c"Q )\ !K 9dI|6j7l DzAu0e -c /` 3` AtBw@v>v;r9m:m5k%Z L6`Cw8q-d$Z U RR &X+[4eGy&Cw">v@{>{;x@{;x;wHƒ#D~7q9t;wH„ÐÞÁÿÿÿþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿÿåïÖež H…E†:y}D…CƒA€;wDLˆK‡D~C~I„C€>}8t9x8u>x>xBx"BwAs.WCQ)d;r@vAp1_8nC|9r6o/g(]&X .d u>t=q 8m ?u;m6k:q5l3i;q7n4l0h.c "Sv8k%T &R CpH}M‚KExI}K€Cw@s>o.` .b 4k6l1i/h0g(^ ,[ Ip#U‚*I#K‚$K… HA{B}A|A| @z;ux:t@y=u6n=x@z*] G{!P‹{§[êïèÿÿÿþÿþýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿÿÚæÂr 7:t 8u <{7w;y1l :xD‚F„D;y5r=yK†B€<{5p;vFƒH";s&a (a1h@uI}H} Bx;h!J K)`-^)] 4m9r/g;qDxByILƒH|Fqv>w=u4k/e9q5j,\ 6b9l7l;rF}JE{F}?uArFy@u7m9p=v-d)^ &[ $S Is N€#G} H}$C{ I‚!G‚"D}@|B~@z@|:t8p8sC~Ay7nBx9q&_ #Z2c1h(hÃÕ®ÿÿÿüýûýþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿúúóx¢D+k0i 'Y "P "Q"V*a *e -j 9w9y6t?{B€;x1o/k.h0m0m9u=u5mBxF} @{!B{!=sDxI}Hs,UN*^*^ (_'\.c>y9q9pE|@y8m=l?r>u=ueI "V Ot Nt 6m?v2k0h/f2h+^ ,a*] /\Jz>p2g 1h 7o7o 2h 4i7m?s?u?u3j*` 2j3h#W "P AkJ~ DzC{ D~"@y:un>qG{O~@gKQv"Nv!5k8p-e&[ (_+a ,] $U &UDpH{O‚I|Bv;o x6q0j0krKN€Pz"2cQ1j/j.h-c=vs/_(T K Q "V P#[ &^ -g5q>yuJ€I~Cxw>w;u;t4l8s1k/g2m/i(b +e *^ 2bAuLƒR‹$K„+jR„/ìðäÿÿÿüüûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýùû÷«Æ—V)>~A‚A7u8tJ…QP‹Q‹C}:pDu=k KEJR&_ .g0j+b+`2j;u8s7q5n7mDy L~ Jw.YH$T 6n3m/g5k.a6h1f+a/e;r5kCv 4c4bBuEwAs6e 9h &O C'Y ;r?tAs5j8pF| HzlŠ*9j3k;q?u?v?v7n8kKx!I}L‚!H~F~F~-c -^ DwBy=t;q7j6k4i.c$T AlI{EzBy >w9s2o2m4o2m+c '` &\$Y P M ,Y6gL%VŒ*S‹&I‚E‚\”)¼„èîåÿÿÿüýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþüÿÿÿ¨Ã0t8t:w>|M‰J‰F…B~;w1mFO‰#H‚G{9h0] K GI T #X ,e0l+e-f5o7o@xE|"Cx!BuGv6`'V $Z #V ,c7q8n5i1d4h:q8p1g#S !J 5cJ}I{L~N‚Cu2b !E I1i@xBw>t2j9q>s]‚(Ao.h8q9q5m4m/gIyM#Dz?y@{p1e&\%T >hEx Cy$C{!mGx K$G}!:tG‚Q‹$N‰d™4ÝéÒÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿÿðóê‘´wL‰B‚Aƒ@‚;{:z0l 3mD~K‡C€G‚I‚!I F|9j2^#J A O KDN R (^ 1j.g0i7oG}!H| M{AjDL)_+c'Y3f@xAz5m*_*Z 4`3]8jl :k@v"F|&G#D~E€Iƒ E~@{>{<| ¶ÏœÿÿÿúüùþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿãìÛu¤P2v5t5q2oA|K†=|D‚@|B€@}9u*b7lK!DxBsBp5`'P !GE=::@N)[/e5j:k>d&KA&Y .bw!E~":q*c:tA{?ysF{H|>p Ar /\ (T .] +[+[9j=n$\Kr!Xz&-e3j(_Ao!O}0:q"2h']'] +b&[ *\ BuM!Gw.b&[.a&XJ:b\‚4Kx)Gu!BqEt#Hx$Jy"?qCx&Cy$Dy$2i0k:v?v7l,g 3p2l7n8s 9u tžRäëÝÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýþþýÿÿÿÈÛºOŒ A€7s5u0p,j '` $[ 1gD{C~D€?zB}?{F~$H|(=q!)\:oS‡$Pƒ%T…'L~$;j:kEvDtGvL}S€'Y/Ei!+U)Z #X +\:p*_'V uj?p"3m5p6o9o0c)W 3dCvEz=sF{Du0c*_$U +TJt!N{.M{/P1Hz'Cw&I)K&:p3k9srx0f&\ !S 7h BxF}H€G€?wJ}"M*O+O}*Py">bEK-a*^-`1c>pC{>t>tIBwEv>sAs Br6d /^ 1g 7o7n3j0dl…2X~$>r6m2i.e)a']*a-c,`1h7l1e8m2g0h4i.YFjFqP}0Ex*9o6m2i;s4l:r>t;m2g4k3i.d 2h=q5n z¢ZÁÕ«çíÜÿÿÿýþýüýüþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿâëڨēqžMv/f &X 0` ?vH€D}E€Az>wC{D{F}(@t#@qS}Ei$J G'Y +_1cq8k4f7m4i*]!S BiGrJv*Ex+6m8o2i/c*`-b 0f9pr!.c(\N4XIq!Aq At*5l1g+`3hAv"6iBsCr*\ 9n;m.a =lJ}C|¬ÆŒÿÿÿýþýüýûþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúûôýþüÿÿÿþþÿþþÿþÿþþþÿÿÿÿÿÿÿþþýýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýüýûÿÿÿÿÿþýþüÿÿÿèï߹ѡ©Æ“X45s :s:r.f 0f 6i)W %O 0]6i AzFB{9u?|B|0j%[ 1bI{$L)Dy%F{+O‚%J|MwAh:c3f ,b *^3g1h,^0` Eu=p4j5iCr:i*Y ,[(Y,`/c\|)Ak.e8n3k'_$W .d8no,` 0a KxW‡$Bx „¨cÿÿÿüýüþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýýýüþþþÿÿÿéðà»Ñ¢ãí×èðÞ×åÅÙæÄ¼Ó¥‚«ZÔäÁÿÿÿÿÿÿÿÿþÿÿýÿÿÿÿÿýùüõýþûÿÿÿþÿÿþþýþþþÿÿþÿÿþÿÿÿÿÿÿÿÿþþÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÄÖ³o˜Wi•KjšBc–2a–%F>v E}C{ 7l3j?z=x8s7s.f-a;kF|%=y(_ Q,e4mEy#EvJt_‚'4_M*\,a([ ,`CtK!Du?oAqCr?n3c1d/d0f,bOr#Ll,`1j.d)^,c4l:oHy%>p 5k4k)]N +Q InEsBs$n0a/aAr;hl*Z *] .h(aPt&Ru'*a 4k6n6m5k7l4h4jCu*7k']!S #N Ts%Js >o#2i.f6l6j4ho$4i-e.f;o 5f+\5d#N @2Z1[F"N:iM}"S„ ÎÞ¼ÿÿÿúüøýýüþþþÿÿþÿÿÿñöí´Ëšš»rh—4G~M€W‡+O~*I|#G€ E}9q@rEu#;p9q=uK'I‚':u9nK,E~#C}#:u:tC[’+o A¬Q·e‹´dz¨Rž¾|òöìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿþþÿþþþþþþýþþþüýúÿÿÿºÏ¦9uFHƒ=t*` 1h 1g-_ K4e 8n8p/e$V .c1j4lC{$Ct!@pV|"Bf(W.d3i1f6k1f1d9iDsFt@q3e.d,bLs!Xv)'\ 7m6l0f3h5h9h@n5f3g&W CdWz%:kCr&Cu(Du$=p4i3h4h&U H 1VAgMv%Kv@l7b5`AnN€ÊÙ¹ÿÿÿýýüþÿþÿÿÿëòݦÃ~mšmGr ?m Cr&'Y/Ud€,Ht=nt=n@oNvDe!H $X -a7m?u@s Cx?pCpAo5e0e:ii~3:e3i1g6i6h7eDr%>n#*_ J Mi HrCt"Du(m.YF (W:k /_#O &P +X .`0_1_ 7i Ct CtFwL}Gz$Bv"AsJ{)K%J"?u5m'^ /_8j7o;s=v!4o2k2i7m,g'_=p4n)e%]/b6h9me/f7k+\2^9d?o"&X/RSu$AoAs"3i5k5h0d2b"O FAD"J"I*W 79@ ?5]DmEn>d8d?nвB\Žc–%Š´Q…®SS†lš0ªÆpäîÏüü÷þþüÿÿÿÿÿÿüýûÿÿÿõ÷ð[ƒ'9oM‚Cu'VF*\ /e+]%Q 4f=t6k*[ ,a5l2h8o>s9k@qXƒe„3?f9mM{&Hq1Y EK6h6j0ch/>c/e.a.]=iGp$.^ I Sr(Bo?r ?t!;p2h6l=n6g9i5c,Y .^(Y *Y -^ (T G F .R=hIt%CvHy!2b-a2g=m0`&S >k 7l2i6m9p+`*Y Ht'Gx)6k3f%ZS OJJ"L 0`#N !K L&W &S L%Y +a4im 3d([ p4c6cBq&Bt%?p5m/h)^Cp!Fy+:p 5j1g*^#XN 0X@f!Ny-Bx"G|(J{(x>yH„l !O >_Uz(EwEz ?t9n5j0f+b,a5h-_ 'T 4`HuIwKu#FqErCr:e%R&S4e9j7gCt=n5g)]-Zk8eo4a 2\ 1_E6b Ev:n7g.^ @vI G|#BuM~9l1` )V $M A"Q)^ 'Y -a 4j/e)^/d9p@s!EtY{$?b$V3d>n#@i$1^_|+Ch*^ /c&Y3WWx+CqCu%?u{=xCw6j0c#Y Y+j5p"U &a 7u;v*a /gC}C}H%I~#L€M}5dP'\ 1k:uH€!8l,Y C9,[sAv?s!3g:q-c3i;q?rYz#Fi"&U /^7e",]_z+Fo,^(\(TSt%FsDt&;p!8n4m.e-d*^ )\ /a 1c'R 1^ ?qBu8f,\3d6b?j=nBt!>s >t5j._(X/_;m/^1_8j1d)_!X N 0]Bj!Ek!Qy+V3Kz*@p/[MOS #\ %^3j/i8o;q1j.g2jD|$íòèÿÿÿþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþüÿÿÿÖãÊJƒ@|K†R!Pˆ$Dz9j(VN Y )]V+h /k0f+d3p:t3mCz @x:q:m8d L"T.h9v:qH}>o7a+T !K'R r$-e&[ "Q G K#NEH?*Q r Aw @u9qCw"M}(M|(S/R€1P€-T‚.N)H~':xQ‡2ßèÙÿÿÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿþ…²]EˆJ‰G‡HˆG†DƒLˆM† G|Aq-ZKR*aR"X '^ (d 4jH}ByG|!H{4b L!U+b 6q7oq7n$Y MHEEE!K$J (L :eHxI{O|NzJxL}Cu>m+] gMu#Qy,Jw*Kx,Fv)Cu$>p9l:o=t Cw"Iz$=qJ{&K"Cx@vI}$E| ?w;s3l+f ;tÄÕºÿÿÿüýüÿÿþþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿÿîóä| V(b1h .h-i (b*g &a'` %^ +a BwNFx@n.[ #O K T (_ )^ 0h3i?r?q.X&W .i6p;v3j/e8m>q?n=g/^ 5eEw@rFv!N~%Q€'Kx$9g:d!F (V 5h,^'V 'S+Y0f$S?H "O (Y 1g:pBuiŽ%’žGPc….=t;q!@t%Gx$EvEuDqPz Kv>j@kIuIwGuFsFvI{$Au,a8f=n3j(^%[ !T MG#P 5aBiRw.Lw+tJƒPˆ%L„!L…#K‚IBt5a)V O)W#W T +`:mGw!$N L 1h,_'W1i:r?v6h0\ /Y!M-` =t=p1b8mDs#O|";i%K !G A"L ;p4h#R #Q %V? 1?C$Q 4g5iGz€“4†Žl6a3a8iDvKy'Es$Cv$9o3i.a Am6jS LI "H 2W5XJn#Ou%4^+Y*]0b3g1f3k5j:m;p1e9gDt&Bw#.c=lIz'Cu!;q(_!U !R -a4iBw ÝçØÿÿÿüýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿþÿøúó°p=~ Gƒ:tJ…TOŠLˆP$K‰K‡$D€?z7oDyNFzEtDn+W JL Q 5j8fGDGL (] ,b2g5g;m=h1\,] 3j>t3d(X >q"@r"2a'P "C B3c%Q E4-*>EEEBG)W 6lh‡*…Œ:Dq=u"5j-`+a.c6l;p:l4`7c;i4d8jBr&;l6i3h/f2f9j(W,W8`Dj Hq!Ku'Mx+Ap"?l 7c*S!J'R RS Q M "W%Y)Z/b1i3l,`:i.d*^)Y7f6f4i(e 8k"¯Â¢ÿÿÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþÿÿÿm›D(j>yJˆJ‰J‡B‚@@=|3n2lE|Kƒ"I€ @wJ~GzCuEr;g3^ #P(W2^<>K%W O&X 5m:p6g3Z!J(Y 2h(X(X3id!5[&MF F A D+Z*ZO O*Y(V'Q+V9g>s!4o _m–SñôðÿÿÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿÿÿáéÙf—A5u7s 8v >~;y?~:w/l A!L %O $S #V (X7f &J 2[ !G *P FsEn:b 4\ 7d6c9d.X%P !IF%Y Rx&…B6e?s%@o 7h5g5ci@lHu(4h!U J 1XIm"Ku%Du As#Ew%Hx'=n!:m"r@u!>sCv">sAt#Gx*?r";m!Bv%qNCvGvKvLr=`3T0S %I 7A>I 0TAlEr4` Jp$Jr(4]?h@j8b@j;g2^)Q(W5el„.=h/i.b6f6fEp Lu&Jt)T~:Eu*/d9eFk!_‚7U~0Fv&Cv$Du';m!7l=s"6m>p%:k4gp3j:s8m1g5o5m7m4iPR§¾•ÿÿÿüüûþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýüÿÿÿ²Èš$^$^3d%LD CAEA;57!D-W 3\@jFwKE|II%?vF~H~"Bx7m4gCxP„'BtFyGx @qLzIwBkOpAa+K > A%O ;hAo7`iGrEk>dAhBlCn/WE 4] uˆ/Dk.f5h5dq2f=pDw!Gz#@s1h7lDx&Av!Cx$:n*`,d*^ .d.bVVn“ZÌÙÇüýúýþýþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿô÷ðºÉ²m•W=zJ…CzAt9g9e?l!5\4^BoFuL~R„ CxIJ‚BzC}?wg)Us'Li+a2d?kN|6Av(=u:q:n4k8n7m=p!5d3e3i8l8k7kv6o?wAx?t/cB/T EtCtO"M|!Kz GtKwMvNu;c&N J "Q (Z 6eLs+BkJt#Dm':c.S$Qi|"Rg'^8fKs-?o-3i&7dOs&W3Fy-w?w7q7q4l)^ +` 9o1h-c;pI~/d 2iAy7l0e$S ;3XEvGy;nE{L|,Es)Cs"EvDvDuGuGp;`3[2a8d :_ .R,QC %PDi&(T ay!Ym*]Ap(:l(.a8cQv,Q}8;q)6o9p;q9n6l6k0d7l7k5i4i1c6h5j*[.`/d,`'Z$V %R L J A$K 3^,O*R0].] ;no”^Ž©~áé×ÿÿÿüýûüýûþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþýþýÿÿÿýþüy U$^1g>tFA|4k 1j 6p=vHBzJ!I~!3er7j:p9o!:k"Ky+=p7lCw$>qBtCuIyMv8],X.\5_7\-U.T7f[v]p$T%\*WBfOx.q"Ew(.a%W 1e9l=r7l=r?sEwOyR} Gw!Fq(Bl2Z%NYsiy# O0XOr%O{49p%9p;q5l5j5j5l1f.e)](\([%T %S'R.Z.W1Y9h3_5a;i@pGy Bt;q=q9l2f)a*bBs¯Æšüüýýþüþþþüüûþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþþþÿÿÿåîà…©h8m7o q6k 4e*X *[ 8n5j)]$U 5g+]/c3j8k7k(Y (Y 0d?nKxHq:d9d4`Vn{€)YsW{!Fv&6l!7l:o9o4h-b'Y&T*X1^7d4^7_@jAp>qEwAuAxCx?qCw@t9mAw"?s=p7k /e X^ˆ<ÆÔ»ëðèþþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýüýüÿÿÿôøîÒÞȰǟvžX6r nLM‚ F|F|AuCv@p?p4b(V '[ $U D)V=o7g-] )Z/c&V J -\1e(Y +_=lOwJm2bYq†….fƒ&@u 9k4f:h9h"1`7`=f">f El&Jw(Iu$Jv)Kz%?o;q7m:r?v5k4lp;q8o;pl”F‚£hz`ÄÕ±ÿÿÿýþýþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýýþüÿÿÿþþþÿÿÿ·Ëª,c "\@uH{"Ds&Bn#Gv L}$Bq?nDtHzPƒ#Oƒ"M„ H~F{8n.c5hL~I}@r4c$L $Q %U 'T&P ._4g9l)U!L ;(Q 8j*Y*Xo6k5k7m8o6l1g;q?sAp">r=s0g ]Œ>ÑßÈþþýÿÿÿÿÿÿüýûüýûþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþýþýûüûþþþþÿþºÈ±{™mJw,1k9vAz!Lƒ%I#N„$P‡$N…%K"HF{AyAwo9l:o0c.a*Y%O C:A>5> H &S C )R7h'U(U8h1_+X3a0a=ly&†€*a„/P‚"< .N0L(?!: : .P7_*O$K /X'Q'Q:c@l#>h3bfv|z$Gy)Bz$2k.e ,a&Z "W-f -f *a 3i3k 6k7k5h;hAq7k3g0c)] .d ?rh‘Ki‘Ož¸ˆìðéýýüûüúüýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþüýüýýüÿÿÿüýúÖßÎÆÓÀ©Àš„¨m8n&Z -a/c0`*Y/],W,U.V:`Lt&Qw+Qw)Os+>h?mJx"Ly#Oz!Pz!Lw!JuKwGqIuEoFn!Cm!@hCi"Hm)Bi&6_,V5^ rz&v}(>w':r6j)[ RFp t—U‚¥j…§m¬w˜´ƒš¶‚Š«ovYhHGu"CvX†3K|#V„1hJp•Y¤¼Œÿÿýÿÿÿþþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþýýüÿÿÿÿÿÿþþþÿÿÿ¹Ê©žlc‰MFu&q@tM~'S-U‚)[Š2Y…1]‰7S0Fx%5f@p?tBtK{GxEqN|Q€!L{#Fx >p?q;lDtK|"M}-Bq$&SI (\q|&p|)7q=t0c :j§¾“öùòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿâêÛÄÔ±ûüùèïâóöðþþýÿÿÿýýüþþþÿÿÿþþþþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýýýüüüûþþýÿÿÿÿÿÿÿÿþåìà½Ì²®ÂŸš·ƒc‘@H{#Z‹5X‰2K~ ?s=q‘’$œ¥JïñæÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿÿÕÙ­šŸ/’•*§°düýüÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþÿÿÿ¿Å„™›+‘(·Á‰ÿÿÿþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿúúõª²X™œ.–3ÏÖ³ÿÿÿýýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿÿêêÕ ¥A–•)˜£HéìÜÿÿÿþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿÿÿÒÖª’—&——,¥°^üüûÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿºÀx”™(˜™.ÀÆŒÿÿÿþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿÿöõ쫲Qš2•œ2ÒØ±ÿÿÿýþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþüÿÿÿàྞ¥9—›2˜¢@éìÚÿÿÿþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÄÆ†—œ,—›4£­Yûüúÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿø÷ñ©°U›¢7’™.¹ÂŠÿÿÿþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿÿáãÞ¦<ž¤=Žš/ÒØ¸ÿÿÿýýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿÃÈ‹•Ÿ,œ£:›¤Fñòéÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿ÷øò¥¯Tšž4•›-²»uÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿÿÞãÁš¥9Ÿ¤?—'ÌѦÿÿÿþþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿÿÉΙŸ,— 9“ž8æê×ÿÿÿþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿøùó¯²Vš¡5•Ÿ1«¯^üýýÿÿÿÿÿþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþüÿÿÿÜབ.™¢:š*ÅÆ’ÿÿÿþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþþÿÿÿ»¾y™›-š ;”œ3ÛÞÂÿÿÿþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿóó諪K–™-˜œ4š£EõöñÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿÿÜÛ·¡Ÿ7™ž6•#­·sÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿ¾·s¢š4ž;“#ÏÕ¯ÿÿÿýýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿÿææÍ¢š6žœ8“›/ž¢AññçÿÿÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÿÿǾ­Ÿ:ª¨M•›,¯±dÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿÿÿßÕ³®ž;™Ÿ9¡¨Iœ™+ÇÊšÿÿÿýþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿúù÷°£W£¦M—¨R¦¯Nœš,ÚÝÂÿÿÿþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýøùôûüúëëÝÆÊ¥ 3çæÖÿÿÿþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíëÝùùõÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrmagick-2.13.2/doc/ex/images/Hot_Air_Balloons.jpg0000644000004100000410000001460312147515547021571 0ustar www-datawww-dataÿØÿàJFIFHHÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀú»"ÿÄÿÄ:!1AQ"aq#2‘¡±$BRÁÑá3bð4CrÿÄÿÄ,!1A"Q2#q¡$3Ba‘ÿÚ ?ŒÁ”ÀÕó¸M ]‘(ÃW {#hÀV&ìŒ7eèp‹f·.8©GH|ˆE]âÛe‹çT6Ƶ”qhÔ%©ÚWšU€$µ NÒ‡Nê¡8@Fz'¹¨1º€Â;›º+ñ³OÌ©5l09ç`02ªjká4î,v]ŒÅý[™:’®¿“«úo ]³—¤F|oª“'V‚pЙð8ÙEŽâðð50Å8ÝN~ü_Šó3ú­ž‚OãÉ«ÆÐ»Éf÷.v„cÿÒ‘O%t°y^d cÛ’_“vTRÆè¥s'!`éÁ©ó¯Ïÿr`L h Ð#Ž|ÉÓ|-ÓZßE$Qâ'“DÈsƒ!ü°Ò]Óé/ÁhÇ^ηSªuIpÎ{œ­†é³·XË»½Ê¥¨€»K±»ƒòZ»Ae³ÍpÆAy+Ï]gÚiâÁ9ì½"ÖåYå4SÆ}ns‡oò³´Õ&šô׸Hk‡±^üùµwÇ¿@ª©ª]Q<š«V~‹4 ñéky”û¯GD­¢m] ØÜÚz,…m }+†2öîÎÃUçгQËÙ†»û*›Ý#ijÜî#“Ô?ºD,jXmæAJº&–#,Þ^3“…¡†„ƒsÀH·SGÓIÜá¿%¬²PúMTƒÙƒû§]qŽªóQGÓE¾ƒþ±·rªí7'¹³8–=ÇúJ?Ö†Ò5Þ§níú*J–º•ñƒ‡1Å›†ä]ÒÕİ¿Ò5Í2´z]³¿ÊàºóE}4®?g?¤ûŠÙÓ ËQi܆àŸp²t®0ÞY(ÛCƒŽ>k¡Â±ÅÿC/'®©/Lì%«Í)Ø×w¯‹w^‘=ZeÁX\°€µaÃuÎ|yc0U‹œ-ûŽ%ù]þÿÊén¨ÕT°ÖS>ž¢=qHÜ8ú%[Z²-0¯ âXÁç²Olg s.t°·CmmxÜåÑäï¾>™Â´¼Yä·Ô¾n2Çæop«{. ŸY5#¯:QN/Ù×X8M À.éÉ<g¼O'•5'g=Í?PŒœñ¬Ùâ¨o0Ì =~¤$òWjš-L¥Æî z$Üu>¾_&ÚÈÁ8Oýé|»kˆÔ:ÿK•uÖCæÆÏ长ý¼ÉEW(ú‘[]9‘ƒÆå&Ž_*³Ì<;b‘+üÉÎ:œ)uЈ|·4m§U£ÂJ/äÍXl¬w…ªÄh~Dz¹½Àkh‰oßfásÚ*Ã$mßvlVæÕ^+(ÀqûFz]ïØ®uÕ¸=:\;Tàè—Ï¢–ÕHúª ÁÐróØ-œÕ0ÐГüŒnQiá‚‘¯1·ާ,­öð까0;ÐÓŽ½Ê_Wl±Œc©üÉ•wZ·TI%KÎ@9i“ÙUÑÔ]'ïd9{S'Ÿ ‚?¸6ª=S> GÛ‚ºp‚QêroÛ5VÙKŒ±žê¶(Aªq—9:‚lJOv©vºWIW#&IhöÊ•¬’9Á#¥Â1OÇòц†€ÑÀ ì/O !,YÐ8'„…m‚‘„× Ð¦¢ªéne}8næ³xÜz£ê°Æ"ñ½¥ŽiÁi…Óœ6*”´ÒH_$L.<œ,®.—mÃE\‰V±yÊhX@ZP£À{¸Úªiÿdd4öwCøáJ1Fµa?n­’ßTæ<ZtÈÃíýÑݤkªõ°‚×3-?<«?Zoº ø[ˆª7v:;¯ãÊÍ>O6ðx|— ÚzY¥¯_T-ó*›ðrUpó"Ð{l}Õ}¤}š®e¥t´N¼Æàöê‘cÉ¢c—£=M1‚£|オÕ\içkÁô;gc²ËUÅ¥Þ`àò¦Ûjƒ£òÉÜqî¶*qÒBn I{6»Ð øzwƒ¨ Oc'©t@³^^ìïØ&VUZ@ÝÇ…žTÍ©Äé’«Uj(µ·JÙv‘ok§ÏÛ¸gúT+¿ÿ4Ÿú…sN×GO«N#Σ¹;Ì­ü5=ž”l¸µSwôîµÞ§5·—Lb¦ôÔxXºy 1–F·ÑÑu¯ZtÙ¢‰ãÉë”õÉ[xt÷·³ô‹ýO³ª,ˆüPã „/Û…ÚÑbÈBBðËô»¡\V¾Ž{edÐJÒÒÒZàWq«¬†ßI%LîÓ~erKíÑ·«œ•cY« h‡u–¢ñü‡£kJ‹S´Ìï–?5°¶±®¢sHάì²4ñ*ÛcðZûdŒø@1¾s•ÅäþQ£†¿™äÍÜ© ¾' îß’¥:éåØà´ìVêãHÚÚRY‚öä´Ñd§¦2‚1‰ÝZ‹5cȧéÏǦDc$ª›9É<žÁ_[¨¼Ç6ìÁ»Ž(¨ÎÑF2ãÉZšZfRÅ¥¸ÕŒ“ÝVë|b—dµú ÝÈ Š€NW5ÕÄ“ér´7™¾×á¹Y¶G®B÷ì Lã¯ÁvJÜô7¡¥¸]ÍUTŒá…ܹÝþAuW. ÄLnaô¹§«§øGŽ¢u„6¶1òóuÙâNz¯egS¯4Ô„„k嬦 ! L! GA‚ˆÀ@SÝ €Žð’@Êô‚P`>bp Qðš‹áî´!C<¢Yf<1…߀ʚŽwã»Ûª+ž'ýŒ—¥‰{ÎFêæºß=O™T÷#òò:ﺢ~ßE‰N3“ièËë¶´”Ö&ZRJÚ¶†Í{…nÔ)À ‚ XÚgÈ^ÒC›¸+UApeM>¦àJÁëõ\îM~^ã,É3Û%~j§¢îâÌü÷ Û¥½Í¨lÑ4‘!Á¡Y†Ô¾“;‡µäƒõ[»}tuÔmœ`Œn;žØºÚ’ZÑp—¿T´±ÐS™e ;y=…Eq}mEL¹ÄC `þê¾ùvø©~}“~û‡Uí¥Â;t„9q'ä¤j}{KÛxÆ]#é ¸L,qô•CäÖsÀèŸ^ñ;ðÒC3·ºéõ–†’Ià-ÔôŠûŒ®«›Š gÓ«U„’ÒTÁU È|nô‡çk ËN[ú(ÓÛji©ÌË;„ú§SŸÛ/#­§“þø<ü²ÍsŽíkŠ­„eÃÔCÕN\ÿöq^D•.;æ4|¶+ žWJ-á‹uh$!!@î´˜(ÐSBB%pDƒG9Ï Tœ(Ä”&3l'˜øN I—À‡(—gh´U¸"?¢˜£Ü¢ó­uQ»¢ |ðU'æ,m?½ÑÓ—lE‘¨sˆïºÑµø•ÍÎà¬õfbª•œW/öÉ£©ú·Ý\%øx"aÎ÷ ÂWÄýq<µÝqÔ(øÒìãgyÙ6kî0Ô“¯láÍÛ$gr›õ4ÔÓ27×ã 9A-9ÊcNI*Ê £:}_a—HØÎv.äû'¶®O‡l#Óäªì:£}qL|öã8´®‡Lò«Ñ@¶RyÓ6I¥»Ý[KR|Ãí¶Ël÷íG{‡ÇŠ_RØ´Š ˜ÜH Usµöùþ’‘ ŸÂ—²TjÚ†Š7€w;$WZvx:<«ãÉ¿ÁmàÆAÁÐáÿ¿‚êØî¹wìê'Iy/èÈÉý?ÊêGŽ¢¦M¦â±Ø'ä„„E ¸Z `²„¢(HP%Ü(ç’¤?eò£epÓÂŽÄö¤¦7FAiê–8Lj:Þin¼Ïœ|º~XTWxþݲŽßÌ.ãËQ{c¸FÜŸºüwéýÂÂÔSº¢ÞóÕ›×Ýrd¾•§Z_ê8î?>ÿº)cÛ¤ô+â I¢¸)æ˜M‘‡Ôãºe'¦2r‹_QVº&† zsîøòOÕHuÉ⸦¥Ö\r|®Š,0‡LÖ¹ØóŒ­]‰²XÝ^Í,lcNƒ³³Õ.RC£WdÌÔÓ‰œ•SÃðEI šL(䯡¦3Ì#fK¿EtÚ6Ó@Ò2y*“±/ž/Íï —Ò×€L%Çæ¥2»;r£ÇN÷NÐqŽR6ÙÖ–äb‰2ËåCC¶J¬«˜¹Ífvê¤T¹áî.(t°I_] O‘Á 'Ñ:sRä>ªµýû5 1Ûç¬xÁyÒÓòånOÍC´[Ùk´ÓÒ0ÆÀ îz•-v+]br%ç×ÁáBîPS 4BW§•á# iQRpTcÊ’þr7CA€3„椳¢hKLf8LjXáJ!<ª¥Ž¶’Jy-{q¿O¢ã7‰²Üê) O^;®ØÂ³>4ðÓoT? Š€dcùÛÙgº¥5£#dಠâÒgY=Îvè˜'•€iqôRK$ðùd9»ã‚¡µ§V”„Ô— ×$Óö_ø>z®’Ip{DgF¾5-}Mº¢ŽGˆ_¡¤†µÃnËœÇlšlé--s<‘¬m±Ýaº¸Îj[˜vx²¶ªœ:îü‘!©–9œö8‚T‡Ý*Kt—ï„©©Í<šw_RÀéê0Cw[:Ã;4rÔ®Œþœ[^G‹µCü8v)±]Ë\Iˆo±Ý"H$øÐ‰R±¹ÀÂ_ZßÁ¢VrkóÛp™S\'‹“—s•¿ý›øp‚o,Øm#žåe<#ቼArk0[Kò¿Û²î0A-; ‘ÆÐÖ´®Š’óðfvNÙw˜då ^9Ío.æPëcÆÜî´»`¾IÕŸ€¯CƒÇ¤‚=Ь¤Ÿ¢­Jé+àÁoà¨Äî¤?…ò¡V-§„æ¤3ºsNR“ƒ8FÔ°Q·„t#ššÒܦ·…4&#žw›ûÆÞÍÜ~Ö1߸\ú÷gžÙ3d—iÛÝw¿KšZà;¹çŒ¼?-9øœ™(H ƒÌYþËÕ8˼}|š;Bu8OßÁˆ¡žX.'<)ôQµòÊÝG åQ1â–¡ÍÔÈv­¶ã kµË k]÷‰ ÐöÐþ?5,Œ¾ û£tÖ¼Hµ@G$äà¸éoÉG»MEÂGÂàXN â7Ò X d%­õ`õV²RUÅ~DÓdˆ•І‚Ö—çr½†Í5}ÞŠ•ΊŒaÄlË}ªªÿtm-Kcn ’th[ÃfŽ×5;^Àó ò×ã=ÑŠ”2mx5>¼­‚f’Ói¥²[c¤¦nÑêwWå{<Ï~[¥£“Ý*ëZè(A‰²9òpÜ•}UÝç1ÒÕ‘ÈÆÊ¿¨ßsJʲ®êa¦{šàé?› á§ ÊÎåÔ²gøzŒ=˜ãéÝ$ø†‰í.}<Ûò4ìO|eszHuœ˜É}¬ÓÓ] °ä¹Ã#p~jºùs¨–FIŒ7Ö AnH;óÒªâ+tOfLÃHåÍ;v©1\)®òŠZw²o3rÓ~DÚá-ô-\œ1¿&ƒÃà6Ýÿmp{1Œc¯ä¬ÉJ†S@È£5£|ÿ´E˽\\b“1ËËCºI;¦<¤ºf”ÁL;'´ì2¢°§4¤éqÍ)€¤‚Œ枉€¤‚Œt88`¤ £[BHeãXii ÁÎô‚NNwUwk`¼=´Ÿø5jhÏÉ7[ôã£+ƒ›,-ÕÑÖ@K^cw–ò.©¤ª+‘–ÔS¶wJ^àâç }9Vù÷WªÎñÒ³‹‹Æ7+Ì Õ•æS4¨yYÿXa¸b­‘ƒ;«Î;+²WÚ°©d‘êɉû0Ô´T€€b“×óS ¶ŒÂ”7=ÕÒØ ¾*œaÙõ°u÷QÌ>2HØå¹TÛU½têqê…•¹bðgêmt²É¥‘’çH Caðôv:b5TÉˈàv ]¶ØÚAçL§?PÕ9Î]Î×Ó~6Õßj/‰Ê}×CE3Ç”rwK­®‚Ž/2gØ5º‰ú*'x¦ŸQÅ[‡qÝWêE|ø.vOkŠŒÇæ¹)2ÃÁFÒ 0rŽ„x)€¤5ȃ”ÒÈx(ò£‡&ƒÕ[H8R*mô•n¨„=ヒäŒ;ª-J4¤±…6½SÒÃH!an®rINÏT½GºûVÊ$¢±¶ýÔ¼.KÎÅ}«emYÝxHã(5!.ÝMd‚0w %3£lÒ1¯aêÌÅ?R‰ =4ïž0ýoç/$wã8I²¨ÎQ–n …Ž1”wÙ4¹-Åx^–^¢O‹’:”%Û¥K™æ‚á€U$ßW€^üŒ¨¢kÜNA#<„±E iËv÷T­ºÎæùR¸ê’:‚‰Õ’¸ä8àû¯lnSzÎÊubÄJiMk”Væ—¬8¨~B&¹ 91¥,<;tÀT`íч)¡D€ì„aÊ8r0í‘Ð’äzý”pí‘jÂ:Aú¶Ù}¬¤‡/uîŽn¥árXróRšA…Èu .C©M ÂíùB]„@]ʉ€a( n„»dt®vè °„¸÷@]Žèe5î&Ó½µaÁºŸ¥ÀžOL(B €0vWUÔ±VG¦Vêì?<þ ¥öF39£ ÓÂçò8JÉvC뻪ÂÉŽÙ9®Q£OjØ!zÂXD:(Xhr0ä¦ð¢CZäaØIo(‚‹RP_Q íe}©-}Ñ Õî¾Éîe0¹¥ñá „=.÷B]•áBxSJ³×9rñ åM!ñvèK׎åSJ°^íöJ/ßÜò¦ŸÿÙrmagick-2.13.2/doc/ex/images/Coffee.wmf0000644000004100000410000005323612147515547017620 0ustar www-datawww-data×ÍÆš½ Ÿ@[èÀ\ D+&/MGXI: created by Micrografx, Inc. Mgxgre v1.00 Ÿ½  ¼ ƒ ü- ú"-$…²?¿hÆ~Ì”ØÂàòâ ã!â8ßNÙdÑyÆŒ¸Ÿ«¶›É‰ÚwêdùTF<-2+(-06üEèUµ‘€Ê9ÞqªªwäH"Õ+a3xANT°ZiM"EÛA“AKB'BC¸ Dm CT >< 4% ( ú æ ñ¿ Ä™ “t db MO 8; %'  ó ðÀ ÆŽ —_ d2 - ôá ¹¾ ~¿ fÁ NÅ 8Ê "Ø úë Õ ´ •7 xV ^w F™ 0ß # àD Îc »n ´{ ­‹ §  ° ™Æ “Ý ÷ † €/ zM tm oŽ i± dû ZJQHôAN;ª6 3j1Ë0-14ð9P?¯G Re^»m ~[’€œ¤¨Æ´çÀÎ$Ü@ë[ús ŠŸ-²?üÿÿp-¦$Q ð& / E7 s<  > Ì< â9 ÷5 . % / ?ý Zä wÎ –¾ ¶· Ȳ Ù¯ ë­ þ¬ ® %± 9· N» Q½ U¿ `¿ v² ¦ ˆ™ Œ Ž€ Žt Œ\ „C y* o g fö fÒ P« 6… ` õO ã1 »% ¦  y a I . # ú0 ã> ÍO ¸` ¤s ’‡ œ r± dÇ Wó B 9 2' %1 F ] õu è¨ ÑÚ »æ ¹ò ºý ¿ Å Î Ø ä ð”$Hs‰t—w¦€ÃŒá–ÿ+œ:™H’Vˆd{qVœ0ÅèñøÛÄ­•)|0c5I8.97 ýéóÐç·ÚŸÌˆ¬^šK‡9s)^H1ÿ îÝÿÌý¼ý«›Š zZ+::? CúgóŒí²èÙäâ(áOãvèœïÁùä%-BGOV\fhws‰üÿÿ¿-°$V±À¶Ü¸ú·±5¬C¦OŸZ—ckqtuev†Î“Ÿ5©è±›¸ÁfÆÌÇ3ǜƀÃcÀ'¾é ½¬ ¸Ž ³q ¬U ¢; –# † sù [ð Mè >í ò ÷ù á Í º «- Ÿ6 š@ “X ƒr q g ]© JÄ :Ü .æ *ð (.hžÑ0 \ˆÝ4a Á"ö$4$q"è"Z v#‘(¬/Ç8P&]Elb|™¦±Àüÿÿ?-$&¼!Ư°²$¶&¼*$“œ¶œÃϡۥà«äÍÝÎåÌìÉòÄøº± ª ¦¢›–þ‹ ƒ&„-ˆ4ˆ3=yCcGLJ4N1L.M)Q%W"Y ["f(n4|HkH|C>„4†*ƒ | |ƒŠý“üü¦þ¬²¶ ¸»/»:ºC»ÑÚâ¢ðhú.ñ´wù|þúÄù‰ú^ ôb ñd íf âd ÌW ÍL ËD Å= ½8 ³5 ¨/ ’, ˆ) €& z! v v {  „ ‹ü “ü µÚ |å uð oû g [ Vþ Pú Bù 3ø #ö ó ð ë å Þ Ô Ë Å Á #¿ ,À 5 >Å FË N¨ =± 7¸ /¼ %¿ ¿ ¼ ¸ û± ô ÿn N¾.ž   |êùXíÅÞ1Ìœ¶œµœ¶$ôþðþðîõîûíïô $¥DÇ3ÇD¥D-$A |3 |3 eA eA |- $‚ƒt|y|‚ƒ-$ m ¤f ª_ ¯O µO V ‹[ ‹_ c g ˜m ¤-$( Ì- Ì- Ý( Ý( Ì-˜$J¿Ä"È.ÌGÎaÑzÎ”É®ÂÆºÞ¦ 8…H|Xuip|h¡bÈbÔcßhôr~Œ/¨S³f°i¬j¥jf–doMI3#þúõñïçèÒæÇã½ß²Ø©ÖÓqÒVÔHØ;Ø*Ûá çýöáüÓÄ» °:—R|lcuOy:z%ytúoäa¼pÂÊŽÓ›Þ§ê±ø¹¿.$µ&Á4Ý;ë1à&ÖÍÆÀò ¼ã ¹Ô ¸¼ ªÇ ¥Ô ¢á  î ¡û £§­µ&$IôEB;&6,/12347í:ã>ÙAÚDÝFäGìIô–$IB:/1?`q ƒ— ­µ½ÆÎã4÷?IQW)_?dWepc‰^¢V¸KÍ<ßøíÄ"¯*š0Œ6lB\GKH;G,A$<6 !(C |ù—í¯ÝºÓÄÈͻխÖÕqÑUÉ9¼$¬›øŒâÌ}Á|µ|©…‘Ž…µ^ÉKÝ:ó, "%3B$ eNa^ZmOy@KeTH\1b6e=eN¶$Yã èú ò':&L<ZSdlj„osœx¶yÑzëuþmbU-<J1Z)k˜£ °¼ÊÛ'ë@ ['uFŽOšT¥Z£b jœp˜wx}WƒFƒ6&|s qnjó dá ^À O± E¢ :– -‹ ˆ † ÿ† àˆ ÐŒ ‘ ´— §š –Ÿ ‡¬ i½ Má ï úõ êù Úû Éû ·ö ò „ë kæ _ß SÒ >à )· ² ¯ ü­ ïª ã© Öª È· ÑÅ Úã èüÎÎÿ-ˆ$Bû]ùcöiìrçvâ{ڄԎјУѮØÃâØóì!)?WDcGpH}D‹B—=¢6ª.³ÃÌ×Ü ÞöàñáíåèãæàçÙêÒêÏéÌíÀòµöªøûŒû{÷kñ[êLä<ß,ÝÊúº×´Å±³± µ¹…¾}ËoÚdêZóZø[û]~$=£H¤d¤€ œœ©—µ˜Æ•Õã‰ðx h%HiB{>Ž<¡>¶<¼;Ä=ÑBÓFÖJÚNÜMãHè9ä+áÛÖЭ ¢•ˆýzýlþ^QD=ÿ7ÿ* !÷=ãXÍcÀm±w¤~–„‡ˆxX”8™7œ8Ÿ<£HÀ$^>L[)y+v,s*n&i%cS 5%B,R9cCuKˆO›P°O¾MÌDæ;981",'&4"AOoõ °æ Ðñ æÿ ü).4?EI L&M.K4H8?=5?*A!?;61õ *ë *â ,Ó &Ä ¸ ´ ± ± ë´ ×º Ä ³Ê ¡Ó Ú ~à kî Sø 8þ à …ƒ€{vqû ]ö Sð Hè 3æ 'æ ë ð ÷ #ü ,>- $.†,y.|.†$3ê0ç5µ6Ã6Ý3ê.$à ã¿ ð¸ ü° © ž #• 4‹ E T~ [z ax du fr k~ D† 2 ™ ¥ ÿ³ ðà ã,$¢¦’µÂnÌ[Õ ñéáÔ-É=ÂHÁTÁ^¾c»g·v´…¯“ª¢¦$ Í8½$¬žø˜ì”à¨ò»ÂÈÌ+Í8ê8H*F‡;/~{~û‚áŒÈ˜®£¤Ÿ³[Ê9äí,Í^¼vªŽ•¤‰®|·q»d¾J¾=»0·%±ª½ Òæï ù ûüù"ô'ò+ò6óAóUïhérç|çŽçŸåÀÜßÒïÎÌÊÆ9¼R­k›w´eÎU×PßLîD #(@ÜU¶TªRO‘KŒF‡A»eÀ‹Ç°ÍÕÏðÖ Û%â1è=ïUùm†œÊ*÷AHS+m7zC…QŽb“lœw£Ž¯™¶£¾¬È²Õ»æÁøÄ Æ Å3ÂG½Y¶j­z§¤ £µžÝšð’’ “ –ÂëîÇ·§4™NV†^p|‚z•w¼m _3WL\fbg˜i¥k±pÇчÜç•óšý£®ÄÙä'í+÷-/3-77=@@Z?s<‹7£+Ó&ì# /úZç†Ü›Ï¯¼Ô¥÷Œt<gE\PJjAv7‚+Œ“  ¬ïÀÕÕÉà¿í­ø›ÿˆ wbN:/$Ü"Ê%¹+ª4œ@ˆ[vvl‚`R•Aš1ž#¥©­µï´Ô³Ç±º®®©¤¢›§’«ˆ¬~¨i›_”UŽU›T£Q©+ÏáòëÔ »¢h1.FOñUÒY±Z¤^—a}hakSkEiÅa¥^†YgRII&B9â/Â"‚Dæ<æ:èQAú2ñÛÓ Ìÿ Áò µí ®ê ¦ì ¤à ”Ó †· mš T€ 9x o [ ÍO ²E —4 ^/ 6(  À ² ¤ — ‰ € l b Mþ 7ù +õ ï å ËÚ “Ð [Ê "Ä Á ÿ» µ· £° ’ª k¥ CŸ — ô— è™ Üœ Ñ¡ Æ­ ±º  •Ê ŽÑ †Ô }í g R I$ C3 ?D >V /i $} ¥ º Î ýá òê ïô í íì)ë2èIç`çkævä߈×ѲÊÇÄÜ¿D·w°©§¦A¨u«¨‰¨“©§­±­º«Ã¦Ó«ã®¯"±2µA»À$ÞJ>z1w0wtwwù{ø{ޅކŒ«±¤˜|­{­WÄ5Þ4ßûüè'ç(ÇZ¶r¤Š¥‰Ÿ‘Ÿ…©…¨x±z°o´b·d·J·L·?´2°3±(«)«Ÿ º »ÐÑåðý ÿ%ú*ø'ù+ù*ù5úBúVöWöjðiðsîrîî ì¡ìÂãáÙñÕðÕÓÑÑÍ<ÂV³o£o¢Ÿ|Ÿ}¸kÒ[Ñ[ÚVâRòJ('-.FàFß\·[©YœY›UŽPˆP‡JAŒF‘FJ•H“KŸKžM«N·O³:Ù:Ø"ü#üé?ë>ÜFÔJËOÊO°_—q—rg˜g—N§5¶7µ¿ ÃÃÿÅîÇíÇÝ˾ÕÞžÞàŽàqàgâfâSèTè@ìAì6ì7ì,ë+ë&ëîóòõõôöô÷íïæçÓÔ¿À!­°!·"·-½;ÂIÅeÅs½´³™©š©¯“°’ÂzÓbó0ò1>é=ê_Ѓ¹‚¹§¥¡¥®ªËžä’ä“þ‰ý‰ … …‚‚.…-…9ˆ8‡CAŒJ$?ÂdNJί԰ÔÕÖÓÖîÝïÝ â â#é"è.î-î9õ:õRÿSk„ƒ™Ç0ôGNNYX&r2>Š?‹N”`š]˜g¡h¢s©t©‹µŠµ•¼•»ŸÃžÃ§Í¦Ë¬Øµé´èºúºù½ ¿!¿ ¾3¾2»F»E¶W·V°g§w ‹ ŒŸ œµœ´—Ü“ï”í‹ÿ‹ –ÇðÆðòÌòͽ ­8Ÿ7ŸR“[‹ZŒb‡`ˆrƒqƒƒ–~—~¾t½t f4^2^KcJcdiei~n—p¤r¢q®v­vÃ…Ã„ÍŒÍØ•Ù•ä›ð îŸø¨÷§þ²þ±ÇÜè"ò!ð%ú$ø&(,/1:7D6A9[9Z8s8r5Š0¢0¡$Ñ$Òë,ôWáƒÖ˜Ö—ɫɬ¶Ñ¶ÐŸó†n8p6c@WLDf;r<r2~3}'‡(†Žœ›§¦ëºë»ÑÐÐÐÄÛÃܹé»ç©òªñ˜ø˜ù…{rv a`LM9;01%ÿÛÉȶ%¦.¥/—;‚Wprqrg~g}[ˆ]‡OPŽ?“/— ŸŸ££¯®ï­Ô¬Õ¬ÈªÉª¼§½¨±£²£¤š˜¡¥‘¤‡¥‹¦¢‚¢m•cŽN‚N›NšM¢N K¦L¤&ÊÜÜýíýìçûèûÑÒ¹ºÖ×îïø÷ææ0ÔW­[¥\œ\›\ŽQ”[še¡{®‡³”²ž­§¨ ¨«¯·´¸µÅ¸Æ¸ÓºÔºï» ¼ ¯!¯'«&«4¤3¥C¡U›d“q‡q†{z|zŽ_¢D¡E¯9®:½1»2Ì,Ë,Ý)%% " -$:%O#P#dcz„‚‹žž°þÄòÏäÎåÚÚÙÚóÅóÆ ²±¥¤#— ™/’<‡FzGzPnbTaUlJkKyA’«ûÂØÂ×Õ²Õ³âŸâží‰]2*-í2Ô2Õ>¥>¤CŒFtFsGZGYD>=3=49*:,642õ-é#ß$áÖÁ « ªž÷”ê߉à‰ÕÕ‚ËzËy´j§d™b€`g[h[NUMU3P X»fºf“p”psounu[{R€QIˆK‡1“0“¡±êÁêÂ¾æ½æ‘ › ˜š ™™ ™˜¡ò¥Þª¶ªµ« «¡®Ž®´|³}¼mÃ\Ä[ÉIÉHÌ4Ì3Í ÍË È÷ÈöÂäÁã¸Ò²Ä¨¹§¹±°’©‘©z{p–q—eS‡UˆGH€<u0hN Bú;Í$Ÿ‰oùWòXó@éAé5â4â'Û Ô ÔñÏòÏÖȰƱƌÀf¹B´Dµ?Â&$‘º¡ f*,?HHðNÑRÒR°S¢W•Z{a|a`dadSdTdFbEbÅZÆZ¦W‡RˆRiKKBJB';(;2ä(å)Å…Fß9à1èLSùCóEô6ëÕØÏǼ÷ °ø ±ó ªô ¬ñ ¤ï «õ ¥æ å Ø ¼ hŸ O… 4‡ 7 v b Ëa ÊU ¯V °L •; \; ]6 5/  ¿ ± £ ¢ • — ˆ ~  k a K 5 4ÿ ( )ü ö ö ì Êá ’× ZÑ Ë Ë È þ ´ ³¾ ¡½  ¶ · ‘± j¬ B¦ ž óž ôž èž é  Ý  Þ£ Ó¢ Ô§ ɳ ´³ µÀ ¡¿ ¢Ç šÏ “× ‰Û Ù ‚ò lñ l W X O O' I& J5 F3 FG EZ 4Z 5m *l *€ ! "§ ¼ ½ Ñ Ò å øã ùì öë öõ ôô ô ôó ó*ò4ï2ïIîaîlíxëƒåÜŠÞŸØ´ÑÉËÞÆÝÆE¾x·ª®©®­A¯v²¯¯‰¯ˆ¯’°¦´²´¼²Æ¬Á­Ñ²Ò²âµãµ¶"¸ ¸0¼/»?ÂDµ5¯4®#ª¨ã§ä§Ô¤Õ¤ÂŸ·¥¸¤¯¦±¦§¦¨¦”¢Š¡‰¡~¡s¤u¤A¡Ÿ© ¨ v©C°Û¸Ú¸Å½°Ã›Ê…ÑzÚ|ÙsÞuÝjß_à`àIà1á'ä(äåå æó æé èè èÞ ìÊ ÷Ë ÷· ÿ¸ þ£ { z f e R )R *@ 9D 72 8" <! = C L Mé bè bÎ yÊ „Ì Å ‰½ µ ™§ ­§ ®› Ö Ε Ï’ Ú’ Û ç è õ˜ ž D£ l© ”± ¦° ¥´ ·´ ¶º ½ ½ à $à #É \Ó ”Þ Ìè è î ò -ó .ø :÷ 9ü O d c m  ‚ ‹ ‰ ˜ ¦ ¥ ³ Á! ( 7- _- `> ™H ´I µU ÐT Ïh q z =• Y² rÎ ‹Û ™Ú ˜æ ¨ç Ÿâ ¤ç ±í ºú ÆÑ Ø Öß.÷>k?ã?íAë<íDíAì ¿(ß5à6@$I%IHPGPeY„`…`¤eÄhÅhEpDpRrSrarbr~oo™h¦e³a±aÒ`Ó`ò\VV0Mj8¤"£"¼½Öºü¯ò-ê$s/;7\B{Pša·tӊÔ&í$ö"ýóðÝçÆá®Ü~ÔgÎKÉ/ÂøµÜ¯À¬¤¬ˆ°Œ´–¶›¹‰¸y´j®Z©œ°’…[1‘•Ù˜ÁšªœzžaHš1ž%žœ#œ'›+˜– –ø—虨­h¿(Ô àê íÀ ý– n %F >; 70 /' $% % # $ ò) á2 Ñ< ÂH µV ¨e  ‰µ sÞ _ó W R1AZ2ƒ%®·¿ÇÎ 7kú„ôíµèÎæèçêî6ñPòið•ðÂòúuÍ/- $×$á%×$$õæ×Ç¸Çæõ$Ïf¸c£cbx^z\Ïf$ e{e}]zUxNuKrInPp^xe{$”Œ”‡“‚Œ” $ÀÅ|Ó€À $+•5–+•üz-|$<ÔåÓêÑïÈ÷²ª¨§©­³!½%Æ#Î ÜÚ Úãò *$##*ý0ü=ÿJXny~„ ›©°·¾ÆÄ¾¶¯"³*¸-½-Â*Ç&Í"Ó Ù!ß'â)æ,é3é6æ;ÔSÀhªz’‰y—_£D®*¹@­>ª!´¼ÅdžÏgÔIÛñâ™è@ìéïçìåíßî»æ—áÓàμȒÆfÄ:¿%º´ ¹¼ú ¼ó ¹Û ¨à •• n• h— eš c  d¬ j² m¸ o½ oÁ kÅ dÅ ^Æ ZÎ WÒ V× UÛ Tß Qå Jí Cõ >ú =ÿ >CJMü Rú V÷ Zý ^_] ZQ!JFB@>;73.)*"-076;==D;K6O6R8V9Z9^6_0Y(X$X_ms!|€ƒŒ  –˜—’ '+/—33¢0¦,ª'¯"´º¼»µ¶ ¸ Ä Ñ ë÷  û ÷ õóíÿéä ãå&è3ëQïmö‰þ¤¯ÿºöÅðËðÒòÓ÷ÓûÎÇ ÂÆÌÓÙäúûöðæèÁݽ߹޴ܰۮԯбÍÀËÏËíÏ ×'á+â0á:Ý>ÜBÝEàFæDéCíPô^øløyò|õ}ù}yxz |‚ˆ Ž œ£üªö¦òœð—íéˆæƒáƒÞ„َטحÞÁäÌäÖâØèÛëäïîñøô16:? B B@;ÿ7þ3þ-û#ø÷öôò í çá6åSìnôŠþ¨ñÅßÉàÎàÑâÔå-$ ›ú  ì ¦Ý ­Í ±Ó ªÚ ¦é  ø ›$ M&G'B(<(7#:=DJL"M&$ ÞÕË¿´¶»ÆÞ$d_[ W!Sbdd$ û(î/è0â/ê%ð"ó#ö%û(ü¿ÿ5-‚$¿B~E„I†U†`‡eŠh‘l“q”|”‡“Œ”‘—–››¦›«™±—·–½–ś̡ѩҳеԾÚÄéÏïÕóÛóãòèïíëòåõÙõËó¿ð»íµì©ìœê—æ“à“Ý‘ÙáuâqàlÜe×^ÖXÙQÞDè<ë4ë&ã ÝÕØÝèüìõîîîæéääááÙàÑãÉçÄé¾é¸ç³å¬à¥ßŸâ™æ‹ïƒï{ìwètãrßmÞeè]ñVûUU/,*'#&%" 3<úEòMèRÝTÑRË\Åg½q¸t²v­}¦ƒ†”‡ƒ‹}z{wxusvl}Y‡G”6¢'ª)°'´#¸»¾Â ÈÍ Ò ÕÙßþæ÷êòììïçõâýãäèìðþõûúûýýîÛ0ÆB³G³KµM¸N¼NÁMÅCÓC×DÛVÍ`Åi½s¶}°‡«“ª—°™²²©§® º”ÀÈÑÚ„å~ütz|v(s1r:u>yB~-$$62/*&"%( % ## * 0 36$>BE<>$†RxZj`nYuU~S†R $J>7/ ,($ #', 2 > J$ x"r(k+Z.X,U+\#enx"$ #MQVZ[ YNK#M$ YkXoUqSqQrMtNpRnUmYk$ ‰K‚SzZq^f^c[lUuLzHG„G‰K$¥7ž9ž4¢5¥7$ ?þCóI÷Bþ:879 ?üQò- Œ$ÄH§G¬D±=¸4¿.Ç ÞôûäÌ&³3š=EeQH\ qtvv$t,sRmvc™V»DÛ0û9è>çCåHæMêLðIõAý70*""' ,%1BR`ôo÷uù{ø…ôì•١Шȯ¥ÉßnèZïFõ1ùó µ–"v(U+3+2Õ7u;D;=ã?´D†FWF'Dö@Æ:–1h'<í èŠϱ Å› ½„ °o ¡[ H {H wF r@ j= c> _B [J XR Wa [p ` cu Xi OQ ?7 2 $ " + 4 D !I A 8 $ ÷ ñ êù Ûù Óú Ðþ Ï Ù= å@ ä6 Ô+ Åù ‹î }å nç jé hð h÷ ký p9 ¤X ¼x Ò€ ч Ò” Ø  ß­ æÅ óÝ þD"].t<¹JÿUF^h¡g´jÈnÚtsBsvpn§iÒeèdýc(]<XPQZQcOlLuHG«Dß<0C"R!Yaov~˜°ÉøáèÆ:¡>¢B¢E¤H§-$ãZß\Ú]Ï]ÙYßXãZ$ ƒGwTpXiZnRtJ{EEƒG$ óœç¥Û¬ÂµÌ¬×¢â™ï’óœ0$%Š –  ý¬ûµü¿ÉÍÏøÐïÎèËçÇèÄô¶ø­£ —Ž‹%Š6$وΒ½¢º©¹°¼¹¾º¿¼¾À·Ä°ÆžÅœ¿¹ µ¥±±ª¶¥¹ ÅŽÉŠÎˆÓ‡Ùˆ$wy•}„‹‰†Ž†w8$¢·¤·¤¼œ¼”¹‡°|µq¹eºY¶U­O¦S Wœ]šci£n©t¯|±€°…­—ž–¦˜¬¢·$$x ‚‹ö“ê™ê–ë“êèó„øý{wuux-$ÂÍì׺åêÑÉÂ-$J‰>–7œ/Ÿ3™:’BŒJ‰$ç xå xâ zâ tä qç qç x$ e¬_·VÂKÊ?ÎFÊJÅRºY°^­e¬- n$µñCõF÷JûZý^aú¾ôÔîéæþÝØ!Ï/Æ<½J¡|‘”~«~²Mú3AúbÛ‚º¡—½ŠÄ|Ê_ÓBÛ&ææùèÏð¤öövôl÷dú^ÿXQK"AA:O4V.["ejo wzþ{òwåuÙsÌr³l¨gž_žI¤5­#¹ÈèêøÝ7Ìv¼‚¼Žº¤³¹«Å©Ñ©Ö¥Û¤ó¤ø¢ýž/“F‹]€p{‚t’j£^ÂDâ*ë*ò(÷#û  ,èHÉb¨}ˆˆvn–e¡S¥I¨>­6±-µ·»ôÄ×ÇÇɷȨŘ¿Š´}®s§k˜_‡XtS$KLäQÆY©dqq;ŸÀìàÚñɹ«+œ:ŒI†QZ}c|nxur|k‚c…Z„RK|FvClBbCXEON=Z.d/{”ÿªæ½ÌϺᩋ/rX\‚J­;Ù/$ $%%#>$d'°/Ñ9ñC-*$³Á³ÄµÆ³Ê°Ì©Í¦Ì¢ËšË–ǒ¾¹˜¸ ·¨¸«»®À³Áü²- N$¥±‘À’ÎŒè‡õ}v3lH`\RoMsJxEƒ&£ ÅúÆÝè¿ º µ ¯ «¢’!Œ+„2{6v6p5j2c.Z6P;D<980>'EUZ]û]ïWá^Ù^Ñ[ÍUÉSÆTÂWº`µc±dª`£^^˜`Žf…o}wt{n{iycu\nRuLxF|:4~-{)x%xƒ ”ÿ—ø˜ï•æ›Ý Ò¡Í ÇÕÂĆÈÌyÑrÙeà_åXéPñB÷<ÿ9 8 <>?#<+742=/F/K1P5h#n u|ƒ!ˆ$%‘#–Ÿ¤©± ¸ ÈÖÝ ãëò ÿ &1 ;AGR]ùgðqæ{ކגԟÔמ f&J=-RfïoÔw¸u³s±p°m«m©n¥r¢w¡€¢ˆ¨±-$žzk}„xŸsžzüÿ- L$$Ûíýý?ùPöbê†á–Ԥʥ¢¼·–¯†ª~¥x°`½IÉ1ÓØÞþáôæìëæóâþâÞÙ Ì ÇÃÂÄÛ-&$&y%|#~(…/ˆ6Š=Ž0Ž"Š„€á nÏ d¾ Xó g o&y($¶˜§–™—‹š}žb¢T¡FHšH–I“L‘Y“f”“›’©”¶˜üÿÝ- h$2±²±!­,¥6œ@‰T‚^kx~v‡s‘ošk¢d©\¯U¯O­F§>ž4•ˆ yøgæTéPéKèAç<è8ë6ñ577-4@.E*J'V$b glw‹—Ÿ¦¬ ±- d$0Q ÇQ Ïs õ“ ² DÒ lØ pÜ tã à ‡á è ›ï ¨ð ¯í ¸ç ÀÞ ÆÔ ÈÊ È¾ Ų À ±“ ª‡ ¥z ¢l ¢f žb ™^ ‹^ …\ T {L tI pH jE WC CC B ñ? Ý; Ê< À? ¼B ºG »K ¾O ÂQ Ç-$V[TXTT\MZPXXV[ $`øjø`ø$‹†}ÿ$V]RSSV$ Fu@u=t:r@oGmMjQdOpLtJuFu$ x =p ;l 8i 3h -h g d j p 'u 2x =- f$1ƒ—ª» Ëúëóüí æÝ%Ô0Ç8½8´5­/¨&¨¦£Ÿ• ‹n ZùEé/Úʸù£ì‹ì‡î…òƒøý~~8vƒ³…хzyz}ƒ- L$$ùÈ ËÎÕÚÞâæÿëáþ¡#~&n.\4H645+3"0,&"ü4ÕJ¯cŠl‹|‰„‡”„œ…¤‰»–Чä¸ùÈ- j$3LLM0TB_TlnrŠv¦xÁzÏ}Ý‚èŠìð—ð í¨é¯ã¶ÕÁÇË¸Ôªß¢ãšæ’æ‰ãÞz×rÒnÑjÑlàkèiîcô\÷T÷Lö?å4Ó!®ˆu÷ cô Rô Iù Aþ ADL-$B…?“f$l/tB…- b$/´ÅÂÌÐÒìâøëö  %+1ó;íAéGÙLÉO¹P©P‰LjEJ;*0 &ëçßÖÎËÇÇ ÜüïíÌ.©?˜R‡Z†b„i„p‡€™«Ÿ»©Á´Å-$ *Ÿ&¡ ¤¥£Ÿ ˜˜š*Ÿ$¶Ç°Ê«Ë§Ëª¿°Â¶Ç- ä$ð™Þò‚ra'V2K;2L[ÿloh&`GMg5ƒˆŒŽ!&‡5}Ce^Iv-‰#“Ÿª·&¬; O˜Z•f•j—mšnžm¢\«K¶*Ï/Ú1á0è4ê8ë<í>ñ;ø6ÿ) î/ß:ÙAÔIØKÝKåGîAö=û:6, (&&*: HTõ_æi×qÈwº|²„ª‹†¡~¨v°x³ŸŸÄ‰\\^bjþ‡ß¢¿ºžÏ|áYð4úì Ë©"—%„&r'`&N$;" !õ%Ú'Á%§ \ C(áõ×oÄO¯?¤1–%‡uú [Ø BÈ 4¹ &«   ž ÿž ú¥ öª ö¯ ù´ þ½  È È Ä ÿ¾ õ¹ ë¸ äµ Ý± ׬ Ò¨ Ò¥ Т É¢ Ƥ Ĩ Àž ®œ ¥Ÿ ›— “Ž Œ‡ „† † yŒ x v‘ r‘ n i _‘ Z Tˆ Pz Hu Dr @r <w 6€ 6ˆ 9 ;— ;‘ 4 + k þ\ îU åO ÚW Ôn ㆠòŸ ÿ¹ Ë ß (ZB…N±YÉcàlñsx)€P„w†¥ŒÕ‘”“1‘JdŽšµ‘Ï‘é†9z;w=vBvHwMuqk”a¸XËVÞUôD 5!(9P fý{ìŽØ•Ù™Þ-$ ¤¦£« ¯˜´‘±Ž¯Œ«¡¤¦$ ¾ØºÝµáªå£æçêzÚŒÛÚ¾Ø $¬ ©±¬ $ Û ÔÌÅ ½ ¹öÂûÌÿÔÛ $ û  ø ñ û$Úʼn®’~ ”—Â…Ú$ á kØ gÏ aÆ \¼ Y» TÐ ]Ù cá k$ «¿šÖˆísg Zdÿoí‰Ë«¿"$j»f½c¿aÇ^Ì[ÍVÌLÊ7Ê,ËÉ ÆÁT¹j»$ á ñûþéÖ Üäþôôëá$ E–E >›8—-4Ž=ŽCE’E–$  ý ý $ ¬¿•¹³t®k§dŸ^“’™ž¦¥«°¬·¬¿$ ø­ó¯î¯ã¬Ø¦Ï æ£ð¦ø­&$³Ö¤Ú•Ú‡ÖzÐlÈ_ÀR¹D´D¯U®d°rµ»˜Ê¥Ñ³Ö$  ÷ÿìøúú($GLõKåGÕ@Ç7°7™5‚0m(€&•%©&½(Ñ-ä3ö<G$ ¡UŸ\‘Y„TxMmDX0N&E^%v2ŒB¡U*$j‰VˆA„+oïbÛUÉEÒDÚFëLúT \"g9tP€]…j‰8$‚-‚6ƒ0‡+‰‰ˆ ˆ‹ûŒðä׋Ä~ÇxËuÐuÕwÞ}èîƒôƒÿ€ ~‚$ „Šy˜k¢c¥Z§Q¨G§E©C©b™„Š"$Ó×ÑÝÐâÎçÉêÄêÂæÁâ½ß½Û¿ÙÅØÉÙÐÙÓ× $RNfD]KRN$JPFS@U4Z?VETJP$ 0XY VöRâOÅ<ª(º0Ê6ìAK0Xüÿÿÿ- ðððððððð ð ð ð ú"-ðrmagick-2.13.2/doc/ex/images/Shorts.jpg0000644000004100000410000002227612147515547017702 0ustar www-datawww-dataÿØÿàJFIFHHÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀú§"ÿÄÿÄC!1"AQaq‘2¡Á#BRr±3bÑáðñ$C‚ÂESƒ„’£²ÿÄÿÄ(!1A"2Qa#B±ÿÚ ?¥j7Ö (9AׯC4iðÛ˜ ã*?ÖŠÔm–{À6;¹Œm åÉæ¢PÖ‰`ònIùVbäù‘>L‚>ê-†XË0lçÖšÝK ÅÔL¢¨rZ];JY¢Ã/ÝRy4uÛWSw G)—ÃAN)ª°¢)îþ¿tíÞsÉãƒKí¤šyŒçoZÚòUºf¿ÌÖÌ„ä®O˜¡}Š%Ô-Ô÷f1ž™ÙMM&4ƒ»™ÂŒÊ¤ϯζ^ÅhÚ®…hZÙc »Ô,í}j[X­;i-nýÉcºx×pÏù‡ZÝqÚg,›b{ûè´9î¢ÔÚg·x¶Å#䂸å}3\ö×µs§\iÌ?q r.ä3!h#§Ø®®t­_N’143†\àOûW$í~‰qµý¯t‹”dL ¯~±A¤ŸpqA7Lç¤Ôl2µénkÂx¬§e2Íh§çý(yûoGr„-í'ƒâô¦09qQEGÙH5NÅcO»io๷lxPq•ÀTÆœ¥ ³IB)KÈ_Ú£eªJd—JŽÚdÆ]8“æò5Ïd·(»ÑƒÆˆy|ý Xõ~ÒÚê]ž·³xeý¡Úó1"Ÿ(ÐbK]# ÞzcÞ‹<’|ŒÝ:”cL^8¬¦—úgw#5¾ã>zâ²—©+FÙáÉR‹Þ´ë™"”Æ¡B·–rO(•¥•«meG¨¦Ú©"X¢-…,c¯$~”4ðø°Éö¤N~ê0d~æGoa2하§Ö—u~ª$rî:|…07³&Ü÷¿»ógó !m­†8Ï"ƒY[ä/¸~›£¿Ã´·<eW5ãY¤Ë0%FNOåZGy-¹GWÈNHcÔPÇRi{Ýцï ôÅ.²M½è¢\–Æša1‚(ÆÌË3ãbíàóÏ?*"úÞÊÞÚ³”¸ÚMÞMè)<²I;´’ =+O§ÆH,nÚdTûD8µoà\ùãË­!ïJEdsŸ»xùSY¾=Ï£tçîô 6ÈmäÿH®Ú.ÔÏ4“A¸4+ÆÔÂ-jæNέ´râUo1€?Ò¨7z|¯jViJ=y#4Œ½^<Ñãÿ¦=7©&ß‚6×àŽ@ïneçi,vþt³UÔmî‹wbH•”ô'¯¡æƒ»µºšàºÃ#ÃÁe_»óÇJ·v;JÒd勵{YÎ6„‘¶Ÿ^8ÇZÇ}Éôtr¹7FØpA¯· è¿h˜Ò´ÛÈ–Êã÷SÀd\શNF@®siRRA¤Ñm´/ôŠH¸»†ÝZš0ÊQ•8ܧ¨52·unÏÓçò¨tì%Œ|ujc{auj£N±§-þÄmѺ‡CìhýØÅ ×D}ÿݧþãý‡Ö´×$7áWM¿>jÉð‚ÚÒqÏt›Iõ>žk/S6¢¢ü/Âtë.Nríýۚʙ—²±ÙêœS`z²³ÜC…Pvñ“3çPÙH¯4CºÜÄàæ¼í}°+â#oÌÒ¸oæµ±²¸ñ`‘òÎq]Û>w•\˜ÿQÑo,¡i%@~f¶±U2²È0qÅ>’uä3L7»L7S°z†áa‚.éÁ'ÄG—4îÖûLm;&²ß;>^ppÊ_Ò‘]Ãnnf’Ô~´Pmi’? \`ÓýâÆOë?ØR›[ »Ì›kYæõîã-ýªÅ¦h“Zí“M½R²†¹aεIv7Åì¶¶£0Z"¨ #PÛG^) óË{8(eBz‚K ôÎF XâYÅ‚«iÒ,Š»C2äyäÐ66Ý·y·yl­‘õ®v7R”¦¶Ir£[=&{ØgÌ µ¾Ö- ëŒqQj6ö· sá’Ù;µ†OL³y‘ùÓ;v’Îp`•¢ž~¾”´r•·¹$~öL³¶rIóæŽ2mѵÁm²©ÚýV]F+^ô(1D±©\r:óõª¼_¥ªMÞwjHÊú†¶ÅTL½Ùfºbšk{ª­k§$¢,Äa€j=Añk 1ÉüûÓX;=¬Ë¤[ü $𲇔“Ÿò’åJnUí ­‹q ,£[zÁwoPàG§?¥Zî&sUH’óA×,¥Ô,ç€#‡a,eILà‘ŸÆ¬ZÍÜmx H° :6C:Ön¢.Ó;_’á(yÜVPýåe$ôBúÕ¬Å;í6(1þ3ŒÔ&ëJ“ÿsç›§Å&L¨À9ϽHxXþ5Öþ?pMØÂ;‹8æE¦@„;¦’FVùø³ùÑëß&MŒ‘ƒŽðÿw¤F5-’>â½Ø¾‚¨œ"6¹Õç–Mïk`´ãëšÖß]¸µ™¥¶{x$pí…àzqøR½£Ò¼ÚK/‚7juf‘œ_F„ŽvF‹Ÿ ¯µúÐé¨9jUp~c§¼©lœPuα$ŽâÒââÞìV5vã8 þ*nqs/'?ÅZÍlN*lºG†i dv ƒÏûÕþ¼¾UQ¥²7ñ§ŸÎ—O¤=¼q™^Q‘òÃÓ>™ôúâ–÷êým-Î>û/Z)t÷š9¸º‹;,2‰­-îV0¢XÃë‚Fj³ÚHŒÖ²…êTM­¯â]8D2zcŠQ!’ÒRãj¢³ÇU‹6¤j”ý§.—tÍ0IgÐ×Qì~©¤iòj0wp@±³&ì¾rg9«]¬}”í½—Ã^ÛÛÙߤMÙNN1ëž8ÿ½t^6–ŒK&öqE–4ï-µËËuDS•@‚£ŒS¾ÕöZÿ@ÖµÒe_ü)Tx]zgçíUr0qYvŽ“©ÅS7º»’òàÍ<¬d=KgéYÓZº²¸`x+ž¾õ¦+eŸ:O¸p”ñË”Xî ˆîr6}Aê>u”Ÿ?;ÈN×™Ö‡åcÇü‹ÃUŠ™Tf µÜösLpvpqLV WBËpÊÀ}ÖÆEtTÚ<¬²Æ=ÁvŒ×»ExÑÍÞm¨%|«ÆŽU]Ýïÿ¬­.ì¿R?fÅEy´Thf‘‰p=Ó¬‘ݯÝuúµ œ~ÉöŠðã¥yû?V6ýø\ÅüÃm ðê œîÀäôª²)'Ø+›Øi® Ø©iyD’ƒ8 ~|ãåŸJ­Æ·O"¦ã– E_ì XFÐÆå¢¯ TdŽG_õ ƒ¯pè_*/{¹ß|½Xœ¬<¹ôâ•öY’ÛV¹Y\ ‡„çÏ4V·xööóÜ—yócÉýjŠfq&ýÇvsšÑ’JqHF4ã&ÎÐ xßÇ>tƒ´ÚÕ¡Ò~ݻۉf^òAÑgß2O_LU-Bæf -Ì­ê¬äƒG ›$ëݰl{šÏIl|²6¨±Åj AËK2‡(£•ö÷?ëó¦öEDË)ï‚äØÚWÅ}Ï?ð¦ø€5nl$ib%v°#‘úcûõ£õ+χŽÏPX†QŒlî‘éϹÿ˜£›ú¼.Ã^Óµ›;};^Øë¹®SÚîËKÙ½PÁÞ¬ð1&9ÓÐú~ThÓ¦™ |t§ÆÇ?†jÍcd;K¡Í¦ÜM²KhŸ`U-"Ȥcuí¥¶¡}!Kh„îHUSYø3_®¼‘H`ãŒÖT“ÅðÍ ySŒ1ùÖQ(‚òÅžéJ¦ï,fE ‘M¡‹Mº¼e8HœCövîà–ÝÜ®ç æš6Ê=:Öi Ì{Á(Ò³›‘û˜/ë[<ˆó9 Tœbµ´¶)ݤîÝSø”’jåÙG k&cïØÈ¶¢#î¦wÊ‹¾\·éMŽ5+¯œêTVl-l£VNÁ”d§­FÆÚI’FÚrûŠz!Nu©m§P±Ý䈄'Sž {Ð=Ï}t;¿üµϰ£”WÄe<éŸqÜ¢'x˜ ’³G‘tŒ ÊØ^¢œÜÙFö:ȱ’§­%›uŒ`…¡q€¡zÓ—7¨Ãž.:ŠºiÛÜÛ¼2NªÈÊñÉ&sŸP}FO•Vtm>æi˜¤dN pëœþãßÁaz»£,Èù<•Ç'‚äþUuKoaɾg½ºS ŵ°#ü3#mé’Äeüê’Ñœ×Hí=„zŽ·¤DKD“ƒn¤x²=<˜Qö¦Æpnn˜úø@þÕæQî68œ»·cyVàÈ7zWNnÁi€ Ü\®Gó/úP³öÅW1ÞÍÿ©WìÄ/ט£³dM¦¼Rm=ÛåA9=GAçÔÓûÈú}ÄhÛ£7AäëÀÍ £YG¤]\Gߪ@ÇÃÓ>c§—Niœªc 'ŽDXà‘7(À' ŒùŽp9Ï΋öãOc'f£¡Y‘RˆGÏP@äóÇëYe3èWS²«4r¡RbþHÉLyW<ÿ©g°·Hm£*,Ÿ5´R•i{efòá~ F‚·ŽS´*œ–çô¨4Ù‘-dF8 äsZkWÆæ÷ s ~÷÷¥á¶¸'§T]=‡$šÑgѰ³Àù<†¬ ô˳B®v…šÊÒ¤¨Ìâ웳Õ»J³É¦wX·+¿¼}¿{8ÇÐÕ±{Û»x †ñÈNˆ—GŸ•ökÛK>ʦ —V²Ìn eLxãnî¹ù×GOµm4Æ_à.éÿZÌ–ƒ›|ŽGkÙnÒÞÏ Ú«,—S½¸–I0Kwíá?J~½‹ít)gl/bŽ;Ö*‘£¶‡’À~"·?hˤÛìé}q>xÀÞBÿ•]"ûCÒcÔMÔÑÜwi ¤!£Žyfù¥YVÊUïÙÇkì ø§šÔìudž,’=)°ì'Úru„ýÓ¥X5O´íêÁ¡‰n…Ðò˜à0?¥6ƒí7³ó`+ÍŸt«Ð7"Œßg]»åõ+f>­1?ûh k°½¯Óô‹«ËûÛim!MÒ*>IÜWK—í+³ÐpóÈ>Q“H;Sö‡£j½–Ô¬íÚ^òhv¦ä#'"£J‚‹•œLxÖìG1!§¦|³Dk÷CY‡LŽENÿ£t$ŽqÇ‘¥$ø± ]"y§"ïx†2wàtò<ò(Tå\lk‚¾CÉ"[5Kt·ï!vT’A••Xž <çåEjú·ìÛo…y]î# $N|ñœzzUÂ>ÇYÍeoRe­£[©c×'ñçÚ¡ºì”7wf{Û™ö‘à›lmÎsÏŸ­é­{¶Ê—Uî¨é›MjêûGÔn % Fz0fÁ÷â—C¬5ÎÈû‰î'|æñyü9n=}ë©Xv[O±ŽCðH‹ Øñ®[pô9©š¶òab‘F|ŒK}ëEë°+ª’wÜ Ee#X»\Àˆ¸%»˜Ù‚ŒtÏ™ 4}Q®,Ê$qüLX,Û|`p7g>k ^ÙÏ»†ïâôØé\óW€h¢ÏŒŠNIà7ž2=êåƒÒV–óz®¨1n/äw_ˆÙÈ,Y|ñÐqçøUðZn•Ú‹B+¾òê8T ŸrIç•Íín_XÖlmo`°yÑ\#`*–ääúz×uìÎ…ÙŽË™ŸL×c=ö.#nŸJN›²JÒ£€ö–Â;P´‰JÇ Ã¢‚yŠPž•wÍWì÷²Z•Ü÷g^Qq;™µÂc$äàPR}˜öE¡ENÐBŒ¿ÅߦOÎ¥JŠd4]'[Žh/ïæ¶ºB apuóòê++ é½„Ð4‹Ô¼µíD):‰ÓÌ`ð~u”JT•³èÑC0›¾¾K\c”¶î´MÜ¡#ÙÓKòL Sb—Ú¤ã)€ø’˜Ѝ­ ŸÈ‹MµkÛˆmÁ`ìç#À$çҘ߲²TðçùœT2"G„SÞO÷šD9@à|Áϵz‹?cfôÀÍ ¡ÂäîÝóVËx‡=ph®âáÉÛ õk"´Hd 9‘yã þµEGqhÒbNø¯õ –k0Àé Ý OÝÞÀ­²Z¶vJLB—ÜY I7ÄÄä àøTa.âï3L;+—íNž…ð‚å[ ÈãŸÏ—µkì•”:]ÜZ½ÅÆ\£wQF3·Ÿ…—‘w»‘¢щUzH$´„å˜äŸSZ|3Áæ¯`w-ñö–{F=ıƒŒeECqÚ+›¹D³HÌÊ0áÅTÖ7¯J¸©EÿÒÛûyš&FrÄú¢ÿ¥oû@þΖ$ñpà ÏåTÕÝÒ±ŠInâDRY›U2×qÞ™bnç,Ã÷HrÞþÕcL²ÖÕm­Ö$çO©ó58Lž”©>(ÑÛ<…å·Dìê§âÆéçeŽêL0’ã‘ì}E-T @êÚ´Zu¹ÉÝ+ ?ö¥G4¢ý£%†2‹ä_,/îY¤·¹ƒ/Ý•FU‡èhÉu…3! }23ùf¹®‘Úë‹Ý¶AZ7+–“~sŽ£ÔU‚>c“¬ôô£³>.dÛzÝjq7þlŽ?•<8üM*ŸU³·äš1xåÙòÇÛ5 ¦ª=¬»ÌÐZ©à)‘¾}ëõ¤Ç«Ë9UÑ¢].,qÒí öŸ{rg±·’"CÎwŸ\yU`ܾz S ?ÓúM&'ÝØ— •™™€À¢»—Ær¿Z M=¹ÑïKŽòvP¹ãÔQ$¼.^¦)3åY^}L ÆÒlz÷MYWÆ?@ò™.ÊHP}¨Ãq4£ ‚Àz•Ÿ•œøY†©8äùþ£ZÍdŒàó†Í;7L]÷¡SùV¦åsžèéE½‹ñ‡CŸCX4™Ùw Ÿ^h¶,®c="£7)ÿËXÒ®<£Èõ¨ÛLœ `*›&ˆ–X³þ«_f¬U£7Í\åcýOéõªÈÓ§ÎvWU·Ó(!„xc@£ßŽ´¬™;Ûпel}(–ˆ£jY©]¼0º[÷aG÷5’y9:Fèãâ­‚ê:å½–S;¥þUòùÕzY´ËÍÓ\½ÉÈ¡[M¼•Ža‘äêÄ óZ”`“#¯„ÖŒxÔLyr¹ºhðié©Dm®܃áeÆ8«Ä`wb¹Î…˜µ˜2Îáùè±ÅYz¥îF¾“àȦà×=×&ïõË–'„ðÀb¯óçŠæSKß^O/ó³7ÔÔÀ¶^vzÿáÉý& ´ÓEŧ}ßD9 ©p NÿáIý&€·Œ´Dçζù‹'cYbøY‡‰JžA5¼zþ¯ ”ŽþuN˜Yö­e‰¿ Ô£í"®J‹´9NÐö‘Xj%|³!¬­„k%„vä À8äu'ûÖU*#‹ðc!ŽVeÎqÖfÞ~÷Ðâ±Vgp›ŽvŒÑÛFÜœŒ„S!Ø Ÿ#ÔïÃlü>†¤Yî-¤vr3P¶2 °Éò¬E9ƒëEBÂÛRºlgk/>U´z…Ä3wÑLÂO-Ã4"´ ¨f}§joek¦0+s4¡Fr3BôVñw1gØœ’§Š¼è]¤¶žÙ ¹=ÔÈ¡w8À`<óëU‹‡²'áÌ3drθ#ð¥RK,‡vIQÁ'.5’4ÇaÊñJÑÔ'Èr§9ç"„{(€'Œšç6Ú¥å‘ýÅèþ^£èhÈûisž5%OëX}dz: ¨„¾H¶É?ym!ŽOUó†‘êÒjÞO)\}Õ8¶‡µvR"™KEŸ^iŒVš€=ÄñÉì?Jdg8|Ç‹/ňôõæq•hâä„6vCïW8N"Ú5£ÃyvΑ³eÔùŠwp4çͦ374Åúå×ÃiWRŽÍ£æxýkÂrÇåWNØ7w¤”þiõ5H¶>&ùSp­ó?pTŸáJʵk¥´Mk°º‚ óì§÷ÿAþÕ[Éõ­13ÍZ.pGfò•ð1÷ý)n£j¯ ʈ>Ÿ½Uàî:^÷üÇëLm±j)m ?kÏop%„(n˜aœVRÒI9'5•T"Í£K$fà#… £ ùóL¢¹XÕ”¤lO`iŸx–’HÎO+š-µÐT¯\W’4Û K¹<í¥l!Fl€Nxç ¤²j²¸ÀE _Ü>Gx@ö«sE(6X$·¾"£äàÔÚu«j‰kÍ´NÜ4ËýMUŒŽÇÄìmÙëo‰ÕbI—?… ÉôÅöYužÍ&“§És6³§\H˜Ì03³qÁÛΩ²j!r"B>f¬Ý«u‡OŠ1÷ärOÈÞ©@¦Ú Á&H÷rÉÀö¨ärÄzÔg‡×çW8Èp§jå:r/ Aœ™~uÕÂí‡Ó"²å‚OFÌ9$ÓL¬öȱÓã>]èÏÐÕ>ØøÏÊ®=¬Çìþªãóªu·Þ>â™â+/È1Æ`”z©þÔ6Ÿ£YÝB úœV²ä‚²#Œq÷AùQmþÿM'ɦ¡2V?ƒ²v7^´y¶îî’) {ÿ #Ôô“`ê«ì}:ãšKYæ7åLwÁ#íBÕžÚ² h׺Rà`äsRIÝ„?¸]Þ„Tby?˜ýkÞù‰ÉÁùEÍÁŒ;?lgÕ¡~åB)ÜJùzUþr1UÊDúY¶ =íV{¹vùãÖ\¯”x•^ÖÎ8m—©bçðàsU¸† ùQZ¥ßÅßÉ(9Pp¿!B§ŸÊŽ*¹;v“úJYR9cl|©¤GïgþqR)0ß³}’°Õ°o5ë{3·qˆA#¿Ë _ÌÕÆß³}‰Ó1ºÚûT”yÍ Š3ø/5ZìÄ&I¦p¤áBýíVhÄîè­“ Ay×î´ïÙŽ¶º™hªB†Ž_¯ók(ÓŠÊ8÷å™ò@ö²¥‘¤Žv–ÓFÝC/¦j^ìÓÞ˜™U!>lp?:ÓcàíÁ|Ö¾nl=1^õòü(à¬PïUÍ êdœ`Ðñ/™8Íy±‹qR˜˜\yWŒ®g¥S‰jDEX•æH­¿zG[>~tÑcÞËCÜéæV21aòT Ô»¸Y¼r£åçLd’;‰8 ¸JÔn ÕÉ“$¨áiJ<¥f‰KŒRaá¬_:ñ_œW¹Á4Êaq¿*•Ó4>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€‚‚‚ƒƒƒ„„„………†††‡‡‡ˆˆˆ‰‰‰ŠŠŠ‹‹‹ŒŒŒŽŽŽ‘‘‘’’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ,æþ¬`0a… [H¬!±bI4v¬â1d‘%Û¨¬£²e ™‰dÖ¬¤³“Ξ©|­e´—/¥ÉœF“šMjÕrV³ÆóšOŸØ‚fª­hÑmH¹)íÆ´›·§Þ¾IG•j¸«â²ŽÛJ®k×r`͉=G–,º³éÒ¦SÇVݺ·ìâ¶›;×ÝwxßÁÛ /ž_y€åÍ<žázˆí)V|¯1¾ÇøòIÖGYß¾Ëü2óëǹŸ¿Ï L¨¡CˆÅ&R´˜Q#G —$iåJ–.aF“)æ´›8uò´ö¨P¢Fµ!ݦ”[S§P¥~«j«V®^É-'Ö\Y³hÕþ¶u W.ÝvvÝåÕË×o¼À‚ ¦‡¸ÞbÆŽ!KÎWÙ2fÍyÚ@ÀtPB ãÐCMdÑEm”ŒG…4RIÍ ”ÒJ-A£Ûn3Õt“N;õT\PØ •MrÊ%µTSPE5uW…“•8[“vaõÝY訵V[o­;ç¡wW^|õõW`„vXb÷5vd‘MVÙeûh¶YgŸùZ£!hZC¨©ö`kRÛljx[‡òæp$WÜ5(ªÈârÍ=£tÔSã9î¸]wߤãyd’é­×¤{ðE9_}÷Ùc%–ûõÇ¥—†9¦¤%¸`š²ák½yam'Í™LvŠhSž&þÔ'rFú"SƒÎXÕ¡×é˜Ý¢>–õ¨xD–‡äy•2ÙÞ“€i:¥}Uæ÷X¨[þ—Y©ŠVPªg2˜Z«± k…²Íš¡mÞSˆ¿(\¯Æ¥ìQ.:ctÆVgc²ŠöèÝᥩ´”.‰×¥ØÆ7ئT.ö©~ZR6*€`~;rmagick-2.13.2/doc/ex/images/Button_O.gif0000644000004100000410000001034112147515547020124 0ustar www-datawww-dataGIF89ax÷DŽD4B$" LNL,&$4f,dÎdD&tB  $2”–”\J4ÄÆÄ&|nTdJ,,$V$D6 LªLlælŒR 4* ljlLF<6, Ä®”ìêì\6 ”‚l<"l^L¬b*4J42,<~<Üʬ|J >\RD,tþtœZ Œ~l¬®¬l> ," 4j4lÞlT2 TJDÔÖÔ$|rd,^,$\¾\\6ŒN <LžL& dVL,*,D*  $6´¢ŒLF<$"lV<,V,,TªTlîl4. trt<̶œüþüd:  ¤–|\^\$$*$N$„N 4œZ D’D,F,*$Db,dÒd,2ÌÎÌ|r\,V$T: $”V lnlT>$ ìîìd6  ¼¾¼<:|~|œŠtÜÞÜlfTTVT4J$|þ|tîtlVD„vd¼¦ŒTJ<,&DF<&.4n4lâlT®T̺œœ^$<2,„J 4$& L* <. !þ0Creator: PolyView® Version 3.62 by Polybytes ,xÿµ˜çO›2*LHd¡C… JDq¢E‡%fÔˆIC¤A B—,,Rª\©ÒË—+]œ™R&Í›/mÎÔ¹f¡.šÐ)p!”8Yð¬ÉTiN–6e.ÕÉSj˦1³B½ê”k×”Ya9ÇÉÓ®S“VU{+Û­^“&åã… "†âÂ\*wo_¹|ÿÂõªŸ=yÄ‘b!¯ßžhÝZýÊuòÚÈp-gvË9i$;ˆHYl¡„Þ¯ßL­'ëÓ svÃà)£¥”ñÓZ°ïßÀƒÇ~úÁËܸi¢Z¸óçÐߦ,`ñâä£kßÎ=u$È“ãÿÆ»ÒM ˆ$Hxƒ^}úö8¬‡ÿ¾¾ûûôñÛÏÏ¿ýø¥ ž€ ’VSßYiyÍPE&D(á„Vhá…f¨á†N˜AP$…xÈ)8F@X¡ ²Øá†.¾(£ŒDà•M æ&nÔ0ã@)d…ŒpÓw ŠG"C6é䓆ÐÅ,äxŽD´å1nùdˆ3!Yb‰?x¹e—f¾(Cƒå˜¤_¤Ùb„h¢i‚‹1Ú)§ lò5bn Æ ?ê9§¡vJç¢*êè„•hå’›c¹'…† ‘Ã$“@à§ ª È_T’C\j!›a’hâh„ªÿjç•â @`C 1ìꫯ4Ä aL€ª˜¦)e)QºcœªJ˜Á6Üp@ ‚ðÊ+¶Ûfû«¶»ò:…Æ 1¡¢@²ªÕŸJ&«™]ÖIEèÚ+¯Þ‚»m ‚øÚ/¿÷ö „0Ü‘'”˺å, ÐîY%+èªm¾½zÛ/°ï»k¾j˜Áf²º”˜¯êeŒ[ÔQ¸œñÆ÷z s˼±†Œ ™0W _×ð–’à#½r‹mÀünó·E3]ñ¾‚`àÂ辨îKì^§õ»Mº˜Eø«1¾JOŒ´Ñd?-vÀEÔapÎ3FZX³ÕUºØÏN†àƒÄgÓÿœ¶Ò.̲ÆÀö‹Á ?T­áÕ,‘<¦É\J8Dàæûï¿3Þôæfÿ 3¸ 8† Fé•–:)ÃS¨Íò¯2k¾ùì/¯=8 ˆ$ã+9®$×3ºØÂ×¾Œ¹¾¿Æ@Ű€úé @à0»åH_ ° K¤::¤mVhrxÿ˜@`lýÚ2m†‰À¡»„2´@‰ÏŽ<áÛ2R‡žèö »I‚\dp5\XÈsY¯.`„  Kp¨Bý––4´Q,@°Áö$´3«XiG©ÒꨠÀná«e1Â* £,¡xL#ÜÚ€mw*S7'LàÇûÜÙÿd¶%l~F(_ÑÆ†¹ó¥2ZÖÈêV²ðu¨+øV섨´E0i€*‹YÚ^. ÁjgàãxÈ¡ ¸ pÕ«] . '%âKÌØåÆ1Œ®ƒ½£" pcÅ U€hN ÜÑz…*@© M+›ý\6€‰ì%: ¬dÄ¢d`\bÑ– (µ`j³˜¶4æ­lC;C MTÈ Q"ˆè[ V/Õ¡|ø+š*ï…(‡)Qã‚Ø˜!(qŒŠ%Œ`&9œ!…»Ÿ¯ŠƒªÉÍ+ T--Ô‚(8- ¦ ´d¦$H¯‚[dš· P5dV‰DšÜäœ`@ÿ´tÍ„F‹AÆ '1ø@‘¹tYpF:*¹Ik„|Q ÞGŠÕŽW>H•œ¾€MPê‹bØ_†ì‰$ˆZ‡™Bè9±pO X)·´©Å]Q@£Š%޹ qžkƒfÚTyÉIhB„JŒ”YÉÄç ¨¡›uŽø##t4ˆ« ØH§|ðYW|g‡BDk j¥RÖ¯¼mU4É䕨š¡4 5˜(C÷´3(ò‚1dÄ-$ELòTG>¥“aiŠÎpa,£ÑÃʼ|± QJ£TuÄ×F‰¡‘LeÅfç¸aˆ«tÀjI[Pÿ^,.0TYéV²ÑDÖ9žÅΙÍ”)Z&8AñGÆ_­§ºd㤺W”Nˆ£ºä"æbp€Åªj Àüg¡°•B±ìÊY!Ë¡΢ÁBk‚$\€¥1ôW Š×™(sk0úäv%I½9²3Z Èâa+G8 ô’±¨ÉaÝHQ É!lb¬ž.±‚«ªŸ¤+ÔF|¯B’< Õ‚g걦ÛZÁ£î”!<«B++ÍœÆÌÒ]å¬WŠlLE‰Ø±½¾¢€mgÁ]Q­¿0Éäï6T %2Y¼3k-}e°Ù=Â1»=îÞ÷ÀgH3—¸¹Eòfa¬á%šÿª,P& ¬¡*ô¯µÓ2}߈Uò®-…peîi¢ o(Vfkˆ©gä xŒgÞÆ §çó¤‡/Mã‰[$'8šéd+¯€ðÒ 5vºcöí†B ÄíÆ“pG¦ï§]vÛÕv«W˜/”¹"gL×8¨íE¼KØ*Ž!|}€ór/.@FNd+àâ¬®ÃÆž‘3iLEwøBÒ ä¥õ™!O®Õz:þ6rÁ»ÅÁïb[ÍéYÂY¢È"U®Æ#Ût-H/¨®#®"BëßÑΙC”8[åxWN2ƒ,ûÕ/ǵü&VTè kõ\ì¶•¸ÎNÿub{ÛÉÒo*-c¯åÑæ‚²ÓÑÊåî%ÉüöŠït„×kßÂÃg–Ùo°nš«Øi›ôS[õ&r×ø °Ó1Xx™¡d¢ËЇ éT½ ¡†8GæRÌ[jôžä `òâw[FèœÕ(:K¨aS´?_–÷KUÂé±; Ù^I³KŠÐ: ÏoM%×4’®æ°²½ö¾õ< »tv…`Þ.™_h KpâÕÝ=e Ù™S¸¯ ïx¨®—̪A¢=Ÿ_pþµ!ø7‡Y´ ”šàë¢îÁ_äÞ‰àB,‚[á†t6qˆÛ:ƒâv ù½zœCpÀ#ÿï3 3hé÷BtGw¬4 ”}ÕÑk‰ü~.ð­¸Ù êx&à_ñÛ)pEó†bo2ybnúEb¢d]7@&×òjë×+àaS÷?(|ecÉR_öií¶+ àAâIºTd¿2M/¢q_Atßgr–÷9é#l¤ABÒI €ÚPéãAWu¦§! ~ì÷nE'pc0"-€nB„X$´X{˜ƒj'#UC˶~P@Nhc³âŒPAÄ5;Ü4#¤·#E¨!2°ö¢EÎGƒÜµ[°Adp fÐm§†)ÄQ”WUtB"3zwÇH+ÿ Ýä„ç’i°lħ9p|h¤òç.C’ fÓ$ŠW6ä-@Qà<·Rèv²×4°A(#öô'c‡K@B;} z–LXKH{@rj;…:ìå$P˜÷:‘6~%T ´‰ð{9à:ô=ô×FJ€„©—aÔ#ˆlu‰Kô:8°ï÷‰†yõv&uÀ‹¼‡_*HFÏW40¥”7M1ŽphuÒC&P |ÂÄJ60äE3MPäZ‚(wô–‹f’uà 9l>ˆgÿF;+àØ$¼#ræ‰r’J@““ÔR²§h³³“—€~¦³TŽ£W´#;WI; ·ГPr5:!eó‡\- °¦•j9;j°)¹'é%/ƒªÒ.°V¹–›s+@_Pе'2p”‹q'ÓIJð<+0™”¹‹àgp0p -à”22­ò=¹è™N’¦‰,H–!ó8Q•OÈÁ˜©›šZQ—[(›¸9#´éX®y"¤™›'!`š‡üœ+‰œ"3@ÐX)¸Qrü?Œr09c4v5FÚ 7ØùBŽÿ07¼•‘ˆ¨’±ù›\…ÐŽ“b‚2 ꩜]Cä•䘟D0¦’ýùŸ9àŸ  Z z š ª º Ú :D ŽáÔq¢iÊ¡º¡¢ê¡"¢%ú¡$ú¡ j¢)ª¢ Ú¢#j¢+:£:HŒÁµ9aÐ9n©ö*YuÐ飤 $¤)¤DÊ ÿóæ}6:n¸ø¤ ô¤ä8UQú8;ZzWjž1Ç\À,AVpPŠ&•¥Qê¤í2¥<º£i×›oj¦pÊHÁL° =Ú¥]Š¡}z¥Ñ(§RÚ¤„j7‚*š*v2ÑC’ᨧXÚ›‚êšBº¥™¦’:©mš©<òŽðc¡vÀlz¦>ЍNŠªd¥\šjVšvªŠ¥ˆ:OP0;@ªk*©UJ©œÊ¦pú«—¬¿Ú«<eÀ"ÑX «ªªÐúªÒ­Ô:­ÖZ­©fQÅ>šØQKE1´PE--0¸£¸ ¥Å´”´RÐRÑKŠbRâ–€—b—”RÒÓ1E.)q@ F)qF(1F)Ø£˜£´´ÜRâ—b€ŒRâŒPbŒRâ—ÜQŠZ\PqF)qE&(Å-˜¤Å;b€b—b€Š1N£ÜQŠv)(¸¢Š1@ ¤Å8£$€=è@¡¬çR0ø™p§)ü(n(ÅN–ûñ‡{T†ÏÆ*Áã(®§BÁÖ} ˜¤«B×ý¬~‹k¸àH?#G×(ÿ0¾§[ùJÔ˜«&ԃéü)†Ç7Ò®8šRÚDË V;ć˜§AÁúÒb¶ºf 5¸Ê)ؤ Å%:’€”êJJJv)1@ IŠu% ’–Šm´PqE-€m´P-Ø=¼l:Ê¥¦@‘héRP¶–Š\U(¢–€ Z1K@ Ú”QK@ KE(¦!)hbeˆÞÀ3ÍD§îËŒ%-´SÑ7±PF}ûÐñ²™H¥Г²eJŒâ®ÐÊZ)kS!)h¥ Å.(Å-b–Š%.)h ¢—¸ £¸£˜£ê1@ Š)h Å¥Å £´PbŒRÑEÇa1F)h Å¥£LQKF(1IŠu âŒS±E7ÒÊ Éô&£½%m$+'–Ç€Þõ6ž%ŽI6ö—½rb±>Åhµ:ðØlõ)æòëΞETÏÉ=¦+DÚ[Ä6XvÉàQ=ÊÛ`€Xç¦zSlT^™\«‚¸ÝÉ&¼J•'SÞ‘ìÓ¥NŸ»Å‚{xܤX §9ìIëSI2¬|ü£¶=? Çòž9œ.FG­Nó2’7·Š—ÅÆ¦ššf@¨ÏzQ*=j¤Ä-ºàçJN6pO­gÊmÌHdÎ}x¦¬›sÎ;ŒŠ­æŸ%F}MJ›AmÌ s»'ùl.k‹ædÐŒÔk±5‹·išÜ|¨‡ó53—*¹Q3k3ܼ²1$ç€OÝ÷Ÿ&ÆÛ´±ïÍd诙¥Luüªì³0 +®9÷5ãU»™ëR´`_„ÉæF¬Fwg'­i;|ÇŽ£½rл%ÌnÌx`I®™$IÀ‘NGcí\µS‹Lë¡%4ÐÉ#FQµ½;ƒh¨å}MDë™’q]øLe½ÚŒãÅàþÜ-)$¢ŒW¬Ï!« R☄¢—¸ £ê Å§bŠ`%¥Å-6ŒS±KŠf)qT.u{xIXó+Nó¬¹õk™P¨,»8Íc*±‰¤i¶oÏ4véºFÇ îi‹u9POLƒØ×.ó±,O|äÖŽœûÆdùrÄmÅqÖÄN׎‡]1½¥©°ÒœpŸŽxÇ­D.\¾¸ïU$8ðsSHйV<ã©ÈñS­Q§}‰Ä²¤±†` œãÒ´DŒHRPznk–KÙÚ} …êxÕõžR »nã5HÍ»ÜÚ•H%kîWþ™žÙh÷cåÈëƒýk/s(ùK/ÐÕyKä9fÎqœâœeQ} Ÿ³dèhèÅ‚vš‡SK¹¬«‚ |.OcWq^®S”_;¹åâã%Ȭ6––Ší8Ĥ§Q@ ¢ŠJ£ª G11( žŸ]Y•$Ù È=E2â¹áºÃ¯§½séZeÖ×2"t;z8ö¯3AÍ󎺂å/žÞ±ÎI<ö§)+÷[±ëYlæ¶ýÐe‘NJ–êµ;ªFGÉòž•ÀÝ´±Ú ß½q­,²ct‡8õ¨”d½*Àd óÇf暊„ð­œw57)¦È™_ËMÄmÁÛVRbmãðO8>”ŶB¥¼Ð=ˆéõ¡`bLsëRìÊJHn99Œ;zŠ¤Ê 0Ï­W26~hÛ¯j¤ˆ“±<2• ’N)°¢HêÒ9â£WŒZ±okæ `;â‰h8^M"ä…|å$œri&ròž>QÒ›œ×œÝ¤wÅ'öÓ™"!‡Ì^ÍZ²CzŠ©n2¸Ø»q‘‘ÍN— ´«®ß~µŒµ: ìµ'4Éþâc¦jEUe §#ÔTs®}k£ütaþˆh¥¥¯¤>lAKE-E( @)h¥Å%--W)¯°:œØçò®²¹yvjóŒcvæ+ÿ ­-ÌÎ<KxlÖ›¼‚JŒŸZ– 7¹ä×:ÇG JÀ(ÆOZÝ·‚#C,Áã§ãY–· åýÇ9ldt«n¤BÃÁ¹jÉ·c¦’KS\5 PVE#j0w-ÄxèCY@,`…ÂðGúÔ°mwe‘CÈqXrXéö·ÒÄ“²àCg=s“ëVíåfEb:õF[bèNqØ÷¥±”ÈZ2Hnx>µM]5"Ƶ/—a…ÇÎpG^+šã5Ò_D×¶þ\d<ô5ƒ5¬Ð¾%”gí[aÚJÆ8‹¹_¡Óè*‘;–?­hb¨èjI ³Ö´1Å{0øQäÏv6ŒS¨« n(¥¢‰ŠJuÚ)h ²«£# « í\F¯§› ¶‹%Œ£zŠî+?ZÓVþÛp8š JŸQéYU‡2.œ¬Î8§¦éÑœu¦²`Ó­Ø£1•ÀÑÚ›:íeœ¡+ær$Qøÿ&¬Çtéq0 79ÜI0=+šÓõ #ò`]È7üÌ2¹éô®žô’Úd· û­yõaikÔôéJðÓ¡8¹Ê†’%{àT-³¢<óòœT‹´¯4íÜVltÙu ‘î,ìäKlÌK‡#ëš‚ÂæòâM“Á± ¢| Ÿ_þµ];[¨Í µy^)Ý[b9u½ôíòˆ™$Œ¯*pG±¨ªÃ1hˆ'=ê örù^»Fc T¿q´”êJô8JB)Ô”ÓE-Ú)i)””êJJJSE IN¤ bRb–Šl+¶Ç¢åRS!9‚3Ó*?•IŠÀÀRÑKT ¢ŠZ)h¥ –ŠZAJ2îF\•ÈÆGj§y}b¢Kk™@Èà gÉÅu4 ÂÀ'ÐsV.Ñ­kyáG“ûäô÷ª(y Û9é\5eÏ£Ge8òê™ÓÁg4¶‚Sy!“Ž ~;[Ý#á%Vœ¸ÏЊ‹E‘þ͸b¡ÎÜvⶃ|¤oÝé¹­y$Ô¬zô ¥™kspŠÞd$ƒŽPî~?Ûan|Æ2UW¨«žZ08]’cï/Ó˜»ÌÆ:s‚i—:\–è†I;ýÕ“R-ŒKÜå÷8Jæ÷w:5Z2Ä7>` Ða[Õ¸4²_`¢ÜñýÂr(I%ÛT_öTT÷Wíö5]áv3ŒYµ®Å§¦å‹k¸·²ºŒü¥†*[«V)Ù0îsõ-´«äÃüD¯'Ö¬3¡Žx®y6ž‡TaH ÆÃ å†FÕ8¤¸H7ˆƒø°3R®Ï' FOZlVâõ^)7mx à‚)'­Ùm{¶H›M„AfU•7ºàÕ¬S'>´b¾– ÑHù¹»É±¸£¸¥ª n):S¨Å6ŒRâŒPhÅ;b€ŠËñÛ[YÓ‡›#>ƒ½j×5â©£3Ãl´jwLÖu]¢iM^G>À7 2}©»<´bzµ<o»ÂÓ$\($’}ë€íC­˜­À dç§­w€XQʾõÅé»Mì{±·pÎ}+©µ¼[–‘‡MÇhÿgµqâm¸i%{–c\FÁA¹É= *y›@b™õÁä9üf¹Ü„å@’ppzS²2Û†1ëÞ“i)².@$‘¶‘Bï‚2)Ø ìû yAÔ÷$Ÿ/—"Ÿ“?Ê·£ZT_ºsÖ£ ËÞŠCR» ]@ô$Txçý+Ü¡YT‡1á× éO• ¢š“Fò2#†+÷±ÐS«U$ö1qkV%!§RU%%-Ú)i)””êC@ ¢–Ò””êJHr`Œ·¨ÏåO›ú¤ÿtSé­…-´Ä¢ŠQ@ ŠZ)h¥ R@¦\L¶öòLÝgê{T‚±|Et¡RÙNNw>;z ™Ë•\¨«³áÚiÜåœäš€.ÖæsœÑ2J¹é‘\ õ;: ”´ŒHUI$äŽæµíÉ>¤÷¬ï&D `Ÿ\ ÕÛIÌÈU×zc5åTÕÜõ¨».VL™ƒR)'ŸJbçéëJÛ¶à`sÜu¬Ž‹Šªp=-$gr‚y_Aw¢ŸÇ+VbRŠ1K]‡RÐ)hQJ-%.)hQŠ\sKŠb¸¥Å¤vµv-tò+´ß 2=ÍsqŸ%TGÆ=úšÐñ]Ö'†Æb‰ï“Ú³ ÍÄY\ŽkÏÄ»³¿¬‰n$ûCÃ!r¡_n½E œb¥˜>Ê1Ý{cÿ×SÍjª¥“vGPk‡™+#µÁ¶ÙM— éÞ¥žÛ6¸EBH »‘Æváú ”€#ùaœúRlîI§—b “Ë ‡ ¦M[hÙNÝèØ9]@ªò­s×´šPeWÇéYN÷:)ÙÇQ<²Yö’qÆW¥^ÓHò°OÌ;ûT0È­¿ý®«Þ–ͱ0P¯žxõ„®ÕŽ˜¤µ-ãbœÝzQŠúzzA\ùzºÍÛ¸ÜQŠSŽäP žâ«ž=Ä¡'ÐLQŠ^Þ¢ŒSº+Z ŧ`ÑŠJq{1¸In†QNÅ2YšYX*(É5D‘]\Çi›/=•GV>‚¸ù šêg™Ð–rX’jä·R_]5ćdKƒü#Ð{ÓÒä–á7v‘^mzÍ»#º$•äPûŽŽÊTª.O×Ò³'ÆG5ÕIwj¶sR¿!Æá\›€Ä‘ÁïXÒ“•îmV*6³Ù >õ¯§ÊÛª– Ü­b Ô´A,lC‚;©¥b`õ:ˆd£úU• wéYVBE$Ý€ Õ§n€(ÜwÖ¼Ù«3Ö¤ù‘#:ìåsøÔ{•s¸1Vr£€2*½Ã"¶ÐÀ)ûÜgšÔÚJÊãC(+´ñéD§+…=yüj«‚̵$S’Á_ŸqÖ´qê`ªta1, ¤sÎ+.Îù’Y"‘‹0%sÓ"´cq¥‰Â¨ÜIî+2ÓOš êm¿1$.rA'½k£LÊiÝ4Y³±‚XHÙÎrÍÓðïZk±Ã®@õªp2ðÍX£”ó´ŸLUFµH>dÅì©Ô\­ŠJv;Ý) {4+*°¹ãâ(º3åŠ)i+sœJJZ)Ú)i())Ô†€E-%!·böñ1 àTµ²…¶ˆÈ?•KMlp¥¦»¬k—`£ÔœUvÔ-T%W#°4œ’Üj-ìZ†Eæ#¨ª¿ÚhsØñgšdS¢íE9ã;«Ž¶-%hnuÑÃ]Þ{S,zT€.v“ƒéUžbHåÈ¥‰· ÊAï^kÄV½ùIQ£kr–X(þ j1(ÜFŽøàÔpˆvïP}*?µ&p®ï‘]ÆU¶§<°”y®™fW©¿íu5“y¥!…š=í/Q–Îê¶÷¡Û—#¦:f«Ë$¯m$™Ø6c©¬åZ¬ÝäËT©EZ(æeR¬A©ì#2HqÔÖ«7ëZIT!›þz þUÑ7hœ±Z›!Œa”ŽàÔÑÜJc0-ýâ9ªÍ°±ÂÈþ§¥LŸ1(P;g5ÂÒ;T÷%†YT!Ü;ÕÄ™X|ü~•Wä#–ÇuÃõ¨åLÕMÄÓ :S«>Ú˜FXO¯nù¹9ü+· ˆöO’{¸ªÙ{Hn;´¿­-{ ¦®¦˜˜¥£´Ä–Šp ¥ÇRŠ¢–—˜§ÉÖŒTwEÖÎàÆ2â6ÀJ#ŠÕgûV¥<œXAÀ¤ÓÆQð?‹¡ê£5¥§#w(ó’x¯*³Ñ³Ó¤µEé|«ƒn>ã¦ì:qü©’;7îÜã׿úÕ#BP®ã½ˆ'S*ÐáÏ<žÕÃtŽû6S!)%—4¾SK`{jè^I<à`S|¤QÎ̦–Âe^3†Çcþá1x?/BE49ˆî-€:Õ9ïm•BƧr«ÐÑE³'+(ŽÈ®HnSÈü*ù€+™‘ž|ÂF>•Î>¤ò¢4CÉ+ÇÊzâ«ËrÒÎåˆã,rhTz•õ…dŽ¢ï_‚=ÂØoÁûÍÀüz¹l—7²L<°Ã*¬Ù8=ø®H ¶zšîmbaA˜ü±®*¼]i¤•ÉÁÒ‹“m<„^ÉúÔ!ÓÌ#©5+€ zâ©"äýkÍM½ÙêY-‹m!\/µeÉ-ÏÚŽãϦHÀSíëVnâó-Ú2ì¡Æ )éT OqC°ÌTar Ÿð®ŠriZç=h§$ìi¬ûÙè}*u}à Œ{V—|’g"D :Ÿá>•{Ë+§e ͓ۊ†šêTgÍ} w7QÁlÓ²±D 1_CÞ°õÛŸ´H‘¤Šmð m?ë ïô*MBrö o&~y•xêW½%ôB+‰•Z6&: ]´ñ3Pä‘Ã[ Ož(θƒr¬JÇR:aS$!"P;xÇj ß'̊71è•7oB,–¤zƒyVaúv†Ù éV®.$¸“|‡ŸN«°Õe©„ÝÞ„c­hilEÒ~^ÿJÏèÕjÓ>zÔ(–Ì!¹ÔÛ9,qžÕhg cõ¨|†‰ *>øÉç©« aO­y’k¡êÂéYg`Á™qúÓˆuÜ3߃M”•eˆw{ö¨çgY³Ÿ­N¬»¤JAq†àúŠi·TÉ"îKsLŽäš¹Úp¤zûÓÞqä«.Ù#Ï$žAéG¼„ù%¨Ë…P§.³(%O%OõªÊï½ÑÛr‘¸7N=1V|–yFÎ8õZiU& d®Î0}M\uÐÊNÚŒgN› üh†`’¡9éP³g¢3NPÛv„8Îs[YXçæw¹z)—wãҮƫ(`­óŽ¢±aÔG}ثַL&SÁl`ú#9ÒÖ ¿r®•m”«ÃSjÍÃ+¤n¸9ïUëØÃÕö´Ô™äâ)*UPÚ -%n`%%:’€E-€m!§RPÄH?ÙÊ›up¶¶Ï3ôQÀõ=©ñÝ Î~QÍbø–b0˜.©nѹI]™W7m;™%bÌ}úUv·Ò£& 22 ¹s¥v:*LF±ºNGnø«s·—}˜”y5OJ& )¦8b2G¹©!ž@Øe˜ú×%y6Žø»A&6âYZA%I]ÜzR —‹¼aF3ŒÔâ4#''©êxì-À CbhæŠZ‚Œäô)+Œ™?ìÒp@À;½}jy`¸Ê©û¼ðTv«AŒxHÀÚ8'9%°”ÜŠÎ !‘›ïÒ§òÖh]Æå#­LƒžÕõèïÍÙ"¹ÆNÇ­'ƒò®~†ˆvˆÚ ¦ÉqŽ9ÛŠäKSvì·dfwoãQíQ-OŒ’Ýzb®Ö2½ÙnÊ”³ó… u­Hòªºã­Ac0(_÷¤/Hâ¤,ÊTòW,Û“=*QPŠdèÞ[íÇÈzzŠ˜r2*=OSž«‘ÊqùWv ã/fög7¥Qn‡cê(¯dñC­8 - RãŠ1J(Å(bŠ@+ĺšÚÛ›8›÷òœà_O©­RôiÖqŒ¿ÝAþÑé^4¯4¬ò1gc–cԚƤì¬iÂú‘¸ãµ_җ̹;ŽUFqïY¤äbµôx™K¹F+Ï«¤NúKÞF¶Üú Sñò~ÞyÇçR/ ŒçÞ¼özh\síP\Í´Eå8ণ¹Õ-àP™\ztüë îêK© È~€t¥:NNïc*•£e¸Û«–¸”“Âö_JªÝißãMjîJÚ#…»î5IŒñJI"›ÜӀ☉íS}ÄI¼à~µèª-žÕçQ ¬pAŽÕèHäwì1ùWŸŒÕ£ÑÁlÇHtªª#µd±=éµÄŽðœ!LȬ»ø™cI#qZMÈ¡<%«Œ¹Hœ9•ŽzFc!—«8Á>µkûT-º$ñ»)<È?‡ëK%¸öŸºySéíXz•À24p±òÿˆŽŒºãPà”¥H·ss²ù‰÷£‘U_qäz~5¥jVòÇË~¤m?QÐ×?¥F&r®»Ž2£Ðö®‚Æ#l€0Î[®hª”UQnR»Ù˜·Ò mÉÒoåY233NIêsWµB[Q¸'þzT^ºé­8ê?y¡‡ÞÓšNi§[XÌFn:U»ÒgŒ¨sгhH¸Cך‰ìˆçpWs('{PÜO?5Eg"˲º’;f­ª.ò¯ßHé^KÑž¼uW œ ê1Îj½ÎÓõ«w VR8$Ž9éõ¬½BFEÛŸ›Úª ö"£²d2\#1E€î/þnÜ£YAåår„6}sTà°àÉ€¢ŠÕX6.Ücn?¹¸­(Éݱ‡÷Q¸lî;vÔNèf2Þ€gšŸìþ|Ÿ|­œUwEË‘‘“É-Š•bår7öP=ɪí!ç/ÿ|Š•‘IùqÿÏ$ç;:ÕXæ—3!Ü3П÷>)?}±¤àœt§˜€Æâ*' ÐdŠ»¦gfX¥`v0ùAÆ= OŠ ’±ÈA†QÅ^C¹õ®üK®Fsbá¯0RRÑ]çÚJu%!¤¥¢ ¢–’€è#8ÆTq\¶·7›©ÍÏvºxuh§û‘çô®&G.ìç’Ä’k*ÝHÖšÖä}iÑ6ÉU½i¸&”q\ìÙêB‚0ÄFBÿSVa¼'åÆ3ß=«:œ¤©u¬ÜU™ÔÙ©<ñÖ§ ÊÌx9äÕK çþyñV]K GZà–ú±zhHí–;r2;šH×+ÏzrȦ4R€¸àœqJƒh§­›xV$Xãàw=ØÔT•(Óæ•É>ì9aè ,ÁJžy@ô§ªöÏÖ“Ë; Æxä÷®[êwrèìÁo­B’ùs«òÀ8ÝŽTæ1…*Gìiá~lðET%Êî…8s+2î=9 ScåéŠ}}-)©ÁI3VqbÒŠAN¡S… ¥  P)@¤/‹UÛJ‹hʉ~cøq\Q5èzÜb]íOdÜ> ×Ÿ7Zå­£:hì2º\y{qØ`§zçëwNm‘ˆá‡sÖ¸klwQÜ¿’>bIÏJŸTý)‘.sM»qœÍžˆk‡wcÑJѹËÈsœzÔFžzSzôÑä\sM~E¿ZVš`†½OAȤà•Í*±QÇSAD£Œö®îݳ g”_å\r¤ö®âÖQäE“ŒÆ§ô®RÑØ7«-‚“½4ȤhŸÞ®ÐæéFH^&õ=#ê+¢œÒVg,âÛ¹œCcÿ­Mç=3SN² ŠHŒŒ:©íQmô­îga¼ô«¶,à‚åxÅSÛêjîŸ Œ’Jš4à‘ëQQèT¦¤0ÉÚ¬3³¡ ’Ê:w­ß4I`79ÅeÅ ‘"²«z9ÿ>Õ©al³+oYGLpOjóª5»= I슲\i9ò3Òª¤8•e)"ç9^M&£m=¾fI¶eX7ñ/`}qX÷Wp©N>|œä֔मŒªMÅÙŒÂê"âFr9~ Š…¸)ÕÈ·+¨ÖÈ]weÌ7ÍS¡ÑOa´RfŒÖfƒ‰É¡FOÚ³d<˘ж6þtäuPÁ” ' <¨Q’rzàSZBÑíè=©TqHcã=Gc]M„Á¬ás¸Lq\ äÖΓ9û;GÎU¸9Ƭ+FèÚŒùY¾£xÊçð FyÍPEsüD~5"Æàúþ5Æáævª—èh¤`cæýiþx‰ SÏ­QL@}鎫#a¥Ç ­gÉ}ͽ¥–…O^,–¬ŠC‡ÊßÖ¹v­^Í%ÔÅ¥”ppÿ°ªm†Éí^•(rFÇ•V|ó¹bùÊá°À z×^.!;¾r2ƒ÷õ¬eò-£„efûÌbO ýjã2mÚ9ÂáXU\ÌÚ”ù ¿mÁPFO'ŸJ†êHfýâͱÀùH9÷¦ytd´v(h®¥ÆNŸDb®TêJÖa$^iÄ®²ŽsY7°˜ÎÆý oÛBæMê{çîûÕ{›ued?4g½o ÙØç”®sÙ5·áö2Csl/ GéYW6²[8 Sʶ:ÕÝ@º†Ãÿ-húõ­*ë`£¤ÕΪxÇ—>ñ~æº×¹OÄ‹Ä%Ác ƒœJÁnº feÓÄÑ,jQùØÙÎ}»W:Ù®ê/Ü8«|W$S‚ê+N$-l_ <ô¬¥5·aºMìNÅ$S¨ì(®fmiŸ.ŸÛŒ¦Z¹HÁ¦Û25œl„ØÇ°© ƒƒ^lž§©î¢…Fåõ¥H•ËœSÚ!·Ãèiv£“øÑpQ×a¥x'µ}Õ#½MœP® ÷8¡ ò×w­iéà¬,½ãò¬Á}sZ6 ÆGÁù×vVªŽ \S¤Ë´áIK^ÙáŠ)E%( áH)€WâhBê—Fðߘ®ÌW/âÄÆ£ã¬#ñÁ5…„Úƒ÷ŽYÔ«cÒ¥±m·ž™l~u™.sÖ˜2qÔ×Õ±Ñ:öy©Ær3šds "ÉÎå¤Þ3À®z1±ËÝ(K©Ttj1Vµ/æÀÇÍšªÇšô#²<ÙnÈÈæ‘—åþTã€zÐN@ *AÂÓJT9B "‡’[²”Ã2…8.ÁOÒª'-Oïg#‘Š™+« hÎF žE cëSÛͼ!£LÄzU©­ ÚvÊ1ÁZáuvgj£&®™@»É&¢oRjÄvû¤T`ü¶ ±o¶žìË>=ýJ¥(Ý#7N|®]ŽVr ­³;rqW4›q4ï#ýØ·>½ª›._¶ôh£’Þhß# dÔg¥uÔ—,L)ÇšC-–F‰¬„½Mh­«#~òd@FrI§´]vާ¡iœ©ˆœsŒ×$§}Ž˜SIÙÍ”r!VÁTnC 0 ÔäH.§…€2)28*icÈ,=¸¡=ÅÜÍu6ê|·o,‘¹§µh¿•+ª&<¥ïëì*ÁfŸf@?JžÚ)#lðwu”åµÉ†ö-›{yíö¼8^»wq\ýÍ«é÷ÝAÌ%¾\ó´úëaä韭W’4sÛºæ)Žýe –v:jQºL˜Ì—P[ÌŸt’89§éÇå”} bèLF21;Ò@@ý+rÅ6 8*:Öu-Ñ¥6åfPÖb[ÍêŒW8à`×fñ¬³4O’’¤{äï-ÞÚGIb»»zWFjܧ&. 5"¾ží¥QœœêZê˜FÁ–f äâp·Q°nŽ}+­Ó‡vcÆ,çÜ‘×ò4ë«jw}¼:BCع=érHK ‘Ò®Û’ITdòî3QÜ"ý©ñÈÍsskc©ÂÊèªC˜ËFÄõ%O8¨â¸Ëm‘sîXX^9‹G’§$ãÒ“ÉY¤WFEcÁ©ÝâúÊŸ¼§üþœʳŽ;òjİÏjFHù»Ž„TRäò98ªL‰! ϽJ°ÈèTsWmîšÉLP¿Î Œ)#+c Ј”Îá‘×} !©•Òñf‘†à{æ¦"²u¡ƒÂ—§¯ùjÆbê?ˆøŠô°•T+Øó±TÝGuº-ÒZJõO0JJZC@„¢–’€õñ”*å<@¡uiB€2ãé]d?êcÿt*ç¼L#KÄ#ï²e¿¥g?€Ò„Óðü)zÒ“År³¥XÙС&Nq…ÓøT‹¹ÚYǘä¥C¥I²ÒEÆ|ÆÛ×¶*ùØWœaÚ¸g~fuÆÜ©­#ØX–Ë„-\v>ÝÎ #òHâ©+Ÿ7?0â´~ò/'¥sËs¦µ—,²Ë•SÓŠ¯%´yÇÍùÔÀ|ÊdÄ}Ãp{š•¦ˆÒI=YBñWxdR0HèMG8,WÓŠ¶®¥†p~¦¬F!Vôÿ€ÖÜÍ+ÞÍIÞåH-YÁAV!»×-*l‘†1ƒŠî ›Speæ¹MZ*úMœ«Ãñ­(M¶Ó&µ5«ó]†Žár‡¦®tpÜÖׇ¦X¯v;`J»r}sZWWƒ3¢í4tVºAH‹[\=¾ãŸ,ËùSäk‹BŸk‰Ldã΋%ÚµŠà tè(ÉÁÅy^Ñ·©ê{4¶3QÒTÜŒg±¥ÏJ–ê%9”a$ïãÐúÔ[†’95IÜ{n#uªØ&#ƒŒ=X|nã"£+ˆÊž¥ªÓ"Jã@#<Z¿bÁ¢;G|çÖªºíyÏ­Ùcf=w íÁ6ê«xä•'rÍ- § ÷ZZAKÞ NÑN¢°f sÓšèœì8Ú+š¢´Žªm¸œö¨¬/œ³r@ù«VÀ‹ˆð9Î=j!Ü8àÔö­åβ¼â¢OB–æý¹1ȯŒ2´ĹžÕFÉ –ži#æçñ«׸ñ^dõg­Jê!"é`2Xõϵex ’-È87Ö· PÄàcŠÊñE¾m¡‘…ÊŸÄõ©ÒkÚ!VîŽQÍšÙÐ¥A3ÆÜ;㕌iðHÑ8`yS‘]õ2±æÓ—,“;"€Øû¦«ne™AÎ@#Ô–Þq=¢¿÷—4ÉJõæ¼õÙžœµ³C/CC­ÆÃ¤‘3ìjÚ[.àÊ6çš©8šçOu_½½yìx­$ Ï´¤ÚHªiJLæo–HõY¤ç¶¯ÓÖ®FäcùÔú…£OrþV7 =ÏB*¬vóá÷(zÖÜÉÅŽ2f½›+ lã®jp±— w=k2ÖIÐqƒšº'$@ÜÝ«žQwÐí„ÓŽ¥ :§©FXŒ1Ú=‰ÍlÇ3œœƒþ5‘>áªïÿžÑØ=ÁÇøU¸ç íÇNƜӖ¤Ój)¢ôû"Žiñ†E.¿P8¬Ùmc¼±X]-†,?½ëSÜ^$‰$_ëÔ¯ Åf»=Žœf„–‚†oà÷ÅâþdÔ’ëª9é£ò¦tþ%$]fŒ…!;³¸õü«“ϺE,IwŸ©®Æ0ÖÁ£tt}»AaÔ†ºqDŽ\*Õ±±6n9‚OZY6ùä*RÀßLAg÷í\¯sµ]¡p7Œä¦8úTh€F«É,ÃÔÃå`=éÉ÷£àpp8¥qØšGKñIUO¯J¦¶¢;Ý™Ê`àûSÔù21®s“M’Bòî8éŠhR³Õ¾Ô‘P‘ÈÈ=±N»%£§Æ?…Ct¦T„Æ0ȼÔ’ÄÁ7㌟N+D–†2oTP\²²]æ-¹9Ç•nÃî»§ Œ#éÒªÜ :ŸsW-FÍ)H$)é[Ièaˆ¾NpqÉæÔV²~ìÉSƒî*\ä? ïÁ׿îäqã(%ûÈõÑKI^‰çi)i(BBƒøBŽ ã5;ŸµßI/$ãéÚº‹éÌ;:õ(~"¹"6ô…IY$oN=Hûô¥ÇCÒ” œô¥ÚB×3gBEí*AæùgÓ+õÍk!]¤`zVžqv2q‘ŠÜUUêq\µmsx^ÄØ2ç6xö­ÁhÁîj¢  ’MM»3ƒšå›¹×MX{²©è'š¬di£8O•[ ‚ÿ…I$›˜Â„à’ÙïI0bXséž•+MKzèŠo2ï¶ßîàóV >ÎU!³Ô“œ}*Ôy“€ñ“NݵH8"œ¦Ú°¡I'r]茨—°öªž!²W´Y ‘dä“·iµ‰U€?0 ŽqšŽ{xåV‰‡ 6ÔÂv’eÎÓ8CÜV¦…ƒ©F Ž~•4f9YOI­érùW°¾í¸n¸¯F¦±<Øi-NîÔ¸e^vÕ¼qíU!l78àv©Ä«ë^4–§´‚X¡’" ÝRHF+$J²÷¿„ý}«@²J›N0k6yZ ¹Üº÷§ ìL­»–n‘Ê¡b0P–ÛùÔj²Ã8We”Œ…ÁµZì“К«æº?B@ªÞàÒV$™ÊíZ¶ÿt>¹ª® Ä6ä:V­•’ Áë^Ž]üFyù—ðÑ5-%-{‡€(¥¤¥ J)Ö–³¼B›´¢ÝÒE?Ò´EQ×t§Çg\þu>]?V¢ê‹«uúVqïZÚ”JȬX+g:Õg!]ÊËŸCÅyjǧ$î@¤«1ÓÔÛJ¿f€´½”|¼ä:×2¨VSªU‡Qé[znû‘‚ÁD@*{b³¬®®mAÙØŸQ‰¥°”€Ï­sŽ6°ì®Êí’="åy.PØõ5È´7ÎçùRÃJé†*<²D%‰ €íKå—ÀÎ3ÜÔ†4ãƒïO mägë]79H|¼œu¾´Ð sÓŽ*SìOÒ¡Œâ`Iá”Ð4LŠGSÍ9›h>´Õmݦ¤lm9íRQÒhĶ™×;_š™ŽX¨?SYZ5ɆH‘U]&\cЃÔÖñ]ÙàØ óª.Y3Ó¢ùà‘È"Å»ïsÉëÿÖ¦ê± ›‹#,FÒ}jMB$hQH¨qÐÔMt˜ è0;Žy¬•ã#Œ–&ž9×BA£PXázÖæ¾Èéy ß$ƒÀàÓtÛ¡šEKpëï^Š©îs[¥ûÎT?J’Ktû<Êèwéü8ô­Kœ rž20¡©^LÌ <à‘Þ³/e&bG#Ƚù\ì—îãmÂR²Á³'³µzŦû>%å‡çŠÅ·|Üäð@Ï l@ûòX|¸ÁøªªFÊÄÑÝ˶ß-ÞYp¤sUî\ÆáÉÇ#štMµY~^™ëŠy‰^5ãqš†ÅháW”ùy^FíMŒ¸ÁìNi£(î!”œT°)Ú[3Cе¨¬¿0úÑæ?÷¿­<Ÿ˜}iªCÍ"¬D˸¿âj¸ù°}EZ»~5\ö÷«FrCP~íG½6_¸GcÖ¤òÜ6Ÿ_Ê¢¸‘cR[*RÃKrÐ¥t2ݬYö>ä™üÅU‘Ãò0ëÁ«šj‘ ŽÇïåZËHœðW™48E}j]ù\ÀþT!XôëA]³ç›Œ”‘¼éóEÅŠi)å±"–¾Ž/™&|Ü—+hJJZJ¢Lía\èÉ·øJ–ãÚ¹ñ6ø°à:fºè”Md‰0Üo~+˜Ôl~ÅxbBYHܧ¾+–¬n“:iK¡ *玕¡¬rEåºdµ^Ä`޽y­ 6ÜA<óêIô;)Ç]LI!û.§å£îØÜ6+|2Uß’GJæîò·ÓdòóøÖý¾Û«Æh¨´M•fÒ%Y%gÈ;è)šxŸr¹>ýibL¹É$Õ”@ÛƒiE7ÔB Ȳ ÷q¸µ´í$ÏÁ(«É>µb6!þQÔ㚯h…YØœ¨ö¨èÍz¦[9PÛI=³ŠlYÞ7ÊO"¥ÛˆWÜšT¼_­fkbt /K þ0nÔÀKJ[PzúSãp.¥=BçhlqÍBEœ§ˆ#1êÓ‚»wÃŽ Š§k̨ d–Òx‚Ø>œgeÌŠF¾ s6Ͳe>Œ z4åÍLójÇ–ggb—kÇ€fA•W<0ôÍ\_3ne‰¢ãœàÌU w•®„qà3(#=1þEJ÷›ãpNÜA®E¶wBI"ÒËŠlˆ'u qÎrEWiSÔS‘ËΪ,1K–Ú–æž<»ß ÷G•!(Ë!9,ztÅW‘DS²îÆ?!H’”19$Uòé¡Vzš&E äàœf§ŽáT„vQÇ8¬ûDìňpxqUÚ2~îáÞ”féJñeÊ ´-$\¥¦«Pý:¾–SŠ’>^¤$âú )E%-Q˜¢”P:R’Ic…$úP0$*³1¨É>‚²5›ø_E›ao˜®Ã޼ÒÍyö§äí„r«ž[Üÿ…eë·~^´C¸î÷ÏÖ¼ÚØ¿{’©G”9æSž5’ë~r@ü{ÔR•D9 ŠD•f` 2F9Ç­góna´Œõ®oSg®ÅUu–Îc ‡ˆ‘מ@?NÕ¹¥Å¿Ú‘v/,€ñšÅfòã‘dŒÈù@íÿ׫ÚlåbØ¿t®}JUqЪRJJæÌ‚;Ëp¼íwç±À®rþ³ÞKs´ð}EnÀ‘Çk¸dch<·ÿZ³uˆÞYZéË€tv¬è;JÝ ± š<ÝL¦43;TEØž½ 1Žx$×u8{8èOlT9 * t®i±üҖǰ¦2Ú¶žz`œTq‘ŒPùÎ}x¨FRg㢮ZêndX£à|Ý…sš˜å‘¶µdg•Êî#¨=8®*Êó;èIFd›ÙØ—$’* sÉúM2`¹>еfR¥•‹63ÛDµy²¦¯i·D–G6T€?„f¢Ð„f,)»øyÁʶuMÍŒ±p£#>˜®ÃÌÞq££(úã?ÒœeÍMŠqä«RÈÆå‘¸Úøâ¨Ü.×+ŽßZµpÛo¦nrH5VgÚá‡9ª‚2¨ï¹™+í‘[$f·4™Öhlo ŒV,±«a{б¡ƒö¡œ‘Œ:ŠÖ¤S8Ìéfˆ0Æpݳڈ2iþƒK!\çêj$*…ºNzW Øô¥½Î3Qâêqž’7ó«ZUÀóÑpîjÛ &‘ÇFbj8$(êßÝ ×¨ãxXò#+Jçg©´hÁÐ6Ve`÷Å2FË‚¤¶:vÍHn ÓÎÙ™éȪ·j'”–n3Âæ¼ø®ŒôfþÒÜ–=B" „9Û‚F«–$—T±¨'¥c:í]¸Àô­MãÎŒÆUwGÀ8çN)FèTæÜ¬Í©Hp:qY¨6»Çõ÷«ÿÅÛªDådæ°Ðʇ?i•K`y«VØXܰȬÖ5ÓJ>áè§éW–E(\Ei4E9-FÍrŠxÜ1íNµ‘¾Îî ïŽ{⡊ÜÏË ©Ôšš}­•÷Q1´-'m†œ·boc㟥,#jgf\ôɨ¢"c‚Iõ5n,D´*:îFÃÌ‹ÌÚUã9—4åuhÂXtíV¡áXczÔfÚ)•ÁõV|Å4ÌÝ:‘d´scÊvOJ ‘p ¢îäàѨX´$¼r7Œò)òhwºeŠóÏ@A]×KS“–ÒzX•]:‹§p<þ0í…óYqKç!‚cî¦y«E<’fRÌ€å <ô­!BRz†¡¾“v·O°Mb“Siš64Ñ}AhÔ“ÉëUÍÄöcœS£ÂÄ=)ö§ý)1êjÑš¥ªPAæFØõªh6ºƒÁúVùÝõžíºPO^ôé» ¬’•É*Á”àôÍ\$È£iÃw¬ÿ7hÉ]ÛOCÆiËw³•ÇR8§(¶(TQѳV1ŽGœU˜äYT2Àõª+*>ÐŽ q•>¾´ÆV‰²œóœfµ¡Š-:ˆÂS¬®·îjS…V‚äH>nëVTg§5íR¯ Šñg…[:OÞBÔ7’ì„¢€Ï'˃Øw&³µ]FX¥h-ÈxvïøU¦•Ù²ù=NFkŸ‰åN1ÜèÃayš”ö4F<°@ö¨îáŠkI“jŒ¡ÎTqÅ>-îU8Ü@Æ}k"þîâ{+Õ…#Ù ˆ¤J3ÉÇ©ÍxЄ§-r¥HB”4¸K@dÜwöþ•iWq?(Sü@t'Ö¤†!äGŽëþ1@‹À­å-N8ÃC/P@°¸ªÚ|‚91!ùr8õç5>£6Won¾Â¨D¬ó"§-ž•Ñxj`Ý¥¡ºþÔL‡kc=xÒÍròD‡ èÃqêjÅÕ·ÚmT£"Ì£'¨ô¬øÕb È]{àt®ufåx»=ŒiQ’b¬n„QQ‘–­-b$›ÏEʰÉ>õ›¿äÏCè{Wl%us’JÎÃe9|Éâ¤UÚ'€*4È;Ž3Û4øÔ»sÎ Q$‰÷ˆÅJÀ>¸¦ .qÀîM†qß<}jFihq‰._çÃ*ä/¯cZ¬yÜÊTíÀ+éT´e‰ïã„/ïxTeàœõ'Û«,jœ½È÷®²÷ìvÒ¹qÁ‡–¬…H'ª÷¥[˜ÚfW!OcT I ‚4ó,Ü÷Éõ©§/,‡åV c!y¬œUÍÔÝ‹íuÈŒK’;FEsš^mïO&Ú½*ê;A“E74mw¨®”›YÂý⇕,ÑH£å”ýÍdØÄ0‘JâZjz.ïCˆ˜`qP¯Þ­]nÔÛÞ6j>px>¿­ecæêÆ\ѹ丸»3ªÓÊÜh „¸éìúÕ>IÏZŸÃÁ_MØÝ76j8ÉÍq-$Ñ×+¸¦7çnçó­&1‚eòÙïŽÕ@l Àæ·lJ 8I¶2+:²ÐÒ„5¹dçŽGJΘ0óHኯ»ð«ÓHˆ¤î+隉cSTîaßÖ¹âìuI\Å»nèÇeÊ´¬mÃYÄY¹+ž*­Âƒ;Œ’ÃŽ}qSÛÈEší$½»V“m¤gM%&Zp Ž˜ª2ÌGµDæi\5ÆO84­#D˜\Ó-ÍŠ”î4–Y*ä-Ó9ëU‘I Xu5aS“¹d·#Þœb˜GʼÐçîàÖ&â\ÈAæ¨D¢XYp¡Ã¡àýE]nèA²ÚQ¬ªO §úVÔ¼Žz¶ëÔ¶C))õŸ@9?¨¢¾Ž”£8©#ç*ÁÂn,JCJi+C!))i(NþBšj*œ—gÔcšÇL“ÀɧÉ)óŒRNÌ‚%x÷Är*F€!d$‘€@¯.µU&z鸢-ÇhnÞÃ4>èn7)‰†=1SCnj£%Tb³Yld–l«wïÍdµÑí« kbÅ[§Ë‘žæµlX¼åpqŽâ› nN[6ÛŠµåþ`ÝNÖãò53•ô#Ô™1œút«DP›ÓÒª ƒ÷»úU„‹•ÛƒíX4Žˆ·Ð@ \ñØ ž?¼ÀrqMòøÅMmî㚉3HÇRPÆ*X¹ošAþÖ)ÖÄïÂà±ÇZL¥¸òðc#Òƒ ¤È_;s×µNé™b|ÄóŠ×tȧ·ÍY¹X×–ãn¤X­¦vÁTŒç=:Wʧ¡Àã¥w i?礊¿^õÆJC;}q]XEî¶qâåï$jx|„•˜­ëí‘Wu;uŽáÀÎIã?ΩhhÁep:Œ~µ³¨E½¼Òq:õ4MÚ B7¦,LÕ‘“Ló.²ºŸ¥Gbûí™±ò«²Â¤˜K#ëYÛ[]ò¦ À8a†ÈÊûÖ9ùœzúTðf'“Èÿw¸¨¥‰ÞRVLŒð3ü¨‚åvI9$ì4¹ìr*[H—,À3‚3Ÿjk¦îAĿćŒûŠtà œcð«oM ¢½årÙ>d Ÿ-Lc+»õÆ)¿h~EsíÐR`¸ ÇŽÙŠA,…~•‚·S®ï¡fÙÀ–m¹qQê±ÜIgåÀç,ÃæÜFFbEF,K7«ŠGe;PîOcU©^,S³,‘«öhÃË¡!r­““RÆ3Œòi²Ì¾fU=|Ó£ºQ D»U»´d¹S±j@t#ªžkˆvÅÄÇ=\Ö»[ˆ•Ëazžü{WÃ.þãŸÎµÃ[Vgо‰J¡{p:)8¥cœeÀãùÔ*ûg ¦\òE.]IçIwsy·.ê6¯@ ¤´“mÈl•85„¸p;1¦)ù×ë]¶\§%õ:E’C~iÝÀ;Hëõ§K¶A˜ÈM£Œu5*FÒ U+ÀÍ# @L{9?ýj⺹ÔâìUv3ÄŸzËÕ¡h®äÊíÎÓ‘[®qßœšËñÁï¶Œü‘ªœý3ýkZrnFs¢f¡ÊÓÓåfÁëQB )ïŽÔð¬¹ä óÏ5Ò`H[¹&jÝ&âXg­G·dúÓã,§p]ØëIì3{Ãñm×"‘ˆ§åÇ9>•Ð]%¥&4l± ’rsX4‚¶$d´˜ÝÜd×Cªæ(#¶kË­wPô°é(bHüÁ˜×§ñDq2Ì@$·”f\ qý*Ͱàs»5 ØÝ+œÎ½t..J* ý×\äç“T ª§zK¶K3óóÈ[õ¤ƒ>X9æ½BÇ•)sM¶t‚wpFÈü±YRü§=F*ÛÔYœžwEý+"rª½:šÂ“ÐÚª(JãÌUÇ$à Ú ªD6±+É#¦OZÆ„,wÑÍ!ùŽ£Šèe9\½êª½èGFË"Q,!€*Àíen ÒäyM’8ÅVÝå„p>RÛZ­¬{ã d­rµc²-³+ÄÑ7ö|M°å[¯ Åro‘ŠìuÖF°}£?ºQô9®JuÚô5݆~áçâˆtÚN’Ç @ÇðëQ;©]ê2 ŽõcÂf)¬Þ`Ë·ØÕ³ä nX¡ú Çí³Y|%´™‰lðÒ·ôõÕHcÏLôÌ™LR+ª}ÐU†zûÖî—td²®"³­c\<•ìiHŒñ²…V$óŠE\`ml*Œ‘Q¼»Tä˜v<ýhŠàHU_8çæþuÍgc¯K”§ˆ ™—¹ ŸqL¶`°°àúU«×G”mÏNsT"Œ‹” áɲս…”BÛ›;sP"`zæ¥3 ß.GJˆH‚2êrhWÑ$h« ó|Ù«' Œãðªˆá“ öíVƒ(ËjYqjÄÅþPšÇU™ØµK\Ó È=ˆúÑÊ74Xf¬gG^ ŸzÒÉcÈÅSÔ£%C{V”ô‘…gx–£“Ì]{ßãSš¥aͲ“‘µˆÅ\+ÓÁOWÍÆÆê3 JZJô4J(¤ F î>Ò¡T1¢.~™5aC0ùÆ1ÐzЬP»BÝögzº£ +ÂoCÚZ»ÎÜ‘ùW74†YÙß«75Ò¸ÇPk˜hÝcT…$…>¸­(ÛR*T`×t)£>ž”–;Úœ1QHN/sÍaÔס$c&®Æ¿-TŒmAëW#Ç•ž•5¦ƒ†^;TÖ¼;cÚ«FØV×5fÔŒHäð¸¬å±¬5hŠ]À¸^¥Ž~•>Ÿ,ņxÇÒ‘¡$Ëcr°ãi«zz~ä¶1¸ÔN^éQ½qVYƒ/%Fy4‘³4Œß€«!$~ìp)‘¸' 5ͬaø–žÞÜ{ö®OþZkSY¶£tïÉÝŽ=+%X¯^Œy`‘äU—5F΃Dµž¡±Wç'ÁùxöªZÅ”ÍêÀõ­WAän-^õË7ïtãxY[„—Ìp 9©©œ=†Iö¥UÝÆzqšI6çqÎ6þu».ÖV=ÒÇ$EÉÀVõõ¨ŸT*Œ¨ÁÅIÃOô¦:`à‚K ñÒšÜOá%Ýò,‰‚{ƒN˜ím«¼ž:Õxà/ ó8ÀÍ[{}±Ù‹ƒÁÏzNÉ•f¶ ÊèëÄn>e#½G0ä *©ëS8Å»H㪙Z%ùy'“žj#«4–‹Qc [sb:dÓÛ-Ð)ÎÒ¯!‡<ãmW•šIO,{ãµRÔ—¢!pÓím„*‚{ŸZ lß(V&¬lòãÆàsœ ÒÍò‚€d$qØúš¾nÆ\—Õ’ùea[²b¸wÎp?¾Gë]ôŠ ?„׋¾â@;KÇçZažä╬kH t¤N1Ö¬l'æ `¦™,ÎÇhÀÏz»œü«©‡¨DÂ}ûxqéUÁƺ J$:sž¬¬+œ0ö5Ó sDÊQågO¡á˜ppj_—¢" ª–3"É$Lå'¿µ]ÀÆ?:㖌뎨H£H¨Ñ‚Í×5…­àêÓ¨Ã|øÍu»bF¸qÊŒþ¹;È¥I¤’e*ìK`Ž™æ®ƒ¼™5Õ ˆaq€})Áp}¥H„{°vúâ˜Í†éÚºïsŒv21ÒŸ Øà^jcÆ:Õ«h‹øäž~•2ѵ5ôHÉ—-’N:à×E¨|Χ¨Çõ¬øíLkÏ•‡…]»9sדü«Ë©.iÜõiC–6epv¼|ñŠ{ÎRaŒH cƒ¤ä t»šA°E*ç)xžMÄÑ÷mG„åOJ›W'ûRëýþ*«ÜU@Ëé-`y-ZV;+ÕݵòmÔsY BÄÇŽ˜ÅmÞ…Ùˆ€çëXS‘†W-QÙ_FRó$@$¢°b§¡"·bÍå·Ú”aC`©ëX%³ÀäöÅtgË¢•<6üãñ­*è“3 îÚ%š Ö"Œc©õ>µf%`ÌÊ‹€€uÆ~µ^G+k [°©à¸ˆ)Ý*ŒŽçÊö;•®eëÿ.˜]¬ï· ôï\¼êO<¥u Ýý–¸ƒ7^Ý+™#ä_¥wá¾ÎÄ¿Þ~}—䜡 ZÕÔ¬Ä7“º.!vV?t‘’+F‘bÕb/ÐäWSyq±åŽEÊ+†ó¸? Æ­ÕK£jV•+3Xùp9j}&&ô##”möÏj”¬,͈»zÓLV£ út¦ÝÕˆŒ\etÍÆš%È1ñŽNìcéEµ³`.zñ»¦QmÑöçõ5§dò$'2Žäs\’VG|]Êw€,áTpƒõ¦¢o¹÷â§»(eueÑ”b1ŸaT ˜ÇpéíÒª7h–ÒzޏŒ<;Û;‘9ïQ%¸`NçíW‘†Ü8ûÃG]²ŒW”KvLv,©À«Vÿ2dö튤™'µ\· P`¨¬¤o ÄÛ±G¾jXeH­Ø¿;›QÎ €OQS¥¶b¾³m[SX§}Öròàu"¯ZʑªîQÎjƒGå¿8ZHà #%Û#­D¢™qrZ_k‹É 6NIæ£YÔñ¸g=*%¶Äeœ*N•Dç ¨oZ•—vrú¼¢]Bì€>ö8ïŠÉ²M^Õ€]B$áCsõïTïf½h/qD¾&tš ƒi"‘È<v­dfNG”¤¤c1ù}N+>gcUqÚÛFqï\j·wÛh=ù®Ð¸Ÿ3é\èØTð 9­ðïVŒ1[&]¬Ñ©U$Î=(Tãkæ©YHæ!†?+g½i;»JÌž+V¬ìs'uq¯óÆÊ[†ã®^QµÙsœ3ë]C °Äź¹ +™»O.âT=Uˆ­h½Èª¶6ÛlÉm½AØ­8Ã>í£½©Œ„8έc(ÝTçh¢ÜÒ™ ±à0縬ÎWQy-A=ðjÓ1,1õ¦ºa*ãäÊýsDt½âÒ9d]ÝûõZäÜ`­Ó=¥H±qÐú2I·Ì\¨ ãÞ§bŸ¼¬6gò@CÈUý{ÕS6äùT€Zµ0Lúõô¨ö®É8㦬L“¹™$` ií'–vàåzúÐ1'®$’y¥rã½^æ{/2'wl‘ÉéLœ ,¤Œ.YÇSVÛÐr‘€HúÕ\›>¬•YYv/@©*¬'çgþ´kÓÀ¤¢Ï;Û’’–×qÀ”(X4JGp)W¥23û¥ã° 8¯ žÂ&jªì Éßæü*RãØ}j¥Ø"ÚR§ÛÞœPI’ÆC)X›åÜy‡¥Z„«õ¨,Ä@XgŒVP"÷ˆõÏzR}Ô‘?hÙTg 5œ»wpÇò«qdD@by< Æz›ÓÑ…ÃncŽ™"®Ù9x67¨žÛv…°µz•buá\çÛ‘ýk9ìm­ÆÜäÜ1=±LŠb[ Œ I*æn[® Tžsš]gqæ-èÎçss·=ª#’Ò¦V „n=hDËr)'bšLãµXü½Juè3œUÇ5³â€U|wE¬hÿzw‚g—5i´t>–Uî8ÇLšÞƒýbŸjçü8ÿ¾˜sÌc¯±®Š%ÉÉ ¹9® ÿ;°ÿ NiÈ”ØLK;œƒª:“UîeÌv€ˆ;Ó-6´ÇpÉ^A"«—B9ß5‘Òélc¶ O5f[xg!~qÆáÁÇ¥R¶—l*¥Nf㎵Á(¾k£±GB½Þmq|¾\„ä8$þ•Vx…µº@¤°SØV‡žËïY—ÓoœŒ` ÖŸ3vdÉ(«•K1ÏëQÄuúÔ(Rpy>Õ\¾W§ã]qLã“Bà²;sV`ÄdeC+|¸õªaÏnžõjÏ*¸õô§%  õ%Fó&,O=TÛsGÒ«wåxÏ4y²8=+;\ß™-Ë1’/lÖ¦¥®$þîkj ®&f,ÇËÆO¹¬­H~ûj©é#:¯šì¿×ù}ñн#ï}ˆ8QŒÔÖt-›è‚ç Ù8«¶¢A9ndäçî×D»œÑÚÅ™Ft³ #×ðÅ`jQŸ´!ùük£¸ÂéRpy1Uaò™6µ¶…daƒŒöª©¦ˆ˜;»Š²²&2OB;ŠÉÔµÅÓd¬Ú1í[¨á~Æ0Á‰þ;W8ŠÒ¡€ É&Š[ÜutI鉙Xú žqåÌ;sRi‘¤p’\ œäžÔë¶¥%Aã&©Êò3·ºF‹"ÈYI]¿6~•»7Ù]A3H¡°£5ÏÊÍ#ÇŽ+JݱcÖ*09>Õ•HÞÌÖ”­t>_²€v3–?0qøÔë8‹OO' ³ä“íT&â@¹;‰$œqô«ñ[—´MÃå ÐóÖ³’I+šÁ¶ÝŽwSʾsÃëî5žIÆ1]ˆ¬SûJ%"ù`dz×>êUŠž â»)IJ(䨹dÑfÎè$¡¦äÚ0+¡D†[ttE†G'šå¥nè£kv™~`=«:ÑÒèÒ‹W³4bh`:óOQ…æ”`g9Te³,` ÿ*åÜêÑÖ²hØäÀô¤HwÅ ÈãµW9àžy©¦—ÈÓneç„Àϩ╭±WM]™Ö2‹’A,Ò(ÀϵcëˆS›’sÏ?JÔðÄaÞàžÀVoˆqý« S÷pÖºiéQ£–k÷I² v-nÎwÉ®¹£,¥r>µÊY“PˆÀÕ9ÚN*k½Qxt¬î2(XºûE2Kiðƒ×½N|ÅÀPvúF÷ œú‘ŒVgCŒJÄïav a¶nÏÓšq,Hå—'Ðõ¢¹.c;˜8ëX¶Iµ%·~ lvûsWtc5Ëkâ”àãiÇ~õ8lÆ=ùZ+œœûŠzWܼã¨ÇjM_bá&·-ŠiÀËÆ—°$â˜=ÿLÖf¬<Ðñîb2RÑr6ÄqN÷q›Ò¡0îŸÆš±-±ŠàÈÏ)<Ú†d#‚‹ŠGŒ¯ 籦8RªÄŒúw5jÆM²HÜ:dðzG ç'¦)ÑÆXžÌ1ÆhlOJ:[„b‘Ö¬Õqþ£ð©”åö¯G÷GŸŽ_´”´•èžp””´”€ÁGýÌ`’¼Þ…9RG ÔI¹'Bãn+&Ít#Dù¹ÍhC´DvÕ@ãô« ™íš‰ÃBÇéZ­$0Rvä± ÅPb·54W267aS$ÚШµ}K1¬R;$”áƒ4‰’ÅP¤Å¯.¦â¤þT œvÍM™¢’& ÁN8§D­ëÉjs€G84ä»ô*ZcM~,Vò6'–ŸÀ×<+ ñSy’A&*F}Msñœñé^á£Î­üFnøm±5Àï´Ö·äŸýr¹É]  ç¼=ÅÌÇÑ?­jÜɶÂRNîkš¬o3¢”­œDIpˆÇ§½]´Hó«eH#ük6Çq"OâÆê¿iˆ¢1pr;~´æ‰¤ÖìÒF§n8ªaÊàcZŸ\î'bš,ï8õªW ?Ìn;ã4ór2AÇ ʲ!ƒÜUF-2'$ÕŠ¡N~Vê3–â/È`Ç>”àŒ:qB‚W§¹Éa—ïsÞ®[.ÇažBqš«ß`3WDˆH8ïQ&Íi¥¹—´3íš>A‘‚Ý©ù}¹*6ާ9â£iI?/oÒ¥\ѤMmÄ„ |¼sYÔn )õü1ZÐͰ\‘Ò¤…a–YehÔ±bàqÅ—,®ÂQR*9K=¢ä’q…ãëJÙIlœÀ©5[(mõ(Þ$]Ì£¢ŸjráÝÉI]ª2³èIxÊö&<Ä£Û›j#@ È ÷¤MÄrƒ~„t4Ë@êGÆAô¨¶^òL~¹ƒ~Á>Z†Ç­eÞºd¾ò(ý Y¹—͹’_ï1¨5~Ϫ½Ûqö­)«YMݶVÓд.I,IÅkZ£d’Ï'V$Ç.FZ›=9§7rb¬&¥r¨÷n¤7 >¿ýj© ÛýÁœzÕmN]ó…­]±`œŽ«·,Dß3,[FUYªŒdñÍ+B6o,O½FT·Ò–#¹[ÓŠ‹õ*ÝcXÁc/$tx2Éi”9ÀÒ¨²ðxç­hØÉû¤½p@ïJ[Ø®7àÛÓ9­4´eÆ0Ý{ýk8ŽñÐJ€1é[ZdƒÉ“¨ÝÜæ±ª½ÓzÞ+xˆ‘UOÎ#RÄõnÙ®{PEÂÉüDààu­Ë¹ Þ¥61†?JÄÔsåÇÇÉö5½ Fµ“e üÕ© çí²`‘û³ÓëYDŒÖ†Œäj(ê¤øVõ>eOI#¡ä“ÎOzL,?ï dn‡p,Ûÿ‡ <|ç +„íNåØÑLOòŒš§­ø’¶ ûëZܬ£ý“TõQæh3ÿ²Tþµœ¾*/qú|'ƒ%Ðö_ë\þ§(šþâE< ­¤\}’ F^„FýIÀ¬9ÏÖ»©Çß”ŽËÜŒKöÊTP‡#þbº!Ú3ø÷ÍsšX ¨N8®‚F@§­g[â4£¢b—}ò}i…‹8É;=›¥‘¼À3Ž4ÖMì £×=+#VÙqœ´ç€ØÚê1U.¢hõ%`1æ§?_ò)nI" ‚ }?/‰ch䆨HÕŸ¦0¨ñqZ:‚yÖŽ©ó ȵm·QF¤àÂNÒGa€£¥ ûÔÏ4½\gX/Þæ‘‰ÞqœþÝØjÚã=Iâ…qÇ$·×¥=rTvàf¢Éù½3ÖŸ;;{PÁ=GFعú…5!lÔ ˆë´v÷5*çÒ“)0Ûy,,ǧñ©c\–ȪÓj1p‹ÁlrÇÐT«½‹vJìÍñ?‘ÛÉÁÎ3\ügšÜ¾w¹‚PÞ™°ó]Ô•£c‚¤¯+£[J—ÉŽf[ *æ«3%‡“Ÿ™ß’+*ÎA¸!8ç?jê©æI§¢ó’Iüë9/|¸]Å—¬­6H˜Ê篵,**¼æžgTØ8fîßÒš£hÀ9ž+ ·¹Ñd•æqÇÒ˜XJã 0Òx?Z„’z`Ð9XsbgQÓriXA®ÆM’ƒ…'4ŠØ 昖9Í.@ëJøäviœ¯Ê0§rF}¹5][ælp½H1CCLžW¢¸Á¤\ä† ⚸ þ•c‰~aãïü^õ/CHêÄ»·¤`TÖ¤0b?‰Éך„ÇóÇ)ù$vüjͨ ¤2«À¬ÛÐÚ+R–¸»'‡¿Ëɪ-€:UÝU·4e¹íT[SøNj¿-@Â0Àduªð6Æ.HùPŸÒ›¹½=ÐElîHÉ~´ìMïò*'Ì@¨ØÔ]‡QÉ5zÚ5#ià‚3žõM­ÝÓ63»­ÜÍ«"Pr¹=¨.:çÍFdèvñéëI>VܶA,§  ³"WÞÅ~knÈbÎܯÜÖÂH¶¬ñ0ÇoøÖµv&—&`\ŽŠ&«î îö©îð%|zà}ªÅ†+\·ù>cÁîjÝ»ˆÙ\à}+8œ®s×µJ'Ìj8Àã8Å6‚2³%¼L_Å‚Xgù=jý™_;IÁèj°^<…•€;AÏZ»nÛåòy9!€SÉÅe=¬mMër£ Šv1óµ²?:¯w™\`s¸}ÿ^¯Ïlë1Û—`zzUk˜³„ÚwîÎGLþ5Q–¤N.Íë’0=A«ÐÊgçVfµY¥98#Jd–¬ Ä]~SÉ÷÷®—$ÕŽt­©·fŽî¡B¾rE[T &28õ¬Mé!žKyA`ã+ìÕ¾¦2O ¤ŽõÅQ8ÊÇu8ܱhrÎ=TÕkçQ¡]nî»G×5fÙr°ÞIÛ‘ÇcT5xÏö!elâQ»œlæj6 Î\±€8VãÖ©Ž£ëVäÆ1TÇ ¿Zõä—m’K{¸™—nð žÄzÖáË‚¹Î1Œr+"!5ÂGžb‹€;ó[ X{nÎ ®jŒè¦‡ –ò R»ª ’>”ÓÀucìzR£6rUK{óX›®Á#ÿ¦FÄŒ,@qVãòæB§•'òªÓíFóÎèÆw#µCbÌ779'§aJ×W)JÒ³-ÂÃ{.[!ŠàÔŸÆ*)Ù“xSÖ¥|T²×a'“Ë?^jû¹ žxÕåàŸzH¢^ ylô&©4‘Œœ†Æ¤Hp Ž€Ñ1ÌyZ°†bK0ôÍ)„: ãH¨æÔµb»uúÓsRºœ/=½*0 ª¹-¤«22*Lä}㟥1†ö5 9 ^ §#bLzÓx)$ãµ¥>Y&eV<Ðh±šLÐTZ+ÜNç„Õ‚’–’q ¨û»G¢  8QsÇ›šñ\-¨9,¤t¬%âEö5½»hæ©¶˜Y$ž6ûƒyVïíZBInL“fÊÉ•S‘Èõ§n9ÏJdz¸Iµ4òPÅ ó8­‘ùIëXÊ<¯Sh¶ÖƒAù³úÓ‰%ÁÈïU¤‘VcaNqžÕ*)q‚ûjYK]V.2N2yõ§D¤rÏ© &ÕùX~TD>fÎxàP;k©n+wœÞ,lª@ :óR­›+$±ò‡5N"ÐË»±ÍNÒÏn+'{›G–×hŽúP Û¦vÿ§Ú¨£óÛÍ>Y‹±nôÏ7 ’p:g¬SHÂrRcIPÜŸãÏ:•”ðA"ºh3$…ƒ1QÁ=³XúÔN¤Ç´ŠVô¥­Œg 9ŠjpEt’Ai(ˆ^G ®iF]Grk¡¶‘„ÏcòÚn>̽¼jÜäà÷ïN=IcÉ9 ”Ò<É’BÏcHѶö!ð ùIô®S«¦ˆ°ˆ a³ÔñŽ*¤ÑwnR íØÔöÀ2’ùf‚JuÒÚxÎ1èi'i%Í™ü÷¥fÜ£Oòž;gù{Øåi¡ÃŽôà>^YAïS[Bd“•û ±÷ªà0G4¯¨ùZW}j@G"ˆãè_¿AR£øühl¨ÄX×'²H§!ù†wsÛ€FÐGºÔ˹dîàw¬Û6H–Øœ>îs’iåŠBp2N:S#çw^~j‘™QTœ1' þ•›ÜÝlP½V›Ê ךÏù@É9­¹W÷Ñæ±çˆ‹—T ¨9JÚœ®¬rÕÉ"QƒÀrOAõ¨/fHXgiãÓ5bå¶Ã)Æï™‰ªìËUØA$õ5k¹œ´V,Ù©•á‚°­øf© -Ã7Vÿ:¸/LHåÔ2ÐʪAD Ýq“U.Ù2wI!$Ç_^Õ=Ò7ØËc‘l§SHØOp®ê­jsør(oTZ3Ÿs€>µzÁŠDUÎ2x@;[æû¢´!O-8ÝÜ×Dö0Ž…‚r)ÎOµ:PÊ_)®ù$úÖ&€>þ⻀õéNy™ÀÎ1Ž!G9”‹ÕsÈî=¨fÑGÎËոϽki–þSÊçïà ç¥cÙü÷¬NÈÞ¶âa$­cW±ÓA-ĸu‰¦\¹Iã¿­dH7nœ6+M÷óeãiÁEgÜ ŠgE €xÅ*aX®ÀL#sqOpsO‚=î2p+kœö¹Kˆ5ˆ¦]Iü멟‰Ú¹]Lì¾QÆS‘ù×Nìd}ÝCA¬ëtgE£EÈœ=Ãé°*ÊÕîÕ4Ãm‘¾I2G¢þ½hÙ ÈØô®Jòf–êá˜ç@ú Š0柡x‰¸ÃÔ¦ÄùŒÅW8ÏLÔÌyÿ¨P}ëÑ<ãVÊO(Ô3í[NϺzg>•Í¥ÁÎÜpÄdŸc]ÝHª¸MÀޏÍrÔ‹¹ÑM®£ƒä­9pÔT24Œ2Pg=1R[¶à7+œõë¢îìAª©1DÑù}p}jΜ¹U'¦X<ÓÇŸùhkRÎ0®Õœ‚IéŠrÒ6{Ó¸Ò>qŽæŸŒ8¦·qÚŸœ}k3tJ°´ÒðÁBŒäÒ2<e•˜tñSFB³úí®¼dŠ…{–ÒJãÛw#©ã§;þUè;š«$ŽeÌ9Èüªc3ñ¸{Ч5"F*ú÷¨±×20s¿0}ª&Àl’~†’î#}ÃÍ27ãµ:Oºp;TG鯩Ý™.rÃëJÃŒn9ñšW|t4ÐØø¾æ= >£'%{t%ÍM&"<µ”QIZ˜ÑóŸUÑŒæ„yj@àGø¿!^1êejå¿Ía0õŒÿ*¨qêM(bT*œô™IÙ™ºSmÔac©ù‰è½t²Ê Ëd=+ xÖ8&•xb0O¯5±½„Œ:ªàã§êjÓ7dÑJuÝ©êI&§±‘¶só¨Á'¸õ¤r | š@v̧¡&¥ê¬ Ùܲ[©cøš]ê» }i‘€Êws“RVo˜sŠƒR3srØÇNzÓä”´\m ¦Üp @ø@Ã99è;}ièÅv‚(þ\°ëOò² t9ÈãÆ¢FV_œàç¥4ÊJüØåÇzvdÝ$Z‘Ûz d|Ù¯Ö³õä-¼Är¤£ùŠš(²I$àŽ Òê0ÿÄ¢UÂãó§) ÖQf>Ùc89Åké²É1lÈïÍcš×ÑGú4‡ý®Õ½_„ÆšåÙ|ÜØ¥=@Æ{õÕb¬fàO4ओßé\‡]Á%ØB§?ZžU naëïUY6ŒœgùUˆ¼`œö©’êTî™^)‚¯ Ï®h‚ÙÁíÖ£ G¡>ô×ä’ j‘ƒnÃãâ$Çà õ«L¡”;¨É=* $…˜ù¬Ý#йqÛw1ŽcÒ³“W6¦›È²¹'œ® r äU$“4»ù<Óå9u&;@ÏJ<Á»'“Ц­ŠpbM£ç-Å"†aëNY>^1œð*¢gvG<ØÆR})8I·bÚ¨Û—êzË”¬²³í;:.;йrû¿v¹ÁŸð¨—t#ù˜i©u5ЧtAHÈè2*¹5wSPžH§ùÕyÏé[ÇTrÔÒC.îò§òI梟ýCý)Kzž•§C+‰+ö©µI€mÀçtJª~ f¡ Ã9¥ÖDVÌ÷%ï!¯…•Sf`0G¦^{}*¼-•ÉêO58?1«d :åN8î9͹§y¬Ñíà3Ö˜SPP¼Ïj™$Ä’x8ìj¹  ‚¥Wò¬ë•Äß^jüD‹2 9ý+56Ldbç°§Ö¢µu±ÅKGN´Æ1ã¿•]Zn>ÕQ»ýiĉ– ÊóAŠL~ìö§!ÞpGëLcb_µ-D>øúÔµëaéžF1Z RQI]G!ƒ%û£š\ŠD¹Lÿt Nõã³ÔO4Àà šSMˆe!ƒ(–øR9>•6ŸwçÛ° •°8Ϫ½ó˜¬ß\í_I$4¸8éUËxÜiÚFÃDêrî¸úT Þc>¹ÇJ•¦c ‡ä…8õ¢UHŽüu¬º‚ŒŽ=E(uÀ~”€€=)óŸZ’î6Uù #OñR,[— Y8åBjF Ã0SU$,ÌrùãÖšÔ™h2Ô³Èþƒ·jºçŸÂ£±‡å ­”#Š´bãŒÑ'¨á,; Ríó xØ}ðE;nÞÜSʧ§j‹š$qî…£uSƒZúRŸ°’;¹WZ˾fÜñ“ŽÆ®h¸6Nf?ʺæï œ‰ZV4-þ|‚NGoZ²*µ Ì¯ì\‚¹$õ:¡±^tÈ¥´8ÆsO—…$Ô &ÉœsOt)\´¨æB2ª™ÎSK$Jd9U>Ôò­€U°s’Gzs"ºŒŒûÖW6åDÛFÄ“ ûñO-öyyB0A©PªáGåš ÑvØÔRZ¥Y&eǦ=( Î]¸]˼uj¨ ,[@3ZÆWF…˜ÐW›'Ú•ÏÊûR48ÁSœú T–çC†#f›î%{Ø|dãú•\œT*>aÁ#éS†Ø¥ˆÎ?JÍšÇÌl¤4ŒpqPÇn} Eªàý™AÈ&œY‰Îyªú—ÊÐ)È; sîiGâýÒ¼+ǵNÝPF*E­€Ãm&ìS|¼ nãš›ÇçŠt„½©]Ç‚)€¸éC8H%ÈÇz|L®±åIR˜5zÐìPCg€{Õ ëÐ ;T@ëZÖÊ"¶C·æv{õ4¦®ÇZ Q†A#uW#1Ž0;UÒª7í#pÇT«`½gk4A&î½)ÛŠC‘Ð.vÒHÆ1ŒS§*¾Bå|¶Iìªæv3íË©Ûîè oʺ)xÏÐVF•˜òNyùŠ©­wm’À8ƒô¨ªîìmEZ$ö}dŽq÷-›Ë“ÿM uÖϺIO”q\l¾iÛÕÉ«ÃüLŒS÷QæV¦] H§ÔS×ïœö¤»þ]§"«ÚKm¼8ÜÍQ§ÆJ¶áÁ*d®¬i¡RSó$g©a˜ŒÊ?*¯o<˜Ê¶2:A©•œË¹ß<å\-3ª-úp’’3NGjÕ„ÊwFABÉ<”G7š¶OÊž»ŽiÏVôDÊzEX‡ï“þÎ*¤?Ò¬ÄØªÖ2: Èî$XîÑ™‚†GÖ”däsÅC~ž"ØÚãÞ—,È#æçõ§m oVJÄöÐ …eã ãê:ÔÊ䌲ãúÓ°¯r@ÙàãÖ›¸,Œà›ÐgK….¤±ò½ÅS oÆqVØ†Ü úUIÍŸlS‰3$C˜ÀôâˆQD= òȾâ¨]„kÒÁ¿u£ÌÆ/y1sIE%vœGÿÙrmagick-2.13.2/doc/ex/images/duck2.gif0000644000004100000410000001340212147515547017404 0ustar www-datawww-dataGIF89a´´÷Ò    !!!""++,,--!!###$3399>>') **"-0'11(?@6GGJJLLNNSS\\^^BC;aaeessttzz||OOEJPFMQGPQGQRGRRHT[QW\R\bX]f]ag^nofjqhsskuums~wwx}„~€€‡‡™™šš››œœžžŸŸ¨¨®®¯¯°°²²´´··ºº»»¼¼¿¿ÄÄÅÅÆÆÇÇÉÉÏÏÐÐÖÖ××ÙÙÚÚââããååææééêêííïïóóõõ÷÷øøùùüüýýþþÿÿ†‡ˆˆƒŠŠ„ˆˆˆŽŽ‘‘‹˜•˜•œš‘’”••–’––’——““œš—˜˜˜™•™™•œ™žž›Ÿ ¡¡œ««¡¢ž£­­¦¨¨¬­«¥°¯­µµ´µ´¶¹¹½¾¾´ÆÆ¸ÄĹÅÅ¼ÆÆºÌ̽ÉÉл»ÁÁÁÀÍÍÆÈÈÇÈÈÊËËËÌÌÌÌÌÌÍÍÂÔÔÇÛÛÈ××ÏÐÐÌÙÙÏÜÜÐÑÑÓÓÓÔÔÔÔÕÕØÙÙÛÜÜÜÝÝÎååÐååÓèèÖëë×ììÚèèÝëëÚððÜòòÝóóêÑÑààààáááââãääàîîàïïæèèéêêêëëëììíîîîïïäóóæõõçööïðððñññòòöööö÷÷÷øøøùùúûûûüüüýýýþþÿÿÿ!ùÒ,´´þ£ ÍA¶T¸ð`ƒ*4‘`Å-*Ì8ðbÇABôØ G$O–ÔÈP¢K‹)C¾Ä(s&J‘&'Æ„ˆ“&Ïž7mFSIhˇ¾z$YôgN¡L™%ª³¦Ï§,aZEh4êÖ£é(Z‰ÒcS¬W?:í¸mP­pÝýêU(Õ‘x[fUÕ×-³ ¥®å:˜pVµ&Óýz*cÅ…r¨.Û©]ͶMûör\Îs¡jÆ\ølY½r-#­’¨`¹=6̺jáÖt_c4fëoïX½ƒÛλwqã¿ ΛâïåÃ}KÞ<–ò㱊¿œ8uáÛ•þ Ïþw;tïÓ‘³Žü·öçÇ£~9ÉÐ)=Ê;?hÕÑ&àP£Ý6UýáÆßi‘}E ™6àfÚ–Zf ¨`ú YQ–C=Œµƒ°ah c¥‰Š'‚Ød²¡Ö_·Ôøá‹†Çݯ¿½ùzz<ñÉŽ ò õÏŒ÷@|9Ó²VG°ÅYÎ`¢cÜäPs9k®rK—: P[d`#ø7ž 6¥Vi’Å9Èî€ò(—@s}°€+]•r%0 Vp"tØ “„ÀŠË…þý²Ò 1gÃvdvfÃ`ß²$A#¢¤‰§£`»+“¤O>ÔÉÓ{â‹gçŠÒŸoô4§öDÊ<êq_úêÄ?uçRÉQÏšú9ú†<ÒQ#žèÈžö§ªj4CnJQdãðÉ¢z¬)¨öܨŒLÍì Keœû˜ôN²°GnŠ™-t&x»%™loÛa©ÌŽ¡Ñõ’m¡G4ÌÇzE-»ã†ÌÇÕ`¿ã]WG7s[Ñ„Ñ^ÂÜòÛÔ·ÖÑíÈm©ÂS.‰ÐZ‹2Ä×Í: ¡¬V"¦?ï»?¾ÎBá1Žfzˆã ˜6<‡z¼É¯¹U3†ža¼æq”* 3Îi›œï¦¤®ˆyKÕWñRF‘&èìËNÚX%Áþ2”ëÎ@N½ÊîVÐ1v¡ SDâ¬ø3òŽÀ[ˆ!4®7gÒØÚ…÷WIÆ'øþЂàûà?^ð\`+‡Ö¿|_zßú@d%b¤" ÿB°#0! SJ& à'‚p >¦oAÇZ”pï—QM—)õ¨áwNlø èlÀ@~s° d7>guYgA-–O»†TwÈ@ð}pa‚<؃øWß7 1á vÀq¡EvSV,ì´EÛU˜W'ŒÇEUE)' €à7càƒ^è…Oð}w@F±°cªàzb$U$#VòÑ'œjUVsth¶òÇt†%oÜ–-»@ßwUà_8ˆ>HþƒÐ*A—WûôhOyŒ}A±fèdQ'`àß'^@ˆ¢èƒi  ÕvJKg,ÄUn/XZ§ÏPßç_0Š¸Øƒgð}uSùR/åb½7E„©À€Y‹ÌȃX%Dt§„YF}À…}ç >ð}GÐÍø øð `·\æK˜|l'¹P€bŽòè[~°JÐ5}ð9íõjáu?ýÈ^ÆÀ߇óxn _åÕ>âÅ]É!‘â³f[s4`qvhE5Xã(ÐÀß×Y’#¼°`H£;ˆf59`ñÕþ`^C5,)3vsûˆo± 1 €%Y’GºPŒö‹°ˆ:‰P$á ?ðAY’R£Ð~ƒ§“Y‰\ûJÑ I0•Ai° FyP^ oh{=GÀ Ðd”Tžp޼æ–Å—,ˆÈðu”J« —Jç—¹†=™2=w¦`z=|fͰ°…”*ð+¡4ö…hMÑ;OƒÑ#h£;•¨geååSVNU‘–æ(Ä1P›”ÅP›Õ±?݃>P‘äÓ>Ãi^(St{){)°›%©À-¸@Õ7nÄþ†‡°Á `Þ(ó˜°‚wnÛv˜KG'¯ð}e ži 牎ÙYoýdc U ò9hОl™sQ§ž»"b­Ô @:C‰ Òg}où{7Ä ùg Žkð —å6½v‡ Š`dszôV™÷L}’@ ŽD‡ÐyátzÔ…ä´NïQqã4«—=«U{Xñ 7¸5ÚŒf ÚœD¦{̹˜ pMÚŒ$ŒÀ˜ŸÌGBì¹J@Ù¥¸X•60×~M¶žWw&Á&À¦¸Xß7 ·'ŒJQþ¦!þHª‹Ë¨§„Ø’L¶vY…Ju9),j ¨„ˆ°iénª{ÓaNYs.J)ça µ ©ƒX *wŒ'Ué¡&¨zqDj(”bM¤ÖGÔñŠ‹9  ®ê…KÐ ÷YvÜY¢cª”æH«Jp¬=† € ‰·e9§ !¬êè @Ø‚M ±¸„øxŽCb‹± `çúIÀ®Tæw5e q*®îG£ðŸ÷ú? Ôx ÿÚ‚<m ¡ [z®h½0©Iè­+($€"œdrÕ¤VÙ 0ØÚß·þ¿I²hõ(l2?² rl¨yf…œ#»'% `{ˆ¢}*1 ˆšŠß篒* 1‰Å³´+áaHPLK©m'~Z ¨b€@¹ Ÿ±×.%¶PƒÚ±Œô ðlÚC rà IÙ¬X:tœÅos€Mš P Ø ­Tz'$mUÂð}g¡_àß§Ï®ñG¹LiŽWêc¦d"âé"ð}:P+”në¨{:§/‘é ómw'x@…éUpßG¥°3)3>ã¥]Æ ^ )‘þx¼È;¼ù;^ã?uÖ`K3g­þ _yð}„”c à‡¡p*@ ¯7½™4ν0éhÃ;`9ó‘¢0ìû`Ó–“:V+á W`´ÍGpˆ"Jܺ‚Ÿê°ßº‡)ún4;rçJÊ0à\ЃÈ`à'~9€ ˆ[¶|À[™Ží'p1Ö@Ç7ø} `A P0QÀF°!0á·q ´`† bgŠ•÷&±$¼K×{@¤€/ ~LL.П Õ+ è¯r Â(v1šÌð ¬ –` ª° ¨‰¿bP÷¬åXk©9˜Rš¡Q5÷µQˆg7ÁaªY“½sg{šþqÖhÖn}Üšc²f¢ÉÇ”˜<¯Ã‘öhÔÓȦ‰hÕ[ÃË?¼¡0UßU¼åkªÆ'ž<‘S…nµG`•^d•jÄY‘ËkÉdõ\ÄVÌi Ÿ³ÀÓ©„­tÛ­¯+r qÅÆ§Å¤f³À…R§ÛW™Ä~U'Íc*FͶ§ËW|¸µq¨ûvJc‘áΕkÅÓ|¶oÖ_#Ü®f÷7Ǻpª>Ö,v|†(©0ÎÖr¢ù,xÿ<cä½òiœ§«(7ÐOEq¬×N¦šrCÚ~‘G0¤“÷4‡†!·£ÒTNrô£Ò¡~¡Àû±ôœþ)x7¥îŠÍUÚ—‘T' ª1È|H9e£ÍRË|«X:qÏéܰ¬(¦a<Ö¯üio¼L¾ C;=°`ÖÎWÇ0EoÆlŽèÌ̆ \¿·Šo¬¸¥Ô‚næ¸Æ›(ÔƒÛËP]pi­˜+ÐeäMϤyÀúFØdÑu´«}ת7ª¶Ð ­0« í†ì䢞'zÝñqrí«»JGñ4ÄÅÌ«ˆ'Ö¢ «æŒÆ¸,H|!1)“Fæ®ï´]=}Zi€!©½Ô7]Ï\=¶’%Ûá žÚXìŠÌt¹ÈÏuk¸:í— l¢B}Ò•JÛÚÛ"5'z==…÷F\þE(Šœp¸NH(Ue ½Ò <ËÐ+Ç«†}³âÔÜq˜2‘òzzHRyšá´¦mX¦‰|f‡q³pyHð­¡5û]‰ƒ–htºwñÔ¾½PTÜs’=ng·ìç{ÛÆ s¶Òn=wD<ŒÞŠÆ=Ö›]u¼ÄêlÒ~ÜîLÌV¬ÌééÓÂ}¢pwàI¦ xwâ¹ý{­#㺟&ËÄ›¼¯LÊ®¼Â[ãòÛÈö5Uôç»3¤é`Eç6‘åsÉr˜œÌþt¦–^¬¬œñõ]±ËË.¿N¸¿íè â ‡ÒóÌÍ;âé~n·"Й[¿|®–ŒcÜÞ&ÜÒ*b™Îè«‹žÑ°QÉŒÙgÄ+Ú%ŽðžJ5SKWÌ€ê-$uñ½èZןmî¾Ô;rmagick-2.13.2/doc/ex/images/model.miff0000644000004100000410000006173412147515547017663 0ustar www-datawww-dataId=ImageMagick Class=PseudoClass Colors=256 Matte=False Columns=128 Rows=192 Depth=8 Page=128x192+0+0 Background-color=gray100 Border-color=#dfdfdf Matte-color=gray74 Signature=8ef00fddd9f2a02ba722de756c81cb42 :$&6#()&4&7:.3+'&.3$6+&98)<:31.2#F8O-H-#E8*D;4F;7X8'U=4b=,EBHEQEK#HI)CD4DD;EK4[ذ0  èüüïÉòüý!( )R%q1!]M r‡ÍËËÍÍËÍËËÍ  DD&m‰mA%x½ ºù¾""‡‡o€‡4366o[34/("E‚fÎ~^5)54!rs0* É»B^ê³R )*) !5+'))M€p †±Í¹Ë¹Ë¹Ë¹¹Ë  DFD‰ºˆ€TgR33q2( !+Úø‡Úϲ×ÚÖv[ooc:oo%!("g¹¹1 ‡¾³~[~°°·)! uw:>!)W„! 1)*+  ))1MC°±ºÍËËËËËË˹  DDD&DHT‰ÍºˆTB'Uf4( ‡ÙLº¸RÉÚÏ)2R1,0771/oˆ‚q ³oZ~±³Q0) !1Rx[ †¹e 3)*)M.!0! ººËË˹˹¹¹'  &DF&L…º‚T'%~f2!)!)\]' g€€YA%%ˆ½Î1>00)o³ˆ³±%(54Q[o~ˆ‡rM23)! !+(   * ˆÈ(*) )QMV!3 0(*+ˆº¹¹¹ºººººQ& FHDK‚±ˆU'.(0U‚‡~qQ))1QprR2±ˆ‡L(fˆêóôôêðÈ77(‡ÙÓÙÏ%(RsvoppQQ**)!5[1 !) N½¸-p*)v:\~‡|)o€M0€¤º¥±¥º¥ˆ¥2. IDJD'ƒ\vvM,).…€u50031Qr¸°‚o5¸º½ë×îûüôŒ73(¼ùôüøù¸EOcttUUURRRQ )1!5Q [±½iT3*o03\†Z†3]22]€‚`Y€‰‰ˆˆˆ!  -&&O†rvxv1)!KAEqU( *32Mpxr‡uv±63ŽÚôð‚07o¸üüûøð¾gUPgPUUpN\4q41‚ƒ*)!°Ëº4E4o51+Q63(#~[ZM€++'B€ˆˆ   --Zvxxur^pRO)%!%E% )ZQQZ[†ˆx³‡o076³Ì³o07x]ˆ×¾ˆˆ±‡VUqTmQZƒu4[v44)‡…)*o( Kf%K( Z@AWB36qX  Rˆˆ)1!  &DD-DQouxƒoMNLK21%!""1))!PRoQ(M~~Q~‚Z366vw*07[ZE&-…ˆ¤‡qKUSTgtv[R~RK37540 q‡v4v1%Q(ZrfQ]Y€`V~rV )K(1%  D&&D1Qvuv30Q]XLQ2) 1131(ETUMKVtRO136ovv[774o…‡eGUQp€…pcN@+MqRQ'KQ$+3322o4 !!*  1)1‚u€W€€Y€‚V* 14Q'  DE.2Zo6000\VLRK$! !0030!&HJTTq€gU2166[‚u63[ˆ±„P(.PqqN142QqtfP')))@M4[Qqƒ* *)!0)1o‚V€€`€€‰‚+)*****|††O  ADDDE22Q63004pS)))(+(),0>30 #&ELgVfcURQ67v‚~oZoqu~pcE&& !(Ocf'K.110']RKQR\3 ) [R\:†U(W€€€‰€ˆO0****ªq  DJDD&DG22553>soQ)1)* )0((1)331"&-KcovsqTR43[u~~pQ102QpuUK@A L„U((AE240)Sq''M45) *1B *4oo30[+B€‰€‰‰ˆˆQ*0***ª‡t FJD&DEEOQpvooo2 !0*0* )1" 25.'&&&&OoofTJTO336vvo40+2MRvv[+"$"ALM1:) B 2110))2(*,0o vx'C€‰YY€[*0)*)‡ˆ¤‡e  FFA&DDHH.2QZ4) )300** ) &KLEFFDDEPPRHJLO3066ooQQUUPQ[[QQ$##!AX'11!2:/*2C+0**( 6†~"N‚`* 0037)„‡‡‡i  DDADEHH233* ! *000*()!DPSRFFFHFEKHHTPR537[pRfURPROQQ22'BAA$'B+( (. "B,  )xN*(+**)360‡„±„O  DDD&DHHH2063 * ))(5o1)11('EFFRRQOOTTP21(KPTfQQ4cQcROO52111) !'(("#"3B !LW!** )! (+! * \!***))33_‚‡¤¸œ1  &DDHTR26o6 *3QfV‚ˆ„c001QfRc[44QfcRO1) .OPccd4dOO5551! (2(! !"!"Qv4")N2 * .')+A * )) ***)))[7¤ºˆ\!  &DJeHQww7 ***3QfUˆ304obRQ574QQO..51)(DHHOG.(/.RRKO[(!!!! KQRK1Q!*2 )%KU+)2) *****03)332SK   &AFgeE.ww7!4d003QPOG‰‡UQ452.2533ocO/%.22/-GE/%-PHE  % !!!!522! !Q)  ^Z )2R2*>*! ! )**)0**333  %  DeHcc1/da)01%P€‚U.151//,1QstO!(1(%'TgTH&& )2' "!%51!!!NQ)))\Z) )52*702+  ))* )*)*)30336 )12K DTE&,)% %m-!!%OcbG%!122(@FTJFD'KRL#''3vM!)(+p4*!!0M1))) )5r001)>*5\Zo>>o3))))**)))*0336)034[KE FD  %:42OO/%%(  /%%(2E%#&FVqpRD&!K2.15u‡5!(1)46)))  [53)1}53ŒŠŠ§|}w)0)*)0)00)7)3*0*0[5.E D 1owospspO5o}}}§§§§|sO/ "&&#&FTTRE'' %oQ22~K)1M%"30)00*0)00(5}0 5oo3*0w>3))*)3)3)33)44v†o(DD  ,w}xoox|††ªµ»»ÆÕÕÕÔɶ°tO/%!-q°±‡ DD-LPKTPK12.-OpQQQQ†Q54Qd0)433000000!1}5% **:}>0)0)337*373p††rNE  !4w}oowŒ©ª¶»ÇÔÔÔÛÛÛÛØÖ¸‡„ƒs¤ÍÙÏÍ… EGGE@$('RQQ51%%%c[QoQQ\owoov5)6300737)%}6(+(:w03)03)37)36!ƒ‡†vpK  :|w{owŒ©µÀ¼ÇÔÉÔÔÎÔØÉ쳩œ„ƒ‡½ëîëÏ%-LMB$!.OQO2%/oZQQ+cR5:) 2 )144363)5:"2'% *7*0)377)33‡…uxvoE  %s|{zw{†©µ¶µ¶¶¶¸¼¸¶¶¶·²œœœ…iH€Ì××¾E!%E@+''112OQd12rQQ2 RM11R0*)1cc5701.!%.!!!(!03730 +7336ƒp[o3& && Ozzzssv†›œ°´´´µ´´°œœœ‡œ‡„„hGO±¸¸³O!!!%%%'((12464QcOG.o12434B25+M00!0ZpQ576RO-/%%/%.203>1(037+ !+676„p>73  &Dbtƒ„„„zssƒ†‡œ©°©©©©œœœœœ…„„iHK‡¶³°b%%%//%%!(/5554444Qdb/103035K54!040 *0QRppZ66Q1.4O.//2c6>73,36!('5[€„s>>>1  -DDDDcsz††œ†„zƒ„œœœœœ©œœœ‡œœœ„„…ze-f‡‡„O//////.((1Q422005Q45OObo5 04c400 7:.!**4pRff5544cooc:cto[>66Q%O%!%'@Kƒowwo/   DDDDEbt„‡œ°œœ†„›…†œ‡œ œ…„†›‡œœ…„P/f…œƒO///./2//5OQ511)0)6[6:OOQK(p404331/RP)**)435//146>[o62R†‡xo>og/..%%%%%@cccsvoG  FHEGcs„›©°œœ†„††„†„†‡©©©©œœ…„„ƒiG!O„‡‡d..2abaOa4d511(!0*76[65:bEKp!)Q4311cqfc103764.4oov6o4//pxo:dor2)1/!%"#'ObbtzhHD  DDFHOcsz„„›†„{ƒ{†›†›°°°´µª²©„zifG~°œ†sOadOdQdOa4Q51110036QQ:2/.Bv$1cN552ORff40066Qpp\]xro2//2QpZ[44530001(""&fbfffbGI& -FHHOfz‡††tsss|„|ƒ©°¶¸¶µµµ´¨ƒcG.%f‡³³°udbdddbddQd[Q524:344:Qbad.2\SLRO4GaOOKK2)0[[>o^r]]]\UK-.1Qr\Z553)0735KEEtttttiFD-DHGDUu‡†uc:dh{{|†©···´²µµ©„tb%%…°¸¼°ubccRdcdR:cQ4224O::4dbbQda2NSUfdQGGPORNN33366ov\\]\SSUF%/(Z~\RKN3006Q.@E††œ‡„gFDFGDE©°°†tQcpsts>™©¶·‡…œœ©°†tR% !³¼¼°ƒcfchccccoZQ21.:bbdaOOOdOdQNV\:d2/--bfUf[7736[oZZ\\VSL@ 5r~\2BB)*33##@©°·©„eED-DFDRƒ©²©ƒpOczsswŠ©°±ˆ†°‡‡‡stf.%c°³³°ƒcfhhhhhccRQ5/./.:2/.:OdOd4LV]o>4/%%-HPUR46655RZ\US]SB" (Up\MB$("(''#µµ¶´Œ{OD-DHGg‡©‡†xtptƒ„ƒ{{†°µ±³©°‡|utf2% 5‡°²uchhfcd:b4Q521//////GOadQ:[\RZ>45/&&&-EPOQ66(@KRLRVSH& NMMZB+$#@EF@«´«µÀ©eHF-DDDDf|œŒ†ƒƒƒzƒ„ƒs{{©³³¶³°‡†s{shO/.ƒ‡¤†zhhhcaG./.1111//Gbccco66Q3376OEED&&&EERQQEDEEELTFD&&#BNL\M()'A&L`~¨ªÆÇǵfGHD-&--&&Rv||†{vztvzhspo„©²²°©‡|ssssb(Gt†‡„zsshcaG--9/(//%Gcchdc>6>>3>o5OFE&&&&EEPPHHFD-KEEADD&'SV]]M)(++@S~€›¨»ÊÇ´eHHHDD&--/oyow{cocccffhzz‡©¨Œ†{ssuztc/.fƒƒƒzszzhbH-I-/,//.achchho6o>36qOGHFDED'E-EEEGHHHFPEED@-LV~~`Z032+LV~€›©Àƪ{OGGFD-&-&&&.psoyo:OO2chhtƒzƒ†›¨|svuƒƒuf./OctszzzshcH/a-/-acchhccd[664uSEEEPEEGEEEEEEEFGOPPPEE&E]€~~SM22KKSV]†œŒ©†fIDDD&&&-DEDDbv†zsod2O4dctiƒz|||{|yssuƒuc.!//4css{z{hdII-bdchhhhcbQ67oGEGPOPHFGEGHEE-'.LPHTJEETV``]ZMKB@&ALttuuufHEDDD&D-FHHHfƒ††so:QOdcozƒ„„†|›™}o:ouƒƒsO%!/.dcszzzzsbb/9/9/-/9--/abchhchhceb464fHHPGOPEGLEPEGE-2MGEEFHEFRLUVRM2K'@ELftuuugTEHED&--&-HHPHq†††|spa5cdst„…†„|||ooopu††ub/%/ccuzzzzzzhhbaaaaa/9aaaadddhhhshshffccOtqGGPPPOPEGHEGEEEKOKKEEEOFFEPTMKKKEL~VfRcppfPHHHDD-&-DHPPPqƒ††|{sc:csoz„……|||{vsou†††„c//.cvzu„zzzzzskhhhbaIbchzzhzssyssszzhhghepuTPOePPHPLHEEPOPQROK2KKKPKGFORK2OPTmeecopcbHHHHD&&DDDEEHfƒ||†|scQcsst„††||uvxvvx†©©„c.,/dv{„ƒ„{„„{„{„z{cdadks{z{zszzzsksthftihcqHPTfTTPPPHEGKRRRRQMOQPPLOMPPRPPLLT~TefccbPHbHH-&&--DD-GRs|›Œ„uhcssss„…„{xvvsux†©©©†s.(/4o{|{†„†šƒ†„„{zhb/dhz{{{z{zzzszzhffgfiPu‡TPTfUTTRTRPORRRRLMKMPLPLPMKQTPTRLLgJTbccebTPHF-&--DDDDGcu†©†u{hoost„†œ†||{vv|¨¬©©†h2/5:ys|†„š†„†š„{„{hdbdhz{„z{z{{zzsztfffifTRˆPTTeTTTPTRRRURNK'KLLPLRPRQNPTTfSNUHeegbPHHGFDD-DDEHHPPfƒŒ©†„„sssot„…†¨†|x||¨¨¨¨›zc2.dov|†™††›„›„†„†{zbGdh{{{z{zz{s{zztfTfftTPu†UPePTPPPRRURURPK.EHRLMLMRRRSUTggTUJTeeHGGGHEID&-DDGHPPuŒ†œ©zswowŒ©©¨¨Š¬¨¨¨Œ|vQQ21Qs||††›„›†›„›{„{hcadz{{„{ƒ{zz{z{zztfghffPRwpPTeUeTPPRRfOMK2.LHROQMMMLRUUPVgeVJJeePHHHHGD-&&DDETPfu‡†‡©°œ|}x}ww†Žªª¬¬ª¨¨ŒwoQ+.22Qow||›†›†›†„{„{zhdbchs{z{zzz{zszz„ƒtiihePpsfefTbUcOOTUPUMKPPPLLMKKKNRSfTPVgqGFJJJbbeeHI&D-DEHeetuŒ†x‡°´µŒŠ‹wwwŒŽª­¬­­ªŒ|w41(((14>o|††›„››„{{hihhbbahhhhhchzszzs„„ƒttfeUbtfgfUffUPPRTURMRZROQMKKKMLPUTRUgVDDFHHefebHED&DDEHePt†|xo´µ²¨‹‹wwv|Œ¨­­­­Œxwc41%(2116>w|››œ†„{{ibdbbaaaaaabbdhhszh{„„zuqtqfTTTƒggfg\UURRHTUURRoURQKKKKEKRTSLRTSD&FJehebHH--DDGFHGv†xv©²ª­§ŠŠwoox†Œ­­¬ŒŠvooc1(../4>o}|†œ›œ„„ibaII/aaaa/a/-Hdhzz{z„ƒƒq\ggTTPPeigUfSRURWTTTRRQQRRRPPKKLFTTPLLKLDDJegbHHED-DEDDDGu†ŠvŒ©¬¬‹‹ŠwoZq†ŠªªŽŽwoooo2'..54owv†›œœœ„{haHIIIII/IaaIaabzzszuƒ†tpUqgfTTTfgiqgRRLRSUTWSTLKKMRRRRLLLLTULKPLLADDHebebHGD-GEGEEGxŠŠŠŠŽ§Ž‹Š‹}vcou†ªŽ|[4ooQ2QO1/7ow|††œœ››„ibaaIIaIaaIaabbhz{zzƒ†zuUUUgggTfgqtgTPLRTUSTUTRM2KMLRRPPLRRPVPFRRP&&DHebPHI-DEEGGHOvŠŠŠxާ§‹‹‹‹w|osx†ŒxZ6oovo2.,1:vv|†›œœœ„zhaI-/I/IaaaIIbbkzzzzƒupRRUffTfVgtmgTRLRTUURTTSKE2ELLPKLLHWTUFERTTDDbeebHED-DEFHTPoŠŠŠŠ¬§¬­‹‹}}|wv|©†rxxvxo.(14v|††œœ‡œ›„khbahaaaaaabeehitzƒzuupRRfqggggƒttfTfUgffURSURMKKRLKFPLFRSTKELUT&JeebHHDDDDGGPeco|ŽŽ§­­»­¨}‹w}}|Œ©©©²³²‡|.:Oc†‡‡©‡œ…„œœ¥œ „kikbadhkikhzzz„{„z{ƒqpfgttgttƒtggfgqqqfUTUTRLRTLHPPRPTTUK@LTSLEAHeeebHE---EFbefw‹ŠŽ¬ª»µÀ²Š}‹ŠŠ§¨ªª©°³¾É½³†dccsƒ„„… …bbnn„„›Ÿœ„kikik„„›„„„„š„†„„ƒtpqtƒtttttqggtiqffRbULRUUPRPfTRRPTLBLLUB++KHfhePHG-&EGHPef}Ч§§ªµ»Æ²¨‹‹¨ªª¬ªª©²³¼ÉÉɼ‡spshhhƒnn…Ÿ´…iki{ «œihzš›œ›œ›››†›››†„tppqttqttqqqqqqqttqfTRRPRUVULfgfTPPULBLRUNMHhebbHE--EEGPep|ާ§¬­µµµ¬Š‹Šªª»ª­²²²»ÇÉØØ¼©ƒhheebemk œœ …aekkkš«´„ƒ„œ›œœœœœ››†››„tpfqqfUqfgqVUUUUUfqggVTRLLKSSTRUgfNKLRULRSVSNPheeHGE--DGHPPs|‹‹¬§ª©ŽŒ‹Žª²²»ª¬»ÇÕÇÛõòõÖ²zbbbibhk„œ–i„iae„i{Ÿ´´œ„œœ©œ›œ›œ›œ›†ƒtqpfpgqqqggUUTRgUUUUggUURPRLLLTSUL@@LeRLTg]\biebHGD--EEEHPp|‹‹‹Š†xuxowŒ²¼¶©ª»ÇÔÔÛòïõІbiahbdi{ kiškiib„„kš´ÀÄ«œœœœœ››œ›† †„tqqfUUUgq~gqUUUffVUfVVVVTRRNNLLLLLB@RggLPU]]UDehibPGD--GEHHPcw‹}‹wv[2)*oŒ‡¸¸°²©»ÉÖõïïÛ²habhaikhššh{niknbn„{ŸÄ·´´œœœœœ›œ››œ†„qqUfUgqqmfqUVUggfTSSUUVSUTLMLLLKNRLNqqSNR~~]SRifebGDDDEEHHTc???73356) 3‡³³°‡v©¶ÇÉØèéÇibeaahil„šhkkd„kidaiz›´Ã´›œ›››œœ›œ††„„ƒqUpggUgfqppqggUVfgRPRLRPLLLLLKLLLRLLV\U~`NM\heHGD-EEHHHPcw??0*3ovv1 v‡‡ˆ‡Z)>u°µ»©obdiaiklhškjkkk„k„aikšŸÀÇŸ››„ƒ†›››†„ƒƒuuqppqqpVpqqqqrgqVVVRLLTRRPEBLRVMPRURNP~~~€€]RRpieHEGDEDGFPPow??**Quƒ|[ )M]qN)**4v†|sdbibbkhd{šh{kbšiknIekŸÄÇÀ››„z„†„†„ƒ|utpp\pf\RU\q\q~qq\URUTUUTPL@.S]UNLRUUNKUq~‚~HekgeHHEGDIEHPbp>??7*o¨©¨v0)*  ))1Qpcodaaiikijkš{j{k{kkšiaI„ŸÄÀÊ´„{ut{„„„zzuqURof\RRUpqqrq]USRTUfggfPELVr]\RLU]]MLppV]PeghebIEDEEGHTPoŠ‹?6|²¼¶©|o[[2)1Zqo3coQcaababhihkškkhk{kh kbaa„Ÿ´ÀÃÇŸ„„t{„ƒuƒutgRcRRRLNNU\fV]USK@ELUgtgfTLR\~`rUPS]SCL\qSSFK2cheHGHGDEHHeP†µ»ªŒ³¼Çǵ†††›¨›©©«©›™{obaIaailki–zhkkk–hk{ikahaš´´´ÄÀÀ›†„uuuuquqqUfRRRKKNNRNUUNB'&$ERTUfTPKRrr]_\LKWLABS~SVV\fhhTPHGEGEGHPb°ÊïÔÆÉÊÉɵ†¨´¶À¿ÀÄÀÀ¿«›|s/abablhzkjkid„khškikdkkl9kŸ´Ÿ¥ÄÀ´…†uttppqqqfUTULLKKKKKLLKKK@$'@EEKKLEEL]_`^]NB@A$@N`~`VS\]iebHHGEHHHPbPÀéýþïèèèǵ›©µÀÀÆÂÆÆÂ®«›j:a.aahk{kbkakkkkkklik£kkdj ŸŸœŸÄÀ´ƒƒuqpRRRUUUUUPME+BBBKBMNSK@'@%#"&''@LU~~^]SNABNLNVV~`SVtbHHFHHHHPTG¶ïýúþèèÖʶ°¶ÀÇ߯ÆÞÆÞÆÂµ›cO9aadkkkdldakdaikihlkšššjkš  œŸ´ÄÀ›uqpROLORUffRLE@2KBBKLRfSK'&""""&@LU~]]]]SBS~]NR]~`&DeeebHHGHPPPPeE¤éúúìèçÖÉɼ½ÈÉÊÊÊÊÊÊÆÆ¶œjaabdkd{ddlaaa/9aalaj„“šškkk–{š Ÿ¿ÀĆƒqpRMMMPfqfRKEK'+BKBBNVUR@#"&&%"&@@P\VU\]NKN~~]S]‚UOsssHbHHHbTbTeE›ÒìêçäÐÎɽ¸¸ÇÈÇÅÇÆÅÀ¸¶·†a:addhkkajb9a88Illkk“ššk“{j{k„›Ÿ¿À´‡qRLRUURKEBKB@@LU~UE#%ELH@%''BEBLS\L'@\`]\Vx|v}}‹|bHHHbPJPbeGt·ÇÅÈÇÈȽ¼¸¼¸¸¸¸¶³³³³±¤„daajhk{lah9b9,8aadk’“š––jš9jkkšzš¿Ä´†UR\TSq…€VKB2KL@BLq~VL@ALmVWAA'''@BNUL'#W~~]|Š}}‹{bbHHGHHHHHPPh–›š|›©©©°œ©©›†ƒ††{:ddhy–kakdd:/9aljlj“–j“j lakkšš«À¿›qprgVgVg€m~P@@BLLBL]mUL'AAVVT@&%&@@@@K@A&W‚‚‚~\‚‡‡PbHIGEEDEDEHHh{y™yy›©©›††›™y70)1)0o{ydjz–„{jk{ka88hldllj’–’“j–9jkššŸž«¿«ƒV]q]USUVVK'@EBLBLSSS'"#@SWUCA$A@E@@@FLFL~~€.Nˆ‰‡fPG--DD-DDFbh{{yyy›©©©††›{o:3)014y{jjj{–kjk–k99a99al99;|n\ŒŽD\V<Ì–ÌÌÎdÌÎÌ,&ŒjŒ¤ªLdj442,LN俤L:LTVTìîläªä|~< ¼¾ŒlVd<64LNLtrt,*4:ìd\Z4ìêìlnTTV$¤ª|~\Ü¢ÜÜÞl¬®|lfDüþ´,,<>,¼Ž¼dR\,*ÜÞÄÆÄLN4ljlœvœ¼¾\üþt L>D,*,<:$\^D\^ÜÞ¤<24<>œžLÌžÌÜÞÜ,",¤ªTlj4\JT,.$œžtüþü\^,¼¾äællRläæœž”–”,* |~ÌÒœ<. |jd”’D\RDÌšÌÌÒdÔÖÔ,&$”n”ln4<6,LN$俬T>TdZTìîtì®ì|vL¼¾¼üþ|~|\^\\^¤~¤lnD”’lÄ’Ä\^<<>¬®¬®T,.ìîìܦÜÜâl,.Üâlnl<>$d^D!þ0Creator: PolyView® Version 3.62 by Polybytes ,xÿ³˜Gƒ*\Ȱ¡Ã‡#JœHQaJmj8%щsdIÒГ‘2N¢T9Ò¤!”.KÊŒ)#åK‘-O’œYS$K’:k¶lYRçH•=‰¢,òáD•=î2fI”3š,zS¨QŸV_b¥yÕèO¯Jqú»shÒ›1Å>‘1G¥”h\eË2nM¤]WŠå*”¯Û¡9á=Ì6îaÀg³- ƒÇ1`†¬%Z”çXÀp¿* ŠØèVÎ~_ÎuÜvncš§qŠÞk¨Ô,Žô˜ÈŒVmÚÉu~m¬Ö·ÍÞ¬†)šqXæX GyèQŽ1z²iñvµY¥r§ÿïØ´qð³VͬrÄÅÅ—&і캉´pM[ùqéÊ}×€8]a"è’*A¶ž dð€ øeÇB%UɶÙr2µ•T‡VÈ¡‡$†å‡!zYÉ]~fw@ üý6žŠçñ„cˆêùf£ˆ7æÈÙUŸÝDËfgÂ’t (R‰"T*R‚•%dY‰–WfYe [^ie˜RZ‰å”cšIe–l²i&—XR¹å—`¦ù&‚(€EH› iÈ‘º%)c EœP > bG¢v ’¨£&ꃤ6:i¥ŽJji¤–RÚh¤ R**"Š2*©–~úh§ŽBP‚ ®ÿ• J º… œªk©—.Ú뤻^ ì©¥f)ªÃ û«®‹òjl°“ú ì³è…X´&# ¹¢j¦¢kª©Åj*n§›ŽÚl³Ñ†ªl¦é~«©£"Åq~ÑcŒzxq»•Fû¨·óKj°¬ +/¹¾>멺äþ꬯ '*Ç7þ‰¤ z€hªÏÂk,Àè.Œ)Á(Wü-»§Æ«°¸òr fqé”m….ðr¸!ÊsÄÎÂìsÀåK²Ñ@³»nÄ>T²# ûVx¸ ®ËéÈÀnÊ2«ôM0Èç{lÈ,;|¬Ðˆ”@XMUl,¨"ÞÛpÁŒö ³ØÒŠë³Ð{ÿê5Ä宜¨"°áts Ù•@õÎz‹ªõ±&;*¸ÓÖ2äv_ý3Øà–°"¶/ò[a —† °å]ëø© Çn”!{– °BŒäÍ·ÀÓ6¼´ês­¶ؤâíœ:« ý,r A…Daýõ×'Qà 8ÒA[ Aä—þÏU£/¬¥„¥Öሓ®ú»;},#r„à‡ Ø_õÿë_’@…!¬ ”“Ä v@…Rá /ˆØï¼¶:c Ï7'ÇHw2¢i­~]ãB‚$Ðý»ƒU˜=ü “‚P…4ÀlÃZÁÒ¥6÷~øQDÐÿÆ5¶Uq X=HÄX(À&:±DÁ ´`ÂþAB½ê™»phÁÖ´äf¢ã`ã§»ÓuÀÖcbÔøÄ6Zn¨ƒ ƒ! Y"[_Ë2å¹É@ƒÆÓƒü䯰˜Š rAÿØFFžð‘þ»C8$hîYÌ£_ßS<Ž 2sÊŠ\Ñ „5¸ÑŽÈ«°ù`x§ùâ9ã·¹ä=ëh$ö8 ð‰³ˆ©ê O@ yôC«'YÉ mµJ’Ifºcu ŠŒÌ&+T†áÓXèÂ[Ej=?T`r¨3­Ã*ñ½ÿj ?ƒŒ,³¥`6UVðô¹³j6T…Žd¡„ Y”QîY}ÜIOŽdKÜömb¢‚´éÆ ¤Áy[Ì¢ò|ÀËÕ6lèU—–6 %[¶D^Vë¨Lò”;H«M³–:çA ¸oyЭæ)^CÛjh:ùÌ[Õ¯Âê€CÛ?*°A—vCë<Ó [­$›Dux×µ¯ºŸÔ$X/%Gyò†Îu\g¿Ö59¢¨cêd<â´g$þ´nlçk©¢ó‰ ¨_ÙØ«bT ¡zNœ@xV¶BšJÒ‰Oo¹¸= «]˜g …Þ]²rE<fèDHxÿ<Ž1±øÉêÞV›Ø4%Å„í¢²8’ÞŽ’ ™Ž¢ž˜Fól½+tÌHëæÁËc¢=ÜFHÔ¡i½œ‹ÈßD5áMôCrå°’½ÒÇ8IÌ–‘Whe)Z¦×Cê¾gG“QŠj\PöÑ…C !3&5Öåµ$ƃÛx]M©Mãúz<àà ´PG;Æ lYí’07T Ôœ[qº'eQfb¶Ò\NféLµix•µoä ¦”† šrÊZqäÀ_[ΕòœiT2ë4ïw¼"p¢#íÝDì @8‚QSC¦9Uóå¼öÛlé´Í–1ÿ’Ÿ+§¬#¬{Ûüåk@‡`ÝÊÚ=lG•]—ÐxýFáÍå=ÏW ¦<òµ9­½¡ H/„¶CxY5\}ÔÊe÷ŠÛe;×j·6(ÅUˆ Ä¡0\6“Ó<°ªmr@ЮÕFÑÙLA°ñ\º“°ƒ \à|ÀëoÊ’É>ç0q?å±õY|_{ì'T!$l€ €“å†èðV:O:x¾f&ülT±Ë”BèÀh¬Ç<†‹‡“ò„î,FìLo€²<) ÉmB¾µ7|·öf])ðýjÈÀåQG±ôÈÕ{éiØ?Ø0àÏý™Þ(+ †çóÁÏ›€ÿC¥ÏM`ÖÀ ƒÖ³'©>*F˶¼›?/-t˜ü¿W%$âp>®±|¼]³Uæd‰Ç7µ†Z`mä÷N x cÓvñ27„ƒ´äyµÇ9ìu:vFs 8~6}!4Y"×3jc(qr´'o\Ä4P (LJgƒœvƒ/g=fÀn÷}DÓn’|"m­Vw„–(‘PeÐD ØFOÈBOˆ=k0e(-ESb•UÞ÷h˜C¾‚‰Àº—w (seðXHã_”rA§q(o®§}Y%*HpP†x§ƒ»EBtp7%1’¶…-è6¢³Q§£Oá[ˆÀÿ`^¾åxø6vt †¶_‘BN¢Ñ…Tutsi¨ò 0zè„8xmaÐå‚LaCY“fg –[ëTeé¢cêålÐPàIgz÷D Fá2Q—²y¨A„]€,\Ððf_÷JP…pt ~gØF$pf‡¦‚?6tžT{Ç>ð °K€Š~Àj_‡iJ“(L0pKŒ5ðDSèF@àƒ`ˆfÆÇ.wb„‰¨,/Pb<`Bdú¥}ÇŽÐuTŠ|xoÖ†uUã…e…sxax–sÞ¸w(€SŽ#ˆª")lÀZ =؃Ôÿw=T>[äsî'²‡±¥:H°’´ 9 —yéf/Pe°;¸Šj´“¡D5éÒ(̸´HÈè5ëbn“Ö£éƒçs8„"p“òd•šøJ’"K´áŒÐ´sŒSÕs~°ƒCÓ‚•ó,‘pRåD1·ßÔs<9[µæÈ1y¦K,×5Ø?F@Z37¶—<•( ‡I– ¨B;™>šd)xI!F 3ÐFǸz=©a‹*Ïre•1VZsfYïcˆÿ¤lz# 7¦tIÐ0x]³~¿ÒR¹Š×SÏiZCNCqç(A˜&* f0ÿW‚~p€U‚wDr—> žÜ䢆›Ñå>‡)PLv§t~Þ&b9•Œ‰rw%Èi0e€ Ç7œD7wâ¤7ZœmÄeÖdH8ÈdM…×3IɈU)ܧï¶A?˜KÞvJ÷?R†Gé8´3=€FÙDtÀKfU!£VÑš¦EL%)\ň=š„C‰– ƒÓ‰“Qй‰>©BYø2#Šxx&oê#6sr€‰ wX_è’ ‰–vD†Oƒ3ÉuД>öC0E)OI`°zsI&J/а¤n$‰éÉn5£Wö‰<Šx¤\  #~ÿ@ަaÁS4°7ø?,ÄVx{1¨P¿Ê¤Ëšƒ¿w!ÐïJwBEgDá‰Êz¨îôS9¯×à PS#ˆº\˜Q'é¦pF,™Biÿ4 ËšûF™ Y2 íGAyŽfãqÒRÿJ²#E…€@7j«^׆ϡ°Ï„ˆÒ„IßÂî II@¦{hP< ˜¸7̃µûô [‡8'i€G3.KðD`IK!È{ ƒÐÝFêò¤á‚°a1k,‘"ni=ÐZ[Š˜Žû[àÆ8®G_/]ÆA„)—G.“•Æ‚ƒ0žQГû%@Œõ.Е”œ¥^rˆ¹¶Õˆå³HÃ`^"P9Ð$0ü£¡%{²pV<¹bž¹ˆê³•^á‚’©‰F;0’Rà@Äj,C^Z Áøªmÿä5@"P  &^Æ™C2 *Ñuš{—¼6W9/@HÀ÷KL°·1f3Y@PLÀTà]zGu¥LÄ\ó;.îw ÞǼ™z™ˆˆ°=p,õÁ)åo¹†Hš¾ ×ñaÙq¸k¶l˜l[¡¿I?®v6qö¥EÔnùBœøaéAÊ–I«ÓzVœq¹nšc9{»)°Q» †V(g£Œ^—ßI7Ó¹wʲU‡*† p/[¨Ð{[A‹˜¾Æ#¼Ænì·ïÊd ’˜“Pÿ¦Ä—¦ýu`¢FW¬i®VÅU\ȺÿR˜$Oðn(¦[Ð9'9–|ɘœÉš¼ÉœÜÉÃÒG0CPPÜ`ÙácPŠ ÜÊ®üʰ˲<Ë´\Ë®\% c@!¼Q’ylŸDÌ™ÌwF̦<ÌÈl¥Ê ̼k]åyÉ,ÌË\ÌÑLÍÓ|Ì×lÌÆÌ^€x‘ Íâ<Îä\Îæ|ÎâÌb€2!#pž$ÍòlÍóŒÍõ¬ÍÕŒÍ8 ,°)@•vÏùŒÏÙ\Ð}Ð mŸLÂ'-0YÀðŒÎ]Ñ}Ñ}ŠðEñgðÍ™5j;Ò&]Ò(MÒ*}Ò+Ò,ýÒ.ÓKR ULÑg€½Ó<ÝÓ; ¡@€>}ÔHÔ0UQ!SÀ4°T]ÕV}ÕXÕZ½Õ\ÝÕ^ýÕ`Õ7À­;rmagick-2.13.2/doc/ex/images/duck6.gif0000644000004100000410000001170112147515547017410 0ustar www-datawww-dataGIF89a´´õ?!''##99)*!/0'11(KKZZ@@6ffxxOOEKQGQQGU\R^dZ`g^ooglqktul}ƒ|ÿâ??þ::ÿLLÿRRî~~ˆˆ››©©¸¸ÈÈ××èèÿÿˆˆˆŒ›˜˜™•ž¡ž«« ¡ž¦ªª¬²²¶ºº¼ÈÈ燇þººÆËËÉÕÕÒÒÒÕîîÝóóîÜÜÿÝÝéééçööþííýþþÿÿÿ!ù?,´´þ@Ÿpèã…¸cQ¹<&F§’%V‡O«2;¤N·_)ô*$û¸e0”if¢ÏSó[®ÖÖ»wdXl'¾çn{XyEtL|xc‚zˆiŠkpD0.‹’~—^“ƒ‘f›}‡Œ¡ed ™œŽV†©¤>/(®¨‰¯§£µ«]¦m—8¦lš[Á„ŸqG±ÃªgÅž¿Î¯Ì¸¸˜ºM¬³ØJÊÚ‘€Û…„â༢´¹¥¿ÆÈÌÝÌ1/íÏãÙÜÆÇN<8Àþ7üõxcà?oD°€ !4(˜ÂŠ 1.4Ð`¿#â(làB†1"txñàȉ]*ôÈÐäIÓÔ‘ƒçî^þ+n½êé泜¾K¨ýܵîÓ:—ú¨Aã^¼¨ï°*%”[5©WÑQëI䛨¡šö½ Ëî\:¶øly=j®¹!få6U«·ˆ]²ÒŒŽ³vw/ß½„ò>-ìjß¿ƒ}Ùs»X0e–ñʪ+ÔkPž[©­ÌXñäË3rt(°#•.'R,˜úåA7-®¤â:"kÒ­}›þØ»¡Ãm—Þ=²¸ò‡Lnü¤J’+Dý|îR}v|Ù϶åûö2Ý›JçGý)Ú¢“±œo ÷Óá¸ã‹Tò{iŒ1f_gM)†Y8Yåƒ`déô5 hZIÃ_$ŠáW_‚•_ƒþD3ž‚·Ì·_b›‰—á-Z8Ýeþ͵áci-¡f€Ñ—"d!¦õÚC;òØãq¯½ÔcI;ÒVäH 4äD¾fdM"·dOòÆ$’Uâvå”HrùÚ^GQ_fæuFX…ø8fš`¢™&™…ÐÉf™kÖÙ¦_pÞé…gT7g˜E¬wf˜FùçšA"zˆóYsß"âh¢ŠšxàZ‘¶xâ¥F5ifBTªgb*aƒ6Z•ª€÷ÝWa€5:ö©a÷tõ”¤¤îk¯¦öúàZµ~ÅjcÃ~ˆXh—ZZj‰Ê"#g æÈL6FH—f¢Œ’Ó'šeh›†¸‹‚¹Óšþ×ÅÙD¶ip‹ ýœ+îäºÛg·ñn‚Ûº>d®™H\]¬é£kPÙ¤q‡pj*d–$ùOÂ;JlÒF–ô°lg,dÃNFÙÄn ;j|ÑžºëÊ3*»)ˆ  ë‹­²ØëÂŒª†ÿiê©´8m-Šð,Ë#¦ë}I‰ ­žTZë¬;[iÀ̾U«ª.(¬7ÐîZ¬Ö1ÛŠŸ®¶[­|í½­l 5L=6ƒrûj··[J%U”I(Aì·à¨Þ÷á)ÓÅ3A~±E ©†s-±V±KmŽœF“nÓhoä—¢Ëzv³;ŸžuÑlSºwþÚ²«žó•¼Jëy»Ý T¼ö>mÐOõ,£ƒl£ÞÆÐF|×·›LÙ`G¿¶òýÙ¼{´B_}cÆç];ïHëÌj}>[<ñÍSëͶ›^tlŒ_^E£ËÓá ‰Tå"!œI8w“Óüpö›\J ˜Œàp1Ñé ˆ›¿U®tð#VÕæw6ݱÇ|ì OËŽ<ox0ŠU\Å´åµoê ð8˜·¥•ÏAh[{˜·=éið2TÓIøØµ_A/^çëá÷ÐçA!–mf·jêÆ­ØaŠFÚ ËB½)ºnkÈŠÕh*H%úî4¿!ãDø8–œÑ8…«ÉÇþÈ›…ñoc·™ãÅêÈ#àÆI(Žßúøk4ãƒè ˜)Ö3”HÙ… t’Ù#Ù£ÈÙuÂ:‰aÛÒs&‚±{LóäS(¶®*‰ˆ”Ù 7Hùigz4”Z+›C¯1­iDLŸ+i$>%êR“.D¥,É÷¼£‘C<¦‰©>%ïŠF4feÕE§}1mEŒƒ—|²-uó›€ìÒ6Ô¨mî@ðf9ÁÉÍu²“œíŒ'ÈPö#oцþ‚SIÀ¤¥/ÁHKP”Ÿµ­iùäA4ÀP \ܬS·ú%oíÓBB¹µ-¿ì‰6© v ˆÔB ŠHËþ`Ò¡¥(B DJRÀ4¦t[i`:„™ºT¦4-éISZ‘z€¡ •ALyàÓ˜ú ©5m*N‹úSð¨?}jPm:Ô©Pu©WeªN}€ ”5¦.(+ ,ñT ¸u3<(«[‡`V³Òµ®h}+[càÖ¹A®(C_K4X´Êu¯}ÅÀ ÊP¾õ®f5¬[Û×2È®ƒ…, $‹Êú5®BfE!Jî©l‹µèc;ÀÌ]š¶—µ$íñ”™ÅÎ6.:è€8Ѓ.«•ÑÄ!Rnë»b w–W{"ö¼Êã>Â^íÓ!ו…4Í+QüØtÑå­|© N‡¼×ºòÅþ]s‘‹kúïÀ¶•®9™+¼üo{ÛÔ(ŠEidÿ¨ÒÈܤ`,Tâ˜I$ÇÑscK˜Q¦8¸`t”Mƒ{ä¼e¾6—MüÙ(›™a\]«ê°Qû,bóF§må3¯å¬Ô˜BÕŒ0WÌ)ØÉ°µ¥U[‹“©>hÞMšôåû²gJ^â…QÌ`A[׎˜Z!$ÝLL3I¦X‹|ƒ‰ aòïrûÃ\ÇÀÕh9Ì cH@·Ç47GŽ·Mmü+‘•$ÎpÛœ&9üI!ø"^m“¥6cyÃ.¾°};ä¶Ð„L´0[åÚ^Ïš°”ñm—ˆdþC:í—+r.¥§käA‡úeC¾],¹Ä’Ææ*1¬âZÉI¾„ûúì½åÆZ>lF‰#w¹ÜÔ¯ÎöÛß[ÇþͦoÅy JLƒld''–7Á¶לŽ-ÁýKHóú×¢(a,GËKî ¤>­éTªâh"Z1*ôÌJòõÀ*€Nð‚<ì¹E­ãO·wºTw8l€< p@D0‚Ž‹ @ÁUP^ß¶ûÖ=ô4«Î5úÀ(xD`‚Øüæ8Çy @@pYŒ;å¾fxûž}- 8BPóœ;ýé6'/þ®›Ï·˜ L*ø?Å©Ù"a6ðÉ$üX€àL‡ºÚÕ>‚§Àp;œ%6“ŒéyƒsÞ\àŠAG †‚›Ë=zF ^<7˜ÀÀ @‚µ;^í&˜:ɉ`xžÚ[ä±#£Pùí²ƒ`¥k5q§µƒ˜@%x¼êÕ>u„È´óñ¤=Ìï¹`à¨_½îŸn‚Ë[y9ìñÃÌ×C@ãwÿt '*PiB‡[š*§uÍò†‚‡€ùO'ÈŸ¯z ¦Azsm;ûDÿvu;( ÐtðßÜæ€óA zé«ÀÂa4zD÷2ã”%#%ï%@òÞgþ9ÇsÏg% « O h€L¢˜$ SOåütPî2‚e'bò#0p©ç€6×vóׂÒ7«·Q_‰"(õPþ$‚x²'fâ^uoèfiT§WöWS4xsmׂçw}‡F[ÀäL˜Ffpà‚'` 0pü—sVÈ„k×v(•~#J×dKôhh°"÷}.h…°lhsuÒW-ömÆ…+‡h\°…öƒ°|Ogƒº'}ohk¹ÖkÚsD¡Â‰ÌW0p"àx¥¨{Η‰‹¨hïge{-Ò¥]ð2_ûþrù„~&ˆƒ˜sºˆ;p‹”7‹Ò¥/E§/×Õ/ÊøyyÒƒqBNöÕ_÷u_Ov<  ‡ÌLJ ŒN7º7ujÂ#×(2£f1%Yb„Û‡*@~Ì'} |»×‡º |GxˆPse®x4`Ž»‡¦È|½7†ýlEW€µÖŠQtGŽNgè u½ŽŽw†5tZ¸iC3kì£x¢èxÎwzT8ŠP¨z½Ç•FE ç…Š(k³eþ¸zOø’Ì×v”¸vVÕçjöfcø7ê`q!ybH†6ç|3©vg|@ô:ƒ(þÛ–G¡“fÒ¦?ÿÀߨ{#I†f¸‘U,P8g¦ÃA–Ç&$Ù¶F‚Ó@rv1É|×0p»7D©{|è‡×{ðgõX}æCœÈ I’ÑG©{’x™jgƒNe=:‰…¨v‘&g}UÀ‚¸{X9Š¥¸‹ª×vÐ…B\ì™iƒ)Ž}»·†jé‹ ©–×yWa yií÷™âp{šY’§©zâ8•9WŠ4`uõ–“LI‡–Bàg~ý'rüÈ|gø(©6ÒÙ˜3ÔÊ1Ì–@@à7uŽÇi ~V(of–ýã8éI:eÙlùE@[¦wÿ‰šˆDZàþˆÙð)’éœNç| pÒdë·I$ägZ”§È|§u1iY‰™ûH0Fç~–ö™«V›t…éxø¨sCé‚0ø{ã)h›xJ¿t`ɹv½—†6g6XŸȇò6MÄÅ’´·d×.J“zØ u8 W{×¹“Ú×ô¨J`àˆ”Y™4(‰#Ê|æi%b*šˆ>±l&Ãw^‡—h¤‘ P”@Šh• ax”g„Ô1|D$'c9~¤F%ƒgµa§†¤I[¸7˜ä ¹IpBº‡Gš oÐy‘„¡ß‘J¤‹þq¡Ás?Š¥}x¥"YŠþ°yÂ9ž'çdÖ¦ä©ލ£h•'À‡eÃcN¦“?7€kc^Z– ¬—(r ”™ÆˆJMfh³i ޏœÎªv%+€Äʤ(J®Åg¡9#0ðžÝ u%P¤Z<Ô‡å ›qÈ ã¤€ð´_éH÷H°ºz$°šP_’%IB1ê$O]¢€¸°â¤€ñ„唳^…`(i’}ê¬Ip`°µOÑu/µ/UP]u(#è(Q¢ƒ|"]ʺD ùž­š˜!ð„ÐØ…¬å)¦¡bíGš‚Ñ}h˜¦OW#p†wÉ6d­Y³+ºhXD0÷HpþÐ Àq ã7p€5°cÊ•j_ |¹bµ©R+W· 6P©ì3µJZ‘´ôaMô ­Ç•pµqÇ~ƒ¤g v58K=´Å|)9ŸYÛM—ÝK»øSIòÝ·¡.Ò]Ø^†&zÃÔTŠU!‹þeó݇–˜aã^q£uÙ8Ebzí(F;öXäŽ<"þ¹’})i$ŽJyc^L>™$’VÆ¥$\BJye‘:‰¥a]*©Æ™hª!FšgšÆ™'4!ÉÞ ‰F"l®É&olš‘FmžÁælªY¨žh’FšsªÆŽš'›Šö)h¢g²g¤ˆ¢é&£62І¦ŒÂ4Hät³aƒ0^÷›š3ÎTŠ-þ¦_WµŠWAÐ8à­Z¹Š "±Ò·b°Úz¬z¾æâ[4K wö ûÔ² ’¬´Æ8O±‚¢µºY˜+‡æzî¸É ì»ÙR—±ÕBC§E$½ˆ¬´ÜbØT®ÿÕ+-¼ÊÊÒ'\WÂëÅðNœ@Ãxþ¡ñ°'Œ†olÃ£Š‘1#k|F#7Üñ¯5ò(›FÇ3ƒìpË"SsÂq¥|Ë ßŒð¨ëì3H'½±Òh¤!#I;-PÒ›¬ µÅ^¤Á4ÆJ;}µ †=Šô#bhôÏf'ÍuÔO3mcÚw–­4Ú[3 ÕÕM‡µ]pŸ ÷Ò]·­´JW­ÞþkËýŠíƒ³¦Kn¾’·på'ÞªL>Lh+«û¬/¼SN­â“ÇW0}š‡žKìò :³¢;¾ú°ßÎ༤+¢îŸƒk{·ÂnøxŠâÞ¾ƒîpz±×~úô®¯+¼­j,šý™a ©ýÓþgjªRH|žá>š^x&øiŽf¦ƒ"ú½öªùfüèŸyþöÙSÕоõ©éRÛ“Ÿÿú§5=á/k{ÚŸ§úw8 n"JÜÑÉÈd†aHN !’¼´$,‰PL(´ÑÏ8h£&™ð…;òÒ™DBZédHZá oD"Ýãr¸Úœª"G=ÚчˆÕž¿„˜ÞEïuÎS—‹0'=]oX¹X“§Ec]:_Dbª0:xkøÂþ¤D&z‘x–“ùÅÔå牣8ÁF‡Çõ+ˆI|Uãø­9nQˆN"q‰Dº)‚@CsÊHR‰‚7´MþA§DBj‘šJ†¤¹ÈFy t”mÉH6ŠâcÞˆå'c +Q(‚O›\-µÉO:²…¨™K\ 3ä†L”ÉøÒ£¿H†K€)&ši2\ÆFƒÑR6;SMhö(›©]#Nm©˜¨A§1IÓ¤»<†™êæ\<ó™!é…Lkiñ¥º.ânt4c?QGÈyõQ]â´Ù¼„ñ îÒg¼`1*,tŒR<_7»‰–«ˆ=£?‰ò„,  M¨ÿyEãµt9 KœÞQ ^4¤|Dccú+‰–N¨JßÈS„ŠßAš±L˜É45«Q _œþ†Ó”†˜Ó T÷2ÌH2O5&cc«jI O• CÖuÎå21 \ØjVʼõžoñ©ï"‹äñ£7Õ0¨qTëQ¯"‚i‚tÊ ,8ô¢5cd YÔa±±°~<ó*{­ÇÒ”±”¤&kU>½ž+b—]ƒ‚~ªÔ¨œ]zÞS« ìñ±PHlMXäu”µ¢l²pGÐZ" ·í-À»[¾b¶ N”p‚tb‡_‘—\x#îB †SÚn–Æ‹Ýab‰¼àÍ®¨4Âòf) ,ÄK|Op‚) ©PP)”ŸeÊ3A–|Ÿ~ñÇÈNú—Pl §Ìßþ‰ •iêÔ™ø¿?% –iBp„E)‘ Š j¡L›Qz•T¹%ÞéJý8T–² F nD=[‰4è£v|(oÛUÆç6Ždh}=!Ür‚ 䘬JÚY7¹@‘`œE{Š[UhVÉmdòì êRZõ§ ù)À~›"¨à–¹¢eF@3”†$œ€¸{˜Ê&4„d%ÚÉR††ši¬Î!{Yžñ3>ûyh€v™Æ0ŒÑ™fEKØf2Gÿ™f;Á¡è¡1ocCYáÀ€75ùipr;[Ö˜†„)®Ôzßæ†¿‰:j3sÛ©em5Uÿmm¡†õ®ß4k_þ3íÖcC pµ·í­×I#qŽ/JÝÔâT¡èZqð|Üc•Áû¤²“«ÚÈFÛî"ó¹Ô]âl‡£Í'àA¸m%m0?É]3”ËÜbWƒ¾2¾¶³Œ[,ëøµ?nnÁ×0†Z\WrtËÌîi«XËX)ƒv`pQ°}ö0þXÁú€þKÂIئDàïÚk`¡²r–_M0ß^ºÇ&F‹"yÎÏ$@!ç` µ¶ÓûDÁ¡=‡è½Q¦²C÷Úè 9€‚–˜_ïªwë1ìz|Á>¥ò—ëVï }ñ’A!=KõXƒJº àÒKáÊ"¸8;n‘æþ»ŠL…(lÜ„‡Çö¾ûÄ[T†#œ@ž;àW”…2¨y‹O¼»O#T` ™ÏœgC?ù—†ÅÅ›„,zx.+õ<–cmÀà¹v÷º°ï†¿|ð¿ÓÇ–±ÄÓ&YñÊFœr“Vdå*7‰„ø·À¢\Ã,+IKEè’”™|d/9A}äë)—ý€¥7Òàx”!•‰\¾(®üL˜ûþÀæg³¤ª«^ÒVÉ$™ÊˆS.åÄæÖBx¡YUOdÐLÄ`uëe€öD€WõwÁ#Ù´Uv1SðMó·$¥QNqÁVdrM†aMäTL’GT 5I¶gd±R{ ·xíþ–‚†U äwYCtzœWzpÔ>„)5ˆnEÖwCˆqK6oéfB¶¼ç.Уwç{¸…'Yh´-÷T€y‘Gccñf‰×zR¸yÛ°aq·7cF8E‹'dbƒTm¨QEÔBpGb¤·Tq5OxµN…Á¦ï„V‡qrL]„XWQ_oW؇wq9€ªˆ_5WVÕaÕV¬áU¸ Ï@[‰U V¨8Tp3Î…9÷²;¯XDW X®UY#2z`ˆi0ZP@[p~Óf† —ihx{.4èosˆi@AÐÖxØþZ ‡„ÐŽ'å „·ƒ¬£‹p@¸.Y€0À.0ð- P×AàJ²7]ðyTø+Ë(n¸È h¦xÈò'0ei‘%€ð5p8‘¹‘y3רmBYYð'®§ƒb–bÅà!pØi Õ À5À‘8™“ `öEc°šeŽ.†wˆvaW%i&dg¸^V@ר7©“V©“/`=à$ÔåZðu6Ôu6$BLéH²Vçe&…Bah"2 b`3×a& 6!` WÙ—Vi B&N3þ\–'ué`˜—£Ä>F)Šù~‘ÒŒÛSe0‘@3à—œ©“7Г{4Æx…;–’”‰ECeÖ(4Й®™“6`B™å/Ý&ƒ©çwDØQ;vUp02ðš:é€~)pýA†¤Y_øŒ.±Z‡€ÖÈÄ™“2Àœ90ŽkhSD‰ifw‡·’c°ÐU™Yp œ©œAÀåù*i+rv2+iœ–3ž¶3„f sÆ0cIpð¹‘7 Ö˜7@Ð p>–†hö0kgZh Ã1%* Dó0ŸÆ4HƒlMþCjº7ņ4t£4Àö&¹f°™š‘Y À£Ê Y01ÝslLã5º&6Mc‡c£NŠ47ʤ{ã&T¥Lsšä© hà0Ù£3Г@¤™•<ê—,ýÑ’Ïé†úùp\TüY]ð=Š6€Ö¸cª‘múž} @\ý¹„ÏX§»Yš‡Pp¡=z+``9¹0¨}0Îi§X´ûɆ ‰’„PÕè=Ѝ4¹¦8i¤žz•ˆjQ‹ÚeFé¨H¸pÚBðJ `®z•ÅêšÆ9!©ø¨³˜{‡T(<@` A-‡sþè³(ã>’‚zz¬Äy`)P«9àšœJNsr|‚?ð“@M'aô@ÜZ­î#tk‚?Ðve§AfY&éµu Ø™-``¨WÙž®Ù“_÷^JçSu+±gù4Ë¥Xè ÙÕ(œ®yPi² Ÿ))FtʱÆB@Jœ5žj®Wi²ЙÊ9£ê¬rzªE˜ª£ãÖ¨©) ’‹³}YÛ™€ÊFã¹ee³š`ª"p¦Êª—­ Ÿ3¬œi²Ð{èv›ÐzŽ: 2‹²˜ZÛ£ :œl ›õYqšww I‹„IÃWJ&KðWþKÉðŽHë—:Ë´®™°]›³Ïa±´éÇ~Ðw|{}ù}ÄÇI»4}ñˆ‹ñLL‡!Npµ$ädEð´é´û 6G;·EPOþ×ëÒtM¨ LÆd¢ëÒúˆõô÷GÖˆ¸8ùµÂ Ÿ7Ц'˰° „†7µºÙ«%¬Û™ˆ*·Ä «@¾}i¤ YRø³ •‹i;Щ¯iœ‹Û™4 Æêšˆ*ªš·vKªC‹›±—/epœÄy©…k¸ãº§ÎË‘± ÁQ›¶˜Slµ¯@X оœ)»Ü‘ ¦ÖÛ— @·ÌÐ¬Þ Ñþi”ÜÂôûšàyŸи|Iœãê`Ô¨‹ ;r几›#w!‰È´ Ù˜Mk³šm ØÃtµÇdBXWÈ¢ŠŒAŠy +¼³ÄI“VyJ« ¼µ€Häv’Ï:ZeûzB+#[@©e<Åɵš•ÀFºJÀýU†† ³hZ²Ý‰“2ඉœYãˆE;Œ…|‹@»2[î›ö©‘6`¤°}Ú¦0É1xQ¦¨†˜œÂà@EˆLœz¬–j°ÆÄ ’ 0Á.›…T{É££Œ ¾< |ù£ «Ùyàùdx¦º’þWɧ€”8òv!'KœjZÂ`Û§_ & _þ±î%^رÚ|_k9`æ(†&A¡ÀIœÔ[ŸÜ—ÔÛŒ—óÌ=‘R@Ö`¦¾DÏ‘2­ž’˜mA|"AÜ— I#üš5P¬ À{r‡Ž»ÑôrÀz\²Ì ŸÔ»Ž)†ÂäøÆUkz¯8ÈܧÄ)3|QPÁØǾJªð»«eó'üÂ4Ý—ùkò¶½.ب=Æ“‡kðE¼Ï:ó %ðƒ-}DeøËÈóŸ‡fg(:ižF g ôõ‘ö4©ËEÅ ! gàS@Öœ†¢Ÿ6¢aþ)c­×Êh}F1}ö×"z4Kê¢jkWê6¼‘4d€]ð7lÎE]j$`J³R`]C8¨6¥}7ip£‹ j¢ÍkSZ£Iã¢i£ƒƒ¥HS5ñjГ¬2[Äœœ5ÀnF`’íkÍÚkw¼ª„iÐbȾj ט4ðÁ7P/¨×X2v¶GXÇÿ+Àt Qnöµ0ªi3 €*à/`.À0ë½:Ë20„¼Ó/ícgÐzV  TàJË‚Ùn¹êÒ÷Ó‚ü&£-Áü/jP[0S[0þÖá«àx±ì°LážE˜gâsùãaëcS@_T°@$@ë“t?Çt8'a±=s¦&ˆ¸„­l²s0ÎÐïcsú:(l9a‡b­7—&ôÃt[^b€K@u t±ØÕgíœBƒ±nwÎM¹æ7dˆí%æožæBwc‘Ì30,M§È àaüßg%uš—yJ…;êfå oÎQ}%ÌB_›%;»øñàVèYÞÐÉmãí æíâÒéì0硊Úi„úÉ©–²ä¨¡x‚¢›{걓¢t§Jè_~ªŠ7eŒ! ‰!~ˆë.Ø…*&ç뫬^”jz°R×*„Âò:¬vÈew¡®¿"ˆ¬«ÆÛ]°×jX‰YT«ì¶ôÕjê± i{âƒèÞŠj‰å6[ Vex‡¡°Ü›n΂hцîšÄl¶Ï®ºï9¸.°ø¾Ãì¹+8ßÂÁŒ›¬­£Xȃ$üžÂüf;rmagick-2.13.2/doc/ex/images/Button_W.gif0000644000004100000410000001170612147515547020142 0ustar www-datawww-dataGIF89ax÷ŒŽŒFŒLNLœ,D,&$L $ŒD¬VT,&LbÌL$Ìd\&,ÌÎÌljl 6lL$V¬,Üjl,L4ÜlD<64”FD,¤T.\rììt¬®¬L&$L Nœ¼,T, nÜìîì<üztl4,&\<.,l,$œLÌbdT,äll64|~|Z¼ 44œNL¬ª¬F”\^\¬<D,*,, jÜÜÞÜtrt>|ärld4üLT<¼\ .dü|¼¾¼bÄ4< ”–”TVT¤L<&$d,”D¼^\<*TfÌT$Ül\.,ÔÖÔlnl  6tì\L<><”JD<¬TzüütT*$üþü|><ÄÆÄ<\|<,&d<,\< R¤räLÌüz|<| 4¤RL2d, Ìfd^¼J”¤L\,ìl<ìrl!þ0Creator: PolyView® Version 3.62 by Polybytes ,xÿó¸§K‚-*\Ȱ¡Ã‡@œH±¢Ã$mØ Ü8°„œ5‹žŠ1’d “(Kª<9r¥É•%_¦D9s&Ìš-eÊÌ3§Ì'B<èÁQ`Op²\º³©Í¥7{2•zSgÕ˜V™:åiò 9{l™ 5«Ò§g£6åZ–lÖ«f}b5YFŽ %¨ “­J—€•r¥ê–&[¸ˆÛÊ,SÑ<58DÙ+2îɲƒ//fü´ªåÀš& zd{lDY­âPè·iEo^<{«íÌ´1ûu;‡ËQà'p(iݶµª½]ÓrlÎËs·|b$äÕ« lqûòçä ¿Ãÿ]Ûöûq4gÎ>û–2¯[JßW~çÐ¥uÃÄ-=mëaÇÚ92PkX@É‚ >°`R!! Rèà„F!ƒ”Pa† ~¸ †#6Èa‡"vÈá†RH‰ƒSX D_>étÈz ' veˆ$`…wi EÞ‘$‘BÞ!$’LY$”EI¥”FZ‰%”\.yä–_Z¹¤“bZ¡†ðpØK ˆŽˆ@ “J*‰¤’Q:If“Iòy$žH ¨ÚYg¡Fâ9eOJÉè M"*hxx7W 7Øk9å—ŸR)£–Úe¢ ‚úi¨¬î ¨ª¡–ÿ¹è©ŸJ"Äq†´é&{(±ƒ¢[&¹j“©¨¥’I¨¡`¾ê¬ŸOªl²y&KÂel†)Žšf§À°ÖR«è«Wr‰*•«‚z좪–Ynµ§®›'kÄG’®»Fq€§Õêy.»ÑŠy¥¡³;í±Xºš¨Á¯ºlºBjV¦9jz±Íþp—}že¼wÌì¬îšª(Ÿïš' ”ÔØ¾»ÎÙp£B†YóÍ_Ò\­ÍCâœóÏ?£üqÏDëôÏÊF|Åš GÉÉ ×)õÔTS-fÕXg-uªZwmõª” ³›O'ëõÙR߉öÚ²}öGj1Ó:êHɱô!ÃÞ|÷ÿí÷ß~ëý+znøá{ë]dÞ2ŽøãËð+”AØÌ:®VöTœñÈç ‡.ú裋@…®úê¢c d"°.{éT4*q`L¿©¹¹T8aÇïÀ/üðÃ;QÇ„¯üòÂÀdïv ÂüôÁ;A…¢-+†ùjN/\‡ïÔ‡o‡õwh þù0( ýùÓ[O¬ÜNÑMv D®Ï¾òƒŸüýÓ;Ç÷üßñ6ï,el›Ó¢@â Ð| žôìƒú/‚Õ;™àgù ènXêÝ~7Áê„ ^úþç„F°„lRت2¶ölŽH ÄàÉAªðyŒÿ­g%ø-ƃܓY’ì'DÖÁ ”^ #XA0…üû’T9©Ü+@º!DELñ…¦»%~°„þÎ?pEð4Üo‚.´ÃL%r‰« »Ô œÁŽX<_ ` @à ÐA qÆó ¢ÐÀtP$B¦€*9=48Á š„±fH–æˆ\sRþDKŠ!ÏÂAH9½GüPÈàDR g DÔ0&¥éF~™»›Á¤Ô‡Z†O߂Ց Pþ}aƒ˜“nÀËàùòz’•RCì”íYD’Áîá)I-`ú0ÿ&aIêeÄßï°p·Ñ‰~d 4ÙBƒ:‰ 'v(¨¡ì{„ æP)Á€yƒ¸Á¯dE4VógÒâùö € ±*V2ÊO’&ŠX]^4x°Š4 $­ü Œžï°œš£HЇ|–SŠ„ÐÓ¬ô„²;ä”xƒPBΘ­;< <¹£€º·RWÝA ì‚´Õh) ìËÂÕÆ4/£:˜pó ng©“5 ‚LX»H ,°/ £:×ì¾3<²côóàª<L‚¤§ªœöĪ»1ª«Ydûq=úùËIxªðR@ŒõTi0,ñ‘¤ÿ™ÌHFœÉ_ .µY¡¨÷ÛèMóÔÑŠ¯ZXRdÍ–ˆå‰à±í­IS‚R8ÀÒµZRRsÙ'•Š `ŸF&X$Wy>ZO¥”Мü„SaÙWÓÒJ² _iªþÞÆždа’±Œœµaº «$øš;è×§ªy¾z*K¥ih)ñNhÁ3¡($”èßOAà ìCC$.\¬;ìàªÔÓ(–†¥Jp 5ón³X)W¦T¹RÕ¶{>Ø3O©ß KÕ…YaŠP$ Ðäi]8n^É{];,2Í÷|+WžŠÔʆo ü‚ì‘"aÍߥQÿVÅ*ÕtUÒÎî!KdD -ûœ€1s!é­ç«V–0hxx³¢ÍÅ×?r«b„¼ÌÄXê‘ÖÃVJƒ1© á™rÊÃBmû¬Üae¯• v§ÈL«6(}-€é4sÒZS"A”‡Í‡”К­‰sô4½R«I’8tø,@'IA@÷A^ÙE…nï¹È2—˜Õ8›íadz ëÓ¢ÈÀöù]ª’„™Åƒ‘ê’@ïpûéZ„fy[›R°–@F$5¸aÏ“ƒ T[¼Òºëùž¨ã,(®}‰Ç2ñ¶ÛÖ®=á÷¨< °ëûiÔ»Eª5ñ€ƒ`Ñ•£|ÿ} £ß#­Hdhóò„{Z+—ƒÐ´êmâµ;eeש{ÌÙ.øÝM‚Œ©‡„žÞA t]O¬< 8ì¶“XVV.ÍIkûH7`Ÿ¤õ§,4бx–Ħ'êõòJsfIYž]½º6¶çKÁ MK…rpÀ#”ç„Ì[dYWË–U0•…@æÄ¬K¥e§XçZZ¬ò~Þß” Á»²ÐN¤³¯zÝ0‰ S]Š¿³z,ƒÜl.¸$"†o‰±ncê}PHªôý‰-iaí¿ÕÜøT ɤ<ñq¢ê_q-J‚¨ð¸êðàDZšŸMÚÁÿ”·Óì¢j½Nº½_ÝžO›«…Áíðˆã5©È_§Ç‚>unó##(,f0šå2(Ew¤weIbzÇ%kB¢zÃÓá%> ,؇U‚YÍÒ1)§Pìgt·7®Ò$½7=M—$=·ZpÔó\x¤¤|Óy¬r$CG]©àæd}vS(>4P'uoÃ#„Ð}Ë“%$c@~g~å(_¢uGôî¤1Ÿ5.«Rmç#; $øD<‰@K·<¢F$ÜTYè–mþä'q÷Eù’RƒEcÖ2áó0e'ˆe@JN~ÃpÍôU!}à&/43,?>é3„×6h yÂC>MH< Jö„t„ÖhØ-I.‹ÒL!¤‰Ôã ¤”J€–¦àwÂÓCX ç|VR@V!}ïTV=˜4vH=h {ˆB}ø$¯>ƒðd@„Â3e«ÆƒW%)·‹w~ÀBvPByD=SÐf/•$†¶Ë3iÀ‚Á³_)ÓŠX(*7Hg©FVu4#OØ–÷;0pYHÂfâ#¹8<éÅ0Næ%@ÖE‰,çac,„Òw¦Ê×/QiIãƒK•I—î2%íeÉŠ6z’r$2÷³Seõeüƒ¶†N¥R€DYtßÖR83D Ôx?þ³2¯Ç?OC—ó¸KrKDW}ÂÙ†yG²Ç'‹ÿmbù;“ie«¹UHÃ2jáÎòkÛÖbÇ?Ð;§$/@p<.˜ÆfÁu'dGC.ïÈ?0ÀŸ5Ÿ÷ƒÄBWèÖS]2”=@ …˜ –0®Pi“È$€–VЙ5×bØ7ä! cw³i$>p?) ÃE%'v?2ˆ…UR•;)Ê& f7ù(X×UHòù·<Œ`V(KI=ŒÀSI*X(}¢u4±~‰b¶.3¨2 €›Ôã Íô*aÉ>b ” ™…Ò•*F:se—¹`:=ÒÓ‰/‰òŠ =] dÀ7fB³A³•؉¹.òrZßÉi5ÿÅŠEÂ…â“ßnW'iéÂ0ácÖ%‚8:0£‚1x>ÏerÚ¤Îu:,Jj´޹•ï¥.¥¶{ `Þ'†:¦m”ˆ˜¡ûh2z`4”ƒœI¢~Ú™ÄR£Ã3AÄ“.÷,}`ˆÊ {ô7jsÈQPø3¯I egF—÷yVÒ:pŸ¾ E?p–Rƒ&Y.’F„p¥/¯¥ö¡ó*žN™Ìã2Êb'y$µˆ“}Ð/ˆ¢€ ˆ1 ÿ[#[ƕ韠â0ð³@´0€À$Nµ( ´J;°ˆº³éJ}>zrè§fS¯:{ÚÖ0Œ§Œ˜¦'G Óô)Žx¹w'&»µmhVAƶ¾%€AÚ¶]E¥c™ç¶þr'˜j)êAµÓGhB†0ÚÁ$.Wû™];¶fCŒ¸0B¢’6Â’`ù•y›µ.Wo%5™‹µÚÆ|QX.™²ù"6P|á8o¬X{-«¹@÷uäZVŒ¸`Ôù3xøiØQ]ça‰ul0i2y•%«?ùžÀk¼³6‰ ÷Ö¦«aE;fk;¯õh©Åø«ˆÉµt œ:VŒÿSÐ6±rÂ1µ³oêɯշ®~F2_ç¾5Yé"¿5³¸Û·cµ)*`dNÒ²mV©¡,…LQtBÀœÀRe•c J` Y&bØÁˆÀ”8zÓÂ# <Â$|Â#œÂ%¼Â,¬Â(ÜÂ,üÂz# ”pa PÁ›!}MÓÃóÃ>Ä@<ÄB\ÄD|ÄF< 9L#/¡qøÄPÅR<ÅT\ÅV¼Äøq]ºc˜HüÅI ÆbÆd<Æã, ¿—1D™“9VÇr<Çt,ÇÀŽ0yp]ìÅeÈf,È„<È@\|A„vd*œZ <"42,¬b\RDTJDtþtl> ¬®¬Üʬ<~<|J T2  ´¢Œ<  üþü¤–|$N$\^\<:$*œZŒN \J< D’D,F,*$dÒd4j4$$6”–”,^,ÌÎÌ|rd$4”V T®Td6 T>$|~| <.  ìî윊tlfT¼¾¼Œ~lÜÞÜTVT,:LV$4J$|þ|tîtlVD¼¦ŒTJ<,&.<& lnl̺œœ^<2,„J $& L*!þ0Creator: PolyView® Version 3.62 by Polybytes ,xÿ­˜‡š/a ü¢p¡Ã‡#2L¸°áC‹)JÜx‘#Ć¿Yƒc É/@¸"%†KE.cÀŒ93¦M›5oά¹§Ï—@o *3¨Î£Emj¸Ç‹“xiI”fU£H¯jÝú“'לXî1åd¢$?Ãv ÖêZ·AÛÂÕ*W.Wšw²„1GV¡uçzM[ÕnϹbߺ=œsp Âg‡zyi¬® æ"3Èÿðé§ÌJB—{Ɖ#~ÔUjé &v„§€Ô:k ti*QfžÉ Qf ¬4 ¨ÄzÚ´Q:º[ rb)\\V(¢æ*Šèº‡¶ë.»ížkh$´H§OСì©~ W—d»/±Øû)¶¡œ°Ã³†Êð±@4Ée®pA*)u”F @ ÖZlÄ€ŒÌ°Ä-@œïÈë«­ ŒB¹ìPÍzø,Áž¬°Ë)k˲È)‡t¶>÷Ìr¨·â —•söгÄ@ƒœ-Ê;KÝ2Ð-wj†—3oا³ÏJûcÁY­3¶û0ÃXOÜ©±+­ëœ’úÚæÇù¶|¬É.Cÿ½wÛQ‹ll§Á5À~7”dGõÐo£¬3­l³½·Âodॷ^AšeÝ«=õãS—mõå¥7Ü)̇3Û'–ÁÙýdã|¯<ëÙCß.qí¢ë.tnlþ­KžoÌFÇPžPpɦßþ÷óŽþ<ÕIÿë:ªÓq;{Αçîvó(‡¹Û²w»4¸WÒ]>‘Ëm¹É‚¯?üò×ßÂ[¶Nó×K²±øö¨«]‰V6½Q eO A˜0fe)v£ïŠ6@ÔUð€žbþ¼†*á¬oHóÖ´Ešð„(4á,°ÀóïsRû&Ö‚˜ë†8Ì¡« ÃîpM]»IÍÿþ$6‘í`û°ìÄ@×8=È»[kÃ%ZoTÎ ˆ*ZÑ|ÚÕÆ ¥>N{_ Sm2D> kkÃZ¥0QPM¬I¸xu68—É‘+rÁ#hP†6üH¨W*ІQº€… Öo”Eÿ=rÙ*C ‚´8Ð`$ÀžÀ½cì ` APЈXâ)7êŸÓ’G6¡AE@!îå=÷¹_o@C,æÌ ‘6Ó¤‹–·/´uñKpL2µª{€ ªÐÿLÝQH–ÊEjËXžªÔ#@̼½-gyƒhÏŠ-2Ì¡Ÿ@\¤Ÿ Bz¶`A¼÷8ñ}Oaûz hðO€}Œ5yÆ2,ŒAjVóÛåΆ;   åtÒ,‰‡N)‘}\4 îêÇ·Þ™´e@P•F^qL-â¤ÁBVLÜ%L©+{¨Ck4©¥.*ú:„¬²¨š+Sx4cžTbaPZ+ùRLÊTŠRsXISHÂa§ØÂÀbÔ´j4“{}k1sZB(€Á"àaÐ ƒ ”j4tê1çY´(~%#ãüZBáB8B.5:ÿ`žSLR€™=ö>GíèÚ…'˜!ÿŒ‚  /ª!Qu{ÃcM¢~?nU MŠP 4À{µ€<«[kF/TE¯PëFGšMoOø©|t4ÔlÃ0Ý–iVU-iè) ¨wHnø(ˆËݰMXïõFŽÊð³Çz‚öš©˜¢%Œ_7[LÒ¥skÈ5SBá¥U æiÞÐö­ çÔÚFÊWHÁ}=Å\ôwHBØj7O‡é¿05^¤²»"7D"ÀH[v‰ Åéü§5"ñJ¢²‹p!4€ÿÅ]:Á× bÁ 1®.LmöW6¹!xþŒ’#t;>•‰êÈ-:óudaJ"RG3äžÛ·}%ðE—‚²çø¨æ?² ž`R=ui!)ú’úq˜bÌ" Ȫt“ëÞÂZð„G<¹¯»Bu§YÄja«n‘¼c€A±ÂqîBš …h¡ p˜ª—HP4 ©Œ†ªf‘¦s ÃhÍ hÂM?U0 ¡ 'èuЍ}2…Ùk¥.ö„ÝÈ'Í¡öæ@"u›ˆÚ5ÚÎ$Zë[;Æ<`°¦T€,\KÄÀýG7ü|œX¼}têcÛÒIâ5¯íRˆH›H±ÿÊWó¦³ DáÖaÙt·„ˆ,؉”qïé”j”÷QÌ»N» B£´7Gõ¤GÜW°ã# ˆÔD6¦¯j>AÀVwz †s"º1¥omH]ËÉ !K¤&l9m ŽXN,$ ]àúµZᨮ›ò¼ŽÓ(²#N4hÖ"T§Õ j‡Å”oœF=ƒ=rZOí¬ à8•5Òë¢àk©†]êÁÌÐkª]Œ3Ò Ø]ÒŒ+ñ˜.dåÔˆÖ¾ð2ÚûÞã› àK…µÄ¨ìák=þ«BkÔí-¡ œ ÷QøHž©ÓŽ;xÂÑÆ\9RçÏÌjbÿözéÉ^{j=RdpO¥BWhf€%ß³GÀÉ\×Þùèõà5QôUžâr¾5a`“m.$wvÕ €g0‚4f@”fh,‚˜4MDR~Jå€EPzuH²7 ösÄ3-ðbòG$'@·ZhæAêv"ЀÁæ8€@30Ð3 J=PÀT¶C5Ú‚f@qþÅ'ÒDpF$³GAuõPó2Ð…](LàxâCfÚbñg=­Ñ{ ø"!µ‚øT^euÍ5Y%dào(Ò|7pRÖGýÇ"ë×€úG?„Ø6u_50h±·"³ÿd%Yä{QBhPXAsWÞä8Ð5r$Bð‚~¨Çh^2a°`&TWà“;Õ—|x\v’vV‰6G!Å\†_ºè`¸cBcºÇ&2ˆÏׇ»¶"3  0dp=t护fhwv!~>v'àB ¨ˆBШ%ôð‡@ÏDk×g–2‡`h@^„5O`„_´,ƒQ3豆]2p`B6¤ `óõEzhχj’øEà4@æ¢"P/aP/7t@Ši43`‘$°ÃŸäh*é$92—%0n+9“¨ ŠRÿÆ1p@“-‚‡]Òz@ÉHL°E$y†„”‡¤”±Ä”ÚňMi‚L9•PTE…]‚G“>&406ò’K2mЕ<¹j( êøwc”0ÐJ9J4 —t—v9—wY—x¹—zÙ—yù—| ˜~˜xÙ¦QìAC)Ml5Žé˜ê™™™”)™‰™“¹™™i™™É™Y™ ‰™— š—™“ ÒD•“‰Ó–Déš×•p¯ù@|Fa¶`µ™plEaëq•1aµ„›†=¬i3*FœÂ¹›ôVy´I›â6§1T@&6A'IaG”‰3œÌiœÝÙ–ÊÁÉ­)‘܉=ÔAWi:0`œÏ)›×µhΩbµIŸ»™œtcŸñyŸ|Ä×áxðY°œù9…ÝYŸ ›·Ùœß¹ òù  ú!ì¡eav@æéŸãÉšÏYœ}hž!Ú¡Þ }®9¢Ÿ£àº¡á9¡£2 žŠžåY££Çóip{0ï9Ÿ&Z¤(z¤Fš¤Hº¤JZ¤’, Vð@q¥Xš¥Zº¥\Š¥Oa;rmagick-2.13.2/doc/ex/images/Button_I.gif0000644000004100000410000001016712147515547020124 0ustar www-datawww-dataGIF89ax挎LNŒŽŒ\F\,.ÌÎÌΔ<24LN4<>ŒŽD|n\Ì–ÌÌÎdÌÎÌ,&dj4¬®TŒjŒLNLln¼¾Œìî¬ìîl,* LNìîT>T<>ŒŽdtrtäªäìê줪\^\,*ÜÞ¤<><\Z4,*,,,¼Ž¼ÜÞœžL|~\ÜÞllnT¬®|œvœ\^L¬®¬üþt\^dNd,* <64LND<>ljlÌžÌÜÞÜ,",|~<¼¾\üþ´,.$\^,<>,üºüüþü¼¾俤äæ¼¾¼œž”–”ÌÒœ<. ”’DÌÒdÔÖÔ,&$lnD”n”TVT|~ìît,.LN$üþ<>$œžt|~|ì®ììî쬮|^|,.L>D\^D,.,Ä’ÄÜ⤪Läæl¤~¤l^Tüþ|\^lRl,. lnlÜ¢ÜÄÆ\ÄÆÄüþ¼äæ¬!þ0Creator: PolyView® Version 3.62 by Polybytes ,xÿ€I‚ƒMZ^ˆ‰Š‹ŒŽ‘’“”Š)vVƒšƒ4'{Czz¢¤¦¥©¨£©¥¢¯¨°§©³C¶¬®¬°¹§·§¤zÁ¯ª´­¾Â©&b;c›‚OjµÄÃý¶¢ºÄÕÈÚÖÁ¼Þƪڮ·¦±Å·¸­³½{0'ešvE¡Çêïçá°«¿ë°íìZÀ`ÀJ%¬f°l½¸Y‹±†^[œ‰Øí;„«Ö×±!I£v]P÷ÛÊVîhåÂY’.`À8ÉJ¡È‚>w,·-â*uÝt!=I`C]Ø:òSS&Ï–œ`¶ÉVri?¢IŠc÷r ÇŸbY£®å¬m¥ÿ <Ñ¢+˜GðmkÙµlÉ Kš°mR¯h >Tª”„9!ƒfO.\f‰æºVfQ}ž~^«­¾–I‰°‹Õ€‡žèbk¾ÌY¶aÔBZËSw®Øƒ­õŠHêÈj»’ T¶µçÃ,a(‡ á„>˜a‚.X!aÀГ_ÆÐg_d9)@¸ ƒ0öc„Xƒâ¨à‹ºx£6þ8ã‹ÊX!ŒAl• ÿY¶ÐÇš]#¡¡B¨`^‰à†[JhäŽCVØ`ƒ ^éá-æÈ_b¸EË Çq"Lðð†‹câÙ%…{Né§…xN™'„v8䎹¡ìu‹‰ÈåÀ~\v˜(¢VfXfhJØe§fš§˜1˜æ™x¨Á•9C8ù$ 䑊©¡‰*Š%Göè#–n©&£ö†6~‰âªœõm@%…½bÚ)§Eò h¯EŠzíÓÖx*¢ñ›*>éc[¬´3K$‘ê ic™<)lµÕŠŠhÄ¥²,³9y%±gv í½2&¬ð 7Üð¦?š êÀÝ")ßÿp¢ÈÚ¹f"Hª˜îZI¥Ã$—\r±aVÉçšéló/À§ ±™*kXC8ç¬óÎ<÷ìóÎ/Øì`¨z:f|¹âêœçF ¦—z~‰§W¬`õÕXgýDÖWo͵×XG!„ž j¨‹â®´Ë|q²ÆAÌÒœh®YFÄÝx“÷x÷í÷ß€ãÆØqI4´"] +Æhß¹sŸyëÐÿUˆ@à˜ßÍwæw Ää):!Ž*^޲q2-#½¹Òq½ÚÍùßzÏøà„NüúÈBú(îP½Ì,Çe§¬í—k®¼íoî·óžs&é_(¿¼hSîÆør &¸£Ê^{ÿàÎ3O;¸ží¬ÖÞø{gËž3Ä z‰rÔÉ›¿<ås>xš!ÛU¦H…´£”BxœŸZG&ºÕ@v€ëŸù$x·è• j¸ªÕ™Þ§Ž¥qoTîÚ•¯ê'ÂêOãœ,¥)”=+qjiÕj0Ê ƒÊ4€ˆ(œa³£ ÿçƒ3D!U0[ÑvE?-).l{UÀtÃRNa#ôZ œ!™K!æà#,À!üKE@†°mò+ÅÀg­uqHkŸ‡ø·œ`?4ãVá4#-õGqoAÀ4æÒé.tq+T•jàîy8pƒ¢4HG0½°ÿOzâ:„7Ej}¬[“£Ø‘¾àÌíÑp[¢ÈV¹iÝKb"5†•ùå0j|j×è Là„wËÂvÉk±O˜GmÞ¸H˜Ma%$° *à€yå;ÃØ ™;×MŽ]WDÚp’1)6M€#£Ì! žd_ä$(i¾¢´ äBˆÍ¨]Ñc}ê úÕ¾94]Æ;§¬§¡´uƒ”o«YI º òǦbŒ`ß KBZuŽ2P¨ ¨8Ѱ†µb˜^øÕ‚îõžwi[K.1XA%Wê6–R5réL‚­b Èz³–JG |ÝL£ùµ­>]ªýPªFy2U§ÝNý&U¹³ªHmîÍN÷ŠíÉÕhZ«$±¤-Þòõn)tžo©UEŸŠ°¦Zé8âšQªw¾r¤Xßµ£è¢×vQÒ&? /é xdŠ-mÚñ¡¢2¯ÿù(k©=åµ´ËPVÁÑÒŒšÒ`úUkí{Z!RPµ5K(ÝZÔÜ!r”D5—,KØÓiëcîëÝÎÊ:ת©`ÛÒp?vѸ'%°xY’‹aÑì5²œ“ês'ÖÏK¬iK)» ÏSêöº Ü-8'ëà/ãöÂ-z"‰† ƒ/’ •£Þ-© ¨@2º:Æ›jCu¯ŽíS}¥óÆ0«@O:rGKÅ­ô‹L$Pxuت2ýª±›¯E~œÑÕQÅb(¥Ôòïó0`÷ÂjÐ,X…b{ЏJ†x…ÄlÑ*mÈHK˜ÓÅ›o++±ª£á‰-Ú©iÑîóÆfª“ÿe=Çh¦úL«´¸RϰØI5°Dk\*ÃZ4A^+Jèð„…K`}ºÓ©’¨G=]‹V„Ìõ´…\Ž·DÑTÜä³·äS6èÖçóÛ£_w(¡Ùõ® Sç9†â¤¢ÎµŸ¤º ®FL¨yë8À*»0ƽ4n~¥Ã5$w¯+|ªîÉá³ÛõR3hm©4p@Q(«‚¯1Ò’¼Ò¼%ë× :ÏÀ  ûfóoŒnqë³âÊ÷ séN¶zº;^è li\ bË ¹¬¦¤_ ’¸ÑR>5° ¥CSãH”ñéÂ9_U}r¨zæÎÚ«k–…’#Ó†KÇÿï Èúº-‹wUâ\Ó䙲eiCt·"‹š×-'iîw•éݬt÷*ÖU¾AÌœ£ö™{nõ t|Ÿ à&5`sg[w;íª–^R+ÀþÂ,móYçuÕ×?†6Ù§›‘QŒLW3ì$mmZ ¹_ú7ÏH°÷”=JöCȰŒYpÓ@i,šŸ–ÑöQ€x{…“=àI¾ë'+|È%ņ¾)?å,½gÐãAík'z¼æ#ÚPºð2s×g÷¦jav_òy³k”&uðÖvþ±Rµ0¨g.-·_Žuw×… gu€óWÛ',(¨~£SRk"(ÇeÖiDÓX2tH 7BDÿYe§X3#Â2EñFEUJ HW÷Õb“´lc–ZSFG>&!ƒµt†A_G/“¦q.ôw¦B7¥pɧ\ífKõóZ@Ø/`÷sÝFLXn’?ç•9õ\>xY*†C[ÝumÏgû³@´B;´D[´F{´H›´J+´%@øª ;rmagick-2.13.2/doc/ex/images/Button_E.gif0000644000004100000410000001020012147515547020104 0ustar www-datawww-dataGIF89ax÷DŽD4B$" LNL,&$\Æ\4f,tB  D&”–”ÄÆÄ$V$$6|r\dJ,,D6 &LªLT>$lælŒR DB<Ä®”trt,.,  ìêì\6 ”‚l<"l^L„vdœZ Üʬ¬bT2 \RD,$.tþtTJ<¬®¬l> 4JlÞl<~<|J L* ÔÖÔDV$ljl$*\¾\<2,\6<LžL& dVL,*,dÎd4n4  D*´¢Œ$,^,<:dR<,TªT<>|rdT: $*L>,”V LF<|~|4., ìîìd6  œŠt<&lfTŒ~l¼¾¼ÜÞÜ$N$TVT,&|þ|tît$¼¦ŒlVœØ"B‹%>ÌÈP£ÅŠA^D(fŽ(ƀ˔†NÀ”I3&Í›6mÊÔ9çΛ=yö T'ÏœE“ÖüÉôÄ,xܼI)p¢—@³*Õ*´«V¢>¿6Í*tiر\k ‚’rP³dÏ‚K·n\ºeíêK³9c¡à&­Ü­h½‚Ez˜ñXÆŠá‹ôÎÔ*JÔ8¡CrÞĈùŠŽoè¼G¿²‘È'j(Øûy¯íÛ¥qÓÎZb °a¹“z²RÈL‘W®Ø±YæÉÃ:H €×Ø7÷ÁZ·¶nÝÞÑâÿ®]œfš5¿V£¦OøïðãË—ßã:öô°Ýï„ Bœ8€ÄÁÂ2`‚*Èàƒ&¡ .a…^à€þÇá9àÁ]t3Õ‡_v칇6˜€Â‹0Æ(ãŒ4Öhã8æ¨#Œ 1›h'ÀaßzÁ½Fì¨ä’L6édÔeb‘ÁiF Nf©å–OŠpÜ õ¡ˆ¢\–iæ™2ª„xSªW$6 )çœY6!V˜bÂÖ|ö™#Ò‰‘Eâ硈Âh^B©{,lé"“2Yé¥/VŠ£¦5rj£#wú(v†Zªå¤¨Jš)¥eúœ Ùÿ©F¤;zšh§·š ›¢R©F©:Ú Â°Äªàˆ±Ç:‚± 8r,²Å«,³É6Kí³Æfm´Ék«’®j…§˜³*éH<ÂCºë¶Ëƒê»®¼ëªË.½ö²[o»ùò»ï¿í֠– ¾Ú&¡N›£ <¼ð‚ûñÇÃÿ±Åcü0Ä~\ 1Å;LñÇs ²Ç§<À·:.ªU£±¦G«Ž £LòÄ#oòÄçܳÍ8›œrÇ›Lò A œeÁâöêæ¯à6LqÐ!ƒü‚Æ‹|ôÑ>_]µÈUS-r(|Ë2 áN6î}°Í¼)…h=5ÊEWm4ÏAç1Ï)WÿÌ1ß?c\–MêÊë‰n*Œã ÿ|rØÓ½uÎ_ myÈBGLH¤gט6PkËê6ŽŽH=2à]s=¹ÆE·ŽyÞcòq6É´ÚNß§øŒ½3Ê^On³ÕFŸžõñ¿_ÍñæNºœÌäŽ~£ €½óãÇîxæÖw/wÉs?>{íKÞ:zˆ¿¶»6 6׬#¯¼÷øãyøCÿÁ™LJRB÷(éåÈ6˜€ª··â r4¨ÂHg8ƒ,@ï©.u;0Açbd¸¹LVëSÒ–¹Œ™ c{–`dàFHİ0a~÷»ØÐÿ^†0Tyj—dà€ïaω/xùtd‚ X g0€Ü†h·L1G·`¯•Â%B‹{¡å&&0-eB‹÷‡"”‘FÎ ôª¤D.! ¾ßð^°†J ‹¦ë_ÕÐs…êDÙ¹ãŽþEëµ’‘‹*eƒXˆ{£X®WiH|,W™¸~0¦êÔ 1J’ùA#|‘ùnrBÝ™ vË ³Æ…eÀ‹H&’¹ˆ6hÊ eAö‡Qî(7Ù#~T))Vž.b,æÏPƒršS‚ ˜QðC¹ñíBØÑ.mÒKõHrGÀ|çǰæÿBqæ(Ÿ#ã)gd!hqŽƒk™dN™DnnÉ›w;ZÝŒ˜#JfŽè#¤¦Fz@G»¤I˜ÜT¨_NsrC„Ž(I¹B(Rq£ CV+üi(:™R*š%3”ý‹Ý (z#€ ­|ÒIÂU¡ ´äš SÆ´ÔS}&}bÖ|¦Ò€£ (Ž2ÐDßB8[¸„²¶§°I¬ê7TÜÃhŽdÀB°Ñ` qø"B*“«&,«üƺz£E4QrbÍ>ù œa‚õÜ\ AÀõ¼•I}VÈ2]¥x)Ž„! ¡‘Ž<ËU¡¶Ê™ÿ¢xŒMŒ¼pº~¬L=`r)£µž¯¡ŸU’OÁöÎàá,bD¥ ¤™Ô¥–él!‰aï©£Ÿj{c, £E8¢`µšRê'W•eŽJn­Xy¹5F,ƒøÍïžà7Ì}L¯‡"¬ ¶I$îþs¦Ã ^ò°†ºoÞ¸ÄÍÒçrŠJÑ!Vvßt`ßöùݬñ@µ|*XjtJÒÃÖ6uÄS¤oVÓésټΨd£\ê¶lqÝ0Õz&¾¤ò|³nQqR¹ÌÖÀ8òî4‡¨á^Îa>”{}ÒÖûÈ—Š¡­o†ñV9½ À~ðv³š`ËN¢DC1Ï"ÛÞ­h³ÿJWînŠ‹ÎüQˆtrŸ ——^’*«C0ðb˜¿íÉ.Êm&Ñ›iÌ¥åÅ;§99xgƒ¹Ob£/OlÛ°UM2@€¨E=œA~Só›û„M‘¢r›qÞ0oÆä¾ùSF6ˆe3ì0=c:P:•‰¹”Ï'óóa·Ö¤>™¹ž­šO0¦I£ÒÇÓ,yÅ]K¶&= ͺõÚÅTŒmY‚í($ßhÖÔ”Üý´-#Tïfÿe¯“FczéiNˆuQY¿ƒ,º5š†{ÜZÙ4¶`9ᣠ|6%?°nÉöê:6wÎEŽ# Y¶E&Uf4±Ãç㪱;Mÿ ³R3ª$ŒÁlod> Cr=涺é,Hå”9G#,Õd÷2˜t*1²YÐ8%x94à~1Ro2‘w X8hSüCðæ0'¸€Z§)ð{`<Ç?K0s4gdއZÒíy”HÙ“g€„¥Tvç·ý#™”TY•øÃ”Õ‡o C\àa_b9–dY–fy–h)–h•%ðÈ4H‰·—[aavry—­b“ä’oxÙ—£„7*E“~Ù—S¶Nç@@˜…‰—Qò~–ט”Y#^€$+1ƒ‰`cNå)7šNåƒ ˆ)š4š¢YšåT0"H`èg(¦é™ä‡ZW›¸9#*€ ÅŸ€ŒY™tb#Û±‡ö·™ëð,Ð)-Ò©-ÑIÓYØyÚiܙݩ?šÿœŸ1mŽ‚€É6l˜Ôf}ëy|”Jꉞ›9cîé&äY—OYbïùð9*I4Ÿì‰0Š0úŸÂÆ•êAJð^èŸçÉŸ*ŸêŸõ‰ ï9¡V¡î¹žpkrÀøf¡„b¢ÂŸÙ¡)Š¢(š ,ú¢ëqÜ‘:ð_¡+Š¡zsö™'=º£¤$õ£ê ›ùahU öÉ•š¢*¡(¥;Ú¢::ŸYª¢Vš"†°lQrpú¤+Ф'*ŸEª¦Gʦý©¢fê£lú(} 08@¦UÚ¥V |Ú§Š¥€º¥~*¥dz@®1±—Hú¨s©:©’Z©”ЦŠi§T!d D𠪢:ª¤Zª¦ª  LŠ;rmagick-2.13.2/doc/ex/images/logo400x83.gif0000644000004100000410000001370212147515547020126 0ustar www-datawww-dataGIF89aS晜ÈËÿfþÐÏÏeÿ™ËÍfcÿœ™4þ4ÿ24›üüËÿfŸ†™ÿfÿÌ™4ÿ™fÿ4ÿÿ™5ÿÏÏÿœýÎÿœËÿÍ4ÿœfÿÿ4ËÿËœÿËcÿ™ÿ3ÿÿf4ÿÿfÍ2ËÿÏÏhÊÊ:ýnžþžfœÿ3ÏÏ3ÿÿ4œÊÿf™2ÿËcËÌ™cË™ÿŒŒ—cÊ™ÿËc’™Íÿc™œ4ÿfËœú™ÿ3ÿÎoÿœ4¿2™cÿË4ÿ2™ÿœÿ4Íÿÿcÿc4ÿÍ4Íÿ™5”ÿœÿÿ2ÿÿcÿ™Éÿ2™œÿŸŸ`ÿ`oÿoýÁO2ÿ4›ÿ20ý_Ç5ÿÿÿÿ``ò[[ýÊÆ’ë’†î†ÿhoš÷š¿.ÿÿ¿_–ð–Î`þ–Àÿ_ý_øelÇ`ŸŸÿ—ÿÿ—ÿÿÿÿ0ÿÀÿÀÇÀÿ0Àÿ–þÀ0ÿ!ù,Sÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓ¿33ÂcÙÚÚÝÝÜÞÛÔÐmVåmÖêëÄ7îïïò7©ëÖãøùúû—æþtþÐ=H°àƒ?*\(á !Ý9ÓãOŠ&zdÄXQ£GwLH걦 “(ÿ þd{ï=$i|GÞ¡ß}˜^ºŸfÜ÷ÑŸf$ª¥Œ$hjL_6ø‡„™ä6¡„@¡y¡š>Å!SoJe•ˆ[X§"wâ¹'uâÕâZ€ºãv4º¢9ª"ØŽ…5ªÞ£‹5V$dŠh¦ä·Þr®#à&9Ù·˜9¹ek]ƦƒZ¢Û¼eî&«PªùÛp¸æZÕœr6÷Õ"Á ;lžf‚]²ËrGˆ³wŠ#+‹F‡ÿµ‰ éÞ¤CT"ôaº©¦"“ºˆÈå—ò¦ô•ª ©©Î¶j¼“Ìûê«gZ˜o†ûÞ •¿ ö*ô¯‡l°ŸÅ*ì"Â6[¨Äâ±Bm?„-cÛrë™!L–Ûµ¸â6’$ØIRÖdØ[ÂÆ%»1ÓFf%õÒkæ½iÒÊ”­mö›kœÓ9p"F£˜tÒÇ&œl Ì2#ÄÏBÛJÅæalÐÕ E¥ù2Ëù•Ì_·$ìy拜 ó»8­Êª$@ÁêªÍ±Þ»3p=søóÞBóŠÕ"_ÝàîÖá :ÈâCíW+Óäëiœ¶YG¦.!ᎭýfÚw¶ˆH^;>ÿ§‹´»vmëôÇÛ‘˜w½9÷6{px·yû›|Lg"^ôî;Ân!\Ÿ–¨âyÎRÞx(f1‹AÏjÒkHÇ8¦)ÍYjt›ÝÇ‘AÎ….S.3ªPÇ“yµB°{…è6¿5ÕzÃWtG"DôÏ ±‚7@OFŠCàÓÇ"ñˆÏð€—¸Ä?,à‰PŒâþà€*ZñŠøÃ¶ˆ…-^¡‹[Ô"¯@ˆ0zŒ_ô¢Ó8F3’±j$€çHGüAxÌ£Јøñ€LÀIÈ?(áJxD„?\à‘ŒäþJZò’øƒ6ÉÉNúàÿS˜"DY‡Ršò”uøƒ VÉÊVÚMˆeþ°ƒZÚò–;øÃvÉË^á_¦0‡ùB @ÇL¦þ€Ìf*ó˜X4¥IjÆàšØÌf þ‚nzL §¥(E*b‹è¢:Ó¨Ît²³ŒXpç:ç)Ov¾³‹plg÷yÇ=îq|$d )Ð?‘Šd¤#%)IJb“šô¤'A)ÊC•¨T¥+]yYÆ’–¸Ä¥.}éK`“˜Æ€JW:€?°ô¥*æ4W0ˆiþA›8å¦7» Îp6‘œå<':ÙHT|•FE£RÉXÔ32ŸƒãöYÇ~ú3ÿ%hA¹U?ôŽ`ä"ÊPH:ô¡–Œ¨D9IÑQþ£Ý(G áÑY†T¤$-éIQ:ˆg6“™~U¦Lm*›âT›:ýfO}êqõ‰æjë9Ï/Rö‚ˆgeé¹Ù{Z6³ï¤*­zU>*" ]ÕjA¿ VFˆµ‘eäYњɵv²­}+\M©Q¹®’®ué]k9Ò¼îÒ¤{ fJaêR˜²t°Ô„îM‹ÍÄòt±>uìc#+Ù5.Õl,£w Þï2•‹‚8ªhçHÚ«fµ«\M-"[«ˆ×Â6¶œ-ZÕj[ŠV´Ým*}ËJàzT¸Ã-®q‘›\c:ó¯ö+ÿti*]êVw§²`¬µ Tî õ²œµ'RAìÙÎjÖžô\¯ÛëÏ÷¦¾¬Mä"ìKÖØê÷¡ü]«s+àRöÖ·–%‚ïªà¼2x¯Ë}isÓ™Rx¦Óµ°u3¬a“ÓÃçÔ¢y“zFñ6Uª_N£–É+fÛ±´XMU+P6r¾2N„}ï‹ßCÔ¶l å àÝþX®…¨ëG‡kË"“ôÈ'u°„#üà ;ÚÂ×Lì,4ÜØÇBËè4±e+;bMŸØÄ$Ö§ŠYüO5£v«n(œgLcüæ—¶iÅó&wlˆ>ÃõÏ ´ ‡RCë5¹ÊMòJ—ÌdG;9ÊÔ•ô¤ÿkå Jv²dFãx1«Åi5ÚjÄvÍLj=žöÔ«…1œã|ˆ9׸¬v¾dŽ%JkëVÀ¸žë mWBçÒ¸¼D4_ÁhÀ2šÇ>6¤·yÝeg×Ò}öd=Î7¬³ÓGñ¦%ÞN†sÍk6uª¹qƒŽ»¾­vuºc-ëvóùÝ~&ðo Ao^ãß¿v°ûÊ\&ÛÉ8GöauZ‹*#|Š Ïb˜ñéð7=žƒxÊþ†¦Ž¹b:/ŽñowÜ«â^5"æLgú’램žyÜãx·’å-·÷½a®ïa¢ßÿþ+Îin"ñîxÏ;2:À÷¾óý¼àÿ? àð â øÆ/Þñ‰Dâ»@ùP¾ –§ü ÀùÎ{ÀÃDOúÑþH½êWÿ¶Ïü\ˆý’@ûÚÛ> 0‚îwÏ{#üa À~"Ò@üâÿH¾ò—¯?Èàùо þ …JT¿ØÏ¾ö[ð?¤Àûàÿþ÷ …ò›¿üØ ÔÏþõ¯ÿEˆ¿üç_„H´Æ`È¿þ÷†? áÿ€H€ ~çw€Gx„Çx‡g‰yާ€‹'y`yˆyX›÷yŸ÷Ðø€z¬Çz®WL‰{\0{·w{¹×{½÷{Á'|‡`|Ƈ|ÌÇ|Î'ÿ}Òw ×·}Û÷)„B8„)@~çg~€J¸„LˆðGó' ÷—ZüW…þ'€H€øw˜€‡ø…§x`•wy–—Øy¡gz¥Gz"8‚ªW‚Š€‚*¸‚µ×‚.¸{0ƒK€4X|6xƒÊ—ƒ:ø|˜Ðƒ>˜}Ý'~á~Fx„P~î×~ì÷„PXRXHøW…ûw…X€Z¸…Ø…`† ø€dX®ˆyj¸† ‚´‡rØz2w‚vˆ‡¶§‡{è{~|€ˆi0ˆ„Ø|‡8}™ ˆ‹È}DøŒ‘x„IØ„Mˆ‰QH Sˆjžø‰¡€£X€¥hЍxÿª¸Š_H†h˜Žš'‹lø†nxz·8‡¹ˆ(˜‚¼˜‡¿È‡Áø‡3HŒÆHˆ†}›ÀŒ‹ØˆèˆÑx~”h‰•hòW Ù¸ZÛ¨ й°…\hЧxŽ XŽyøŠ®‹kÈ´ø¶(‡tH»x¸—º×‡~Øø7ˆ8ÐŒŒøŒD˜HHÕ…–‘m6‘ùW‘Xx‘Ž]8Ž©ŠP)fX•iÈŽœ×†î‡ñ˜z+ {-y¾¸‡2ƒ4Iƒ6‰ƒ:è <‰}éˆ9’ˆ~ i‰y FYHHÙÝ8€LIй‘•a8•‚x"y$©&yÿ’˜’#ø•†PwÈ‹cé‚e)ƒ…@ŒÅxŒ…¸ƒlÙ–@è“B”è'”Lx—EɉTˆ”J)Šº€‘à”h˜’瑃‰Žg¸›]°˜¸•n™$8“I™.ù’0™™Âhœ™–ˠЖÜwhš“X— IxÉšÚèšÝ¸ ²I›^˜›‡ù‘cHžå™˜蛞טŽ)œ«'™„Pöè’—ù‚û¸œ„Мž™|ЙZ * Ô7 :Ò9š¤Y„r9—ÓˆšNx«9P8‘¯é—±Ù”Yxy˜ ˆ› yV™ŽìÙŽïø†ð)ÀÆ’aÉ‚´wŸ¼§œú9üÙŸÿ‰ÿ: 𣄠Ô—‚0—×Y‰DºÖˆ y9P{y¡zפNú¤¾ðR:¥Rúvp¥Xš¥vð*Ð¥*À¥^Ú¥ÀdZ¦fÊÀ‹"À¦nÚ¦múKê;b!vz§x*à|Ú§~z<¨‚úP¨†Z‚P¨„z¨ŒŠ¨j¨†€’:©’ú p©˜š© ðLЩŒ` ª ú¢*ª„Pª¨Jª¨jª„0®úªCð0«´Z«ðQ«Q€ 9Ы¾šª“B°¬*4¬®³:»@¥Tj¥Zª¥`¦Ð:¦gz¦ Öz­Ø*rêštúyú­{êÿ§â ¨‚¨‹Ê¨ƒà¨ ©ëª¨„@©”j©šª©œê©‹°ª ª¥ZøªúН…«¯*«¶j«¸ª«¼ú«½º>r?ïC/ Ë>¼ ¬Sʬ͊¥Ï ­^*­ÓZ¦ð¦ §sú?ßš§á*®}J®åz®š®,û¨/‹®…¯•:¯ôÚ©Lð©«ú¯þzªýš¯?›¯­*°±Z°««»z »°ÂŠ3MkB)Ô [¥›¥«±_Ú±dúÙÚµÛj¡ÝZ²xz²(ë*;¨jíª¨k©4+¯6{©õj¯‰°;ë³ýʳ©:´K°F;«›« «°Û°îc¸oó>;ÿµ[µW«±K­² ûµÛøa+¶vJ¶(k劶2Kk«®ëê¶ð ·q;·9«v»·ƒ´z»¯Û·K«›´–°´Àz¬7Ó:½û:Ä:¬ÉʸU‹±X¦‘»µ‘еÙj¹žˆ¹$«¹zZ¶)[Ÿk®¡+ºmÛ¶¦;©¨k³ª{¯;{·¯û³±Ëª|;°µ ¸H‹»” »…«¸›¸†;¼Û¸û¸ÑÚ±‘@¹pšÎk…™«¹œ;®Ö{½/{£³Ù+o·˜ªº«[·©J¾‚»°;»°ê·{»îû¾„û´(T¬NK· SûøÛ¬ú‹¼ü Ì‹­_Àý7ÿÀ›k²Ô˧ž‹À œ¨Û˽ïzº,·8K·ˆ0¾®{Áæ›Áìªl´üÁ’°´ñÛ°Uì°ˆ{¶Â+ì¬Ç»±Z þë¦3ü¼6¬§8œÃÌÃ-«ÀíÊÀ‡zB<Ä<Á‡€Ä²[¾yËÄé[´ëÅR TÌ»°¼½kÈ…ŒÂ÷[¼WÚÂ`ÆŽÃ×:à ½94¶Þ:¶9l¶„p½ØÛÆjûÆ Ü½8ð½óZÇv̯œÄçë¯|œ¾O\°€ÈŽ@Åó{¸ó{Å«ÈÊÚÅVûÅbªµÊËc,²ý7ügÉF“Éz*iL½kü¹,‹ <ÊÝkÊ7[Ä8{Ä«œÇJ¼ÿÇæ{¼¾·Ú¾H ¿:3„<ÂëÜ:&L!­¥ò<ÏôŒ DpÏøL#ÀÏþÜÏýü00Ð=Ð þXËÄ À ýÐíЙ\cK}ÑM@ýÑýÑ"ÍÑ=Ò mÒ#Ò(MÒ'ÐÒ.ýÒ'[0ÓP6}Ó8] <ÝÓ>­0ƒ0r@ÔFÔEÔ†`ÔIÍÔBíÔM]ÔŠ ÕPíÔH]ÕR½†°\­Õ…ð`Ö`d]ÖfmpÐ@99´Ïøü#P×v}×#PÐ}ÐMlÎÕÍÑMÑ››Ñˆ½ÿÑ…Ò+MÒƒÐØ*½Ò‘ÒÓ–­4Óš½Ó?ýÓÔrÚJ-ÚB]¤Ú£MÔ¡­ÚJDýÙ¬ÛrÛ¨-ÛÐÕ¸Û†Öb}Ö¾½Ö‘ÖÍcS3ÜÀ-´€r­ÏÿÜÜÝ×zÝ×qM }ݽ¹†p؈чÀØýØ’ÝØ$MÞmÙ0ý[ Ó5­Ù8ÍÙÝÓWÕG ÕKMßM=ßU½OßõíßYÛ¹½Û¼ýcíÛf-ÜÏ£àèáÖ‘Ã(²°ÜúŒ×®×‚À×ms1S‰ ؃ÝЂ]ØÛýÝí݆ޒ-Þ”mÞ“mÒ•Þ.­Þ‹àÿÞïß>ýÙ«]Û¨ã m:žã¡Íã²äŒðã¢-äF~Û®Û_]àŽàd½Ö<"Ô"åÅÜÃm± ÜÊ=×ÎÝÜ~áÐpMˆ€Ý×-âMâ%nÑß-Ò-ç‚@Þqç,ã1¾ÞŠ@ã7 ß6®ßô è÷ÕýMè@èT àB½äLNnàP^Ö >oÍÖ•ᯠátMáwæbNÐÞRÏuîá ­æ†Ðæýæ'âsÙ,~çxÓz¾ç|îçñMÛ@žÚµíãCÎë»þÚ‡nä¯}Ú9®äŒîÕŽîä‘å;BÕråÑî<Èý \žÏû Ð_îéÑMÿæ‹&X†€æݨ^ªŽ(îâ*¾â¯îⲎçê]ë‰pë6.߈^è­M÷èV톾ïÉÎÕÎÛOå“>né 9™¾Ü›ÎéuÍíê~ÝR…`êâÚ%®vîêu^ÞíÎØ#ç³Nëònë9ëä»îò>ì;Nì; INóAð‡ðèàVnXÎ#YNÜB_íÖŽ׎ÙþåÏMЄ Ý MÝÉtæã^õä¾ñˆÐÝ‹ðñ”]òî¾î ]Ò)}òñ +_ï<Íïùmß…°ïˆ> ðɾóÌÞì ~m­ð î@ŽôØñv-ñ]ñJfñÿâ¥^Ñ[ßê]ò"ïõ'îâdOÓ‘ÐçhÔÆìRmÚ¿^ìŸ_ Ǿù¯­óßÛv_-ˆ@-å ôÀm HûD ôLïÏ‚/ÐÞÞh mõã®ø‹ïæ_Þ®Îâ‹öÅ?ö³ï)ï:ùjÿßL=èþýü³m ‰Õ}àŒN÷ßìh ×x¯÷SÏä_þæ¯ þêOî¬ü­°ê»#$ Pÿö_ÿpÿø¯ ácƒ„…†‡ˆ‰Š‹ŒŽ ‘‘”•–—˜™š›œžŸ Šc£‚¡¦§‰“¨«¬­®¯°±›¥²µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéê–;rmagick-2.13.2/doc/ex/images/smile.miff0000644000004100000410000001131612147515547017663 0ustar www-datawww-dataid=ImageMagick class=PseudoClass colors=3 matte=True columns=48 rows=48 depth=8 Resolution=89x89 units=undefined page=1x1+0+0 delay=10 dispose=3 Signature=e479e50a6b2fd2ede083d65cfe4f844d :Ý ûóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrmagick-2.13.2/doc/ex/images/duck.gif0000644000004100000410000000777212147515547017337 0ustar www-datawww-dataGIF89a´´÷º      %, "",,$$2 :&>)44<<&&&)&!,*#)))2/)44+85/88-555:71=;3<<¶’A]¸4`Ä+¯„€Äe¯ ð‰’uõgKŽñÆ]æ(‹¶TägE³x)› þIa’h›´¥‹„&œ½âà ËeºX²@-‚¡RÆž¨ ,dÐʦ-HƤ8K¬€ră5YQuÅ¢Jµ_v»ÒovÅ‘jEkСnGÜ΋‘(\$KiÈbQ,d›½ÕKðF¹âª.sÄG,cdpÄkfÅvqƯ4qÇ /µqÈ$ôqÉ!ŸŒrÇ*¯œqË.W sÌÏL3Á6Ï[K-´œErβÑâÉmtÑ#d’$Ç@{…‹'­ uà‘‡;Hp´%>×<2Ƽ]‡#’LböÙg?‚‡EKѵ½MïU´~ m÷Ý“8ÂBþÑ›zòE÷÷àv7Â6âü5Á4àB$„GŽv Ð×¼q?…‹Ô!ùçgïQôåÝfî” äúê“0RôÛ¯.Þ-ØÁ:ë~æ²GÈÛ ·ßŽ–¨k:R¸]vð¬cÀÒÛö.àu3Ï:$º—.=^µ€õÁ×q\ºS@#àß #z€$ù9 —¼¤"A6pá@ðF%b[)ñ& XÀ’«lå+c9ËTá­ ÅwÊžl}»Ä[îÀàJXÊr‚ 0&2•©”fò¤{;ˆ&ÞZD–ÇLæ2ŸâMžˆº§p‚E¢Eþ;ô²Òΰ%†ò4ÀAE['ùéH´h0žÑ¼aICØ hC+Æ–pÊs}5Hå"‘…¢ Wé'OŽ€#Fó„H™ˆ-ÍëDŠJw’< îR²œé á£e"§xl(^È‘roEKÀ ²ð…@‚¢©'«`Ëžì”'¢€ XÅ+ÀQAà€h ‚8VA¢-aŸAù*OBQ4GT FjáŠQh‚ X+j°1˜ hAXh^•*¶ àëCÑ:ŠâG˜ÀZðÉz•²AKì\ʺG8¦%þ .hÑ PüìdKF¨øí¢¼dÄkÿ€T÷¡6B¸@SÑ0Gu‘p„BX´'î`zýÉl_Ñ N n´EÁ'ŠË»Œ=fDÈÕh0Ð` El1–Ý™¸‚¹-š\Ѓ<ðÁ~èƒì m› ¯ßìå )M}€pñæñí †Ûq›‚ N\3yxnð¡µñ1mÃH¡…ƒ‹†§O³â‰ÉC‹%,—µ}ŒD`ø2¥+~Á#* ­i”¾>öÉ…À‚!Ôl(ì*±âŠDšó>gÃ' ¹+–(šêØÀ£’# þ”sxZˆ.$¨ËÂJ.›Y’kÖÔ Pv(Ú$ñˆ,‚ÐóU¿ÎÆp´ Ï(¹fØ0õ½.ˆæ‚ ³Î%¦´fý9^·¼šÛ@ç¨ÆÚÝ…q–&l)–éÈÀÏ, âL9OßÍu8ÄîžYR Yò!}¹@H}7SâÎÄŠãpÔxÈ<×퀑“(ëD‡Wã [%‰Åvð"Á±ùúlë(wi¼d—¥cžŠæ‚Xß `Ö^ÑpÄl–½DÐõrü&Êÿò};Hø¬ëe$' P$\(=µ÷Ý$aaœ;ˆ¸.¥šþ<”'€Ò’÷œÌ¼R;r½ŒÁ—‡ò¿‚ƒÎÌ(ñù@ÇÂ`“<(têç$^Åy³râÛ€ùÏÏã¤]r6b²%Àlæ™q1ÓLÉcs«3j/g= p3Þ$ZÁvµy‘v¢p3òµÒx„#>/ð~‘ Î3§¶2ÞÔ=Äqýg=`W<Xídr¡Pðy 0_8{ÑS8?Uœõ‚£ƒÁЃÕF]n#„C„Á Ê‚·#\vU‚B¸S½•€é Ö6VÈ„_õ?¢4ƒ« yP}À Ì—ƒI a&6+Dõs4R€ƒLØ„MQ &5:`{жyÐ.À6FÃþ–°—w‡Qkºð C^•C›°VÀˆ&ã„*±(!â ­@Ü´•£‰áˆf_¨Q0r¦(2W!Z$ÁGöа8É“²J`‹@1lq$‘(¾x‹Rá`óW•À?ŃœX¥X‹"c²UE|Ï8ÝS*3P­pMR {SA‹* B ´_ ¥7Ekh!³bxˆ°ŠP2¨hA+a>â¸ÐŠCG>7wI¤· aY(ЖtEc‡¨æPè‘ÁRH… NP4a0S„ð:K÷ïÔ|õþaY)€JBeS«¨=R?ÐÝ3Žšfc B%HøäwJñ?}àt?R45`“E¹Ù’M89 ´#¸ÀRC9•‚dNÜh•J¡A/Á¡À`R –lµ‘DÑ=LðÉS…U`HZÀŒr9´¸ŽÛå ¬ à3ÐAð&P8 ]@M‚@‡‰  Ž)&G  ( Ÿ  càBðùµVòh¯ œP Rp*0ê%‰Eó{H‰´ P(`Y°^ 0 #a¯@˜£š£I"°”˜‡½•l †P™Š —3ãõšÙŒØ´Ž {)H%•ŒˆŠ›Y E)7äCHµ0I'S`iº%ŸßYŽEƒî)R üéŒYQ š€0•Y ýy|7 ‚¤ŸÝYŒ¨¨µ@E³ —„²t޾˜¡Ñgl9HŠÀÂX $ºµà•H' @j ²¡–Qy05j£²Q J`4½Ø£j¼A DZ¤IªxKJDMj\OÚ|Q ¥SʤUÚ-z¥_‘Zª1Xð¥`¦b:¦dZ¦fz¦hš¦jº¦lÚ¦nú¦e;rmagick-2.13.2/doc/ex/images/Button_1.gif0000644000004100000410000000545612147515547020101 0ustar www-datawww-dataGIF89ax挎DœLN$LFŒ&bÌ,¬ª¬&L,2dÌÎddbÌ,NTV¬DFŒ,6$46LÔÖÔ*T Ü ,|ljÜ\^¼DF”ì,trtüþttzü¼¾\ ÌÎÌ,.L,*,< ”’D¬TV$Lf̬®¬ .D,6lÌÒddfÌTVT^¼<>ÜÞÜ.\älnl|zü¬®T,.<LR¤räÄÆÄ$&L<>|LR¤ <Ì,äæl\^\<><üþü,.\J”úÖ#ni@ðÅÿ L2IE‘·qø’‡ÍÙXߎGþv,0@0èq„˜#pQ¤m@ö¢ß‰¥`–¼™€ÆX„Ð…ed1昈yÄ@I†”ëÑøaƒ&p¡h ?üPÁ .t1ÀI4Ч—ö9¦Ÿe $+kÙf}?`ª©  ê €ÇžšúyĬ´Š©i§PJ)×r†VI_?$Qk¬|꩟Çnºi²³âZd1¦"äwnÊì¬bf++¶Ëb«)±ÆþÉÅŽúX¯’Yi­°Ébº§±Èz l¶{òÙ¬™¹¾DÊ´°UkÞµÜfû­¶° L0§ø>ëW*T¦Kª°Å¾K¯±±Ê/ÿ½Îú˜æjü æoyk«ÁÞÂ{p±e’;b«4Ì–ºÿBLë»óÖìîÍšÞë©Y¡žø1y!ϺV¦àU2š*Ùˆd”‚Å- 2šü¼•»×)pZl!Bû°­ YûŸÒÚA%Ø$†ìÊÔí²68z-.»€![f¸  Ñ t”Wݤ!ÂjŽ€+šÀ$¨°s\‰ª!܆H¯ÖO¼r ¡„€MkfÜ¡4”È>MYOìSʦ˜‹ æ‡Mt`ö†XÄz‘zÍ#€Ä8±;F1‘‰Ë&È0ÊÌhÝŠàù”¾U|‘ÿ€Ë¸ZBj4l\ƒÇEQЈ¡"ÿSÙI®`qôZ]ÒhEJæ¯]D„×þ6  OŽŽTQêö÷8’’·˜äh3LjÒˆ…‹äôN´’Y>¬™Å滈ùŸî¢Š+A¥Š€åÀzŒY¹,9è(CP:Óv”£ŸÒâáG_RgðS]<-GXJÆ›ô©¥ðŽ•C.Cš•\dÕÀµAø‘³>Æ"•’L-Óy¶|ž>uI:$ S0ÓôQ ¸2´x5Ù"c¨¸ B rcèK£Ç$ô3¥Ê|_»Üi¯‹ÒGz£0‘s:…vƒ{úàw»!UD(ÿjo†À\•tMí©'5ŸšÅ®ºð~UÞþ©-€ͨóA*XÕÈÔuEœÖÔãHåÉÏþq‚dPèVuJ&lÔs]*WùÆVîSìÍ_+”£ÀNT~<`î*;"ž)5Ý ¿Ð‰=‘`}*ƒò-Rxˆ£WÕP\/¹É+‚bŠÃ ¤ý€Vl"êÁ ’·­VsL9øB†zt$ZÇ\ £l5ç\ò‰ X@ÕÊB¬ýmLL¢WÊã³­«oÒ.@€ ?X’t„W,œ¨ÍoÊ ….„@øÞKÞrªç"ä¨?›ªƒ8xja×ÿÅlÛÈFŽ)S €ƒG`½Kü& FXkìd%žU ¬@ŸJ7†±šþ‚ùÆv Ñ­·­ñm°bŒj3©¾EiGA–¸±.¤n[¡’ÝÆc$Á0ލpØùN›î¸÷4K{|Ôy9½"Ø]ÅLfÉ•yÌ’ãr\[ÌK!/Ø®B‹³œçLç:7£úêhC›Ð"ÛùÏ€Žsª;è–â@ ŽñxœèFz,Þˆù<ŸÈàҘδ¦7ÍéN{Ó3¸’®neÐJYP¨ÞMF»óå“ЩŽõ –f ƒV½±^g”æ1iLI¹ö†|h[ †hÐÍ…¦ÿÌìàúÙò™À@z}\ {>•UPTŽRƒ–v¸¶¸oC'ôT½¶ÁD0æÞÆÝ÷ºÓÝoX9)RP:ÈA7»àOø_¤AåpÀ A>¼¶vüÝ%Oynªü ™òöÂ{þó —ÌÜp‚Mx¡è|èWÏz¤_` LÈ|1–`„&øàö¸Ï½îwÏûÞûþ÷À¾ð‡¿{0È¡ïš;rmagick-2.13.2/doc/ex/images/big-duck.gif0000644000004100000410000002011312147515547020056 0ustar www-datawww-dataGIF89ahh÷¿   #&,##+++&4"9%?)44<<$$$,,,00.333<<DDLLYCTT\\eBlFuKyN}QaS:|^&ccllss{{CCCLIDLLLTTT[[[ibTccckkkqojttt{{{ÿ,,ÿHHÿ„V‡X‹Z€[‘^–af’g g¢i©m®q³t¹w½zˆoA€t_ÿÿ ÿÿÿ##ÿ**ÿ44ÿ<<Ã~ÿDDÿNNÿSSÿZZÿddÿkkÿttÿ{{„„ŒŒ””œœ¥¥««´´¼¼g•ƒb¼–Oƀ̄чՊ܎ÞÞ“ È(˘:ã“è–ì™ó÷ ÿ¥ýªü«ÿ²$ÿ¹8Í©gá°Uÿ½Cÿ¿Ið½_ÃÃËËÔÔÜÜääììôôÿÿçÀxüÇeƒƒƒŒŒŒ–„™•”””›››¦¡˜¿²›£££«««´´´½½½Î»—Ѿšÿ„„ÿ‹‹ÿ””ÿ››ÿ££ÿ««ÿ³³ÿ»»ÖÍ¿åÈ’ÿÒ€ÿ×üÚšþߥÄÄÄÌÌÌÐÎÉÔÔÔÜÜÜÇÇÿèÛÁéÞÊÿÄÄÿËËÿÓÓÿÝÝñàÁäääëëëÿããÿììôôôÿóóÿÿÿÌÌÌ!ùÀ,hhþ}H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jT«£Ç CŠI²¤É“(Sª\ɲ¥Ë—0cÊœI³fÈcýÚɳ§ÏŸ@ƒ J´¨Ñ£H“*]Ê´©Ó§P£Jê§T³jÝʵ«×¯`ÊåiëØ³hÓª]˶íÓ²nãÊK·®]£pïêÝË·¯ß·9ÿ L¸pݼ†+^Ì8*âÆ#KŽüx²å˘õVÎ̹³g±›?‹MºièÒ¨S«&xµë×¥OÞM»±ìÚ¸sÿ½­»·ï¹¼ ~68ñãȵOμ9ÓåΣK ½¹®W¯zuí…];Ñ\اþ®Î¯º²:_©èóÞÅ &ŸÜ<ú®›Ø»??´–üíý÷“}éq•íõñù$Š`„<ˆŸ~ òT-S„Ba\ô!g!Wë!¸ƒ?Ñ2…·HÅ‹/>7átºhR &­ì4b+”T¢ËO›PB P5ÞÈŠO&È+=æ¸Ó‚ úâ‰RL (µØRJ(¶øDJ)<•"FWHQŠ”UPÙ/Cñ2J(þÅøKˆ¸é¢CçgÁ&#ŽØÓ‚>é’žy&0äNIö¤ ž5Ä(O»¬H夞€B…YôD • ì´‹-eNÁË`„ò•Xµ‹Ux"†þÆH'mºXç$@3œW Ÿ<=ºS.¶€š¢þ’Éy64(ìN¾øré'Õî4 •]R»…]ôÔ…[xç/ßJAËO¤LqÅ.;Y‘ª¬36WÃy3äÂS%äùë®þ O÷‰wº¼É/%&ø,Ñú¥O¶PyîNiŠáS`ô”f`òô §>mK¼;M‘)½WMWb þR‰¿:žËO3|Þ²=õ¢«¿$ŠÉy7ÄüKÎ<"?…!Å©š>)-E§9ð/¶fPzžã©Py×Â-PßB¸SÝÆ+í>] 5O—Þ^ËS„!9Ëf9'zA‘­vóG?oëD•@&œ;Ï¡€ª--(¯²ÂNh®©ùÎ'~»OHA%ám!l"ÞN(çšéë'K›ê~q:žÌ(°ØÄ‘‰ôâÀW× ½…‚R€Ñ.æµnL þ ä ⸦Ážpp5u‹ÄOtѯûmŽ'LdÛòp$ŸØÒkØ’ÎSƒµ°u_ /,VŠòäT[ Xázâݱ*ÆCNà$ž\‘yçQbOÜö¼Wœf=ižz´fýÂ~¤!O*&….‘â}ƒÇÆi¬'Y£¸Üè“ÝM.ŽÈ‰êzÀŠWdb~›;P(¡ î¼§Xñ±ß2‹WPBW ø‘yÒ [åR‘;Ól ŒË ëÉ.¨$Šž€A žøÉ}"†XÁO>ö£rà§;R/˜˜V/4§McU1QŠ"Úêz’»Iv’;y2ȓƊ^þ Âï~ÂÈ*ÄÉÔà_à ( †ÀDÕ¶Jh _ °Aކ(ƒÆð<˜!: h¶ü±îX¨ '{âµfúäTUêB¶€-¡Œ¬‚UÀ‚áˆ7Ð7FeZ¶ƒ'èùO¤ñ'ŒãRh†.„!dE¬©MŸ’7¢Ð¢ #ýÅ2%¸Tµ¬ªn¡èPGD’n«JQ*X•ÒÔ Ü ÅÊ©˜6Ö¤ˆµ­GÑjOÊÈ…-LÁŒ@m\òÖ½%5ˆXPz.xþ¢Ï\š(Âç× ôµ±NÙE¦Í „tRà‚,u@©Y½Ø¢ -%;kDÎ’ö´…y,jW Ó²öµšqþ-lg+¡«Òö¶{Q-nwkÙòö·aÑ-p‡Ká÷¸?1.r—[<Û2÷¹[Q.t‡+Ýéþ¶ºÖÝ-v³{Ûírw¶ÞýîkÃ+ÞÕ’·¼§=/z;«ÞõB¶½îõ+|ã ×ùÒw¬öµi a–33àŽž›_9µÅ*§‚µyMüˆº¾n/X± [xÁ¨æ`[`ùèÂ>LðÀà#@À…¹XÅîFø¶°¨p9OpD4âÆ8ÎqŽÕ0,8ï‹a+(?à ŠÐ±’—œcC¼@ÁX‡‡¼Ú^ˆ²œeX“·ÌeF¨¡åÔÀ QÛáäR›Pþ#¸Ìf6'å¤Ä†åKeÒ^9OPC›÷ÜfE<™z³fË<]d@›gX3ŸÍeD<@›AtëGê‘@ËŒÎ4—Í M=JÚ¹¸Õ¢5Mj.+ÂÇyâÙ{' ׇå)¥Ž5“ç<5jÕ ž­«PEËú×:ætžf0ç¥:7¢ÎÓ | ìfßX Ôë"sÍZÿÎÎv“©´½›6¹ Þ ´Mî‚zÄ/««ª«ó€Ùåvv¨×b°~6|€àog—z¶÷ºß¸¨<%¹ßñ>Á°ÛzïÕô‚zzFx¼A½Dbµáª!çµ%ŽpD\àÔÖl¥þÏÃoŽg{ yêvU1ŽÿÀ&G8Åi¶òËé@AÌ%m|]Üæ1:èy`½s„?ú‰odùhüw‚¢Küy²AÍCî×^ Ýé?:MS G(ÜçÑ9Ö~îó´Ð¦JÿÌa>vŸÔ«JÞfêÛë¢Ýw®ˆ,X6Î4òTGâ]>°ÈÓÚŽãž_˜ ™VDÊÑ~xñP"OoûÌW ¢/Úy¢<ÕÛš`ÆßøÏœGÀÞ—<øópý“£ëÃÏÓtÆ{œóy:£o…&µòÒyL/lÜÀŒÞ¼Ô{¬Ö o»ÂžL£ú‹†o~U+þ¼zŽS?O™–AžŠ-Ÿ´s¦Ý0}#®oüL£!O7Ë~ü›'ä›>ßw@¦y_ïkvVñê7oÔ™¶yâ{]§}K•{ê'yÔÇv‹¶yg—€óçWyq¦wÆG€™¶y*6Ày¦çwœ×}Lv+•À °Ð ä׿—yrêwc‹w†™—i6† ,è‚Òƒ˜1ƒ5ˆcï§`WjH}>(`AxDx#x„8¶†@ð2 ÑGj­÷}PöƒQˆShh…ýF={€pÐC †åô„@˜ B˜g8 ¨†ä–y²|0ˆ„8ˆmø†þq8‡tH=vX†±‡’‘'Kè‡Ù&~ç…˜‰šÈ‡‡r¸ˆŒH†-8ÊF‰ÚF=›¸Š¬È‰n艊Š1`¶‚ÎÑn€ŠÎÆ{CЊ¾ø‹{pˆø‰bX‹ hSܧ‹ÀVkp¿øŒ¿¨r G°@(œgŒ¸WÏ÷…ʨi›GÐ8Ž| ZÖˆ‹¨¤%|ßkeG@ŽšhŽÕx²¨'7 šð ­ÄŽ5{0nïHjÓx戎ø˜°ýø˜QŠ‘‘`(X:¶y °‰ö˜ŽùÉþø‚¤h‹Îqgž‡‘{æxK0çè‘ þ‘#9 #·x*Ég&ø‘!‘y¨5 Ô““{¶y±¸b=ù xƒ&y’FH”\¦çáo0 V 3ùAÙ`—sPÉe'z0ˆqð  $I[Ù§}_¹dx‰w –Qå×”Îá?ù–9V|Z°‰y –ñkÙíæ–~‰c*v{ÀŠz` V#$…zéÉ$И7Ö„(ŒK `Ðj™™Î!t/ç™aøãèð_‘6‰Ù­ w©Šôè `™–®Q›Qa2à—€x,@„ `r&Âɺ@=$˜“–˜¨œ„þ8( `p¹Œ±™ŒI”º©…ˆ+ `:ðz¯!žŒ¡qp‘Vx½ˆžõ8 f—¹ð¹½ÐDÇ—“Ž"0Ny™ø9ˆzp ¦…œ¨9]¹q u+(`O  Ú¹L Žz"ezŒ~em¨Œºˆ I s  ê‹Op”¨ó›þY¡â±kئ‹ª3@¢bHÀKàw0–›ø `˜œ’ñŸ14yòn”(•ä½  )T :Ж x MwÀ ey–àùTZ¥ÔcÞhz× @~]ú š@ 9àr Èê* `þ=àž—ñ¦Až0| ¨u#¥=s™ 7 š™j‡Éˆ Ö'€ic§¥çAHZÑ ¹À ™ 5°˜ (mšÊ£R+£æt‰fw¦Ê ˜ÀCJ}×óˆ°!½0Ey‚4hr‹€Ô£™Ê^º `zh f ž±©“Ñ©ðÕ©mÉZNÃyº§}j¨”¬Ò F=fªÍf8H=П¸¶Ã• Þwh kŒpÊZN³IfæJ<¯P0å0À¨m¶‡@a¹`7e(Š[¹Mæ#ð1 1&а¦&J[Ö*š@°—j(äj^+ºÊþ«¬z©ÚT˜²ãµ²ÉÑ ° 9ð²0›'9@ ¬Ð¦±XÅ‘à§=[N5  *²6Ûº€ bºb@0@fpi jhpd$ð˜¦ò \#k° º`ðfp¬¤–gpa–¶Úµ°‘ ”ð¶ådg’ζg`«1Û¬jË·«¡ Òª`#€d1g¸ ×iOË^Œ[ka0pôIn‡€¸ç‘z[³Fë2U›'1°ƒ¦wì÷?EK¯1¢ €{&°­G(ª³¸§{³VZNëúŽ‹à±Àו¹—Ñ ¿K=#@·Y§Æ»·½;»–'0þ0§Y|nB6½¾Á <;ìú•¢j ¸µ¶Z VG=âë™8öoyB³ó* ÃZN20¾m‡ú÷k¨çª+»É¡¨žŠ½X·ÓlŒ€!ËZè  £MÀºš¿Õl-Š}¦ Àñ¼ç‘¯GX  l¨÷°*뽫¡ ë{1ð¹—Ä ~Í—1Խ܊*ÎËx‹ÀŒh–mÌXºÞ†¼~1NÚ4w5ÈÚ{ÌØ™Îvœðk¤ñ o xGh$J‰°y?êlf{¹¢WôQ½+\ƒ‰°“iØ›7‰ÍV|@ÌpB¬ ÈxŒP§çQ¾Ö„º—mN¬$þQ,Æ®Ñ €¿X§»ž:¾¼WÇlk,#wÅ©~‡P¹yâÜñ¸É²¦u‘ü½Ú„°m§&PN¤ìvGnýʺQ½žsŒ€rÚ4«GÁ,¼gÅçʸqyyòˆ¼sH=&@À9Ö¯¹ÜfÃÌË´A¬Ç—Ì»øº€»Kö®åÌ<6ÔSÉc·¨×‡|vtPn-šÍ®‘oÀÆEÇœ'2ËyRäz ÇkÎfÐv œs„Ëg§HnØ\ÏR ÛÇ´ú«Ij›ÇÍÙ–„œ^öŒéjÐ;GkÀ Í6˜'ùLnahÎ¥ñ|@Ñ1—Ä×̋ք©ÜþléÑ£Až½sX¬Mˌ֢9Ül9,ý· €|‡Æç‘Ò±6Ìýük›w;ÝÚÅwÇådÄÙV|&Í„yÈ=Ð…Ñ ª)v&§ÈŸZn׉Ñ[æÐo¬nXMb½h‡`¶çá7ílYn§ü<%,È“±¼Æìl¦\NÜoˆKn›Ç?I}“ìÈ‚†Š·Ö{V¹û›m¼gÕW× ’(qÃ|¥{mWÊÊð÷¿¥‘MòÜoަM8\ÑÖ«m›§Ó ½tÔ3Õ±æÍå$ÒM'e mñȽ<¹¨ñÖÎ*ÌØšÆÇÚ¶“D;Ù£A¬µ§mû\Emr¼GͤþÖ„wCâ1ɰ­iß|ˆ]tœmýjš»ý+Ô¿†Æf ܲ¦¥›½h2ÌÚÖí›IñV¹Ý&†êÝ×IÂMÙ‰A=ÏýkyÂÕv¬Øê-ÃÕÚœájLm\€åälÌèßÿݽßàxÙùë¨ ÒÍhN¼à Ž®ÆÐÜ ÎE·Ã³mû¯…½بášÖÈNÇÎå4®Ìy"=Ò àƒá?+z͘WtÍ=दàe=¿™±¾íkýäÀV«åÔÝ¿v¤úã™1a'q¸ÜÔýjÛûc™ ÆõÑPáË ÝoÈ,qŠü;îÞôÆ»@þÊqu d‡ÉþçÁ‡¸Ñ{¼g=]9äñ&Îñ¦ïš'æílax9±‹ÏGÓÍ–'ô­Ú´L=PÝoºä¤µ–.7æ)H{ÚæÐõ'å±Ö„½w\[)ö'sîìl®‹fq-ØØ¨j‘n#÷×ý&Ã/Ûx{´Ýo;©fÎä“ÑçÄ^”ŠMÉ¢Îe<,¿%ÞíJfÓC]N$€äM=šë“ÑDéÇqŽçíL†/!^nÚ ãtN…çÑ—'ÕÈÃçñë1'ª’M\[Éá—é,LÒ:žÈÔ3Ìõïlr¨·hñhéè^n¢è†æMQ…ØmvÆUÞvÚ Å oñLñ”çþØlæÔÚ¤Çm§Ø òƒ$p=koç•H=?] ¿æýáKvÉÚ¤ÉvŒ·k ^;ßìͶÆJÖ×£lz‹à¨º­ó"¿ÍqÄc³\N¶lz¼wø];oèåÝ8–Ù¶‹êñföâm];ÿ÷Ýú«MPëE‡Çž.î’A°ÇÞÛÒ58¼Ô“ÇÍ][©ækÀ½ÍØži œó赕#§ïä†ïawø2æ°{_­^¬·èçÑî1‡ê˜:÷µAS¿ùfùšÆ~é}ÄÏ®Çî璘#÷੨Ä6?öi¥_Z//šû{fÈ”.˘?ƒ_‰éjôÎÜVþhê^ßûÉ5ûTóî«d¥mɯùÔ¯8§Ö׿ôÁð.ýÂI°Íï¾(O==ûlßýJÁåyþ‹éæ¸ÒG¿O8ç÷¹!À@‚ XýB˜PáB† >„QâDŠ-^Ęá>bi#%‚Ì4B™RåJ–-]¾„ SŒ’3‰Ä™SçNž=%rôèS(H%eÄDšT)ÒC#jÄ4TêTªUuýhUkâ)(ZVìKFfžBíµUíZ¶T±¶] ©æ™±uÅ2qv€¦´pýþlñmઙj>8dW±KD1ÎÐpðdÊ”Wú*AÍ ‰ÛþetÈñc¹0ŸFÍörjž½äÖ4pfÑg¥ŒÎ8}œAkÞ½¥®öÖŒ³dÓf™èLÞÇPÒ\út‘À©‡|¥¡ù‰3‰@2óÂ@ó"™¾ž^ýDëë3ÂÒA~ 1ÈœA“Fš4gÌä+ILL[“WÜc°Á_Úsð"Mj °Bù.ˆdÁ„ !Ä•H"‘:C´ˆH°°ÂrÈDC†X H¤‘·k´M ©EgàÉ$ºÁ•Gè G% »qɉtr(MzèÆ(Är­&³|(“MþPp(]xd¸Ds«-Ó\¨†YR± IŸèþ„ØÄ󷎲ÊS"T‘Eƒ©xØ¡¢ë3ÑœÖÌó• ©¤’©X vS4SÅ“HQ–©z nÐ4UŒ8eóNN¹“ª p`#VUoýiO\"ÕIl¨*ì½]]ˆU4)õ#›¨z€:Yk7ÒõØ.äЪHm²k¯U–Ë¢XÃVªˆ Éq‘-Ë1ÛàL«0 \ÜŠ’+ß­,^'5€þ*Jàí`±` ~¶,[\s wµ"H~k2–âÉ^˜q+Œ’3³ˆkJ e‘ÿ"G…]hX-‚78˜*asþ“yæ¶j®_"öUkÌtJ³šŽ¸£$T…Œh‰cy­ʵš"¸ƒ>à(©ªi¶8URt­Bt'§KJBl»Ÿ(©Ú³UK[Óh ªµ(èÙœ¼.i‚°í¶{‰’0Ý[-«Cü¹X¶ÖØœZ  ¦%!JB8r=ƒºõeuÕÊ€k‘zy»¤ ð=tJÕt«&ó©Ù"i Ü5jå©Ïk¯ƒ’âÖýt>5%üR¸¢Hï‹z銠hG¾ö=((èæwâÝÁì™_‹  2Šž &º‡?ÇwþV‚øË‚Äw¨—jò@à7À¨¹Ž~>)ƒþ”³ùÅ0iEEÚ7' Ђ|È“º‡`)V6HL¤ñ)ÉxÁvlƒì[¢n°?ÀD"›xJY8@=Ä^/$_ ó„¹ …ÞêßÊ"=ìЂd䀸(!âi„ D`p8M8äƒ%y‚/x‚„lŠÕ©"›*A‰µsL[H/fX4QŒô ÏHEÔeJ;Y ŒV÷E‚háŽ,$HÊöˆ“¦s5˜Ìk,÷ ]è¯$)ØÃ!/ØÃ4p‘hìc¢Š•ÉŒ7!ä@Ü I¾ Rü¤FyÊ™Ñ/¤PIT`GVZÐeŒ%(Ÿþ×'AVæOYe/YØ 3#³œærP™5>… à V0„$4A p˜Ãô°‡L*S}Î 4¥³Eéu­º€Å+X¡‰LxJmD,RÔœHÀ(‚–à7Äáyg9'?¢sSiäÒÑ‘^¼3¯hÅ&2Q Hðà3°@ç$¸†ìÓ¤g &ð !thDÔœðõ"ñœ'&"уÔà›9©|~Ç  ‘ð(H·T¦N4¦ì(–®ÈTªÖD#ÕÅEY¡Q{Ú@‚¤êSŸU'=°ªÍ!@:€ A çV G©TÔ¦8Õ&(ÁþÓd¨óëEfÚKZ(¥ †p&|Ó z' ÀÆÀ‚h°¼X ‚¡ U&è H­ÊFè²½™AŽZ î ,mƒNÛ›^Tn `c-üÐÌØ¦g¶¾y…f[ä±n½uÏoƒ<‚4@ÄÞ@ˆÜõ(78¯PÝ@† ]±á Y¤®oÉÚ'ædqà.2ƒðŠ7”»‚ÅjRîF€·ííu¯SM‚½¹ Âqñ+ý^'­+É@ËJ-¼tÀoªø;ü·—ވÜߧ*ÇH,FNŠkÃ~/ÀðUÀA“{ØmyNŒâþaR,X#ˆˆï˜G`Θ5vY€78q®”õñ;|,]àx +qíŠ@º$ÛhÉȲ*È„’®Ê¨rˆt‘K‚ìy þî—­œâÈ¥Éd\JòC5ƒùÊãÒÅ ’^Ž6su^s›çfCêA¹ÿ˜0+IŽ5A–·h%³™~nî1¥íliúõB‰HÖô¦ýBS”¤‹¡NM£¹tÂÀ¡ºÒ£vu¬{gY×:!ª¶uiqëÀîš×Oõõ¯la;“ØÅŽå±‘½He/ûŒÍv6¡í N›Úô³öµ›—mm›ŽÛÝÞÛ·ÁM5q{f@ùAºÕ½nvE·ÛÝï†w¼å=oz×ÛÞ÷Æw¾õ½o~÷ÛßÿxÀÝÝ‚ÜàGx¾p†7Üá‡xÄ%>qŠWÜâÇxÆ5¾ñ…! ;rmagick-2.13.2/doc/ex/images/Button_Y.gif0000644000004100000410000000753112147515547020145 0ustar www-datawww-dataGIF89ax÷DŽD,F$" LNL,&$dÎd4f,D& tB ¤–„$2ÄÆÄ|r\<6,,,V$dJ,&D6 LªLlælŒR Ä®”trt  >ìêì ”‚lDB Üʬ<~$,^,$*4:\6<LžL$N$<"dVL,*,lÞl4n4D*$6$,\¾\lîl̶œ üþü  ¤–|TJD\^\42,d: 4œZŒN D’D4J$& ,*$dÒd4j4  ”–”,2ÌÎÌ|rdD:,$,V,lV<*T®T”V |~| ,:ìî윊t\J4lfTŒ~l<>,tît¼¦Œlnl̺œœ^,$„J 4^,<:L* <2,!þ0Creator: PolyView® Version 3.62 by Polybytes ,xÿŸ˜g™,*\Ȱ¡Ã‡þˆHáÄ,f”Ø%Ð ¾¨ó J“(S¦¤²¥J–.]Â|³æÌš8cÌ„ÉS&N Q”hR`9'qÞDys)SŸ9[:•ú”fÕ¨1›RešGÈ@PvZÍ©ukÖ«Su^=«t%Ö¶.ãLùCŸ¤kݪ};v/Y½fÓî<¸jO¿€ç}’D‰’|Ò kØ,`Âo)³EÌ·/K?pü8ãøÇËP;§†[mæ×k’S‡4i%Y¨,- Õéá©¿Uo=<¶—¢lbЍšš: bž1•ÉäwÞùe§¦J ¥î‘ZHˆ5Ìÿ 묉ÈZë­3Ô:+­»&bB®Àêjk­0j+¯‰;ƒ ·þêk®Îöê,橜|6 è‡3°Äß.î¸âŠ ®¹åŽ{nºè–»-†,”»®¼íª[¯½:xÙ¡ª1í ¡cïvhÁ-ôQp Œð ÌpÁ ܰÃ,ñ«vðÂwüðÆ}4üpÇË /‡ ^%*x>¼¡ &¬!ñÈ×ÜpÁ}Dì°Å$çlpÀ·@3ÏCl4È4›Ü¡ 3lÇ꣊‚ #\tÄB+¬óÖV­°ÅBwÝÆj¬õÁ§M4Ú_‡Ý‚Éš‚z¶¤:çò†‰Tí±Ík“ÿ|´ÏYƒÜ».-xÑkÿíuÉ'ãýæƒLžA¶‡sÌ7Í$}óͽaЀë,xΣ³ÍxµN¯Ì§mwk˜7â¤ntìVÓþñÞm-6γ‹>{_ݸëPùyëÎP5â°=ò榷ðä(Þµæï\s×Jw˜òMt·¢@ìÞ³è=ÿ-úÇ]Q®Æ»Dæ/^úîç롪Nõ¸åm—Q „†\]£]à°=…É` „0 êäÂ8 ƒÚ¥Ío˜³.` @Oè'ämHà‚¼Àæmk±‹X&0ƒá…ÈUƒÿ˜W±£!ìAƒj 5ðk)Æ[õDÄ0!Cûàá ¦ƒÞ¨p¥óÛp‡&j(e~ Ë\ø! ~¼_ØüÖ"N‹ÃZ ˜„2Öˆ_.ÙË¾ÃÆ(q 5Ô"ïDV0R52Aùúö5 Á‡#rSp´Ô*»)nbú&¦GÀ 4  °óY­ð¢ÙAÖM R Ǿ¶‘®y_匪ÐA«áPlÀ$‰Ð¨lý¨TE:°¸³¯áaÈ判ä/T¬ˆ-0‚ˆÄ¿«Ø2NS´‘PC‰ñ›_’14ƒò²kZ˜‘š¶ÿBöüÏ“SâýÆH‚,›3‚J‰µ-Á ó?ûe¦A*!Tb/‹X±^¾­ Ûä:½xÁ T²–ÊXtK%8¡Jõ¬ÝF3˜Ñz;æ×ôg$˜¥åœîIç8Ç„¤XÅëÑË&@öd²Žî”,pÓ®£~Û îàZæµ@“&CÅÒ8­vMÃm§âªÙ‚%b Õc@ÚàÇÝæÆ»S®háË—¿#Y¢k§é²¤º7>ñšŽ@ïx«^ÓãÊK¥óö÷ŸQ»“ pµ£~s³k[BrïÄ_”°T×% *ܼíÁÖÿw-àBeoä`ÉBÇþÒ Þ*8š5q2øn‘Q9m™ Cl`ÀÌ~Ç·’¶J‡æ­™!·ÖCc¨Å´á1á;;/”ÕÒÕ‹êV§ä;aˆ­D_|íbKƒõ8O•6MåS¦Í3n . ßmN©Ì1µø\=µå)˜Ñ¿lælÞâQšeyV“ÉbÛ:ùm‚>´ÜZ2êÕ¥™JÈnׂ"@ÚÕ>­‰ñ†MlŽ×ôq‹ëÚn4ò¨Ä-ú6•f 3ÚåÐÂK°@»8)ÿ9gK³žÒ£0t(ªeö¾[½?;èštÍwbs{lí‚1a º%v¯Ü*ÛD[Ú9ÿ½í€%>p•ºE†øëâ[Jî\æ6.yŽ[¾ñw¶™åõ6‹Y—ñ×ÍÎ$=Èq>•(ZŠÙFr¸Øôè6=®ÁP'Ò¶í|&¢Ëœ` ôšÂ–U‘çj’Ëxå:ìNcŒì-¯ J„ñ¯Ûl¬_»y»%ë|g\êC‹«ß®žu<=®ëEwÌx¶¾c/}ï­9²? pmëí~¯:±]&û)ñìT£èœÓEsìe÷”ˆF¯z =1­€ýmÆ•'Sˆ[Nó®õËñ]wtkÜ”ïx 0ñÜ ýν'v!úå! À®v¹J.óC׉ AÀ!§Õ'± `R…”ÿ v3iªf9S:(Ç=1¯é}Slâ<ï«o§: "™Öcðçè¶|à ®feå§Zf*XPvàoÐo˜gCJ‡…`5ð} ']V!y£rpúF"…Ðð2 }¦waœöM°2`¸g•s-å‚"’¸2¶Ç|1f0°_ÆQ]ÞÆ&…°7Ügm¶sM$¨0;¨&#‡Ù¢-á÷!48:7…PF4ð„ÞƒG€¥–X?Ä!A¸hê#„ÀÇvû—„^"¢×4M§VAÅ&4hPÌ6¶×@-€†"v2HN"ƒ!²|øˆ‚8ˆbƒ‡ƒ²‡„¸ˆŒØ5WÿhÛdÉw*Q؈–(ˆ†X%KÈ*g‚KXØ!Nà¢8ФXЦxФ˜‰QeqþµF÷ŠC"€œhQ'‹¶˜‰’=Ù‰BÉ“8iQCI“6Yw’4™“MÈ’h‡xO©’?ÙRÿ”'¹’|xŠ€%*Q O©•=I–£²“Ré”,9–:—2 “m9Š€Q€k —-éyeÙ‰DI•(É—~é’zù—3é'ðsðO0b™—é”U™oi’By–jÉ–nÉ“>y‘au p †i~Pi•T{æ·’«©“¨É…pišW‹ðq¤Y™–é–—É›”Y•¾É›½¹™ÂiQ\9!¡ð‘§ÙšÎ ›ÏÐ9Òùœ/2¶Yc0DPÞùàžâ )ž0Œ ;rmagick-2.13.2/doc/ex/images/Button_6.gif0000644000004100000410000001066612147515547020105 0ustar www-datawww-dataGIF89ax÷ŒŽDŒ|Z¼lrä|~< üþüüþt¼¾\<$*T|~|LV4 œžLL,.F”jÜ<$<VT., >dljÜln4 DF”Üìê줪Ttrt,.4>Lìît|<>|ü¼ÌÎÌ\^\<><,,.\R¤LR¤üþ|䬮TÜâl^¼J”DJ”ìîì <|zü<!þ0Creator: PolyView® Version 3.62 by Polybytes ,xÿu¨" … ‚ T˜p¡Ã†J|81"Å‹3V܈‘£Æ (¦\Hr`8wÝpT…eË*/]²” ÓeÌš0oÎ|ÉÓ&M@qô'Í™jÝa“ ¤Àtn´Üy³gÎXqfý)ô¨V«D·v-zu,U¬7ø)9…‹—+­Í:¨Ñ©x¹¥{¬×ªTå–­âb­@2z¼ ‘:“/Ïœ}~…üÕ&eÀDKÞ<¸êã¾^YÞù!”=ŠEÔŒ«×Qcׯóž}–6lÙ²gçŽéºgìß¼—u4a‘ /ö¼ÐóÈ·o׌1^)½¥TëØ«KŸ9={wëн¯ÿ¯5õéá·g÷ÛSц?|öÈßæÑ[˜¬YÆÅËþvÿ¼f‘%×]:š€X©áÊ5ø‚‹ÅZKª±GáXŸUh!…wÉT!Z8Ó}Ü5öYM€Ü|Ê¥fYM&ö&cŒ4â6£5Þ¨cŽ)e”TBiå”WV‰å–Zv™å—[†À‚JWqæÈ#*²8$jhˆà‰È`ÇœtÖiçxæ©çž|öéçœb,AC ÐɨUk9Ÿ4,ñç£F*é¤5”q™Oh®¨fr1È1é§ †:).hV¢‰:耜¢¶J'«®ŠÿZ†’½”iƒj A¬¼öêØUEBΧ(¾FÊê²s2k¬ÉîIÃ~=ݪéD‹'¬ÐBꬶu6`ª#¨¦ºGàn ) |v›¬¸¡Y») é6û§ˆØ ¯¾~~Ë«¸~•k¬|è‚ëîœFRC 0À€Buà ñÄäƒ5@°E½¯Ú°\òjú½Ó)ˆ €<`±!„ìð²Ì3»Aˆ<àPGԀȇúñY¯yn´ÝQ 0óÓ/»!sÌ6Ç<óÕ1›C i.¼ §©è$ƒ‹+»|µÍ3SmõlwÜ;AbÔ´¤ÿV4®e» -xHàòÓrcÝöâP/î¸ЫœCó²±$ïý©D˜15Ü4?-µÌ£“NõÚ¨_-„^Û+ª¸ÔêG¬š¸,*´$<`¸èŸ'Î8ÜoóÞ8ÔlïÀ@šG öYò²8²¯ˆ°a†ÕÁ÷n5Ý4‡¾8ÝÔÇÌCìºZyLm;¨°¦@„Úr߸Ôg/¿ï§S?:!`àú¤”Ø<æ¼J„20<àÕ,~2;D&†ƒ.d@{Ô3`ñWñE'³ØŠÎªXanŠÃÚÛx0`` ˆH!"±€ª­t¢ãœÜç‰jÓ€Ožš¨c†@¶Ða‰/íí§Tøºe†aއxê.â8Ì;XÆheM%Ϋü°¯)½Zše€]` !<§Ûßx ƒam*DçôO0hkõÆfg agX‚ Tˆ`€(j~U­l™ñ¤ÎtnØÆÝ?5 Éé<¬ü †D¼ºY3Þâ#hݘÀ—>†/¹R\[pŒ„Yñš@âZ¿SÍfÞìœPl°Y„ÿÞÖ¿%m:n^O›8¨AR—ÍÓÑ›µV{«B%[«›ªøQ0@œ4_ùG!x“o­œô_f†£+Kß'²§ýÝgÎÚ9fÂö± ú9Ñ;W= )ïp(KqZ÷é,o¸<›€iHà¥äž`EqÐvŸ¨%(ÿô‘Ý83l™_˜7¤MÇ€4|ª¬²ÞÔ·kÍßù’£ËCo?U†<7Ñ”Ôûû¡Žd?j /ücµÑi'ÈõS‚x©+¡ìÊìr[.Z†T 4Ät>‘NGŸF—í¾ÏYáà|2tµvJHu¹å-׳q0VPåá§Ê"ÝašØ?ÊA¸6 g…ºóÍÅÛo¹ÿԦϷëù“ýþS$hݺž¬†Wq’Qÿôx4+`?7wml÷tðây)FV`¬ç6ï'*4Ì&3—æ^XfhvYU•D<€$j–+ypc¸eg4q(u¨õ()?µzsWXXOTuPÇ7v‰7Nôx§dfX#X*$8ðbJ—=øö'"uè7dXTà×g6£yU¯TU4HYXEÞÖ…²SiØV#€DI+ ð…¥cjVÓÀÿ|Âiü¶„|´‚÷£|X†‡>ïdmžHS}{òeYù†p'nid5(À-a7EàUôy§$kȆœ)¨,ýC@H=<a µB@x5©´sàt*e·x‘bŠƒ÷xVŽuzxBJÀ(t;poœ/Jxz"+fÜ7„0ƒÖ'ì‚4 UÓfÜdi¸T,ÑPÌ)ÐFµpÙsyWvÂ.¢%9K’6€æQÍWÂw¹8)ë3‚Øx=à‰°m¯’x‡ÐhGl-à€·hVˈ’²`€¤8àw`1r°0 #0@€†,ÿÈ’Å"é1æ7|×’~Ÿ‚9 oí×HTe^,Ãfl-ÆgÙciO›*oh‡²Ï'xåÆz©æhUøE#Ž…TE·2kàè' rÈZuÆ’–tJTå‰$&vAd—*:*‚°•VoŒXa`8L2I=i/8dgÉC¼yБâ7˜¢–RVJökÉ(k+òs¼" ÐòæOaùŒÇkB€mp˜vbr4&#”±",€F•¸yqò³fyP™¹s~]{)8ˆÀV ’,i‘&?«™.Ë£°›S§-ˆÐy€ÙkÚdGó”J s¬ÿ©.XB–ÕT/bp6(Ð8 ^ÅöÆ0D°𛥵ÓÙiÙ[s‚´YA#p : e nãi—a³”è9W (ìÆnú©-¬2q–üÖ:¢duA$i4Ær¬HÎÒ¢®ã¢r£2ú¢4J1Z£+TÐ!‹96€aE¢­Â\Œe.àår-ÉS)¤Nº'bð7àFx—&Ô¹…°*Úµ¥ýZ^Ê¥á¦_*¦] ¦cz¦e*ZhJ¦jÚ,0 ZAŠ+‰ÂC`mê'yú){:)}º'$ pÁR"ÑŸ&… ÿÈ%“©’:©”Z©–z©˜š©3 c €Á¬ÑJH§Éa|ª1ª¬Úª®úª°«²:«´Z«³ztê¡ZýÉoÔ”6‰¦:¬"C¬t¬æ¬Æš¬Âúº $âIª¬ÉŠ¢ÖJ§×:­\x¥ØÚ­ÚÊ­ß*1àð01P­¿:NÅڮȪ¬îÊ¬Ë ¯ïڬǚPàŒQjQpÓ*¬àªxÛš­;°ë­k° Û ðŒQMáЙ³V¯ój¯ò¯ôº±˱;$+L±ŒP±ìа,˰-«° ®0û²tú°!g0qqp‹Sè÷³>´@;´B[´D{´F´kÐ%q êJ;T[µV{µX›µZ»µY{ª*à‘~@ph›¶j»¶lÛ¶nû¶p·r;·t»¶hàMA;rmagick-2.13.2/doc/ex/images/Button_K.gif0000644000004100000410000001042012147515547020116 0ustar www-datawww-dataGIF89ax÷ŒŽDœ|\,6$&L ,.,46\ l|~|6<üüþüüþt\¼¾\LV4\^lœžL¬F”jÜln4 &4lrä |DFLTV¬trt $ì.\ìêì >dL¤ªT\^,TVTtzü<ÔÖÔäæl\< ”’D¤LN$,. .D¼¾¼NlfÌ,*lÌÒd\f<>LdfÌl4ä6lìîtTLNœ<>|zü|~<<>ÌÌÎÌ\^\<>\>|46<<,,.\R¤räL^DTV,düþ|.\,*,*4¬®TÜâlJ”ìîì $&L |zü <!þ0Creator: PolyView® Version 3.62 by Polybytes ,xÿx&‘„0 T˜p¡Ã†J|81"Å‹3V܈‘£Æ05¢tHr ‚9!ÜlÙ‚‰åÊ–0]¶t)“æÌ˜5m¾Ô©ófNL>yþ䉳èK7xžð()G&,öܹÓ(Õ¡A³zu+VªR«Šõ‰gNÉ(„h2ñ©•«Ñ¶3kÆÅé¶n̹`iŠz œIL`ÅM©l‡Ê:õnØÄ/ÛÝ›2Ì·{iâYúƒ„w®]©—åh«3Oçu¹VkÌÖ«aªv=›²ê¯5ŸLj1á³'yÀ"F{¬WËyïWܶ´kÊ[ÜxвbŠëòf ´5ÐïàËÿO¾¼ùóèÓ+¯ûG‚oßcT@-ŠÉ°ýúøïëÏÏ¿ÿþþ'`€Ú‡›X…p݂֭  ¤‘¦Þ„Vh¡zÛ)‡× ¾ç[ò­ÄD9XF'¦ˆâŠ*¶Èâ‹.ÆãŒ2ÖHã'ö€TVFˆ‚Ö¹ ƒ(à‘Â!z$©ä’L6éä“PF)å”T.™Æ#06Õ#zèÛ a$På˜d–iæ™ ô°Å|Waò#ƒpú0†˜gÖiçf²€GUqé¥ot€ž„jè’f¸Ú›B )@ƒ*é¤e"’Ÿ0ùù§ œi¤” ªKÔÆ£pZ·ƒ”ŸBÙª¯Âÿªd¬O¾jk’£6yë˜ HØg—^.Qk¨TæJ¬±Nö:ªúÀ±JŠ0%²Ð.I­’ÊæÅá¦>{¦´z€K¥¸Ð‚+-¹I¢+e¯ë¹ dªÎ>™À Ì`/½öÖ{o¾÷ê‹ï¾üòK§’,økp¿ ðÂûÆ1e¯µa¢éŸÞ6Y† IÆwìñÇ —±¤\€lòÉoÜqCÉn^ÌÂù¬“|#6ã¬sÎ6ßlÎ>ïüsÏ@Í“KèlGÐ<}3ÎCÍóÍTS-'·Å¶›VÌdÍT+­3#Kï6ÏR32öÒ@½$h£]öÓlM÷ÎPC-DËò6ÿ³37 ¶ÓR× „ás~¸Ís·4ÙD÷\µäE³Í¶ÏSß,Ä ²Ö qVû$Ø9Ž7æ§Cn÷än+ ·ÒL-ôêf«n5ßÉúJÓß þuÜySmºðUÛ~zëI.wØ—^{ÔÎǽôÕYëÞ×Þ3á˜?]:ðg«Î6òz¼>·Ýc7möò¶ï5b2ñnïK’þýêÐýþR“Ÿ´ú¶‹ÞébG6©õlsYͯ¸åµ%]LrÀãžÜ2·: tÀƒ`캼àiÐf@Cõ~"¿x9© ƒJ ¢5®h¬œAP„˜Ih€€Ìˆz¡x@, ÿ5€ÔÐ HZ—q$,5ÐIiH@ö9Ô Oˆ@‹Ä†8\kI‡X ˜w¶â9ÍfÐÐE2½ ,%¤_”â@†„¯Œšj3"üô ø‚,ô€uú[BçD2¥ly,Û Ù6€/2 T0BÃwF!d }´ÓkÇ2AëC_Ø€+œÉPó<س ‘„R–Q°':2ÅŠÐËŸ${¦‡•)5ã0ƒh3%´Á’¼òÛ»šõ,hÖOrSÏÈà‚b)ÉcÚ6 „H”wvBÄçøÄÈ÷.IkÈ7Q7ÚibMÔ'µ¶Nœyœ³—êÖ€k€z• Éû]ùl0às.Ü ûFÐ)F-÷:¸† Ë ÿÎí*Õç…ëöÙÛf}ÂÅÍ$rz¾†ƒD¼›ä‚&ü{QkjÕÖ€N<•u³¯î²ta;0v”¬P™ŒØ3OÃÄ@/ˆæKÊõÅS·4¿^2 U¾cÐ5]lžâåTIß±U±ŽjÑR):˜ZŒwM6,TW…RdÌe¾ð¹Ï™×,¦’¨8f&hDP²ËÚë’àš°¥j{úÙ¢fv]é@œÅk(õûOè(¶º…¯RZaÚÝ¾Ž‰d(]æïfTœ`µF—æ{ã…]Ï6ŽrMK|•ðjp¤@D¸>m¦n+p''N}g˸öîvÞI‡¨ø™ß½º‚oœ2–_zÿ“Ä|uµ^ßIK€„Å#ØÁ=@X”%žÌcñÉþÇl;?ÏuðCœ¯o yK¢Rpw—gx6ÅLú×$ Àxy†_vÐr¹1¡g`§$E^÷; xI=ðscwnNƒ’p'G÷õ¦t•²zEF_ÌG%.ðy‘ƒixD.JÆdò‡z3_ò$AÓ<çÔ'z? R‡&Z^Ö;)5$e`'C†Zâãl0€{näm×D '}S­‡_@Pèecˆ´sEfƒ(Qº$)8?Þ”$i@˜ZQ“…åM `fX4Og5 Ëׇ}Ó&[Ó!:6i¹ÿÂFtw>Óó\c2*ˆpZÏ…x9v€ïG%¡oò'Spd¤S;³4Š€OWç²vˆQr‚-á'p6sÈb,PÈW8‘£8`LüEZJ‚À–9Á79‚h3B œsIؘlÒ#¥øq¾Qjˆ’0=HtÃz›öY{0TÀ^%i`0ÐXQSTc¶3^€Y@T0‡ q÷ZIGL"|@0`BPm–ö@çc `{à:À$\À|°0° Rm‘T5ܳB°|Àg~†t^'w×´r5ènCDþcS6Ynhÿƒ“@à~¹ó|ÿ'_§=ß3p­7I›g4©h‡§QL)’`Å“ Èu[Шç’JRqEysyÔx޳$Ê’gdn7bU³•ó¶-p”43ƒH‹pi3äsx“>qy—d´“°HbðCŠ^øBi9Û5^‚I˜ƒY˜ãc-Iƒ˜‡Ù˜†ù˜…i3PÉ$ëd¾Hal)8Æ·™œÙ™ä7š¢ A“ x¼8•i•Ib?£Ùšä?®››YšØÒf×S`¨¬)›­ ›¼ù›’¹—  !p×’¸$:ÊIËÙœÌùœÎÐIÀ$8 Ø9Ù™: œÛ¡—ù…ÿ9bä9UÉA•˜)~幞Nb¢j‰™Öa/Èžö™T|Ùèù…_pŸþ9%f`áé €ÿy,Jbv•š>°ר9»¡±(¡:¡Z¡J¡Ú$zÒ—n:¶ o qÊž"LÀ^s±Ÿï‘¨X¢Š\ rñ“k)$+°ž£öW0†@£A•_øtàAðó/úÒ¤ã¤Lú¤R¥T ¥V:¥Wʤ‹ !—¡@˜À5â / ²+phª¦iº¦nÚ¦pʦrú¦s§tz§vš§uº§wšÍ"` !‡A¤ÜR¨†z¨ˆš¨Šº¨†Á‘ÑK t€™fZ©Ír©–š©˜º©šÚ©œŠ©c0À‚zQ°ÞȨªºª¬ÚªŒš7À^L`U@ö©žš«¸º«ºÚ«¼j 2x€?P^êªÈš¬ÊЬD‚ ) “ “ê«Ôú«Õz­ÖŠ© b-0] Eº¬â:®äúp%±€àåÚ®îÚªS –ЭLñPj°úº¯üÚ¯þú¯°;°[°ë¯wðÄJ;rmagick-2.13.2/doc/ex/images/Button_F.gif0000644000004100000410000000753412147515547020125 0ustar www-datawww-dataGIF89ax÷ŒŽDœ|lräln446<,üþüüüþt¼¾\œžL\F”jÜ$&Lljl.,Z¼ >dljÜDF”<ìêì줪Ttzü|~|<\^,ÔÖÔ.\ ”’D¬LN$L,.,f̼¾¼ .D,\^\ÌÒd*46ldfÌ\f<,>4 , ä.\ìît,.<zütrt<>|TV,|R¤ÌÎÌ,.,LR¤ Ì<>äæl<><,üþ|<,.\¬®T…j•«LD7FÀØ(¢Ê “gµò¼êU-Ö«_±BKõmT¶uG®ÃÑ„€/icR¥+®Û¶sÛTÌx+Þ7EwìÑÐãoH‘]¶Dì”s㩇v›¥‘B(LôX'Qâ—‚EÆfJ{¶mÙ¸kç¾­»7ïß%™Þ%I!ƒž=š¬&èÃNœi£”þ„ºõ騫g¿®½;÷ïÛÃgÿ_Œ3 iV«7eæÍðãËŸO¿¾ýûøéÇ}»@òÿÊYæTgùhàÞGJbø§Þƒ–‘tTLàÀ…f¨á†vèᇠ†(¢€´Ù€-%âŸr,þgÙ "C4Öhã8æ¨ãŽ<öèã4rÄ #÷Ü8øàƒq€PF)å”TÚà…Zg©à–•)0#•`†)¦”^¬ÚK .ù`|9æ›pÆI£d´¥e‹- ð€œ|öI%T–¤šêeáæ”_ºy莇6Ê(‰ê¸h˜3t%Ò[*·D“R©h‘rj££–*ª¤¦Ž:¦gÆ”&¡=8ÿ€¨Ÿ´Ž9#«paÚâj€¿¶ì°8k£±ÂÒˆl²À«,³ÉjVˆ¼ú r±Ùé¯Ëîˆ,±5vûl¸ÌÖJã´ƒéz- Q bûðÆ+ï¼ôÖkï½÷‘j”¸¾e­zØÊ % ?lðÁ'¬ð 7\ð «`ƒ˜\v“ºØöÐ+”ðáƒÇ ûàÃì1É&ÌÇ‹|rɳ3È(—¼²Í-ß,rÑþˆ.VÿœíÀ,¯sÎ!‡ì²Ì4㜴ÒJ×ìòÔ8a@˜ÓÎ…±zK‹óÔ"3-rËc“ý5Êh/=6Ìjò؈ëó‰› «À@’vÉR¿ÿl2ÍG·ŒrÙT·=óÞf³,Á ³âzÕÖÊuí³ßƒÛ\4Ù—ã\9È€'=²Ù)ýq €Éê{#ÙM(Þ=Ψ·Ó‚{îyδ»}ùѰŽ»Ô>H1cÏ:f½ä=°Ë1áaÓþvå)ßî9ïhû]ûÔ5‡¡•£©¤š¬ûèÀ4 ß¹òFË>8álžt扌ð8Þj犙ª‚LÀC%Xú±#_è@ª/l~³Y®&¥Ÿ©DuÜÓ à)äz–ÛèDF+”0Àð€‡þý€€ìSÞÑŒ°¯e&[ãÕ˜€@mƒÏóX& #I= Àƒ ÿ~Àµ 0ÂÄøe—jmo5{“ pÁª°|"“´%@á«Øl–ÀTmèÝÔ0ãéVÐÎx23xê3D¶Êu`‰gL£vâA(®¦{`’@÷5,², ^ˆÒ¢N`„ì-sƒA“j,N‹¤ÙF²ÈaV¢’J°ÇN­§¼ß޲'J9ˆ4î48‘€q­ó‘Œð¿µ‰dyˆ¤äGOJ.L2蘭2ì Hrƒ”þ°Ë¯©€ Ò¢ÛI ù \R‰œ]ÈX¦`öÈ]ô'¨ „ö…ŒO:ãϾBÿ¼gbm—¼[;¤ƒA¬`R¸¦&ÐÂIMúòž¥ly·8)Àytà@5,¨p£7RC=ÉÇ2lÑ…S ñÜÍ4ªó€2(ð¡‚ ‚ôF^¨éEV}Š3uO,gœ^‡I€†ì¦:2@ÊSwâÈ:hÈ£~ ~x²_ ]ˆA‡JÏšjƒN:°JŠ˜£TÀ‰&hB…ÓëÌ&»Q"5G àÀìî:*<ìQ­*Р‚©Fœ83N°bÚ)SSÊ£ió_mÄ…PÒ Ç89ΠFQ®ns%SE6ÙÉ¡¦¢+m )!–›Í ¡ÈRŠÿåpoI „Sãç‚0òpª­‘vΙ¸Ê³‡*@5H¸ËXrDóÊÖέbO)ñ9¬­\:¶Œæ e*8ÂŽ‡<4òcÁ]gzË¡½éu7Ì àT`€#Ø×¾'° °Tö¹-½‰äb.…ÕÿÈN‰`ô¦÷8øÁ@øA~K;晵VÙcPPÕcÎ)ÍÕ¨Æàú gWâò©°(é'bë:b¾ÍŽyT»€±Ö*‘À•ÃC-šŽ7½^®ÏÇ)›qãÔ²RÄ.Æ0œÔ`\WÒ*”V´üÊ“ ZF".wX¾=¼Ùº³í‘¸d“ÏÌ\žÒ>5 +÷ŽIÿoÓ#©ˆ+,_˜¥¹iYc3æO]&YiGÖÝçĸΒ]ÊëErÝ,&t’¬Å}«œÌBlå–Ýy“t™mrjë)î¾m|S!¥w;4Ñò¡èµ¨ü^Ä)wV˜†°PÂÓÊM­3¢Ý7IsÁ ÆRep‚ ÀÀ†j£Ý¡ýt:žó?–Ò\YlÅÉrÁ õlò¥7›˜^¯ê¼¤Tö“q䅆В´&–S”WòlV¿¹y”cnp@5ÝRdaTŒàÇÙÐø¦âXaSÜ×Mœ2£Ã„NölÁU¤à ~põE–⯑Ø]¿-;G0àuæÖXÕÿ„ÓE§©³ûˆô¶—©ïLïù?ì*yŽÛb#*-½H ë¤ n.}gEáÑŽ:±Ø´ÝI¶â‚is+N±§`üæÓ­Ê&6#N]–8¢)«k®fçDÑjúì{›<>€ûˆ EÞÌ {rM7Ó~–ôÉú(ÙqëH ~pð@u¿uÑIÌZ®9;S}|äuÎDÑx;À‹¯¿ù0÷¢ÆeŽyy¾–w^×nÕå±»?—me@Ьç ?¤o· D=ïÓDöƒ‰Q~ökîäÍ•“s_;mÁðöAïgOã‹Û¾¥4Zäøè²d¢‘ùK©Lø-¥EuôÓßµ2ÿ`p£ß£:+í^x0qdKªÌ¨EõA üvìßȪ3a#¶ú,¥AÀÀ¼|$GGQËb~–hÿ’1ê—#nb,!`h@V‹—Và. ^öGs(V˜"4Ÿ$%C`_0pA=ç  '`_¡²5bvÚ#4“x6Bx ö–³‚Wg)ó@à`X€òDƒ58?&4Å79,·yT˜;§WuvQH9¨tŸ#f;æ…¤'o…ç'»Ö³9üâJ86k؆dÇ„çrrA³…s@Ôv‡þ†npØ„¹R`†„wa&3‚˜<ƒ6ˆ…Hˆ†˜k{Xsœ4‡8ÿV‡‰’8‰D‡ò³o~ˆsõ<”؉žhp¨^ëWjGXŸxŠ‘x…Í—.™˜u?2B´‹x ‹´8‹¶X‹¸x‹³ˆcˆh™q\KÒ":¸ˆÄøy/¡i!ŠÅØ'_BK9ሢ·ŒÒ¸swñK²×7ö÷);XchgHbN*äèXæx*刎瘎츎îè€Â¸W÷„£ L8ƒÂe&¨óÖ€Êa²§ÅÈQ€:`QÀ`8.à2‘Y‘ÌB‘i‘¹‘9.¼U'ôÈnJÒÿ‘€`Êhˆ": }à˜‘ÖÈ€«‘qp$ÿ“:¹“<Ù“>ù“@”B9”D¹“Y”ñ/ á#‰ƒõ“UR•T9•VY•Xy•ZI•J©0Á Øfb9–dY–fy–h +]ùÎN‰ö˜•r¹•t9—vY—xÙ/`Pzàp Ži9˜„Y˜†y–‰]5PL@‚iHy™w9™’Y™[r} o;•‡š¢9šhÙJùQ†pI™°i™²›rÙ˜ù(0S`Iš¾ù›Àù wps°&ЛÁ¹œÌ‰–w`l›F±sà)ؙڹÜÙÞùàžâ 9žäÉœ©;rmagick-2.13.2/doc/ex/images/Ballerina.jpg0000644000004100000410000001073712147515547020310 0ustar www-datawww-dataÿØÿàJFIFHHÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀú§"ÿÄÿÄ8!1A"Qqa‘±2¡#BRÁðÑñ$3SbráÿÄÿÄ&!1A"Qa2B±ÿÚ ?çÓ¦ ÕI$!'JG”ª$’HɉN˜ ÷ù‚Pž!<-L@"ž”¤ ÊêG(ž˜È’yH…+¤À§]+I pP«p`ÊòöS} µÒúq”‰¤Z’Æð54]v ;¹ò%Ü~/’ò‘M¾+E04ŸNê¼ØŽ5а¢Î”!Âð°ò`Ì{Xûa;¦Ï?ȺRÈæ3Û‘mkHp<Ži&•¹ sc.-;‚ª’„16«QØ«æˆbµÄŒÜÞâ F¬ó^©ŠE YoÑ5ØUW$Öe±jZÄ„ðœ¦<­L*3Ê2€ìRJrˆ %¹Q½*7 ‚D’zH O¨ ´ÿ5ЃWúvÉ9ߤÕgZì:^/åâk4¸4l~«äã E\Z¾äµúEÖÂ"€)MWªSä1¬¢B‹F¸‡¼¶º=˜¤™•Öqƒšá@Á\ÃõÕ÷]·W`1—EÅ¿õ?eµ)´Ò2œ[ž" äžÊ¦^^N4‘°—0^ª¶ç‰#Ë»¾]”Øú],q¼^¡½ðª…z»2”g±ŒW²¿LfNdbGÇ Ý_vÚNÿ"´!|p— mó°ªDdîrŒº´G\Y†l¢;!'ºµÔ"->#Fýý• àÑY]Šk¿g›m~¯B( D―¡ˆÄ )É@ãº`”nFå¸@È\’g‘€o¶é]¨ƒÓëLEœq«"6ž …®Á“‰üú®3×™þÁtñ?ÊŽ³ïý)ÆZO$^<¤¸üéXÆcqÛá‹ l]’š=1ǬŸ2¬ÜÀü ËÝOȪ*·‹³Öº¨(jE¾¥N„{.2Q¢g7â»,†—À ÈõFxOsÜi½Ï¢“,‘æÉ¨MI™Ùr°Æ ^~Ÿ52<»Æq£öUFGæÜ[KXÓÁåÇÕ^Lj» {f´;äêó¸'cûgè×.m2QË›NùqýÓÁ&·A²­Œ=>r –4?Û×û¨z.Kr;ìx¤~ÁI|-8åGóOö …Š;¬<°è%ùO¿#{ªY06XË\9YEÉ~̶ɪ¯”äªFOwcÈiËî=U‚Hê­®Ï.Ÿ²jñíz Å)‹”nzÔÄw²g>ÔnuÀ¹% &BzL‰&ÃoüÜUýK§”=Ó¯>6ÕévPb±À‡Ø ^ɨ¹z>“èÑÊ¥/ì§âÓhýÕG½¡áÛmÞÖ®OO0æžwÝP~Áú5FÓ·'”N¹>š=×ã$hãIâã–Ø;ZÁëÂHžQ±êµ¡hñu‚75[Ù ²1ÄŽvÞUãÎ.¹ã<[a¾E|1ÿ‰­M?ÂãÑ–øŽÁÍ-ý–ùÅ,KÜ(iöÿ ¦þŸü@ýGP7j¥É‹^ß&¼K ^žÁâÉ ¨ÿ Ñ»íþ« ðÞYÄÍ› SAÎòßõóö]”}!‘ÊdcéÆÉ³ê¡‡ºhœÌøãÖ]¨¸žéNèIa%¶Æi%ðXds7QJÕu˜P¿h¤ú*óC,.-{oЩÉdŽk®ôã•’¦ŒÛOöTº~p”§Ú@t¹§›]4¬¶îÕsØÇëX³½¿Âs´’={ZÚ/Q‹OÓ-d7Âvß§±Uœõ»“ 2Bi¾]=½n—.÷âº<ªjŸ’ìŽê¼DÎ äµ$÷Q›[÷„”. &uÔˆÉ÷@¯ÃxÞ&k¦pÚ1CÜ®®\OóXXý#unóçÉk³^µû-ë]aÁ§íqâ¿}“d~P¹Ç†ÚÆÇ”Ô¹o6:G©SuIÝ/ƒÓ±·–MÜ}êQÉ‹ x"7éØ[FävñNm¹jø-‹Q?ð‰±kéºäÞy¤gÁgåõ#Œ4<ésv6´Ã™d‚Ž€y-¯¨YWÊ›"lŒrç#ÜÓUgoªŠêcº7ó%’/Ïu¹†Ë¿ÑP|ñf³Ãp»â‡u?Rž7C«V½CAsvÔG$,CÔã…Á°¶·«ª uÍ÷Ñ{3'#ø´Khê{,¢;Ré²à.)d”>zª©sÏÌq…MYÛ­ë+„ŠS– -Z™Ëm%) '¢:%q—ÈÖ\i G¢ãx½@8þ˜Æ¯Ÿd͸õ;mŒÉÓA… q´~¦#L øQ‡èÙ<}2<ÖÈ<¤ÿ·õ;½Z|¾Ò±bk@;ÊÈ÷;|>êX§,sœÝ<DÃ!‘À2'6é7m çp2 &&ž³ž“§?Ä~|!ûº2ûEW©åÈîšÉ|é ‘¥>ü©>^CÁ‘°²+4_ZYC<þ`Æëcˆ¾v>ÊEd[ȲoæF/Æ,¸÷]V߈\Ágå3§Å"£w™žÇ·ÝhgLöµÎiÛšÿEPËo,¶^Ë·ãj]4+o‡8Èÿ‰‘†wn²Z=;ý–ž63àŠY‹<‘ Ýÿ“¶ß¿ÉWÄÄËê_‰ænD3`çö`ª»õÙupâtühzT-:|=ÞFÖ}î¹rïÅMÞ2XsZõÝ[ÐÍè¥ñA#X×k¢âÕU±‚æ¼4 |Vö?Y eKyí~‹›"þ+j-¦Ìö c“CÁGR‹2öx€nºßøœrb™eƒ ±Uxmó¸{›åU~t |$DçlZ;eޏ½4iIaÄ–î£sIZY¸ŽÅ‡WVr«‹Õ¤a‡|$¬0$˜Ž¿l¹„q6ýIàÓcáÇ…Ž1~§»Šš8$Ĉˆ!…¬ç“e7‰•a"0O cIrÝGªàðcÇ^^äËÄÈ!{§u¹ÇS¯²†y„ÅYÃs"Äñ¥›Ãp`þ·u>5cFêiऑâ'ˆÿ^Ÿ/º¦ekòÝó»á0_¿¹VÝ<.c$ŽFÓ¸µÆÇžØ22q&™¦Håw˜Ô »ýÖqÄyŸR±¨$üœáGºÂÊ"snnþ‰ŸÔcÞ¥B~ ÑªCdÿKE•b×£Á•…¹2?1 ‘4­¶¹£â6PcE ,sª:!µÏeGQÒe21³ÃÜÝ—oѺ.V| ™Ì ñÈ;|‰UùbÖUD²Q–:^‹¥ÆÉ2ž5viõ>§à¹¸ðz‡‹$¹2™d‘ÅÄüOįA‹ð¾#ñäÇËÈ‹„þ¶MOåº Ié³[<.°ÇÐ.uz›X«b™ ›8­µpÎ)u=;+.—¶ã°Æ´Nü¬×ôøŸ,¬‘Žc£q_ߨ÷[+bÉÝR2LÑåp¿e{§d†L œàú!“¦DMòš÷¥À‘ƒÈáòÙu(©£…'iõœO##@ÕÉ®ÿÌïÂÝüîk0.`9¶÷ÁõT†òýRiè.k‹Šì'$Þ¢¬pز’¾æðZ™éÓC•<, ŠiÁÃC¶%i_5Ö%k¶ ¡ô£û¬þ mk¬¦›aÒ“,dçõ í9„»þÛ·Ô)£ËÍ#L‡Mip~·Ê¥Â Rm¿eýBø|šgA’ö¾xfifí‡4^ÈbÊÇÇwÖÜÆU+)ïdkÝ*Õî]3:”_”•ãÊéƒá¿Ch:¶äƒKÌßøc«d’éLM$“»·ý— »p¡Ò¹’òöIÈçÛwùL?‚å4gÉÔ4u©@v;c,.‰1¥Ï‚!óg=?á¦åWŠú=‹JØÆÇËÆ‚8£ËƆL½‡Ì+>­’pOØÔäSž¤ðk&îÒ?º—¦AÖÃßáäc¿Èà#Ü:È4~ªgB G¤ecâxŒŸY"ìÚÿuœëYÒ4„žöÌþ‘$}ISž6d=Öß —Pï{)s™•(êæS´S˜Ó³ýí]΂y†dF9ÙÃø×õï÷Tú”XÐcëéw:yÙb ´ÑÍᑦi¦ÈÖ·€µ~èÚÒÑæy%okØ 8ôªNB­,XJÞ‘¸öQ8)\d8$á$º8N€ž‚Ðz 5nÑÓ$’ á4$$& &¤I#A;!Fä4Á)'"öLa£¶G0ÛBžgÿªu¢dÄZN)†² Ö´SZø&<#p( ˆÊÃÝHB ’w„— oÒIwN´5%IÒ@ T•'I„Àz¢) \V<ŒŽDÌ–ÌÌÎÌ|n\ÌÎdLN,&42,¤ªLŒjŒäæ¤ ¼¾ŒLNDTVTìîldj4L:LäªäTV$,*<>,,ìdìêìtrt¤ª¼Š¼<><üþ´ lnT<:,\^\^\,*ÄÆÄÜÞLN4\^<ÌžÌ|~\ÜÞlLJ,¬®|œvœLNLlbLüþt|~<,*,ÜÞ¤<64<>œžLÜÞÜljl,",¼¾\ì®¬lj<üºü\^,,.$<:$œžtüþü¼¾Ä’Ääæ\^DœžLN”–”lRl,* |~ÌÒœ<. ”’DÌšÌÔÖÔÌÒdLN$,&$<6,¬®T”n”俬\RDdZTìîtln4T>Tì®ìTV,,.üþ”’lìîì|~|¬®|^|¼¾¼Ü¢Ü\^¤~¤äælL>Dl^Tüþ¼LN<\NLüþ|¼Ž¼<>,,.ÜâLN,lnl<>$d^D!þ0Creator: PolyView® Version 3.62 by Polybytes ,xÿ§¨gÃ*\Ȱ¡Ã‡#JœHQadjÈdE‰ J±$RäÈ#M²É’dÈ’&IB9“dË–%OšD©s% š4SÆ´™Ó&O‘GyzÉPBÃSì0r±FgM˜-•­yÒgW™ZY®äJV+×±D‹¦ V¨Y X‰¦Äis‹v42Tu¬W”4sM[ô§\™7 6Üs%ÏÀŒ‘Úôó1Q¸‘wôàØ ”£B)“e ´çä«aMýšxn\ÓsÑ–|™øìäÖ8žN™C‡–U¹¾œ]ùõbÖ§[þKܪä›Y±ÒV3åð±GٙхDï.ˆ(cÿš¸´ËÛ_­7¸u×Ðe+×ö©¶1ò–u´¬ Ò»7Œ©ö{Ð]¥hJvY\F1È`O× W߀' ýyGG ¬±žYlEgu!ÆWàQeQffÕÙV^‚)Aaý! BpâUb‰<ê¨X@Ù¢_=î˜iÆ)¡†Ò¡!ŽU"‹ˆ`e#"`™¥•"Dq%—_r©å˜`nY¦–brée˜lši&šhn‰¦ 5HqAy!2#5Þ(… RÈ…¸ñÃnz¨¢ƒš(¡6:裉*)¡…Z)¢—Nªé¦Ÿzzè£>Êi"P¥\JzfH£wTÿĤ.:ª£‡Új«¡ˆâZk®†Ò 쨗ÖZl¡¾.Ê«¦¡Úª)/Œ]«|6™º’ª«¥”–Úé¶ :k,±RZ~jj·œ’[„ôñ´R«MÒhEÌÖª-ºá2k.²¢"ö¬²ã+î¡rdœMÔºÚ¶«­Å¢®ëm¯ç.»û:º±©èì,É„Fp…aÍ­°g½t,0ÁßvœoÍçÌkÂÁîÜ1·›îÁ…‘,DÌ'=²Ç–ŠÚ®¿äö›pÉçŒó·ËŽ+L´ò“½i蒆̭ÈçÚè­m 7ÀæNv¤=Œi×ßÿ,‰Jó)ÂÂ(çj8Ü?ppøâŒ7θ§XgLpÖ$ é×^Å8ƒgú±ã ‡.úá;}ñÛkCN0Ê´6Äd;Y6hëÛl@ä®ûî¼÷îûï¿'!¼‹?ýóÛjÏ\æ,¿´y"ðÝ«À@XpÈ!*\½ Ùkï}÷Þ‡ï½Ú“ï}GäÇ dAI(ß5Ûw×ì ·gÒó½u>õ¸@8Dœð'€L  ¨À:ð4àú¼i@ÝÐ܆2ÖkyŽQ‹žÌ6;Ú5ëS? Wè„*,Œ  ‡1A"(‚#Õ7PÝP_‹KHÿøG»©ñ*o*„ cèB&Æð€q8ĸPÃ!ïR;›ßÎD`Ÿ<ïlàúU ñÄ%¾ð‰h„à!ð„2˜ÌWÍ æêC¯öÏd¡J¢ ¡ø@3*1~L£aˆ'äòÜÁ•?̸liÐ;ÙUØDAÐ…0ôc%ˆÆ%ò  =Ä‚$ðßÌôÑ’°<à39C'XÀ Ä·6æ¹FEI±«Ú,´AéñœŒå7‰ÆŽ!”ÆÜ60æ™fsªç°Xˆ$˜A€C`HeÂò/È%¦$ÉËü)†ˆƒ£1—„0€0§yàÿ$ˆ)_ø‚ò0r6ð ˆç*_ö„Z$¼#Æäç¨4b,„áaÈ 4ÀŒRVÒ„+xÀ•½ä âGQM¹¡î9%`ÉãẎC`æ÷Ђ¼ÍW9(BxÐÀržñ2ˆ¦ñ)‡Â•ªté*Kõ2Ê(‚ñø(?tà }å ?ÐÅñKXÖÎ’Jؤa¦kL Z¶PK@*0‚`Q ˜³Ú\Ñ,õ7×°jOK‹§TÉE4]}!:m`† È¹%눅0Ã8[(ÃÈ&0C×Á0”yÅÎUªÔÏõX£>ð =˜Õ~ð¢ÿŠõchA.u¦+×g$k+§L'ÚO¢™N ƒ°)ÖI­Sf(h,óð·Ý¬”/ŠÌjGMÊű.h¢k[Ë«k KœòiÉ~!WĘSYÏuznµtûn«Ñåfí§z•T`×3&Ó€7x¢ø•?i±à‘=[Ît9Õ¸ –_P­Kqf¨'ôA™àÀ„™5Gœ$ ±‚Ú"Ÿ»©ýÂ23^¹è÷ƒ<6–}À–wåT硘s6™¹.ÜÉf¸Âxå¢@pÇ0 ?ƒT#~tb‰es›YÛUˆ|Õ27Tí[Æ’@e桊ûj×#SÙ%–ÿš?M^£¸\×–—mçÕò„!öu…{耊Ubâ@um^q»\lIæ ¹~À3=öÍÖ?„dsæpvd5£zX*dÇ|1äQc*iå“—b3†eÀ74¨@ì¶K‰äy¬÷(7&H Ôv—Rz“qzÛEc=¨xx{p†m'W?PiVCrðm™y3qXäl Èb„"|öÆYN ³T÷Å.Ò›K%÷j¥t kõ*554©#€‚}‚„€G…y¶'H­&0¦ÿ‚vÍ1}œmSxk±Ç—e¼´0à€á÷@+VXìqu~pÏUyCd˜„L3—€ìDx‡@ƒ1”n·Q_aÄy¼„4zUóƒÐ¦|‹ÈGÙGr¡Ä.ø³ 6¡r‰Å,ÛDLÒSp,øŠQWÞ7[ÀG®x@y Š}³o?7D(f6ŠÕ6¨A‡‘…‰YoàrD‹âw(HôÇcô¡'FSýG¾ÂŒyCˆ¤¦<>$f¬Ôd!è@y˜_„åŒ&hG•…a$)ÖèeKU5¨#pœ’+p`7s Õyø#/Œqzž&XoE5Ÿâz™gdÇf¯¶/|pŒÜÿh 6OÉFÀuZ@¦W0Œ¶IFs80ó(ÐpõV`NpfÉGXÒoghBSWt™V……ˆÅ„q£"æ€5@„8¡4ÂDt_'.(“‘b‡Ãi˜õ‹Ø†ti ˆk}paŠÑ¨zl“‚](C2ç‚´§[xæô‚jBŽÑ·v„‰¹`S“„H÷_K'4¬TfJ˜@ U÷(̳õ…hª)‰Ce¤@§+µ6cn ÷¸G1´f / v–ı{nÆv¶+`–”Öu DEø‚¹’gPŸøD ÒÃyEj9‰DCçÕ(OÀ–dIÿð]À7(ðy0ùç…Mx¶…6¼[Ø6‹=ÀYxù@€Kôã3|UDà)Y†é@ð{é/,Bñ1nM’MqEÉr(IО(H}àj‡Sbp¦O.ô 0¡«Ç+º(ðT}õéõ$[p¡14K>=:š>'pùTNãUIЕ“/û"™d˜Á©XPóyg@y¶eIîgNãõ£™xïÆ †5nÁé$ÜÅŒ¹ÒJ#ú„œ4P@šœ§‰‡bM@ч¸ZrLf4’gêD Ä:0ž¿ö• ‰E±ƒn6LMZ{¸i¥ì“ÿÔP1l 4 FŠƒ16ó‡#V§8™Œh*’N6’¡ôv³ç)Љ¼ÛØ(­äB®š§ëé†Ì4m{°ƒŠFŒß§)HÚÙ);7aŸ‡“Þè†Ã—“ÆjNc` `,…39˜ü'n?ù¥‘¤Š„B¦°K:ugðjjªã’ÛâsY!§¹•¬J¬ÛŠFc¥_ fPIÀhsz™ËãׄX$ä?÷E+…#P›° »° Û°ûg€%rI2 Ö™ÙB„”‚rGòX'pô¹WÐ`T(MÙ([J{Ç(gµ‡®tdìäS–ã3>ÿÅ1,V€q£E·™pC‡ßö7þgA'°ß7UnGž6µª¡†j%ÓX)ËHËa‚™²$û1jñ¸0Ü”pb8c^«¯Ne*Y/P’©³´•Ó’Ô´4öu>øF'­"{³¦¶2¿³'H4 `²ÉKF˜±s lYV8!£h‡ç–´ /héEX-t`·´*«‚%‹nOë•Wˆ€Xc5eøTË'Š€‡„·FT4E³cC™«m›¸°ûºÈ†m~€`ê!‰|B|0ª£S¼Æ{¼È›¼J]8ò^zнa]P"pAÀ“½Ú»½ÜÛ½ÞÛ;ÿ Ð4à!qa©—j­0Ó¾–+½ɾ﻾ò ¿õK¿M⢀÷oîk¿ÿ‹¿ó¿LÀ|¿ìsp¶¡'Vœùo<Á\Á|ÁLÁ)À½›=püá¿\À\Â$|Â#œÂöK\p'#qG`0p©( À*,À6œÃ8¼Ã %}L01Â\ÄF|ÄHœÄ|b#J + vŒzäFÅfÅX\ÅZ|Å[œÅ\üÅ^ %P0ADP¾JœÆj¼ÆJL ða=Ðl\Çv|ǯ+@ÆP1ˆ°‚<È„\Ȇ|ȈœÈŠ¼ÈŒÜÈŽlÈ2A¬;rmagick-2.13.2/doc/ex/images/Button_P.gif0000644000004100000410000000776012147515547020140 0ustar www-datawww-dataGIF89ax÷ŒŽDŒ|,*dÜÞl,*,Z¼ljÜln4DF”Üìêìtrt<,.Ltzü¼¾\<\^,ÔÖÔ46< ”’DœLN$&&Lf̼¾¼,6l.,,>LdfÌ\f<.\,>4lnl”–” |$&L<>|ìît¬®Tzü|~R¤ÌÎÌ\^\ü¼äæl<><>|<,2LLR¤,.\üþ|dTV\ä<,.<J”^¼DJ”ìîì|zü <!þ0Creator: PolyView® Version 3.62 by Polybytes ,xÿy¦›,*\Ȱ¡Ã‡#JœHQa 5Wj˜ ÏA9M9rJÉ’$Sš$yReË•&_¾d)²&ʘ.sÂTIæÍ)f‚‘`£À „rŒ´9ó¤Ì”ÉÒdÙG]£ÚìzÓ%Öµm­Âë«S»sEâÐA° 2eïâõ•°ÕÁN¹~šU.ãŸRßôøQŒ-dB@U\U­ã΋ ƒ¾ªÓsÞÄ#±8ZÑFë6V>RZ•îàÒáŠÞjÛ3bÓ++¬é³'†ã†þ(m©ø1èѸq;íx¦[¦JtpÍ=†B(gÿžÎúbÞ¨É“: Æãß>fûž>ÓëÇ¿¿}~þú·Z,!æÂvÜ%¸…ö5"E~áÇNX!…bha†vÈᇆ¨áˆŠX"‰ Öà Ë}öÈð'£Œ4€÷‹Ø ÇŽ<öèã@)äDiäŽ_Åööˆv×lFiå•Xf©¥oÈöŒò¹& 5hiæ™hjÁ Sœµ” ×:¦içxòXƒ[§Œ@ç „jùÅ¥Á&wØYçu>jd¤;JÚ£¥…ÊqCcSÀøg|( J©£–:䨙é€}*¸(w¤ÿ‰jª@šŠ§Ž«r婘2'­$¬ÃòXìŽÇÖZiš«6¦h‚°š,²r k-ÉfK«ªþ‘äg¯2þjæ-”kî¹è¦«nºb¬[® I0’DÓbze®YÈ+´±šÉˆT,°Àq lðÁ'l°sÌ‘‚2È`À£ÇÚ[¤´ö-¸zˆ«%#søà>RòÉ&§Œ²È&ÃѲÉ#Ür!$«¬2ÊT C*({/«(Á¹¯˜ý~rÉ)×|rÉ$3½²ÍO7í4ÍSÇ|2TL`#hâ»Ö‹1Jé«™6€,òÈ,ŸíòÙ0Ÿ,uËK/}sÜ+³-2É&<ðEµËÿÙì]On÷ªEgi6Ôk¿|·ÌL3βÒT»rÓIËíCv€%®¨¡µ+¯ Êa1‘f[mùÓU7®ºÛ3Ÿ®r⦛LE óöMäªn–åà„“]zÚ•W|Ým27ÕÁ;ízã|ÐÁÀÏZu¥|cû{ôâV+^õÚÜÃÜ4ìØW-³Ò±ûð<޾ãßTé+'¿gþ~¶å7;ÎxÛÃÏzö©ß€æD✓¾E½ŽÉ0p@‚°°|4K^ëÖ6?üévp»ëJf‡Yý¨YQÚû¢e§/¨  'hÀäè75© s8ÁÒàŒàs ‚íµ¦md (œÿðõ“…ÉcwúD< RÐf4A 앤 LàjÓžýPf² JtCìÖHô5´ãÑQ8]Üêw¶pHw€Á~8¾ûÕì{Q8•@¨±°Î€„ZDÈÇ?Å­­yTŒp½-Òr^¼Ðjò¬öŽP6ËØHȶýàWZ„Z(¼×%­dVÀö©ã„J‘YÒ¤Ú$·Æ“Í”W2~XKâ‰,¶óî 4’ÝÍ(Ag”• ¸Fm>¸%–¾`RîŽikÚ¸¦,¯…çsDbžP7«QpeÒÄ’ v‰6NnPvÒß^ò,h]’PÀâ#¡vÿ³tbi”õ{âðLÆÈÓ.—8ñTvjOnäóç•n0ÐÇ)Ï{…¹%2Zòžƒ:À.ªÅ¦IÔJh ò(G?ò Hä ØÞwÄL‚ ßs¤ÜN:©ˆ  ¾´FǾöí˜fĤ(0RÔI0š¸Ä’Oó×I¥5íÜäè\6¦ÐL54ݳ(TµäÓ•2|Æ+²úÁû”Ä}HižDª¼snq=³RZ0G~ÒQy>xéÓ’Ï+¯$ÔM© Å¥Íá‹XŠ@Sï¦:-ŠÌu’1?šL4鈩hÍéððªW9àel,dÓ4Fµ€³«…új3‘69˜ÿñ´H6¨&FåæÈ<`£mÕ¬àì)W<ÑÕn.<§Èn{)Û Ž3§EÛ6;˜îQ? •ÏBï´XºÓeÒ„eÒàÀÙ.omsx#·r'Ú³³i¢«eÇRÚJRº_ÔNõq-FœÑvíôÕáy×±y=úzº°j•À îLŽ:ÂÀMLmì •ÇÜ}Á?]ZX©z¶%@R×eWµëÕ]ÚÕ©'3ATaª‚@L»Õ`¯Ö…‹í­Ãµä…µôÙ¦Ò·‰Žj°ŠÅ ` êÇ'²,ÂǺŠÒa;(Ù²P à=À¹Ð±Øa qàÃÍèûÐèúÿi0RQS²Ù÷fê¸TªÉŽ`0}^{:ݱÈN°7=þ&¯eq¡ºÛC "7ÐNÅà”õg…K2$.«E%‘RÙ—«[ažÅúi ŠÌ ê•dO<¶pÚÔ¡ÙL^m›xVˆ>í¡>8‚ªd¥¢ Aœ½³JMiûAÆ‘ÓßnÀÖ^—?–Ó€ÓäeÀ²tºØ +6#§\ýÀ⦧@F¤Z8S e¡)(PêÏ‚g;ÂÒÐì^?e¦­œ6š üÌòÉzyú{÷ü@ … Ô`ÆYšóJ* ¿Byº–²†wÀ'®?À0[ ·<ÃRËyúê‘K 3>+la ÿ›€tÀ JáÅŒQ° ÅÔ ’xhtÎóû\ç*`# ªC/%Ñáj1 £|äo+Œr©gÃñ9l=—ÓéO'Õ³ ƒïÃ’P"Ïೇõ¬‹;êÀÞ4¡2LâŽÕì~ûI¢í}ŸÉËgÍñrw¨Ç¥Ür–ŠìCg¢—ï}×ú¡k²â¤Çv²–#ßÙ›øƒVwAžú Òmk—=ñ|dŠÇ{r†6µßë6)â+ߣy¶JæjéH!¨_“}ÞìœË²ØvvF~‹og}†)©#ÝUŸtðT/|¨oµÕ°;À÷WÆQ¾ùg7Œ¦5ï¨iÀn¢Žrÿð±¿,o¢éÕ#”&ë׵ɘü¦J¹ïY1›®céÿ‚‰}£‹ý_—'ŒÀêF{0ÓÙÛw|ÊD-ë„d³ÖBð(Wt¤‘]¼Gd6³nIã8" Z×|sFIÃ-çÆ|@70Xú£@¤B:¤DZ¤Fz¤>JyP;rmagick-2.13.2/doc/ex/images/duck3.gif0000644000004100000410000001214412147515547017407 0ustar www-datawww-dataGIF89a´´õ9!(("#99)*!-0'11(?@6JJYYBC;ddwwOOELQGQRGV\R\cZag^nofjqhttl}„~‡‡››¨¨¸¸ÈÈØØççÿÿˆˆˆŽ“’—˜–Ÿ ¢¢¡¢ž¦©¨¥°¯­µµ¶¹¹»ÆÆÐ»»ÇÉÉÉ××רØÎåå×ììÝóóêÑÑæèèçööýþþÿÿÿ!ù9,´´þ@œpˆ»…´cQ¹<&F§ò%V‡O«2;¼v·S0ÔÛ$r…äsYË”º­éð+Ÿ£ÅæiЧóûwv8jT€mO6Fd…y‚ŒŒ†„zu~lp–H†‘›‡C#)kh^˜—_Ž]{¨š°®ƒŸž‚”c¸m™164¦L’«œÃÄ™ªfÀ´Ÿ·ÌÊÅL\%%µ¬“¦­©¯×±Ü³ÚØÅ§¥º²ÖÈàj„²ÍÞÇÆì•Åí´ïX74¿ý3ýÒȯ_Aƒÿ ÈÊ¿…ýI Øp†Âƒ3 ¼ E Ìøk#DÞ°ˆðŸÆ‡#Œr!™pDZ°È5'þ8uÝè 4îÞ¤¢=ññ<íS‹WÌ Ý6Õ^ºlK‡*í)ÕgPRE¨‚r’aÔ:¦ð°uVNl<´gÁ¶ƒ&];^5ê~}ë5,¾|»ŠÕ÷•9®„Çæ‰ñÍ/Ût‰[+9«ÜÃz»JËÇ 3\ÇiÅýí,ºñå¶´>2üèñEF–]¶$©‘ ~(cÇvÙPvm›"Ú¶9å/‘ƒSÑ¡ð˜«*_9\vI58fl‰2bÑÑe’\ùå¤Ê"SOªˆÏ3égÃRÚ—¯^‰öùÉèÛÅ£ØÁÛeÕÕVqÝY'ÁvÕ'›Í1B5 &µÌ„¡56 g ÕcËdþê¢ 1†abn[œ­Å‡`E¸€(¢fÚ0*X ‹n¹×¡b’ˆ e4"öc…zõE`a$Þv[IJ2y #ØÐdFJ6T%•JbYe•q¹¥“Ë}ù¥–Î]¹%™Vš©f“bné&˜‹øe¥_äÝ6HYq¦•¥Ô¹d!…Ô¹„av64¨¡çe–ä* ‚:·èwqösΜ‹Ü) Œž×i)e)ýÙ°¢Š™Å™{qXbR:jÆjX$0FÙˆAþÄ ª/Î8¤® Žèb«™ëg}ñŠ$†îX6ìÇ&‹ã¬Í¢Z³%k±L‘ðÂŽ¹ªl²:J+cþGšëkFhwÞwrFÑ‚"„êî÷š§cQÔ»ÈzKh°y”º^¦M´{(¼œ^zp÷¼p£Q4Úg½eùçJ`vyC'xüœšLÚ¶$“q‰&m·yt2—¯¼±Éºy9å™Îæp5ω뼜¶àºD.k­‘â2;-:×Z8nµE¦ 5²é%´†N3ÝtÔ¿}*<åXN‚ÜBìÑRÙ0µI›øuÑF–[Y~Bj]õ#ìwbH—-¢Û=Zv7¶v·Ýż¦bÝkfRŽFãçRÝu‡ð™‘²LåöRl3<8ÒåÁéìn³µI*¹œrmùÖÑu ©´ZþoÍîI©Ží,µôìÔ…ý|tÕO«%!àÈÞ$<×h‡½¼äÈSþt¬Ê7/† ßöýö­~û8v4sÛ”ßd³Að‘o~OWkµ«°'j­}ªCdàÝàuà üß{ËM!ý…+ &J9¢)n*ÅKßž7*Ö˜9»ÉrX`‘—D¤tµKr¬c’˜@:·ƒGp3:‚0e°ù\qTcÌ%§uØ L´ö7Ãl*àâ’'¿Á” “³Ú¸¤ò*ñÅ¥}óóÚW’h¶#d {Fäaôø²ÀïÐ} ¼Â Î÷ ÂÁ|Ö³B¸ðÀ½ÙðFé«JÅþ}beqãðþŒ½Ki0Óˆ'¸´‘¦Ñ¡õç8,­ +ÈÀÚКqL#¼m’s090MÕáÍçfâH—™0g#´Î®TÂGb„J#±ÒqrÆ1u) x¢žD·…™Ç÷iÂ\0†ž£Ìç–àA-_L1‚A>êÑ—xÀíŒL¢/Ù'¶C6S†68EÅÀWeÀѬaÅ™5òAJþʳøÖŠ-ª‚ƒßˆF¸õ§-šfS!Ëÿ ²™DŒV’&רÄT~2 â‰eÇ2ô' ƒ R0Æð6cSF—„&8ÉÌM0k“ÆÖ´±&Áé¤gêØ—PþºÑå e2é–lY:íËRŽš¢Â’‚xŠIKˆTª5AQvªžB¡Ö4Péùסu' -H꾨ºÄ]^±/‰¤'¸²EÎÀ6(A‹ô»÷ ¢szƒ§)C=ÂëŽF¹A"IpW‡òH®x5ÃWuVsÎs{c•B,m5Ð"‰ =¬Yª®Àê*qJdæ\ßSÍzZV}kåbù—ÖŒÑ4üš  ö©„eaýRí RÐÚŠÅv¨ñz˜¿„€T[^ŒSSXœ²sÓá:dP¸Õë*ú0ÖÊé·SýÓÊbö'†`rfËAV/ò²œygºánÍ`þ^+a‰’NzeÏF–¬®„•âäz5ã½ÂbÂ|ït&¿*Hý!Û”#ûôÉYÌØ†òܧ!=‹–‰‚¬›Õ³f‹N‹ƒH‰E.0Ú†ÙU!ð"!êâW×YÈh–¸¿VÃ_³§âÌþ•\l; luÄ!–¸³Ÿ‘A”¢§­³£®ÑKÌD‹i˜<™mJ€Ù™j ³`G׺Ý-w<ˆ 2À‚ßHvÖ•Ž”=);>¤’ªÃl>dË0ÉœJ,(œ–ÜÌKǼŠIY<û•x4N¬€‘Eb/Š–´%r‹¥—`“`‘ Ž›¡u‘aAG1´NÆt­¹×þ&´ÕZc\K¿F4[›xOQ]¶|òñ¦Qì¼ ÅÀ;O~(` ÄúŠ/¬Í4ð «” Žîµà¾¼Ââà.vW~`Jb8®$Çy¶™/¸I;‡†¡»àA ÓÍfƒÜî t.‡mëÔTÙ’EË hë¿îÙU þ,dkÍ4Nº².VÊ @ƒÄÀŠC DºÔ®Û2c?Æ~ï×j8Vtð‚!à7ˆX÷`Ôgyß"P§FX˜‡*w6t¨v}lˆ~`~ú÷ˆMW‰-€Í÷w6Àq PHŒ¨u™8}¡hbÿþ–}|oyv 7Psqˆ€ `ªx{Adž“‹Œ‹'aD„“/µ|\ˆ\ÄwŠ‚¸ŠøÇ‡hŒr§3ˆ{ЏkpY(„ÀU“0Ù11ýò.®E¥4„%SJŽ$2;è1{³h~›¸†åW…N8yw—ƒú¸3ƒ2?82#U!u2hRhümŽå§P÷‡~0}d·47bÖzð𸑠ڈ]÷‹“§fáöµ‡Þ·L÷Vç“§ˆ2È“Ó牷gˆ øjÿ‚®6ZÝ7‡å‹8Øuýx~ûwh»6v!jK'‰X‰’þ @}tNù‚"ЊR‰uvEÊ8fècZ+GRs@‰u!P…²h–rø†0Iw÷}ŒÃ,J‡ cgºóJÙö@½Ñ‚U9w1èu”†(ˆ¸g‡!ó:/gjF…GB+”™†9gªaB£³Nõ† ‡{–çŠz¹‰ ™o+'€ÿ&‘ '(Ù˜s—š/ØŠ¯HyUˆO4¹‹§ˆZW_ °y–” ŒÂÈ’ågyÐtDWie7Š{pàå'ŒÍ™uÜ(ƒæç‰Æ‰ˆµhIi“ÆÙ)°ˆå7‡ àâžX'Œy×~ËxM§‰“^I,wŠœt7–I âþ|ec·È@r1.”mD^½£B@™‘·+É›• °™WÆl’”£Y¡¡ÆAúm6±”¹¶©h‘Ô‹-)w>ùö™u±˜×{\ù£|ˆu1 ø·“r•–ÓgyðŽ¬–?—–b¥‹t€’}y‘äYw|©PÙd(&’X©r¦H‚>‚’:} huw邚˜‘Mv†#˜rþ6>”Zš€è·¹£8 pžh£ÅyD¦wy™€>INZ~ V“dçk• $À¤f¤J¯}°¥mÈqŠ€˜jV&ÑBeâI¦”JÅAþD^¨Ú©@{¬×Œ«'¨—/¸‰¸¦«á¡z¿˜ã«r©Y¶ø=m·¦¾Jy¢Zƒ4¦}´I­}æ~þ Q—Šóù¬å·‰f¨‰ªŸ7Iio‰ŸÞz{*-@¦Â¯E&¯¸éb…¢¤ë:w °’ ºPtJ¥.W¤Ùj¯J`>fÁš¯Zx‰6kSªoX‚>˜&u¾ $Öe·Ñv¨´Spôpb±ùØ2{²&¨ƒR„‹â3Ñx\J’2 SmW–z1Sa±-ðn5ËUä8†ž²TÎe±C%„OÕ)@¨TO5ao©Wõá(y¡þΊ{!Ào"vñ÷Ÿv ¤åR¯;2/²†E#yº°0™‡Y×*Ve«­xúpG dqÕ4lgs°;×sð @–'e|jp x …`Õš¶Ý”³Å`|0÷q r«–iýqt–j¦e¥‡ˆj=Pâ·Ç"/`pv[£uᤠ–ûÎ[éT7µEO‡[k÷(ó.E˜ZÉe/ìØ\bRÆ´ZæÇ/F8\îR)RÚ0ËûŽÒe±<Ã)°“ôQ#e^"£^¼‘¾%1]ªªÖ5z)EJé%¿=¨õ+SÉJ‰q&)¤åZdƒþ¯ *lE.KìrÖ@8¦‚»{£ëG’KÙ“rØ ÁÈ@jÅÁXª•x»ºi¸Vj””ú B!¶Ÿ{º|¥hÐS\¨µ°D d%hìW "¼œWÀ|v*˜SDÄR£Ä£ãýÁžWv¶ª¾!Å£;¹g)Z:¼#š4à ¹£˜ éAAgf!tn%$;ž)Jà h Ã~·Âé¢yG9jäªoGHK°ylÁ%Y*tǃF¶ ±8¥[ÏØ¬4l¶ó,¯þ¦,å;’”;¯Cê!v‚íÐþšÎ-MÊ||¨ìÍøÕû×j{Δ¸Ê…õÁšœw,¯-{±8˜²7ØCÈ¿)è²'(ØV²E(ÍRé ³€=ØͲ1û.Iè\8UUñ’/O«……r|äøSÏÕ[J¨UkGU޼SEå…ŸòS…‚Ó›‚¼`H1Fe' ¬ÉyŠÃ\©65ÀÖÿºC Üw É„ÜÍ#(Éx,aT´Ðc’¤l›n™“ŒüÛs-Ãz=ËD×eMÜ{¦%LÂþšº¿lï¼È®«ÇÏèŽé[©§ÔC}[¢­¼»U/ƒ\×¼òH'}Du½Ð/º1Âe”S`d6k0âSñÒùx; 9«ñkR畃%#¾§—þhæ•R÷ á^™%Їe(VtÍ·¶üÝ[`bêÖùLË0úÛ¼ýÏÞàSq¤žMm­Dz®#ÈãŠLʼÇ$NÝp;rmagick-2.13.2/doc/ex/images/Violin.jpg0000644000004100000410000002143512147515547017654 0ustar www-datawww-dataÿØÿàJFIFHHÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀú§"ÿÄÿÄA!1A"Qa2q‘¡±Á#Ñáð3BR‚ñ$r²â4Cbs„ÂÿÄÿÄ%!1"A2Qaq#±ÿÚ ?çØÄ²‚ƒìsÏÖÚ±'9ëH\JÎ"”GLÝNß­:§½Ÿ?Ö¼ŸC…èÐy™XžÍvl[®=”í¼ŠpÓ‚J«–á팺q–9R~[’6˜Ü.‚Ç´$€­âÚ³#4¥^˘îb]™v.w;~90NÝ0>5Ìð e’Y¤PH; ÿ_DØ'$~úéEEÐXæçf_Ü,V“F ebc¿†+ËTòö}Íz'`l‘ Ÿ m^p»`y}Í_ñzgó;G¢z6Æ?Dà Ïâ—Ǽ¿¥ubÑ¿ÌÌY˜jßÃÇz6ݯµ€T\†lx–Ï}z ®cÛ–š Šä=Däý!“µô.àuR û˜W–ÎIXüúšôŸHɃÑë¸ÎêàÖ?•y´¿ÒCášv¨œ¿c±Ã1ÉëZvŸ–£öU=›wU³Ì ²/±åPåÓ=<Ä‚±0®çÕ­K/g6 ÆN:Š(Ï< ÓP é-ì¢õ¡Iob(­«(Fu‚†s2¤£;mÐì~UU*´,mæ~ÉpJê>5ai<·é`„/{RrÇAMœ8ÆÑ$r9J¤î"Ì1RH øoX-eºŠ(æbº±Ðqœ/ïBâ,¿ˆEpÚ?»OA“¿Ê‰,0˜¡ŒLP&¶6 ¾ÔX®9k“ˆapw'~f²¶Š4.|+*Ò·y )68tŠz&ÖªÝHÍTŦâÍuHQq•^G?ïE¹vKž2slG†Hý+ÏË tz¸²Rl³h–A¥‡˜=A¥'¶“³qpi?0<ê w;Ì’$A£!°·;õb¸iÛ®..XÞÆJ0ËÑ® 1ñ•R’0pIçV±°*9d¯µµÆVSnÏAáõ§éP3áŠéÉ9Z\`“â…\…ƒŒÖ¸5Hö}ÍvÜQ‡ø]Îÿä:+ŒN@sÛ­zêÏ3æý‘Üú11‹‚Á”cªàoì5Ýâbbaa·*äý·ˆú=ÃÉIkÉf»#i–&$>Zh&ü˜0èãý'%ôjuÒÁЂF9¹×šIýÿ©¾Õêž”ÛC£¬ÂàûÅyT™ü:soîü= ËÙÕXJ!ä>•fOÞªxsfzwA«3²û…Cy—Çúš$޹jÒH‡nUƒ·…m‘^3 ©åSÈ¥_¢‘Ãñ ey ‡`3“àëVQ Š˜Ç;P®@‚ÕÖ%UUÁ¦r*¶n$âê6enÌ’UG<ã‘ýiÍ<Š—D©¬nßcsÍ#_4ioÚwHcžC9­Ý VÖP¦p=3ƒ÷4dw»Y’TG“ºÑçžzû‰? •ܱ˜ãE†Ew‘س ˆÏCð§â]$#$´Ù¨½Q·º²²=”VUd@ã™$¶™¦„ÆuaPùçïOÙ(kS®Äà«{7ßšF3{ø«…’(Ä¡» õÁLðæwy{@Uƒgyj‡:ñ=/Žü¶cØIR‚›º…sƒíö})ëvŠÖU´-—u,ORi{Ù¤†4–5 Qù¹Ûï@ŽÎ éûq­uYµ÷ƒxRrÉè{\'P[:õq‘Ì}hƒ:Gó ¡'uFûdàö}…)2£‹w8EÆNr gá\ÄCàd×ÈWOÆ? •UIÕ¤`1\êBåºtò¯Wâê,ñ¾oÝ#Ð}ÛÑî3pþ«±'yמp°…ðåíâFíNTÌ·1Òº#)Æê#ÿìÔRæ¶ÎƒÒéqúnüy'Ú¼¥ÿö£ÃQú ôH{Wà×™¨iŸ9ßþ¯µpeáH*roª0éåì¸áï¦ú÷>lÍÜ>ʤ±'²ŒuÀ«¯ìï¥CòÏCã¿LrN9ïRfÜ|ê Ë>Ýþ5¢ÛãÇö©e¾K†F_ó f«–Æ_Ĉ´ËŒéÎÁ†ß­KñÄÝö,Ž‹µ/‡Ryb¶eÅ›H¹ÁË<°4ê”WúLøÉßà+· 4¨­Û†<Ï1¿/•êIZh’X»"‘rÕ«95š¥ü3~~ê›&;cÈ”“¼¹ŽÝTJ¥‘ŽÈT8s*~#¾¬¡²šNN1õ¥–å/ch$+¬Žkõu¤áë´®1,ì¸ @çŒxTœRvZå)IN;EÍ‚ôARÃ"ˆ×É,-åS)@#™À®zÞ« i®$Ìj  ÿ(°ÉkE»Ç¾dåçµ68bÝ¡3ù9j]—¼œV4È…rvÛV+±à°Yþ’É“#í«ÿ±®7„Ý›äºfD‰ÉÚS€~t÷øç ݼ³÷NŸ­u:8^+I3«f#ç„ÀÄ€ÎØò¬N5e¾f„ë%”‰FÎ>Æ—¼ãÖÑ!xt(܉ ŒŽÑçÏR%Ä·R-¬r(F8ï¿*±œ•³mÝ$±Ô‘\r\AŪivrÒÁ·yý=´íÜöÜ籆4»œÆk9~ô>5ŸüãÞéÿËæ6ýj¦IYÈæÜ³UÂÙ<çÅZ^%sÁ,™‰Ém cO³ÂŒÑ›ÅˆÈF´+—ãð©[Úà§=Qž”Ö’ÚɾÁªœã9÷VSꃳŠÊÎGq‹8€Fý+M¾A^G¡£¦7À$s>405’=ž¶p”Ð\K ™sm2ˆñŽcÿ*ZÝŸ· $">æF9ƒúÔïVïf†eHQe;gùŠ hEÇlgÓHþÞ[TÙ™^'´3sm²ëxmÆN|zÕá$Ƥä ùš³žp’0brIØ{j&ù& ëc*O,ïKÅ9!™qÆV$·¥¦rþ*9oüøÓÐÉn³[Î\€VÆûr¤b•n¤`†1ʦ%–S“€<·éU8¿LJ>Ö‚i~Ùa˜²)É\ô;xÍNRÅ^V}ÖVû(…ë(šXѰÅBŸg?#4¬š‘ζéÌÞ±[׳eQß¡»äv†ÒÖ©tg> Z]Ò+gEu7‡º™›L6é¡d$ïœuÜf‘’y)…#$êÈó9­_èç­û2B$`WV9Æ9½"ÖÒ1ü Aär1M\H¶ñ©ƒåΕ·¿{†[x[ª÷´‚ÇÚh$ÚV‚ŠMÓµ]ÇÒ/e ``Ý VÕ?ÏeÙõoÔPÿ(Ï)tÉ À¸ëΤòm”¿ªH”×VËà À†q’W®ÄïC„`ú»gÆ¥5Á–ÈBê½³älÀmŠ=¸f¯Æ¸¦E•Ûw7LV»ËómÊŠ{¨O-º ›ë»f?Ú0(ÿ±uèv Ñ÷[ïãYQ¹Ÿ±ˆÀšÊ_Ý ºÐ8Á w9¨Y' m1êç|gT2Ø,À€=Ô~Åú*ø´“G#-ÂÇÀ©Í8á5·V{RÍë+€s×?í\¤ÑŽ*H‹,rZÙÆÚ™Ž®ð8ÁÒË Ìš…oW—OښɊÖ'èÎ:“ËÏ F)åFTRNž™ë’nèíjÅøíœËÃeÉ‘:íž*³ÐÉ&N)".{'Œë÷ ªôÌ–¬Jj–BH.WoÞ‰a)R#TL¾5Øù×95£b—ò&ãñWÕ•CçÈýb‚DÑöZ™³¹ ññ¬¿ˆ­ý³“¹V_¡©@²µäÝ›B9Ե쥽Ð;«‹™˜£[âÝe8“ÄïûÔíâ¾ÚŠù¡œwRAæ[lãÞjq¯tdƒåš³q¤E–ù[r3¨œŸ: BÌÌû«$sÛ;8Ú82yó;Ó:‹W$u2L‘“I'#YY è-+ŒŸTÒ²‡“ލ*½‚ƒiAÿ?Þ§!‰:†<6¨E…`H8yV\Huœ¹äEkìÑYp!{Ûù§í²Ì# ¶Aå?µX–kÅímû6g<Æÿ¥'Xñ ØÒÍWµ]¤.ëúÓÖ†Y¥-.C"•9çÓæjL®ÏC iŠp™D÷³`–’v\gÏ©Yä“VÉ ¹Ò|6rlD]™,ò3j'Ö;ÓP¬yHĪóØì6ùýi±I±9eÉ$j&®Ã™==µi,[ºåµ³)É-±ñëH¤eŒq·,Ÿ:ûªS[Å#œL5îA(@øò¢rW±q‹§Aİ›F”N³íç›H.¤$êP4Žcb‘‰%˲.3’rzbå[ –Ö’aCsðÇžæ†kW‡º–‰\ÈÖß'b·Çô¥c‘Û´õI8Û'|i©‘šÊÕI!õ3rW(%î3jØ1lc—ºT.™‘u’Bƒ×Ÿ<ýê1Mc1JcnyòÞu°ê€¢ç~YYµWeðú‰Ý[—ÏÙŠu³Rü ÄKt̲D§†-¹y™»D`6Ï_×ߊ|^ôM%§øe™gӹ؎¦šÎ§Àçì¤í¥ìI††S‚ÊL„iåÖŸöÚ&ú鬖í¬¥ã”d¶A•Ôu•b{PÓÛ;H÷cº¡F4ŸOÔÕÇ áÌ–-5ô¬ócå°v.im v’þlùÝ.GõlÕ•ÍÙ›\Ò‘•Hä)2’EP…ô£iœÌûrØrÏ—óƑ㧆Íàc'Ÿ•5¶œ4pÊŽT €F|é>+{&Lúë¤gÏjŸ¹«+¤±é›²+duE4$ IܵE oÈVÔ‚€`œ¾9r¤½» 7“ ÐíoÑ 'c“·î(rÞ¬mµ„dg¦w£Üª5¬ÇÇ{áƒD0DHÂçÃãNŒ¢–ÄO›Ó+?Å@º-þÓ“±ÉúÐdô  Ò85± o–?­;sn‰rži¾=¿½-7‚IUŒ`œóöæxÿ øåZ°m齜dpËbJŒ‚wÈ}}õãw’‚ÆÖ?bš"Û«4íš1øêd¸~mv@ÝÏ:ëŒj f7!@<ªi ì*xP3Ê‘&ž‡Â-l_ˆ —‡Ü¯Šu=ÂÉ{9È#j^P%^A²+8<صNãjåõh&êi„¿…ƒ¤±ìàóÌs5¨¼3© ËO0|Y‹›s1·’xÖVõ›”xßQØà˜ÁçÈ~çãMƒ¥LVHß’(YÆ.¥½›³ŸQ+«ep>ôU2¤I#Á(Vn =yb—ð”¤`’Œ§cûÕMÅãÁ‰Ë"È Çž}1ONôLã« ÅË…Ðé¨m•çY@¸á÷’ܤ·W!LJòÎCYFª»·ÑÐÈ#¶ï—lœ“Òª¸Ì’Üð `#S(;óß÷þžÜp9ž• #®Î"`¯‘¾Õt”ßéèËìá¨áxJÜ)·b²jÈ>­zî..#E!•N[ÝÈ|i/ý9l·+rŒèy•CóV‘@‘€sžtÌÙ£:h^,2†˜X»ê7åŠÈ†!Á¶?é©À£ Ÿ,V£$Æú-JViÔ4#¶vÏÇ i›à$ƒ®C`cÙóÅ7q°¸)C“[+Ü[%äpÀÆ@Ƽ«øƲ…{4w)›vdU8 6'm÷öŸe5m{Ò½PKKéûFeVÁ*sãS·ììƒÀò†OË$ï¾ø÷V^_¤GLgSgãŸÎ—±ŒÜ:Ï#§¼®H?­!)J.Rè§”c%ö\jéåZCÞ>%·¡ÖHߟưe[`Ò’vÆ!l8îÖ‘ÿ({1ÿmB꓎ŸjÒ0Ÿÿma™ˆ/Ž¿§íJö«܃l6öƒ¿ËxÙe¸ ¥›QÆîi˜¸]¥Ç0>{ÍŽIöy 8ÂМ™”h¥º•xt-ó½i'.:5_ñG­­æµ Ó’M'ö£7£v4âèùö¦qñV#ù|™ÌvÁ@Ãgì}†ŽgÔär'áV6<Öåf.'!eeðxs¬“ƒÛ‹©#à¬q©ç¹>^UÜ6bÍI #dùŠ2`Œg¨ûUl3jfãIëí§íÉÓ©ˆ÷R$¨ª 3s¤ … Q‘¶ÔfÆø¡K¾=õ–l’#vp;ø)?J›–ÖBŒpÃê9 ‚ÈÊù†(1·&3Ù¶ugá·ÂŽ*ÿÑ2uþIqFÅ»¬@(2܇ʊ³‹›i;®ŠG2¾#¥F7V©²pÄ7Fä2+ cB=$ P>ÊÖl{×B€ „)$€"(Æ òþxVVæ† Ë$‰©J‚6åãüó¬¦_àµìË‹;8íÑ]c¼FùÁëJvFÑËlÝ ]™U³¿S¿CVѲN¨ês°÷lk#¶E cVÀ¶7;Rã‘ÅS,jNѸ˲Æ]43•𭌙[ˆþ°9Ç{ïCOêîùÒïØê2"60>”498þwhdŽ^bn¿øÖ£k6ÓÄ`9À2¨úŠ·€“éÀÔN Qá×÷ù×:dd%Ð÷—qíÞ“ÓÞ%á’oóÞ©Å+¢/Ò«;¾5&“dwÚåõhÎ6bp1Ö¸þÇîø™¹¹X•ò3 1óÓZ-tª èÐÛ))€v­pkLR’ìcÑé¶RJ»«Jç?ê5œ?¾Æú)ø÷ªî!ÇgàÖhâJ³`,d.9Ÿ  ¸ôæíƒ*Û¨Ö0rÀó÷ %ŽOh%н‘,îÄóßçV‘ ðÚªl6_ªÈÁß ½K>Ëñ¿Æqæ+m¾0»dû÷¨¾ØÖÎë§Ãõ zvhã(Ûó¤_\·F&ã‘>¶9ÓÒŒFJòÏÊdzÊò‘²†ûÑãi[’-ø›ŠgW&" T޽1GH¿!ËØçŸ-¾X­@‚5UéåÞ­5Ü(Ò¦¬³d:t®m·Hä”R³.v\²ÊF3×Ë5”Èt™‚=n^êÊå7ñ©m ŶºeCOLþççN?ª)K™T˜Ð>œa˜øûŠÔ‚êàˆŠö@oãBÓjÂŒ£Ä<„jeûëJs/¼V0Ì»usPMçöÖ{ †6À F2™þt£Gžƒo¥<„å·ZäsôÎzœ~µÈÉ[—Oò±]„ `íÓõ®fý;>#(å« íÈ«~,¶ÑÊŠgwè5´3ðVX‘ÇlFã=uBÖß v1íË»\w¡݇š=#I˜žGm‡€®·ñ€ íì¬Ë|˜¨?›ÿˆSƒÀcó‡/a¯5Ï*©ñ®÷Ó›ÎÞÆð%ÎÙð>"¸XWUÒ “ü÷ÕuŽÅw3¦±–¾y§r ôýé[î¨öS>^_¥yòì¾ng|œVËa3×47; xšÂùøPµa¦1€¤gÛí©¨Ð ì2ÛüMY ç¶>5+•imØ)##~f-ÐÆõh†{KRÑ:–u[Ÿ6çPdŠÒ× œÇÉó ZJF,å“K(šç'ëM³ Sä6GΜî.„*’¿bâTŠt” '†:VS«ˆ¢Uªì3YBéö‚ŠqTŠ©m§œ4k0nHdÙ¼óšo†ºöe/#ž]váò4ÎÑÌñ&2¤o’wm½Â‹x´É1:T‘©¹ ùѶ¤¸ƒ¸¾tX0‡Ž£ŠœJ|L°8ë½`å'tŽŠ{#O¾‚ƒü¬ù§íLF9×ABQÜÿ£WÁL»:ŒÿÝ\ç^Îh¥èA\üÜ×NË•ËZ¢ã‘°Vÿ+©ùUU4Ož7_zñöR‡PUäÆã‘ÆÕ݈£Æt…p>„Deá·j2YXcŸ#]º\bŒIŒçNËö#Çõ8ŸNÝXB¨UsÈs8þ|ëáëªáØô»M!1pëMYÔò3óå\· AßcÔŸ§íLr¬@Å\ËÛbR5?:9õˆþs¼{F(Ù˟牨¥ÙlILxφ i°½I¢`¹nHÇÂ…¤’º†Â¢`•l· 3ó¦cuœ ’~&‚ÆøûE hžâHbˆ#äo·• VúZ+ß²’Q)%#B)òÏΘ‚}2\9Ém¶óÚ§$X€Â„.¥Ý½üêqF‘ãB…åïª9&‰©¦6½ð7Ø’A¬ ÛG KìÎk)L¢/D ¼ŠgìÛ+*t#<é·Ãl}ô¦…Ë…¦yuÀ£DI‰I$#Ÿ²ºj¶ÆÛTï-†ÙÚ¶¤íµhz¢µ*%F|>‚§ G'ÝëQ˜ö}…Dž]~æ¹ú1jÆçΪ8œEøt«Œ‘oxµ[{@3·ûR7¿ûi?èýhàêI‹š¸±¯@îR$¸Sžò©Ûß])»NÛHû!Ð ×-ÿ©v:iO½v0¨œo«ïVäût:9O.Òæ+EU`AlçÝ\ÿOÊC~?½t_ñ,¶èÿj£á_Ñ_`ûWeóFâû¨éœÿµ1—Û¨LT¯ï¢Áë/úî©\I©Âœ<ûȬàŒr¬Oé`úÖÛúgÛ@4=Ÿ¥6$tÆ"<*NõŠÙÊTtǶ¥jOàcßû~Õµ«ü¨‘ÀPXôSCV2Ætm“ãHñ·d´],W½Ðã©©Z;›˜Áf#àšjŠ“ò¢Ò3–ÛYQ×ßYACGÿÙrmagick-2.13.2/doc/ex/rvg_clippath.rb0000644000004100000410000000065612147515547017456 0ustar www-datawww-datarequire 'rvg/rvg' hat = Magick::Image.read('images/Flower_Hat.jpg').first rvg = Magick::RVG.new(hat.columns, hat.rows) do |canvas| keyhole = Magick::RVG::ClipPath.new do |path| path.circle(60, canvas.width/2, 80) path.polygon(canvas.width/2-10, 60, 40, 230, 160, 230, canvas.width/2+10, 60) end canvas.image(hat, nil, nil, 20, 20).styles(:clip_path=>keyhole) end rvg.draw.write('rvg_clippath.gif') rmagick-2.13.2/doc/ex/nested_rvg.rb0000644000004100000410000000112512147515547017124 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'rvg/rvg' target = Magick::RVG.new.viewbox(0,0,200,200) do |targ| targ.g.styles(:stroke_width=>20, :stroke=>'#ff5600', :fill=>'#abd600') do |grp| grp.circle(90, 100, 100) grp.circle(60, 100, 100) grp.circle(30, 100, 100) end end rvg = Magick::RVG.new(258, 100) do |canvas| canvas.background_fill = '#51396b' canvas.use(target, 0, 0, 100, 100) canvas.use(target, 100, 16.6667, 66.7, 66.7) canvas.use(target, 166.6667, 25, 50, 50) canvas.use(target, 216.6667, 30, 40, 40) end rvg.draw.write('nested_rvg.gif') rmagick-2.13.2/doc/ex/image.rb0000644000004100000410000000346512147515547016057 0ustar www-datawww-datarequire 'rvg/rvg' rvg = Magick::RVG.new(525, 270) do |canvas| canvas.background_fill = 'white' canvas.rect(524, 269).styles(:fill=>'none', :stroke=>'blue', :stroke_width=>1) hat = ::Magick::Image.read('images/Flower_Hat.jpg').first canvas.image(hat, 100, 75, 25, 40).preserve_aspect_ratio('none') canvas.rect(100, 75, 25, 40).styles(:fill => 'none', :stroke => 'blue') canvas.image(hat, 100, 75, 150, 40).preserve_aspect_ratio('xMinYMin', 'meet') canvas.rect(100, 75, 150, 40).styles(:fill => 'none', :stroke => 'blue') canvas.image(hat, 100, 75, 275, 40).preserve_aspect_ratio('xMidYMid', 'meet') canvas.rect(100, 75, 275, 40).styles(:fill => 'none', :stroke => 'blue') canvas.image(hat, 100, 75, 400, 40).preserve_aspect_ratio('xMaxYMax', 'meet') canvas.rect(100, 75, 400, 40).styles(:fill => 'none', :stroke => 'blue') canvas.image(hat, 100, 75, 150, 155).preserve_aspect_ratio('xMinYMin', 'slice') canvas.rect(100, 75, 150, 155).styles(:fill => 'none', :stroke => 'blue') canvas.image(hat, 100, 75, 275, 155).preserve_aspect_ratio('xMidYMid', 'slice') canvas.rect(100, 75, 275, 155).styles(:fill => 'none', :stroke => 'blue') canvas.image(hat, 100, 75, 400, 155).preserve_aspect_ratio('xMaxYMax', 'slice') canvas.rect(100, 75, 400, 155).styles(:fill => 'none', :stroke => 'blue') canvas.line(150, 20, 305, 20) canvas.line(345, 20, 500, 20) canvas.line(150, 250, 305, 250) canvas.line(340, 250, 500, 250) canvas.g.styles(:stroke=>'none', :font_weight=>'normal', :font_style=>'normal') do |t| t.text(310, 23, 'meet') t.text(60, 140, 'none') t.text(170, 140, 'xMinYMin') t.text(300, 140, 'xMidYMid') t.text(425, 140, 'xMaxYMax') t.text(310, 253, 'slice') end end rvg.draw.write('image.gif') rmagick-2.13.2/doc/ex/cubic02.rb0000644000004100000410000001012312147515547016211 0ustar www-datawww-datarequire 'rvg/rvg' Magick::RVG.dpi = 90 Border = { :fill=>'none', :stroke=>'blue', :stroke_width=>1 } Connect = { :fill=>'none', :stroke=>'#888888', :stroke_width=>2 } SamplePath = { :fill=>'none', :stroke=>'red', :stroke_width=>5 } EndPoint = { :fill=>'none', :stroke=>'#888888', :stroke_width=>2 } CtlPoint = { :fill=>'#888888', :stroke=>'none' } AutoCtlPoint = { :fill=>'none', :stroke=>'blue', :stroke_width=>4 } Label = { :text_anchor=>'middle', :font_size=>22, :font_family=>'Verdana', :font_weight=>'normal', :font_style=>'normal' } rvg = Magick::RVG.new(10.cm, 10.cm).viewbox(0, 0, 1000, 1000) do |canvas| canvas.title = 'Example cubic02 - cubic Bezier commands in path data' canvas.desc = <<-END_DESC Picture showing examples of "C" and "S" commands, along with annotations showing the control points and end points END_DESC canvas.background_fill = 'white' canvas.rect(996, 996, 1, 1).styles(Border) # Path 1 canvas.polyline(100,200, 100,100).styles(Connect) canvas.polyline(400,100, 400,200).styles(Connect) canvas.path('M100,200 C100,100 400,100 400,200').styles(SamplePath) canvas.circle(10, 100, 200).styles(EndPoint) canvas.circle(10, 400, 200).styles(EndPoint) canvas.circle(10, 100, 100).styles(CtlPoint) canvas.circle(10, 400, 100).styles(CtlPoint) canvas.text(250, 275, 'M100,200 C100,100 400,100 400,200').styles(Label) # Path 2 canvas.polyline(100,500, 25,400).styles(Connect) canvas.polyline(475,400, 400,500).styles(Connect) canvas.path("M100,500 C25,400 475,400 400,500").styles(SamplePath) canvas.circle(10, 100, 500).styles(EndPoint) canvas.circle(10, 400, 500).styles(EndPoint) canvas.circle(10, 25, 400).styles(CtlPoint) canvas.circle(10, 475, 400).styles(CtlPoint) canvas.text(250, 575, "M100,500 C25,400 475,400 400,500").styles(Label) # Path 3 canvas.polyline(100,800, 175,700).styles(Connect) canvas.polyline(325,700, 400,800).styles(Connect) canvas.path("M100,800 C175,700 325,700 400,800").styles(SamplePath) canvas.circle(10, 100, 800).styles(EndPoint) canvas.circle(10, 400, 800).styles(EndPoint) canvas.circle(10, 175, 700).styles(CtlPoint) canvas.circle(10, 325, 700).styles(CtlPoint) canvas.text(250, 875, "M100,800 C175,700 325,700 400,800").styles(Label) # Path 4 canvas.polyline(600,200, 675,100).styles(Connect) canvas.polyline(975,100, 900,200).styles(Connect) canvas.path("M600,200 C675,100 975,100 900,200").styles(SamplePath) canvas.circle(10, 600, 200).styles(EndPoint) canvas.circle(10, 900, 200).styles(EndPoint) canvas.circle(10, 675, 100).styles(CtlPoint) canvas.circle(10, 975, 100).styles(CtlPoint) canvas.text(750, 275, "M600,200 C675,100 975,100 900,200").styles(Label) # Path 5 canvas.polyline(600,500, 600,350).styles(Connect) canvas.polyline(900,650, 900,500).styles(Connect) canvas.path("M600,500 C600,350 900,650 900,500").styles(SamplePath) canvas.circle(10, 600, 500).styles(EndPoint) canvas.circle(10, 900, 500).styles(EndPoint) canvas.circle(10, 600, 350).styles(CtlPoint) canvas.circle(10, 900, 650).styles(CtlPoint) canvas.text(750, 575, "M600,500 C600,350 900,650 900,500").styles(Label) # Path 6 (C and S command) canvas.polyline(600,800, 625,700).styles(Connect) canvas.polyline(725,700, 750,800).styles(Connect) canvas.polyline(750,800, 775,900).styles(Connect) canvas.polyline(875,900, 900,800).styles(Connect) canvas.path("M600,800 C625,700 725,700 750,800 S875,900 900,800").styles(SamplePath) canvas.circle(10, 600, 800).styles(EndPoint) canvas.circle(10, 750, 800).styles(EndPoint) canvas.circle(10, 900, 800).styles(EndPoint) canvas.circle(10, 625, 700).styles(CtlPoint) canvas.circle(10, 725, 700).styles(CtlPoint) canvas.circle(10, 875, 900).styles(CtlPoint) canvas.circle(10, 775, 900).styles(AutoCtlPoint) canvas.text(750, 945, "M600,800 C625,700 725,700 750,800").styles(Label) canvas.text(750, 975, "S875,900 900,800").styles(Label) end rvg.draw.write('cubic02.gif') rmagick-2.13.2/doc/ex/average.rb0000644000004100000410000000064212147515547016401 0ustar www-datawww-data#! /usr/local/bin/ruby -w # Demonstrate ImageList#average method require 'RMagick' images = Magick::ImageList.new("images/Button_A.gif", "images/Button_B.gif", "images/Button_C.gif") group = images.append false group.compression = Magick::LZWCompression group.write "average_before.gif" average_image = images.average average_image.compression = Magick::LZWCompression average_image.write "average_after.gif" exit rmagick-2.13.2/doc/ex/random_threshold_channel.rb0000644000004100000410000000047412147515547022016 0ustar www-datawww-data#!/usr/local/bin/ruby -w # Demonstrate the random_channel_threshold method require 'RMagick' img = Magick::Image.read('images/Flower_Hat.jpg').first geom = Magick::Geometry.new(Magick::QuantumRange/2) img2 = img.random_threshold_channel(geom, Magick::RedChannel) img2.write('random_threshold_channel.jpg') exit rmagick-2.13.2/doc/ex/cbezier3.rb0000644000004100000410000000165112147515547016476 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' imgl = Magick::ImageList.new imgl.new_image(540, 200, Magick::HatchFill.new('white','lightcyan2')) gc = Magick::Draw.new # Draw Bezier curve gc.stroke('red') gc.stroke_width(3) gc.fill_opacity(0) gc.bezier(100,150, 25,50, 475, 50, 400,150) # Draw circles around endpoints gc.fill_opacity(0) gc.stroke('gray50').stroke_width(1) gc.circle(100,150, 103, 153) gc.circle(400,150, 403, 153) gc.line(100,150, 25,50) gc.line(400,150, 475,50) # Draw filled circles around control points gc.fill_opacity(1) gc.fill('gray50') gc.circle(25,50, 28,53) gc.circle(475,50, 478,53) # Annotate gc.font_weight(Magick::NormalWeight) gc.font_style(Magick::NormalStyle) gc.fill('black') gc.stroke('transparent') gc.text(107,150, "'100,150'") gc.text(30,50, "'25,50'") gc.text(409,150, "'400,150'") gc.text(480,50, "'475,50'") gc.draw(imgl) imgl.border!(1,1, "lightcyan2") imgl.write('cbezier3.gif') exit(0) rmagick-2.13.2/doc/ex/affine_transform.rb0000644000004100000410000000076212147515547020315 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#affine_transform method img = Magick::Image.read("images/Flower_Hat.jpg").first # Construct a simple affine matrix flipflop = Magick::AffineMatrix.new(1, Math::PI/6, Math::PI/6, 1, 0, 0) # Apply the transform img = img.affine_transform(flipflop) # Scale the image, make the background transparent, # and write it to a JPEG file. img.scale!(250.0/img.rows) img = img.matte_replace(0,0) img.write("affine_transform.jpg") exit rmagick-2.13.2/doc/ex/shadow.rb0000644000004100000410000000216612147515547016257 0ustar www-datawww-datarequire 'RMagick' # Draw a big red Bezier curve on a transparent background. img = Magick::Image.new(340, 120) {self.background_color = 'none'} gc = Magick::Draw.new gc.fill('none') gc.stroke('red') gc.stroke_linecap('round') gc.stroke_width(10) gc.bezier(20, 60, 20,-90, 320,210, 320,60) gc.draw(img) # Composite it onto a white background, draw a border around the result, # write it to the "before" file. before = img.copy bg = Magick::Image.new(before.columns, before.rows) {self.background_color='white'} before = bg.composite(before, Magick::CenterGravity, Magick::OverCompositeOp) before.border!(1,1,'gray80') before.write('shadow_before.gif') # Create the shadow. shadow = img.shadow() # Composite the original image over the shadow, composite the result # onto a white background, add a border, write it to the "after" file. shadow = shadow.composite(img, Magick::NorthWestGravity, Magick::OverCompositeOp) bg = Magick::Image.new(shadow.columns, shadow.rows) {self.background_color='white'} after = bg.composite(shadow, Magick::CenterGravity, Magick::OverCompositeOp) after.border!(1,1,'gray80') after.write('shadow_after.gif') rmagick-2.13.2/doc/ex/stegano.rb0000644000004100000410000000314512147515547016430 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#stegano method. # Create a small watermark from the Snake image by # shrinking it and converting it to B&W. begin watermark = Magick::Image.read('images/Snake.wmf').first watermark.scale!(64.0/watermark.rows) watermark = watermark.quantize(256, Magick::GRAYColorspace) wmrows = watermark.rows wmcols = watermark.columns # Read the image in which we'll hide the watermark. img = Magick::Image.read('images/Flower_Hat.jpg').first img.scale!(250.0/img.rows) # Embed the watermark starting at offset 91. puts 'Embedding watermark...' stegano = img.stegano(watermark, 91) puts 'Watermark embedded' # Write the watermarked image in MIFF format. Note that # the format must be lossless - Image#stegano doesn't work # with lossy formats like JPEG. stegano.write('img.miff') # Read the image and retrieve the watermark. The size # attribute describes the size and offset of the watermark. # This can take some time. Keep track of how far along we are. monitor = Proc.new do |text, quantum, span| printf("Extracting watermark...%3.0f%% complete\n", ((1.0-(quantum/span.to_f))*100.0)) true end stegano = Magick::Image.read('stegano:img.miff') do self.size = Magick::Geometry.new(wmcols, wmrows, 91) self.monitor = monitor end stegano[0].monitor = nil # We don't need this any more. File.delete('img.miff') stegano[0].write('stegano.gif') rescue Magick::ImageMagickError puts "#{$0}: ImageMagickError - #{$!}" end exit rmagick-2.13.2/doc/ex/quad01.rb0000644000004100000410000000216312147515547016062 0ustar www-datawww-datarequire 'rvg/rvg' Magick::RVG.dpi = 90 rvg = Magick::RVG.new(12.cm, 6.cm).viewbox(0, 0, 1200, 600) do |canvas| canvas.title = "Example quad01 - quadratic Bezier commands in path data" canvas.desc = <<-END_DESC Picture showing a "Q" a "T" command, along with annotations showing the control points and end points END_DESC canvas.background_fill = 'white' canvas.rect(1195, 592, 1, 1).styles(:fill=>'none', :stroke=>'blue', :stroke_width=>1) canvas.path("M200,300 Q400,50 600,300 T1000,300"). styles(:fill=>'none', :stroke=>'red', :stroke_width=>5) # End points canvas.g.styles(:fill=>'black') do |grp| grp.circle(10, 200, 300) grp.circle(10, 600, 300) grp.circle(10, 1000, 300) end # Control points and lines from end points to control points canvas.g.styles(:fill=>'#888') do |grp| grp.circle(10, 400, 50) grp.circle(10, 800, 550) end canvas.path("M200,300 L400,50 L600,300 L800,550 L1000,300"). styles(:fill=>'none', :stroke=>'#888', :stroke_width=>2) end rvg.draw.write('quad01.gif') rmagick-2.13.2/doc/ex/circle.rb0000644000004100000410000000131412147515547016225 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' imgl = Magick::ImageList.new imgl.new_image(250, 250, Magick::HatchFill.new('white','LightCyan2')) gc = Magick::Draw.new # Draw the circle gc.fill_opacity(0) gc.stroke('red').stroke_width(3) gc.circle(125,125, 25, 125) # Draw a little gray circle on the perimeter gc.stroke_width(1) gc.stroke('gray50') gc.circle(25,125,28,128) # Draw a dot at the center gc.fill_opacity(1) gc.circle(125,125, 128,128) # Annotate the dots gc.font_weight(Magick::NormalWeight) gc.font_style(Magick::NormalStyle) gc.fill('black') gc.stroke('transparent') gc.text(132,125, "'125,125'") gc.text(32,125, "'25,125'") gc.draw(imgl) imgl.border!(1,1, 'lightcyan2') imgl.write("circle.gif") rmagick-2.13.2/doc/ex/bilevel_channel.rb0000644000004100000410000000033312147515547020076 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' img = Magick::Image.read('images/Flower_Hat.jpg').first result = img.bilevel_channel(2*Magick::QuantumRange/3, Magick::RedChannel) result.write('bilevel_channel.jpg') exit rmagick-2.13.2/doc/ex/adaptive_threshold.rb0000644000004100000410000000034512147515547020640 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#adaptive_threshold method img = Magick::Image.read("images/Flower_Hat.jpg").first result = img.adaptive_threshold result.write("adaptive_threshold.jpg") exit rmagick-2.13.2/doc/ex/tspan02.rb0000644000004100000410000000121712147515547016255 0ustar www-datawww-datarequire 'rvg/rvg' Magick::RVG::dpi = 90 rvg = Magick::RVG.new(10.cm, 3.cm).viewbox(0,0,1000,300) do |canvas| canvas.background_fill = 'white' canvas.desc = "Example tspan02 - using tspan's dx and dy attributes for incremental positioning adjustments" canvas.g.styles(:font_family=>'Verdana', :font_size=>45) do |_g| _g.text(200, 150, "But you").styles(:fill=>'blue') do |txt| txt.tspan("are").d(100, -50).styles(:font_weight=>'bold', :fill=>'red') txt.tspan(" a peach!").d(0, 100) end end canvas.rect(996, 296, 1, 1).styles(:fill=>'none', :stroke=>'blue') end rvg.draw.write('tspan02.gif') rmagick-2.13.2/doc/ex/stroke_width.rb0000644000004100000410000000166712147515547017505 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' imgl = Magick::ImageList.new imgl.new_image(500,80, Magick::HatchFill.new('white','lightcyan2')) gc = Magick::Draw.new # Draw 5-pixel wide line gc.stroke('LightPink') gc.stroke_width(5) gc.line(10,30, 130,30) # Draw 10-pixel wide line gc.stroke('LightSkyBlue2') gc.stroke_width(10) gc.line(130,30, 230,30) # Draw 20-pixel wide line gc.stroke('GreenYellow') gc.stroke_width(20) gc.line(230,30,370,30) # Draw 40-pixel wide line gc.stroke('MediumOrchid2') gc.stroke_width(40) gc.line(370,30,490,30) # Draw 1-pixel wide line through the center gc.stroke('black') gc.stroke_width(1) gc.line(10,30,490,30) # Annotate gc.font_weight(Magick::NormalWeight) gc.font_style(Magick::NormalStyle) gc.fill('black') gc.stroke('transparent') gc.text(60,70,"'5'") gc.text(180,70,"'10'") gc.text(300,70,"'20'") gc.text(420,70,"'40'") gc.draw(imgl) imgl.border!(1,1,"lightcyan2") imgl.write('stroke_width.gif') exit rmagick-2.13.2/doc/ex/rvg_opacity.rb0000644000004100000410000000145012147515547017313 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'rvg/rvg' FONT_STYLES = {:font_size=>20, :font_weight=>'bold', :fill=>'white'} rvg = Magick::RVG.new(450, 150) do |canvas| canvas.background_fill = 'white' canvas.rect(400, 50, 25, 50) canvas.circle(40, 100, 75).styles(:opacity=>0.25, :stroke=>'blue', :fill=>'#00ff00',:stroke_width=>8) canvas.text(83, 83, '0.25').styles(FONT_STYLES) canvas.circle(40, 225, 75).styles(:opacity=>0.50, :stroke=>'blue', :fill=>'#00ff00',:stroke_width=>8) canvas.text(208, 83, '0.50').styles(FONT_STYLES) canvas.circle(40, 350, 75).styles(:opacity=>0.75, :stroke=>'blue', :fill=>'#00ff00',:stroke_width=>8) canvas.text(333, 83, '0.75').styles(FONT_STYLES) canvas.rect(449,149).styles(:fill=>'none',:stroke=>'blue') end rvg.draw.write('rvg_opacity.gif') rmagick-2.13.2/doc/ex/texture_fill_to_border.rb0000644000004100000410000000162012147515547021531 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#texture_fill_to_border method # This example is nearly identical to the color_fill_to_border example. before = Magick::Image.new(200,200) { self.background_color = 'white' self.border_color = 'black' } before.border!(1,1,'black') circle = Magick::Draw.new circle.fill('transparent') circle.stroke('black') circle.stroke_width(2) circle.circle(100,100,180,100) circle.fill('plum1') circle.stroke('transparent') circle.circle( 60,100, 40,100) circle.circle(140,100,120,100) circle.circle(100, 60,100, 40) circle.circle(100,140,100,120) circle.draw(before) before.compression = Magick::LZWCompression before.write('texture_fill_to_border_before.gif') hat = Magick::Image.read('images/Flower_Hat.jpg').first hat.resize!(0.3) after = before.texture_fill_to_border(100,100, hat) after.write('texture_fill_to_border_after.gif') exit rmagick-2.13.2/doc/ex/rectangle.rb0000644000004100000410000000120712147515547016731 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' imgl = Magick::ImageList.new imgl.new_image(300, 200, Magick::HatchFill.new('white','lightcyan2')) gc = Magick::Draw.new gc.fill_opacity(0) gc.stroke('red') gc.stroke_width(3) # Draw rectangle gc.rectangle(20,20, 280, 180) # Outline corners gc.stroke_width(1) gc.stroke('gray50') gc.circle(20,20, 23,23) gc.circle(280, 180, 283, 183) # Annotate gc.font_weight(Magick::NormalWeight) gc.font_style(Magick::NormalStyle) gc.fill('black') gc.stroke('transparent') gc.text(30,35, "'20,20'") gc.text(230,175, "'280,180'") gc.draw(imgl) imgl.border!(1,1, 'lightcyan2') imgl.write("rectangle.gif") exit rmagick-2.13.2/doc/ex/quantize-m.rb0000644000004100000410000000126312147515547017061 0ustar www-datawww-data#! /usr/local/bin/ruby -w # Demonstrate the ImageList#quantize method require 'RMagick' snapshots = Magick::ImageList.new "images/Ballerina.jpg","images/Gold_Statue.jpg","images/Shorts.jpg" # Quantize all 3 images to a single set of 16 colors in the RGB colorspace $stdout.sync=true printf "Quantizing... Please be patient, this may take a couple of seconds... " quant = snapshots.quantize 16 puts "Done." # Now we create the "before" and "after" images. # Arrange the original images side-by-side into a # single image. old = snapshots.append false old.write('quantize-m_before.jpg') # Repeat for the quantized images. new = quant.append false new.write('quantize-m_after.jpg') exit rmagick-2.13.2/doc/ex/sparse_color.rb0000644000004100000410000000303412147515547017460 0ustar www-datawww-datarequire "RMagick" def draw_centers(img, all_four = true) gc = Magick::Draw.new gc.fill("white") gc.stroke("black") gc.circle(30, 10, 30, 12) gc.circle(10, 80, 10, 82) gc.circle(70, 60, 70, 62) gc.circle(80, 20, 80, 22) if all_four gc.draw(img) img end imgl = Magick::ImageList.new img = Magick::Image.new(100, 100) begin img2 = img.sparse_color(Magick::VoronoiColorInterpolate, 30, 10, "red", 10, 80, "blue", 70, 60, "lime", 80, 20, "yellow") img2["Label"] = "Voroni" imgl << draw_centers(img2) img2 = img.sparse_color(Magick::ShepardsColorInterpolate, 30, 10, "red", 10, 80, "blue", 70, 60, "lime", 80, 20, "yellow") img2["Label"] = "Shepards" imgl << draw_centers(img2) img2 = img.sparse_color(Magick::BilinearColorInterpolate, 30, 10, "red", 10, 80, "blue", 70, 60, "lime", 80, 20, "yellow") img2["Label"] = "Bilinear" imgl << draw_centers(img2) img2 = img.sparse_color(Magick::BarycentricColorInterpolate, 30, 10, "red", 10, 80, "blue", 70, 60, "lime") img2["Label"] = "Barycentric" imgl << draw_centers(img2, false) montage = imgl.montage do self.background_color = "none" self.geometry = "100x100+10+10" self.tile = "2x2" end montage.write("sparse_color.png") rescue NotImplementedError, NameError img = Magick::Image.read("images/notimplemented.gif").first img.resize!(240, 272) img.write("sparse_color.png") end rmagick-2.13.2/doc/ex/matte_replace.rb0000644000004100000410000000167512147515547017603 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' img = Magick::Image.new(200,200) img.compression = Magick::LZWCompression bg = Magick::Image.read('plasma:fractal') { self.size = '200x200' } bg[0].matte = false gc = Magick::Draw.new gc.stroke_width(2) gc.stroke('black') gc.fill('white') gc.roundrectangle(0, 0, 199, 199, 8, 8) gc.fill('black') gc.circle(100, 45, 100, 25) gc.circle( 45, 100, 25, 100) gc.circle(100, 155, 100, 175) gc.circle(155, 100, 175, 100) gc.draw(img) img.write('matte_replace_before.gif') # Set the border color. Set the fuzz attribute so that # the matte fill will fill the aliased pixels around # the edges of the black circles. img.border_color = 'black' img.fuzz = 10 img = img.matte_replace(100, 45) # Composite the image over a nice bright background # so that the transparent pixels will be obvious. img = bg[0].composite(img, Magick::CenterGravity, Magick::OverCompositeOp) img.write('matte_replace_after.gif') exit rmagick-2.13.2/doc/ex/mask.rb0000644000004100000410000000232712147515547015724 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # This example demonstrates the mask attribute. The mask image must # be the same size as the image being masked. Since this mask image does # not have an alpha channel, the intensity of each pixel is used to define the # mask. White pixels are more intense than black pixels, so the area of the # image masked by white pixels will remain unchanged, while the area of the # image masked by black pixels is affected by any transformations. # In this example the mask is simply the words "Flower Hat" in black text # positioned near the bottom of the white clip mask image. img = Magick::Image.read("images/Flower_Hat.jpg").first q = Magick::Image.new(img.columns, img.rows) gc = Magick::Draw.new gc.annotate(q, 0, 0, 0, 0, "Flower Hat") do gc.gravity = Magick::SouthGravity gc.pointsize = 36 gc.font_weight = Magick::BoldWeight end # Set the matte attribute to false, indicating the absence of an alpha channel # in the mask image. Assign the mask image to the mask= attribute of the image # being masked. q.matte = false img.mask q # Use the #level method to darken the image under the black part of the mask. img = img.level(0, Magick::MaxRGB, 0.50) img.write('mask.jpg') rmagick-2.13.2/doc/ex/frame.rb0000644000004100000410000000032212147515547016054 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#frame method img = Magick::Image.read('images/Flower_Hat.jpg').first img.matte_color="gray75" img = img.frame img.write('frame.jpg') exit rmagick-2.13.2/doc/ex/fill_pattern.rb0000644000004100000410000000135012147515547017447 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Magick::Draw#fill_pattern and #stroke_pattern attributes. temp = Magick::ImageList.new temp << Magick::Image.new(5, 10) {self.background_color = "black"} temp << Magick::Image.new(5, 10) {self.background_color = "gold"} stroke_pattern = temp.append(false) img = Magick::Image.new(280, 250) {self.background_color = "none"} gc = Magick::Draw.new gc.annotate(img, 0, 0, 0, 0, "PATT\nERNS") do self.gravity = Magick::CenterGravity self.font_weight = Magick::BoldWeight self.pointsize = 100 self.fill_pattern = Magick::Image.read("images/Flower_Hat.jpg").first self.stroke_width = 5 self.stroke_pattern = stroke_pattern end img.write("fill_pattern.gif") rmagick-2.13.2/doc/ex/level_colors.rb0000644000004100000410000000053412147515547017457 0ustar www-datawww-datarequire 'RMagick' img = Magick::Image.read("images/Flower_Hat.jpg").first begin img = img.level_colors("green", "orange", true) img.alpha(Magick::DeactivateAlphaChannel) rescue NotImplementedError not_imp = Magick::Image.read('images/notimplemented.gif').first img = not_imp.resize(img.columns, img.rows) end img.write("level_colors.jpg") rmagick-2.13.2/doc/ex/flatten_images.rb0000644000004100000410000000177212147515547017756 0ustar www-datawww-data#! /usr/local/bin/ruby -w # Demonstrate flatten_images method. Create an image with a drop-shadow effect. require 'RMagick' RMagick = 'RMagick' i = Magick::ImageList.new # Create a background image with a gradient fill i.new_image(200, 100, Magick::GradientFill.new(100,50, 100, 50, "khaki1", "turquoise")) # Create a transparent image for the text shadow i.new_image(200, 100) { self.background_color = 'transparent' } primitives = Magick::Draw.new primitives.annotate i, 0, 0, 2, 2, RMagick do self.pointsize = 32 self.fill = "gray50" self.gravity = Magick::CenterGravity end # Create another transparent image for the text itself i.new_image(200, 100) { self.background_color = 'transparent' } primitives = Magick::Draw.new primitives.annotate i, 0, 0, -2, -2, RMagick do self.pointsize = 32 self.fill = "red" self.stroke = "black" self.gravity = Magick::CenterGravity end # Flatten all 3 into a single image. # i.display i.flatten_images.write "flatten_images.gif" exit rmagick-2.13.2/doc/ex/polaroid.rb0000644000004100000410000000145512147515547016603 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' require 'date' # Demonstrate the Image#polaroid method img = Magick::Image.read('images/Flower_Hat.jpg').first img[:Caption] = "\nLosha\n" + Date.today.to_s begin picture = img.polaroid do self.font_weight = Magick::NormalWeight self.font_style = Magick::NormalStyle self.gravity = Magick::CenterGravity self.border_color = "#f0f0f8" end # Composite it on a white background so the result is opaque. background = Magick::Image.new(picture.columns, picture.rows) result = background.composite(picture, Magick::CenterGravity, Magick::OverCompositeOp) rescue NotImplementedError result = Magick::Image.read('images/notimplemented.gif').first result.resize!(img.columns, img.rows) end result.write('polaroid.jpg') rmagick-2.13.2/doc/ex/composite.rb0000644000004100000410000001031512147515547016767 0ustar www-datawww-data#! /usr/local/bin/ruby -w # Demonstrate the effects of various composite operators. # Based on ImageMagick's composite test. require 'RMagick' include Magick ROWS = 70 COLS = 70 COLOR_A = "#999966" COLOR_B = "#990066" img = Image.new(COLS, ROWS) triangle = Draw.new triangle.fill(COLOR_A) triangle.stroke('transparent') triangle.polygon(0,0, COLS,0, 0,ROWS, 0,0) triangle.draw(img) image_A = img.transparent('white', TransparentOpacity) image_A['Label'] = 'A' img = Image.new(COLS, ROWS) triangle = Draw.new triangle.fill(COLOR_B) triangle.stroke('transparent') triangle.polygon(0,0, COLS,ROWS, COLS,0, 0,0) triangle.draw(img) image_B = img.transparent('white', TransparentOpacity) image_B['Label'] = 'B' list = ImageList.new null = Image.read("xc:white") { self.size = Geometry.new(COLS,ROWS) } null = null.first.transparent('white', TransparentOpacity) null.border_color = 'transparent' granite = Image.read("granite:") list << null.copy list << image_A list << image_B list << null.copy list << image_B.composite(image_A, CenterGravity, OverCompositeOp) list.cur_image['Label'] = 'A over B' list << image_A.composite(image_B, CenterGravity, OverCompositeOp) list.cur_image['Label'] = 'B over A' list << image_B.composite(image_A, CenterGravity, InCompositeOp) list.cur_image['Label'] = 'A in B' list << image_A.composite(image_B, CenterGravity, InCompositeOp) list.cur_image['Label'] = 'B in A' list << image_B.composite(image_A, CenterGravity, OutCompositeOp) list.cur_image['Label'] = 'A out B' list << image_A.composite(image_B, CenterGravity, OutCompositeOp) list.cur_image['Label'] = 'B out A' list << image_B.composite(image_A, CenterGravity, AtopCompositeOp) list.cur_image['Label'] = 'A atop B' list << image_A.composite(image_B, CenterGravity, AtopCompositeOp) list.cur_image['Label'] = 'B atop A' list << image_B.composite(image_A, CenterGravity, XorCompositeOp) list.cur_image['Label'] = 'A xor B' list << image_B.composite(image_A, CenterGravity, MultiplyCompositeOp) list.cur_image['Label'] = 'A multiply B' list << image_B.composite(image_A, CenterGravity, ScreenCompositeOp) list.cur_image['Label'] = 'A screen B' list << image_B.composite(image_A, CenterGravity, DarkenCompositeOp) list.cur_image['Label'] = 'A darken B' list << image_B.composite(image_A, CenterGravity, LightenCompositeOp) list.cur_image['Label'] = 'A lighten B' list << image_B.composite(image_A, CenterGravity, PlusCompositeOp) list.cur_image['Label'] = 'A plus B' list << image_B.composite(image_A, CenterGravity, MinusCompositeOp) list.cur_image['Label'] = 'A minus B' list << image_B.composite(image_A, CenterGravity, AddCompositeOp) list.cur_image['Label'] = 'A add B' list << image_B.composite(image_A, CenterGravity, SubtractCompositeOp) list.cur_image['Label'] = 'A subtract B' list << image_B.composite(image_A, CenterGravity, DifferenceCompositeOp) list.cur_image['Label'] = 'A difference B' list << image_B.composite(image_A, CenterGravity, HueCompositeOp) list.cur_image['Label'] = 'A hue B' list << image_B.composite(image_A, CenterGravity, SaturateCompositeOp) list.cur_image['Label'] = 'A saturate B' list << image_B.composite(image_A, CenterGravity, LuminizeCompositeOp) list.cur_image['Label'] = 'A luminize B' list << image_B.composite(image_A, CenterGravity, ColorizeCompositeOp) list.cur_image['Label'] = 'A colorize B' list << image_B.composite(image_A, CenterGravity, BumpmapCompositeOp) list.cur_image['Label'] = 'A bumpmap B' list << image_B.composite(image_A, CenterGravity, DissolveCompositeOp) list.cur_image['Label'] = 'A dissolve B' list << image_B.composite(image_A, CenterGravity, ThresholdCompositeOp) list.cur_image['Label'] = 'A threshold B' list << image_B.composite(image_A, CenterGravity, ModulateCompositeOp) list.cur_image['Label'] = 'A modulate B' list << image_A.composite(image_B, CenterGravity, ModulateCompositeOp) list.cur_image['Label'] = 'B modulate A' list << image_B.composite(image_A, CenterGravity, OverlayCompositeOp) list.cur_image['Label'] = 'A overlay B' montage = list.montage { self.geometry = Geometry.new(COLS, ROWS, 3, 3) rows = (list.size+3) / 4 self.tile = Geometry.new(4, rows) self.texture = granite[0] self.fill = 'white' self.stroke = 'transparent' } montage.write('composite.gif') exit rmagick-2.13.2/doc/ex/viewex.rb0000644000004100000410000000147612147515547016304 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' img = Magick::Image.new(40, 40) {self.background_color = 'lightcyan2'} # The view is 400 pixels square, starting # column 10, row 5 from the top of the image. img.view( 10, 5, 20, 20) do |view| # Set all the pixels in the view to green. view[][] = Magick::Pixel.new(0, Magick::QuantumRange) # Change the top and bottom rows to red. view[0][] = 'red' view[-1,1][] = 'red' # Set 6 pixels to black. view[[13,15]][[12,14,16]] = 'black' # Set 1 pixel to yellow. view[5][7] = 'yellow' # Change the green channel of all the # pixels on row 8. view[8][].green = Magick::QuantumRange/2 # Change the blue channel of 8 pixels # on column 10. view[4,8][10].blue = Magick::QuantumRange end img.scale(5).write("viewex.gif") exit rmagick-2.13.2/doc/ex/ellipse.rb0000644000004100000410000000174412147515547016430 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' imgl = Magick::ImageList.new imgl.new_image(360, 250, Magick::HatchFill.new('white','LightCyan2')) gc = Magick::Draw.new gc.fill_opacity(0) gc.stroke('red').stroke_width(3) # Draw ellipse gc.ellipse(180,125, 150,75, 0, 270) # Draw horizontal width line gc.stroke('gray50').stroke_width(1) gc.line(180-150, 125, 180, 125) # Draw vertical height line gc.line(180, 125-75, 180, 125) gc.fill_opacity(0) # Draw arcStart circle gc.circle(180+150, 125, 180+150+3, 125+3) # Draw arcEnd circle gc.circle(180, 125-75, 180+3, 125-75+3) # Annotate gc.font_weight(Magick::NormalWeight) gc.font_style(Magick::NormalStyle) gc.fill_opacity(1) gc.circle(180,125, 183,128) gc.fill('black') gc.stroke('transparent') gc.text(187,125, "'180,125'") gc.text(253, 118, "'Start 0 degrees'") gc.text(187, 50, "'End 270 degrees'") gc.text(120, 100, "'Height=75'") gc.text(85, 140, "'Width=150'") gc.draw(imgl) imgl.border!(1,1, "LightCyan2") imgl.write("ellipse.gif") rmagick-2.13.2/doc/ex/swirl.rb0000644000004100000410000000056212147515547016130 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#swirl method img = Magick::Image.read('images/Flower_Hat.jpg').first # Make an animated image. animation = Magick::ImageList.new animation << img.copy 30.step(360,45) { |degrees| animation << img.swirl(degrees) } animation.delay = 20 animation.iterations = 10000 animation.write('swirl.gif') exit rmagick-2.13.2/doc/ex/median_filter.rb0000644000004100000410000000131412147515547017566 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#median_filter method img = Magick::Image.read('images/Flower_Hat.jpg').first img = img.add_noise(Magick::UniformNoise) eimg = img.median_filter(0.05) # Zoom in so we can see the change img.resize!(3) eimg.resize!(3) # Make a before-and-after composite eimg.crop!(eimg.columns/2, 0, eimg.columns/2, eimg.rows) img = img.composite(eimg, Magick::EastGravity, Magick::OverCompositeOp) # Draw a black line between the before and after parts. line = Magick::Draw.new line.line(img.columns/2, 0, img.columns/2, img.rows) line.draw(img) # Crop everything but the face. img.crop!(Magick::CenterGravity, 250, 200) img.write('median_filter.jpg') exit rmagick-2.13.2/doc/ex/line.rb0000644000004100000410000000155712147515547015724 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' imgl = Magick::ImageList.new imgl.new_image(250, 250, Magick::HatchFill.new('white','LightCyan2')) gc = Magick::Draw.new gc.stroke_linejoin('round') # Draw 3 lines in 3 colors. # Make each line 2 pixels wide. gc.stroke('red') gc.stroke_width(3) gc.line(50,50, 50,200) gc.stroke('blue') gc.line(50,200, 200,200) gc.stroke('green') gc.line(200,200, 50,50) # Identify the endpoints with gray circles gc.stroke('gray50') gc.stroke_width(1) gc.fill_opacity(0) gc.circle(50,50, 53,53) gc.circle(50,200, 53,203) gc.circle(200,200, 203,203) # Annotate the endpoints gc.font_weight(Magick::NormalWeight) gc.font_style(Magick::NormalStyle) gc.fill('black') gc.stroke('transparent') gc.text(30,40, "'50,50'") gc.text(30,220, "'50,200'") gc.text(180, 220, "'200,200'") gc.draw(imgl) imgl.border!(1,1, "LightCyan2") imgl.write("line.gif") rmagick-2.13.2/doc/ex/edge.rb0000644000004100000410000000035012147515547015667 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#edge method img = Magick::Image.read('images/Flower_Hat.jpg').first img = img.quantize(256, Magick::GRAYColorspace) img = img.edge(5) img.write('edge.jpg') exit rmagick-2.13.2/doc/ex/border.rb0000644000004100000410000000032012147515547016235 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#border method img = Magick::Image.read('images/Flower_Hat.jpg').first img.border!(10,10,'rgb(255,110,140)') img.write('border.jpg') exit rmagick-2.13.2/doc/ex/qbezierpath.rb0000644000004100000410000000204312147515547017302 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' imgl = Magick::ImageList.new imgl.new_image(500, 300, Magick::HatchFill.new('white','lightcyan2')) gc = Magick::Draw.new # Draw path with quadratic bezier commands gc.fill_opacity 0 gc.stroke 'red' gc.stroke_width 3 gc.path "M20,150 Q120,25 220,150 T420,150" # Annotate # Show end points gc.fill_opacity 1 gc.stroke 'grey50' gc.stroke_width 1 gc.circle 20,150, 23, 153 gc.circle 220,150, 223, 153 gc.circle 420,150, 423, 153 # Show control points gc.fill 'black' gc.stroke 'transparent' gc.circle 120,25, 123, 28 gc.circle 320,275, 323, 278 # Show connector lines gc.line 20,150, 120,25 gc.line 120,25, 320,275 gc.line 320,275, 420,150 # Add labels gc.font_weight Magick::NormalWeight gc.font_style Magick::NormalStyle # Add end point labels gc.text 30,155, "'20,150'" gc.text 230,155, "'220,150'" gc.text 430,155, "'420,150'" # Add control point labels gc.text 130,30, "'120,25'" gc.text 330,280, "'320,275'" gc.draw imgl imgl.border!(1,1, "lightcyan2") #imgl.display imgl.write "qbezierpath.gif" rmagick-2.13.2/doc/ex/rotate.rb0000644000004100000410000000154412147515547016267 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' imgl = Magick::ImageList.new imgl.new_image(200, 200, Magick::HatchFill.new('white','lightcyan2')) gc = Magick::Draw.new # Move the origin to the center. gc.translate(100, 100) max_x = imgl.columns/2 max_y = imgl.rows/2 # Rotate 45 degrees gc.rotate(45) gc.stroke('red') gc.stroke_width(3) # Draw down-pointing arrow gc.line(0, -max_y, 0, max_y) gc.line(0, max_y, 10, max_y-10) gc.line(0, max_y, -10, max_y-10) # Draw right-pointing arrow gc.line(-max_x, 0, max_x, 0) gc.line( max_x, 0, max_x-10, -10) gc.line( max_x, 0, max_x-10, 10) # Add labels gc.font_weight(Magick::NormalWeight) gc.font_style(Magick::NormalStyle) gc.fill('black') gc.stroke('transparent') gc.text(8, 15, "'0,0'") gc.text(110, 16, "x") gc.text(12, 115, "y") gc.draw(imgl) imgl.border!(1,1, "lightcyan2") imgl.write("rotate.gif") rmagick-2.13.2/doc/ex/splice.rb0000644000004100000410000000035612147515547016250 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the splice method. img = Magick::Image.read('images/Flower_Hat.jpg').first spliced_img = img.splice(img.columns/2, img.rows/2, 20, 20, 'gray80') spliced_img.write('splice.jpg') rmagick-2.13.2/doc/ex/axes.rb0000644000004100000410000000364512147515547015735 0ustar www-datawww-data#!/usr/local/bin/ruby -w require 'RMagick' # Demonstrate the use of RMagick's Draw class # and show the default coordinate system. # Create a canvas to draw on. Use the HatchFill class to # cross-hatch the background with light gray lines every 10 pixels. canvas = Magick::ImageList.new canvas.new_image(250, 250, Magick::HatchFill.new('white', 'gray90')) # Draw a border around the edges of the canvas. border = Magick::Draw.new border.stroke('thistle') border.fill_opacity(0) border.rectangle(0,0, canvas.columns-1, canvas.rows-1) border.draw(canvas) # Draw gold axes with arrow-heads. axes = Magick::Draw.new axes.fill_opacity(0) axes.stroke('gold3') axes.stroke_width(4) axes.stroke_linecap('round') axes.stroke_linejoin('round') axes.polyline(18,canvas.rows-10, 10,canvas.rows-3, 3,canvas.rows-10, 10,canvas.rows-10, 10,10, canvas.columns-10,10, canvas.columns-10,3, canvas.columns-3,10, canvas.columns-10, 18) axes.draw(canvas) # Draw a red circle to show the direction of rotation. # Make it slightly transparent so the hatching will show through. circle = Magick::Draw.new circle.stroke('tomato') circle.fill_opacity(0) circle.stroke_opacity(0.75) circle.stroke_width(6) circle.stroke_linecap('round') circle.stroke_linejoin('round') circle.ellipse(canvas.rows/2,canvas.columns/2, 80, 80, 0, 315) circle.polyline(180,70, 173,78, 190,78, 191,62) circle.draw(canvas) # Label the axes and the circle. labels = Magick::Draw.new labels.font_weight(Magick::NormalWeight) labels.fill('black') labels.stroke('transparent') labels.font_style(Magick::ItalicStyle) labels.pointsize(14) labels.gravity(Magick::NorthWestGravity) labels.text(20,30, "'0,0'") labels.gravity(Magick::NorthEastGravity) labels.text(20,30, "'+x'") labels.gravity(Magick::SouthWestGravity) labels.text(20,20, "'+y'") labels.gravity(Magick::CenterGravity) labels.text(0,0, "Rotation") labels.draw(canvas) #canvas.display canvas.write("axes.gif") exit rmagick-2.13.2/doc/ex/text_antialias.rb0000644000004100000410000000137512147515547020004 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' imgl = Magick::ImageList.new imgl.new_image(275, 170) { self.background_color = "white" } gc = Magick::Draw.new gc.fill('black') gc.stroke('transparent') if RUBY_PLATFORM =~ /mswin32/ gc.font_family('Georgia') gc.pointsize(152) else gc.font_family('courier') gc.pointsize(200) end gc.font_weight(Magick::BoldWeight) # Turn off antialiasing gc.text_antialias(false) gc.text(15, 145, 'A') # Turn it back on gc.text_antialias(true) gc.text(145, 145, 'A') gc.draw(imgl) # Blow up the image so we can # easily see the image, then # crop to a representative portion. imgl.resize!(3).crop!(235,270, 365,180) imgl.page = Magick::Rectangle.new(365, 180) imgl.border!(1,1,"black") imgl.write("text_antialias.gif") exit rmagick-2.13.2/doc/ex/modulate.rb0000644000004100000410000000030712147515547016577 0ustar www-datawww-data#!/usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#modulate method img = Magick::Image.read('images/Flower_Hat.jpg').first img = img.modulate(0.85) img.write('modulate.jpg') exit rmagick-2.13.2/doc/ex/skewx.rb0000644000004100000410000000206112147515547016125 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' imgl = Magick::ImageList.new imgl.new_image(250, 250, Magick::HatchFill.new('white','lightcyan2')) gc = Magick::Draw.new # Move the origin to the center. gc.translate(125, 125) max_x = imgl.columns/2 max_y = imgl.rows/2 - 5 # Skew x 30 degrees gc.skewx(30) # Draw down-pointing arrow gc.fill('red') gc.stroke('red') gc.stroke_width(3) gc.line(0, -max_y, 0, max_y) gc.line(0, max_y, 7, max_y-7) gc.line(0, max_y, -7, max_y-7) # Draw right-pointing arrow gc.stroke('gray50') gc.stroke_width(1) gc.line(-max_x, 0, max_x, 0) gc.line( max_x, 0, max_x-5, -5) gc.line( max_x, 0, max_x-5, 5) gc.draw(imgl) # Add labels using "normal" skew gc = Magick::Draw.new gc.pointsize(14) gc.font_weight(Magick::NormalWeight) gc.font_style(Magick::NormalStyle) gc.stroke('transparent') gc.gravity(Magick::CenterGravity) gc.text(10, -10, "'0,0'") gc.gravity(Magick::EastGravity) gc.text(10, 10, "'+x'") gc.gravity(Magick::SouthGravity) gc.text(0, 20, "'+y'") gc.draw(imgl) imgl.border!(1,1, "lightcyan2") imgl.write("skewx.gif") rmagick-2.13.2/doc/ex/PreserveAspectRatio.rb0000644000004100000410000001703012147515547020720 0ustar www-datawww-datarequire 'rvg/rvg' rvg = Magick::RVG.new(450, 300) do |canvas| canvas.desc = 'Example Preserve Aspect Ratio' canvas.background_fill = 'white' canvas.rect(448, 298, 1, 1).styles(:fill=>'none', :stroke=>'blue') # Define the smiley-face smile = Magick::RVG::Group.new do |grp| grp.translate(0, 5) grp.circle(10, 15, 15).styles(:fill=>'yellow', :stroke=>'none') grp.circle(1.5, 12, 12).styles(:fill=>'black', :stroke=>'none') grp.circle(1.5, 17, 12).styles(:fill=>'black', :stroke=>'none') grp.path("M10 19 A 8 8 0 0 0 20 19").styles(:stroke=>'black', :stroke_width=>2) end viewport1 = Magick::RVG::Group.new do |grp| grp.rect(49, 29, 0.5, 0.5).styles(:fill => 'none', :stroke => 'blue') end viewport2 = Magick::RVG::Group.new do |grp| grp.rect(29, 39, 0.5, 0.5).styles(:fill=>'black', :stroke=>'red') end # SVG to fit grp = canvas.g.styles(:font_size=>9) do |grp| grp.text(10, 30, "SVG to fit") grp.g.translate(20, 40) do |grp2| grp2.use(viewport2) grp2.use(smile) end # Viewport 1 grp.g.translate(10, 120) do |grp2| grp2.use(viewport1) end grp.text(10, 110, 'Viewport 1') # Viewport 2 grp.g.translate(20, 190) do |grp2| grp2.rect(29, 50, 0.5, 0.5).styles(:fill => 'none', :stroke => 'blue') end grp.text(10, 180, 'Viewport 2') # meet-group-1 grp.g.translate(100, 60) do |grp2| grp2.text(0, -30, "--------------- meet ---------------") grp2.g do |grp3| grp3.text(0, -10, "xMin*") grp3.use(viewport1) # xMin grp3.rvg(50, 30).viewbox(0,0,30,40).preserve_aspect_ratio('xMinYMin', 'meet') do |canvas2| canvas2.rect(29, 39, 0.5, 0.5).styles(:fill => 'black', :stroke => 'red') canvas2.use(smile) end end # xMid grp2.g.translate(70, 0) do |grp3| grp3.text(0, -10, "xMid*") grp3.use(viewport1) grp3.rvg(50, 30).viewbox(0, 0, 30, 40).preserve_aspect_ratio('xMidYMid', 'meet') do |canvas2| canvas2.rect(29, 39, 0.5, 0.5).styles(:fill => 'black', :stroke => 'red') canvas2.use(smile) end end # xMax grp2.g.translate(0, 70) do |grp3| grp3.text(0, -10, "xMax*") grp3.use(viewport1) grp3.rvg(50, 30).viewbox(0,0,30,40).preserve_aspect_ratio('xMaxYMax', 'meet') do |canvas2| canvas2.rect(29, 39, 0.5, 0.5).styles(:fill => 'black', :stroke => 'red') canvas2.use(smile) end end end # meet-group-2 grp.g.translate(250, 60) do |grp2| grp2.text(0, -30, "--------------- meet ---------------") # xMin grp2.g do |grp3| grp3.text(0, -10, "*YMin") grp3.rect(29, 59, 0.5, 0.5).styles(:fill => 'none', :stroke => 'blue') grp3.rvg(30, 60).viewbox(0,0,30,40).preserve_aspect_ratio('xMinYMin', 'meet') do |canvas2| canvas2.use(viewport2) canvas2.use(smile) end end # xMid grp2.g.translate(50, 0) do |grp3| grp3.text(0, -10, "*YMid") grp3.rect(29, 59, 0.5, 0.5).styles(:fill => 'none', :stroke => 'blue') grp3.rvg(30, 60).viewbox(0, 0, 30, 40).preserve_aspect_ratio('xMidYMid', 'meet') do |canvas2| canvas2.use(viewport2) canvas2.use(smile) end end # xMax grp2.g.translate(100, 0) do |grp3| grp3.text(0, -10, "*YMax") grp3.rect(29, 59, 0.5, 0.5).styles(:fill => 'none', :stroke => 'blue') grp3.rvg(30, 60).viewbox(0,0,30,40).preserve_aspect_ratio('xMaxYMax', 'meet') do |canvas2| canvas2.rect(29, 39, 0.5, 0.5).styles(:fill => 'black', :stroke => 'red') canvas2.use(smile) end end end # slice-group-1 grp.g.translate(100, 220) do |grp2| grp2.text(0, -30, "--------------- slice ---------------") # xMin grp2.g do |grp3| grp3.text(0, -10, "xMin*") grp3.rect(29, 59, 0.5, 0.5).styles(:fill => 'none', :stroke => 'blue') grp3.rvg(30, 60) do |canvas2| canvas2.preserve_aspect_ratio('xMinYMin', 'slice') canvas2.viewbox(0,0,30,40) canvas2.use(viewport2) canvas2.use(smile) end end # xMid grp2.g do |grp3| grp3.text(0, -10, "xMid*") grp3.translate(50, 0) grp3.rect(29, 59, 0.5, 0.5).styles(:fill => 'none', :stroke => 'blue') grp3.rvg(30, 60) do |canvas2| canvas2.preserve_aspect_ratio('xMidYMid', 'slice') canvas2.viewbox(0,0,30,40) canvas2.rect(29, 39, 0.5, 0.5).styles(:fill => 'black', :stroke => 'red') canvas2.use(smile) end end # xMax grp2.g do |grp3| grp3.text(0, -10, "xMax*") grp3.translate(100, 0) grp3.rect(29, 59, 0.5, 0.5).styles(:fill => 'none', :stroke => 'blue') grp3.rvg(30, 60) do |canvas2| canvas2.preserve_aspect_ratio('xMaxYMax', 'slice') canvas2.viewbox(0,0,30,40) canvas2.rect(29, 39, 0.5, 0.5).styles(:fill => 'black', :stroke => 'red') canvas2.use(smile) end end end # slice-group-2 grp.g.translate(250, 200) do |grp2| grp2.text(0, -30, "--------------- slice ---------------") # YMin grp2.g do |grp3| grp3.text(0, -10, "*YMin") grp3.use(viewport1) grp3.rvg(50, 30) do |canvas2| canvas2.preserve_aspect_ratio('xMinYMin', 'slice') canvas2.viewbox(0,0,30,40) canvas2.rect(29, 39, 0.5, 0.5).styles(:fill => 'black', :stroke => 'red') canvas2.use(smile) end end # YMid grp2.g do |grp3| grp3.text(0, -10, "*YMid") grp3.translate(70, 0) grp3.use(viewport1) grp3.rvg(50, 30) do |canvas2| canvas2.preserve_aspect_ratio('xMidYMid', 'slice') canvas2.viewbox(0,0,30,40) canvas2.rect(29, 39, 0.5, 0.5).styles(:fill => 'black', :stroke => 'red') canvas2.use(smile) end end # YMax grp2.g do |grp3| grp3.text(0, -10, "*YMax") grp3.translate(140, 0) grp3.use(viewport1) grp3.rvg(50, 30) do |canvas2| canvas2.preserve_aspect_ratio('xMaxYMax', 'slice') canvas2.viewbox(0,0,30,40) canvas2.rect(29, 39, 0.5, 0.5).styles(:fill => 'black', :stroke => 'red') canvas2.use(smile) end end end end end rvg.draw.write('PreserveAspectRatio.gif') rmagick-2.13.2/doc/ex/opacity.rb0000644000004100000410000000133112147515547016433 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' canvas = Magick::Image.new(260, 125) gc = Magick::Draw.new gc.fill('black') gc.rectangle(10,20, 250,90) gc.stroke('blue') gc.fill('yellow') gc.stroke_width(10) gc.opacity('25%') gc.roundrectangle(20,20, 60,90, 5,5) gc.opacity('50%') gc.roundrectangle(80,20, 120,90, 5,5) gc.opacity(0.75) gc.roundrectangle(140,20, 180,90, 5,5) gc.opacity(1) gc.roundrectangle(200,20, 240,90, 5,5) gc.font_weight(Magick::NormalWeight) gc.font_style(Magick::NormalStyle) gc.stroke('transparent') gc.fill('black') gc.gravity(Magick::SouthGravity) gc.text(-90,15, '"25%"') gc.text(-30,15, '"50%"') gc.text( 30,15, '"75%"') gc.text( 90,15, '"100%"') gc.draw(canvas) canvas.write("opacity.png") exit rmagick-2.13.2/doc/ex/shave.rb0000644000004100000410000000045412147515547016076 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#shave method img = Magick::Image.read('images/Flower_Hat.jpg').first img = img.shave(20, 25) # Add a border so the shaved image is the # same size as the original image. img.border!(20, 25, 'white') img.write('shave.jpg') exit rmagick-2.13.2/doc/ex/raise.rb0000644000004100000410000000026712147515547016075 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#raise method. img = Magick::Image.read('images/Flower_Hat.jpg').first img = img.raise img.write('raise.jpg') exit rmagick-2.13.2/doc/ex/transpose.rb0000644000004100000410000000030312147515547016777 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#transpose method img = Magick::Image.read('images/Flower_Hat.jpg').first img = img.transpose img.write('transpose.jpg') exit rmagick-2.13.2/doc/ex/drawcomp.rb0000644000004100000410000000242412147515547016603 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Read the snake image file and scale to 200 pixels high. begin snake = Magick::ImageList.new("images/Snake.wmf") snake.scale!(200.0/snake.rows) # Read the coffee cup image and scale to 200 pixels high. coffee = Magick::ImageList.new("images/Coffee.wmf") coffee.scale!(200.0/coffee.rows) # We want the "no" symbol to be a little smaller. # Read and scale to 150 pixels high. sign = Magick::ImageList.new("images/No.wmf") sign.scale!(150.0/sign.rows) # Change the white pixels in the sign to transparent. sign = sign.matte_replace(0,0) # Create a "nosnake" draw object. Add a composite # primitive that composites the "no" symbol over # the snake. Draw it. nosnake = Magick::Draw.new nosnake.composite((snake.columns-sign.columns)/2, (snake.rows-sign.rows)/2, 0, 0, sign) nosnake.draw(snake) # Repeat for the coffee cup. nocoffee = Magick::Draw.new nocoffee.composite((coffee.columns-sign.columns)/2, (coffee.columns-sign.columns)/2, 0, 0, sign) nocoffee.draw(coffee) coffee.write("drawcomp1.gif") snake.write("drawcomp2.gif") rescue Magick::ImageMagickError puts "#{$0}: ImageMagickError - #{$!}" end exit rmagick-2.13.2/doc/ex/polygon.rb0000644000004100000410000000113412147515547016453 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' imgl = Magick::ImageList.new imgl.new_image(290, 200, Magick::HatchFill.new('white','lightcyan2')) gc = Magick::Draw.new gc.stroke('blue').stroke_width(3) # Draw red 5-pointed star gc.fill('red') gc.polygon( 75,37.5, 89.5,80.5, 134.5,80.5, 98.5,107.5, 111.5,150.5, 75,125, 38.5,150.5, 51.5,107.5, 15.5,80.5, 60.5,80.5) # Draw green hexagon gc.fill('lime') gc.polygon(225,37.5, 279,68.75, 279,131.25, 225,162.5, 171,131.3, 171,68.75) gc.draw(imgl) imgl.border!(1,1, "lightcyan2") imgl.write("polygon.gif") rmagick-2.13.2/doc/ex/polyline.rb0000644000004100000410000000114312147515547016617 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' imgl = Magick::ImageList.new imgl.new_image(300, 100, Magick::HatchFill.new('white','lightcyan2')) points = [12,93.75, 37,93.75, 37,81.25, 62,81.25, 62,93.75, 87,93.75, 87,62, 112,62, 112,93.75, 137,93.75, 137,43.75, 162,43.75, 162,93.75, 187,93.75, 187,25, 212,25, 212,93.75, 237,93.75, 237,6.25, 262,6.25, 262,93.75, 287,93.75] gc = Magick::Draw.new gc.stroke('blue').stroke_width(3) gc.fill_opacity(0) gc.polyline(*points) gc.draw(imgl) imgl.border!(1,1, "lightcyan2") imgl.write("polyline.gif") rmagick-2.13.2/doc/ex/ellipse01.rb0000644000004100000410000000120012147515547016554 0ustar www-datawww-datarequire 'rvg/rvg' Magick::RVG.dpi = 90 rvg = Magick::RVG.new(12.cm, 4.cm).viewbox(0, 0, 1200, 400) do |canvas| canvas.background_fill = 'white' canvas.desc = "Example ellipse01 - examples of ellipses" # Show outline of canvas using rect method canvas.rect(1195, 395, 1, 1).styles(:fill=>'none', :stroke=>'blue', :stroke_width=>2) canvas.g.translate(300, 200) do |grp| grp.ellipse(250, 100).styles(:fill=>'red') end canvas.g.translate(900, 200).rotate(-30) do |grp| grp.ellipse(250, 100).styles(:fill=>'none', :stroke=>'blue', :stroke_width=>20) end end rvg.draw.write('ellipse01.gif') rmagick-2.13.2/doc/ex/add_noise.rb0000644000004100000410000000072512147515547016716 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#add_noise method NOISE_TYPES = [Magick::UniformNoise, Magick::GaussianNoise, Magick::MultiplicativeGaussianNoise, Magick::ImpulseNoise, Magick::LaplacianNoise, Magick::PoissonNoise] img = Magick::Image.read('images/Flower_Hat.jpg').first NOISE_TYPES.each do |noise| copy = img.add_noise(noise) copy.write "add_noise_#{noise.to_s}.jpg" end exit rmagick-2.13.2/doc/ex/resize_to_fill.rb0000644000004100000410000000032612147515547017777 0ustar www-datawww-data#!/usr/local/bin/ruby -w require 'RMagick' # Demonstrate the crop_resize method img = Magick::Image.read('images/Flower_Hat.jpg')[0] thumbnail = img.resize_to_fill(76, 76) thumbnail.write("resize_to_fill.jpg") rmagick-2.13.2/doc/ex/path.rb0000644000004100000410000000241512147515547015723 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' imgl = Magick::ImageList.new imgl.new_image(390, 240, Magick::HatchFill.new('white','lightcyan2')) gc = Magick::Draw.new # Draw path gc.fill_opacity 0 gc.stroke 'red' gc.stroke_width 3 gc.path "M20,120 C20,20 170,20 170,120 S320,220 320,120" # Annotate # Show end points gc.fill_opacity 0 gc.stroke 'gray50' gc.stroke_width 1 gc.circle 20,120, 23, 123 gc.circle 170,120, 173, 123 gc.circle 320,120, 323, 123 # Show control points gc.fill_opacity 1 gc.circle 20, 20, 23, 23 gc.circle 170, 20, 173, 23 gc.circle 320,220, 323, 223 # Show connector lines gc.line 20,120, 20, 20 gc.line 170, 20, 170,220 gc.line 320,220, 320,120 # Show auto control point gc.fill_opacity 0 gc.stroke 'blue' gc.stroke_width 3 gc.circle 170,220, 173,223 # Add labels gc.font_weight Magick::NormalWeight gc.font_style Magick::NormalStyle gc.stroke "none" # unset stroke color gc.fill 'black' # Add end point labels gc.text 30,125, "'20,120'" gc.text 180,125, "'170,120'" gc.text 330,125, "'320,120'" # Add control point labels gc.text 30, 25, "'20,20'" gc.text 180, 25, "'170,20'" gc.text 330,225, "'320,220'" # Add auto control point label gc.text 180,225, "'auto ctl point'" gc.draw imgl imgl.border!(1,1, 'lightcyan2') imgl.write 'path.gif' rmagick-2.13.2/doc/ex/to_blob.rb0000644000004100000410000000057712147515547016416 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' before = Magick::Image.read("images/Flower_Hat.jpg").first before.resize!(0.50) # make it small so this example will run fast blob = before.to_blob # We could pass the format, depth, and geometry as optional # arguments to `from_blob' but that is not required. after = Magick::Image.from_blob(blob) after[0].write("to_blob.gif") exit rmagick-2.13.2/doc/ex/Use01.rb0000644000004100000410000000070712147515547015666 0ustar www-datawww-datarequire 'rvg/rvg' Magick::RVG.dpi = 90 rvg = Magick::RVG.new(10.cm, 3.cm).viewbox(0, 0, 100, 30) do |canvas| canvas.background_fill = 'white' canvas.desc = "Example Use01 - Simple case of 'use' on a 'rect'" r = Magick::RVG::Group.new do |grp| grp.rect(60, 10) end canvas.rect(99.6, 29.6, 0.1, 0.1).styles(:fill=>'none', :stroke=>'blue', :stroke_width=>0.2) canvas.use(r, 20, 10) end rvg.draw.write('Use01.gif') rmagick-2.13.2/doc/ex/mosaic.rb0000644000004100000410000000126712147515547016246 0ustar www-datawww-data#!/usr/local/bin/ruby -w require 'RMagick' # Demonstrate the mosaic method a = Magick::ImageList.new letter = 'A' 26.times do # 'M' is not the same size as the other letters. if letter != 'M' a.read("images/Button_"+letter+".gif") end letter.succ! end # Make a copy of "a" with all the images quarter-sized b = Magick::ImageList.new page = Magick::Rectangle.new(0,0,0,0) a.scene = 0 5.times do |i| 5.times do |j| b << a.scale(0.25) page.x = j * b.columns page.y = i * b.rows b.page = page (a.scene += 1) rescue a.scene = 0 end end # Make a 5x5 mosaic mosaic = b.mosaic mosaic.write("mosaic.gif") # mosaic.display exit rmagick-2.13.2/doc/ex/ordered_dither.rb0000644000004100000410000000032412147515547017747 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#ordered_dither method img = Magick::Image.read('images/Flower_Hat.jpg').first img = img.ordered_dither img.write('ordered_dither.jpg') exit rmagick-2.13.2/doc/ex/gaussian_blur.rb0000644000004100000410000000033312147515547017622 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#gaussian_blur method img = Magick::Image.read('images/Flower_Hat.jpg').first img = img.gaussian_blur(0.0, 3.0) img.write('gaussian_blur.jpg') exit rmagick-2.13.2/doc/ex/roll.rb0000644000004100000410000000025412147515547015736 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' img = Magick::Image.read('images/Flower_Hat.jpg').first img = img.roll(img.columns/4, img.rows/4) img.write('roll.jpg') exit rmagick-2.13.2/doc/ex/arcs01.rb0000644000004100000410000000205312147515547016056 0ustar www-datawww-datarequire 'rvg/rvg' Magick::RVG.dpi = 90 rvg = Magick::RVG.new(12.cm, 5.25.cm).viewbox(0, 0, 1200, 400) do |canvas| canvas.title = "Example arcs01 - arc commands in path data" canvas.desc = <<-END_DESC Picture of a pie chart with two pie wedges and a picture of a line with arc blips END_DESC canvas.background_fill = 'white' canvas.rect(1196, 395, 1, 1).styles(:fill=>'none', :stroke=>'blue', :stroke_width=>1) canvas.path("M300,200 h-150 a150,150 0 1,0 150,-150 z"). styles(:fill=>'red', :stroke=>'blue', :stroke_width=>5) canvas.path("M275,175 v-150 a150,150 0 0,0 -150,150 z"). styles(:fill=>'yellow', :stroke=>'blue', :stroke_width=>5) canvas.path(<<-END_PATH M600,350 l 50,-25 a25,25 -30 0,1 50,-25 l 50,-25 a25,50 -30 0,1 50,-25 l 50,-25 a25,75 -30 0,1 50,-25 l 50,-25 a25,100 -30 0,1 50,-25 l 50,-25 END_PATH ).styles(:fill=>'none', :stroke=>'red', :stroke_width=>5) end rvg.draw.write('arcs01.gif') rmagick-2.13.2/doc/ex/colors.rb0000644000004100000410000000346312147515547016274 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' include Magick puts("Creating colors.miff. This may take a few seconds...") colors = ImageList.new # Add a row of "null" colors so we'll have # room to add the title at the top. 4.times { colors.read('null:') } puts("\tCreating color swatches...") # Create a 200x25 image for each named color. # Label with the name, RGB values, and compliance type. colors { |c| if c.name !~ /grey/ then # omit SVG 'grays' colors.new_image(200, 25) { self.background_color = c.color self.border_color = 'gray50' } rgb = sprintf('#%02x%02x%02x', c.color.red&0xff, c.color.green&0xff, c.color.blue&0xff) rgb += sprintf('%02x', c.color.opacity&0xff) if c.color.opacity != 0 m = /(.*?)Compliance/.match c.compliance.to_s colors.cur_image['Label'] = "#{c.name} (#{rgb}) #{m[1]}" end } puts("\tCreating montage...") # Montage. Each image will have 40 tiles. # There will be 16 images. montage = colors.montage { self.geometry = '200x25+10+5' self.gravity = CenterGravity self.tile = '4x10' self.background_color = 'black' self.border_width = 1 self.fill = 'white' self.stroke = 'transparent' } # Add the title at the top, over the 'null:' # tiles we added at the very beginning. title = Draw.new title.annotate(montage, 0,0,0,20, 'Named Colors') { self.fill = 'white' self.stroke = 'transparent' self.pointsize = 32 self.font_weight = BoldWeight self.gravity = NorthGravity } puts("\tWriting ./colors.miff") montage.each { |f| f.compression = ZipCompression } montage.write('colors.miff') # Make a small sample of the full montage to display in the HTML file. sample = montage[8].crop(55, 325, 495, 110) sample.page = Rectangle.new(495,110) sample.write('colors.gif') exit rmagick-2.13.2/doc/ex/rect02.rb0000644000004100000410000000116512147515547016067 0ustar www-datawww-datarequire 'rvg/rvg' Magick::RVG.dpi = 90 rvg = Magick::RVG.new(12.cm, 4.cm) do |canvas| canvas.viewbox(0, 0, 1200, 400) canvas.background_fill = 'white' canvas.desc = "Example rect02 - rounded rectangles" # Show outline of canvas using 'rect' method canvas.rect(1195, 395, 1, 1).styles(:fill=>'none', :stroke=>'blue', :stroke_width=>2) canvas.rect(400, 200, 100, 100).round(50).styles(:fill=>'green') canvas.g.translate(700, 210).rotate(-30) do |grp| grp.rect(400, 200, 0, 0).round(50).styles(:fill=>'none', :stroke=>'purple', :stroke_width=>30) end end rvg.draw.write('rect02.gif') rmagick-2.13.2/doc/ex/rect01.rb0000644000004100000410000000076212147515547016070 0ustar www-datawww-datarequire 'rvg/rvg' Magick::RVG.dpi = 90 rvg = Magick::RVG.new(12.cm, 4.cm) do |canvas| canvas.viewbox(0, 0, 1200, 400) canvas.background_fill = 'white' canvas.desc = "Example rect01 - rectangle with sharp corners" # Show outline of canvas using 'rect' element canvas.rect(1195, 395, 1, 1).styles(:fill=>'none', :stroke=>'blue', :stroke_width=>2) canvas.rect(400, 200, 400, 100).styles(:fill=>'yellow', :stroke=>'navy', :stroke_width=>10) end rvg.draw.write('rect01.gif') rmagick-2.13.2/doc/ex/arcs02.rb0000644000004100000410000000415412147515547016063 0ustar www-datawww-datarequire 'rvg/rvg' Magick::RVG.dpi = 90 PathStyles = {:fill=>'none', :stroke=>'red', :stroke_width=>6} BaseEllipsesStyles = {:font_size=>20, :font_family=>'Verdana',:fill=>'none', :stroke=>'#888', :stroke_width=>2} rvg = Magick::RVG.new(12.cm, (5.25).cm).viewbox(0, 0, 1200, 525) do |canvas| canvas.title = "Example arcs02 - arc options in paths" canvas.desc = <<-END_DESC Pictures showing the result of setting large-arc-flag and sweep-flag to the four possible combinations of 0 and 1. END_DESC canvas.background_fill = 'white' base_ellipses = Magick::RVG::Group.new.styles(BaseEllipsesStyles) do |base| base.ellipse(100, 50, 125, 125) base.ellipse(100, 50, 225, 75) base.text(35, 70, "Arc start") base.text(225, 145, "Arc end") end canvas.rect(1196, 522, 1, 1).styles(:fill=>'none', :stroke=>'blue', :stroke_width=>1) canvas.g.styles(:font_size=>30, :font_family=>'Verdana', :font_weight=>'normal', :font_style=>'normal') do |grp| grp.use(base_ellipses) grp.g.translate(400,0) do |grp2| grp2.text(50, 210, 'large-arc-flag=0') grp2.text(50, 250, 'sweep-flag=0') grp2.use(base_ellipses) grp2.path("M 125,75 a100,50 0 0,0 100,50").styles(PathStyles) end grp.g.translate(800,0) do |grp2| grp2.text(50, 210, 'large-arc-flag=0') grp2.text(50, 250, 'sweep-flag=1') grp2.use(base_ellipses) grp2.path("M 125,75 a100,50 0 0,1 100,50").styles(PathStyles) end grp.g.translate(400, 250) do |grp2| grp2.text(50, 210, 'large-arc-flag=1') grp2.text(50, 250, 'sweep-flag=0') grp2.use(base_ellipses) grp2.path("M 125,75 a100,50 0 1,0 100,50").styles(PathStyles) end grp.g.translate(800, 250) do |grp2| grp2.text(50, 210, 'large-arc-flag=1') grp2.text(50, 250, 'sweep-flag=1') grp2.use(base_ellipses) grp2.path("M 125,75 a100,50 0 1,1 100,50").styles(PathStyles) end end end rvg.draw.write('arcs02.gif') rmagick-2.13.2/doc/ex/posterize.rb0000644000004100000410000000024012147515547017005 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' img = Magick::Image.read('images/Flower_Hat.jpg').first result = img.posterize result.write('posterize.jpg') exit rmagick-2.13.2/doc/ex/texturefill.rb0000644000004100000410000000113112147515547017330 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Magick::TextureFill class. granite = Magick::Image.read('granite:').first fill = Magick::TextureFill.new(granite) img = Magick::ImageList.new img.new_image(300, 100, fill) # Annotate the filled image with the code that created the fill. ann = Magick::Draw.new ann.annotate(img, 0,0,0,0, "TextureFill.new(granite)") { self.gravity = Magick::CenterGravity self.fill = 'white' self.font_weight = Magick::BoldWeight self.stroke = 'transparent' self.pointsize = 14 } #img.display img.write("texturefill.gif") exit rmagick-2.13.2/doc/ex/text_styles.rb0000644000004100000410000000133712147515547017360 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'rvg/rvg' rvg = Magick::RVG.new(200, 100) do |canvas| canvas.background_fill = 'white' canvas.g.styles(:font_size=>16, :font_weight=>'normal', :font_style=>'normal') do |grp| grp.text( 30, 30, ":text_anchor=>'start'").styles(:text_anchor=>'start') grp.circle(1, 30, 30).styles(:stroke=>'red') grp.text(100, 50, ":text_anchor=>'middle'").styles(:text_anchor=>'middle') grp.circle(1, 100, 50).styles(:stroke=>'red') grp.text(170, 70, ":text_anchor=>'end'").styles(:text_anchor=>'end') grp.circle(1, 170, 70).styles(:stroke=>'red') end canvas.rect(199, 99).styles(:fill=>'none', :stroke=>'blue') end rvg.draw.write('text_styles.gif') rmagick-2.13.2/doc/ex/texture_floodfill.rb0000644000004100000410000000154012147515547020517 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#texture_floodfill method # This example is nearly identical to the color_floodfill example. before = Magick::Image.new(200,200) { self.background_color = 'white' } before.border!(1,1,'black') circle = Magick::Draw.new circle.fill('transparent') circle.stroke_width(2) circle.stroke('black') circle.circle(100,100,180,100) circle.fill('plum1') circle.stroke('transparent') circle.circle( 60,100, 40,100) circle.circle(140,100,120,100) circle.circle(100, 60,100, 40) circle.circle(100,140,100,120) circle.draw(before) before.compression = Magick::LZWCompression before.write('texture_floodfill_before.gif') hat = Magick::Image.read('images/Flower_Hat.jpg').first hat.resize!(0.3) before.fuzz = 25 after = before.texture_floodfill(100,100, hat) after.write('texture_floodfill_after.gif') exit rmagick-2.13.2/doc/ex/grav.rb0000644000004100000410000000221612147515547015725 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' imgl = Magick::ImageList.new imgl.new_image(400,200, Magick::HatchFill.new('white', 'lightcyan2')) gc = Magick::Draw.new # Draw blue lines to indicate positioning gc.stroke('blue') gc.fill('transparent') gc.rectangle(20,20, 380,180) gc.line(200,20, 200,180) gc.line(20,100, 380,100) # Draw text at all 9 compass points. gc.font_weight(Magick::NormalWeight) gc.font_style(Magick::NormalStyle) gc.stroke('transparent') gc.fill('black') gc.gravity(Magick::NorthWestGravity) gc.text(20,20, 'NorthWestGravity') gc.gravity(Magick::NorthGravity) gc.text( 0,20, 'NorthGravity') gc.gravity(Magick::NorthEastGravity) gc.text(20,20, 'NorthEastGravity') gc.gravity(Magick::WestGravity) gc.text(20, 0, 'WestGravity') gc.gravity(Magick::CenterGravity) gc.text( 0, 0, 'CenterGravity') gc.gravity(Magick::EastGravity) gc.text(20, 0, 'EastGravity') gc.gravity(Magick::SouthWestGravity) gc.text(20,20, 'SouthWestGravity') gc.gravity(Magick::SouthGravity) gc.text( 0,20, 'SouthGravity') gc.gravity(Magick::SouthEastGravity) gc.text(20,20, 'SouthEastGravity') gc.draw(imgl) imgl.border!(1,1, "lightcyan2") imgl.write("grav.gif") exit rmagick-2.13.2/doc/ex/text_align.rb0000644000004100000410000000154312147515547017126 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Draw#text_align method canvas = Magick::Image.new(200, 100) gc = Magick::Draw.new # Draw three samples of text, each using # a different alignment constant. Put the # samples on different points on the y-axis # so we can tell them apart. gc.stroke('transparent') gc.pointsize(16) gc.fill('red') gc.text_align(Magick::RightAlign) gc.text(100, 30, 'RightAlign') gc.fill('blue') gc.text_align(Magick::CenterAlign) gc.text(100, 50, 'CenterAlign') gc.fill('green') gc.text_align(Magick::LeftAlign) gc.text(100, 70, 'LeftAlign') # Now draw lines to show the points # to which each sample is aligned. gc.stroke('gray50') gc.line(100, 10, 100, 90) gc.line( 98, 30, 102, 30) gc.line( 98, 50, 102, 50) gc.line( 98, 70, 102, 70) gc.draw(canvas) canvas.border!(1,1,'gray50') canvas.write('text_align.gif') exit rmagick-2.13.2/doc/ex/rubyname.rb0000644000004100000410000000107712147515547016614 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the annotate method Text = 'RMagick' granite = Magick::ImageList.new('granite:') canvas = Magick::ImageList.new canvas.new_image(300, 100, Magick::TextureFill.new(granite)) text = Magick::Draw.new text.pointsize = 52 text.gravity = Magick::CenterGravity text.annotate(canvas, 0,0,2,2, Text) { self.fill = 'gray83' } text.annotate(canvas, 0,0,-1.5,-1.5, Text) { self.fill = 'gray40' } text.annotate(canvas, 0,0,0,0, Text) { self.fill = 'darkred' } #canvas.display canvas.write('rubyname.gif') exit rmagick-2.13.2/doc/ex/composite_layers.rb0000644000004100000410000000301712147515547020347 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' class Magick::ImageList # Create a shadow image for each image in the list def shadow(x_offset = 4, y_offset = 4, sigma = 4.0, opacity = 1.0) return collect { |frame| frame.shadow(x_offset, y_offset, sigma, opacity) } end end ruby = Magick::ImageList.new # Draw a rotating "Ruby" animation gc = Magick::Draw.new gc.gravity = Magick::CenterGravity gc.pointsize = 24 gc.font_weight = Magick::BoldWeight gc.fill = "darkred" gc.stroke = "black" gc.stroke_width = 1 23.times do ruby << Magick::Image.new(100, 100) {self.background_color = "none"} gc.annotate(ruby, 0, 0, 0, 0, "Ruby") gc.rotation = 15 end # Create a gradient background bg = Magick::ImageList.new bg.new_image(99, 99, Magick::GradientFill.new(50, 50, 50, 50, "white", "tan")) bg.border!(1, 1, "black") # Create the animated shadows of the rotating "Ruby" animation shadows = ruby.shadow(2, 5, 3) # Composite the shadow animation over the background. Since there is only one # background image, it will replicated for each frame in the shadow animation. begin result = bg.composite_layers(shadows) # Composite the "Ruby" animation over the previous composite result = result.composite_layers(ruby) result.delay = 10 result.write("composite_layers.gif") result[0].write("composite_layers1.gif") rescue NotImplementedError result = Magick::Image.read('images/notimplemented.gif').first result.resize!(100, 100) result.write("composite_layers.gif") result.write("composite_layers1.gif") end exit rmagick-2.13.2/doc/ex/stroke_fill.rb0000644000004100000410000000047112147515547017304 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'rvg/rvg' rvg = Magick::RVG.new(150, 150) do |canvas| canvas.background_fill = '' canvas.circle(40, 75, 75).styles(:stroke=>'blue', :fill=>'#00ff00',:stroke_width=>8) canvas.rect(149,149).styles(:fill=>'none',:stroke=>'blue') end rvg.draw.write('stroke_fill.gif') rmagick-2.13.2/doc/ex/rotate_f.rb0000644000004100000410000000037212147515547016572 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' # Demonstrate the Image#rotate method img = Magick::Image.read('images/Flower_Hat.jpg').first img.rotate!(45) # Make the corners transparent img = img.matte_replace(0,0) img.write('rotate_f.jpg') exit rmagick-2.13.2/doc/ex/arc.rb0000644000004100000410000000215112147515547015531 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' i = Magick::Image.new(300, 220, Magick::HatchFill.new("white","lightcyan2")) gc = Magick::Draw.new # Draw the border rectangle. gc.fill_opacity(0) gc.stroke_width(1) gc.stroke('gray50') gc.rectangle(40, 50, 250, 180) # Draw the circles around the rectangle corners and # arc endpoints. All the circles have a 3-pixel radius. gc.circle(40, 50, 40+3, 50) gc.circle(250, 180, 250+3, 180) gc.circle(250, 114, 250+3, 114) gc.circle(146, 50, 146+3, 50) # Annotate gc.font_weight(Magick::NormalWeight) gc.font_style(Magick::NormalStyle) gc.stroke('transparent') gc.fill("black") gc.fill_opacity(1) # xMagick recognizes the braces as delimiters. gc.gravity(Magick::NorthWestGravity) gc.text(42, 37, "{40, 50}") gc.text(188, 108, "{0 degrees}") gc.gravity(Magick::SouthEastGravity) gc.text(300-250, 220-195, "{250, 180}") gc.gravity(Magick::NorthGravity) gc.text(0, 67, "{270 degrees}") # Draw the arc gc.fill_opacity(0) gc.stroke('red').stroke_width(3) gc.arc(40, 50, 250,180, 0, 270) # Draw on the canvas gc.draw(i) i.border!(1,1, "lightcyan2") #i.display i.write("arc.gif") rmagick-2.13.2/doc/optequiv.html0000644000004100000410000017003112147515547016570 0ustar www-datawww-data RMagick 2.13.2: Magick Command Options and Their Equivalent Methods

RMagick: Magick Command Options and Their Equivalent Methods

Table of Contents

Commands

convert, mogrify

Introduction

If you're familiar with the ImageMagick command-line tools convert, mogrify, composite, and montage you can use the tables on this page to determine which RMagick methods correspond to the options used by these tools.

The options listed below are for ImageMagick 6.5.5. Earlier releases of ImageMagick may not support all these options. Later releases of ImageMagick may have options that are not listed.

ImageMagick's convert and mogrify share many options with each other, as well as with the other utilities. This table includes all the options for both convert and mogrify. When another utility has an option with the same name and purpose, and same RMagick equivalent, the option is omitted from the table for that utility.

Magick Option RMagick Method
-adaptive-blur radiusxsigma Image#adaptive_blur(radius=0.0, sigma=1.0)
-adaptive-resize widthxheight Image#adaptive_resize(width, height)
-adaptive-sharpen radiusxsigma Image#adaptive_sharpen(radius=0.0, sigma=1.0)
-adjoin No equivalent. All images in an imagelist are written to the same file if the file format supports multi-image files.
-affine sx, rx, ry, sy, tx, ty Draw#affine(sx, rx, ry, sy, tx, ty) (for drawing)
Draw#affine=matrix (for annotation)
-alpha type Image#alpha=type
-annotate x-rotatexy-rotate+x+y text Draw#annotate(image, width, height, x, y, text)
-antialias Draw#stroke_antialias(true)
Draw#text_antialias(true) (for drawing)
Draw#text_antialias=true (for annotation)
-append
+append
ImageList#append(true)
ImageList#append(false)
-attenuate value Image::Info#attenuate=value
-authenticate string Image::Info#authenticate=string
-auto-gamma Image#auto_gamma_channel([channel...])
-auto-level Image#auto_level_channel([channel...])
-auto-orient Image#auto-orient
-average ImageList#average
-backdrop color No equivalent
-background color Image::Info#background_color=color
-bench No equivalent
-bias value[%] Image#bias(value)
Image#bias('value%')
-black-point-compensation Image#black_point_compensation= true
-black-threshold threshold Image#black_threshold(red_channel [, green_channel [, blue_channel [, opacity_channel]]])
-blend src-percentxdst-percent Image#blend(overlay, src_percent, dst_percent, x_offset=0, y_offset=0)
-blue-primary x,y Image#chromaticity= chromaticity
-blue-shift factor Image#blue_shift(factor)
-blur radiusxsigma Image#blur_image(radius=0.0, sigma=1.0)
-border widthxheight Image#border(width, height, color)
-bordercolor color Image#border_color=color
-borderwidth geometry No equivalent
-cache threshold See -limit, below
-caption string Image::Info#caption=string
-cdl filename No equivalent
-channel type Image::Info#channel(type [, type...])
Channel value arguments are accepted by many methods.
-charcoal factor Image#charcoal(radius=0.0, sigma=1.0)
-chop widthxheight+x+y Image#chop(x, y, width, height)
-clip No equivalent
-clip-mask Image#mask(image)
-clip-path No equivalent
-clone Image#clone
Image#copy
Image#dup
-clut Image#clut_channel(clut_image [, channel...])
-coalesce ImageList#coalesce
-colorize value Image#colorize(red, green, blue, [matte, ] fill)
-colormap type No equivalent
-colors This option corresponds to the first argument to Image#quantize and ImageList#quantize.
-colorspace colorspace Image#colorspace=colorspace
Also corresponds to the colorspace argument to Image#quantize and ImageList#quantize
-combine Image.combine(red, green, blue, opacity)
-comment string Image#['Comment']=string
-compose operator This option corresponds to the composite_op argument to Image#composite.
-compose Mathematics -set option:compose:args a,b,c,d Image#composite_mathematics(source_image, a, b, c, d, gravity, x, y)
-composite Image#composite(source_image, gravity, x, y, composite_op)
-compress type Image#compression=type
-contrast
+contrast
Image#contrast(true)
Image#contrast(false)
-contrast-stretch black-pointxwhite-point Image#contrast_stretch_channel( black_point, white_point [, channel...])
-convolve kernel Image#convolve(order, kernel)
-crop widthxheight+x+y Image#crop(x, y, width, height)
-cycle amount Image#cycle_colormap(amount)
-debug Magick.set_log_event_mask
-decipher Image#decipher(passphrase)
-deconstruct ImageList#deconstruct
-define key=value
+define key
Image::Info#define(format, key, value)
Image::Info#undefine(format, key)
-delay ticksxticks-per-second Image#ticks=ticks
Image#ticks_per_second= ticks-per-second
-delete index ImageList#delete_at(index)
-density widthxheight Image#density="widthxheight"
Image::Info#density="widthxheight"
Image#x_resolution=width
Image#y_resolution=height
-depth depth Image::Info#depth=depth
-descend No equivalent
-deskew threshold Image#deskew(threshold=0.40, auto_crop_width)
-despeckle Image#despeckle
-displace See -displace, below
-display No equivalent
-dispose method Image#dispose=method
-dissimilarity-threshold value No equivalent
-dissolve See -dissolve, below
-distort method arguments
+distort method arguments
Image#distort(method, arguments, bestfit)
-dither
+dither
This option corresponds to the dither option to Image#quantize and ImageList#quantize.
-draw string Draw#draw
-edge radius Image#edge(radius=0.0)
-emboss radius Image#emboss(radius=0.0, sigma=1.0)
-encipher Image#encipher(passphrase)
-encoding type Draw#encoding(type) (for drawing)
Draw#encoding=type (for annotation)
-endian type Image::Info#endian=type
-enhance Image#enhance
-equalize Image#equalize
Image#equalize_channel
-evaluate operator value Image#quantum_operator(operator, value [, channel])
-extent widthxheight Image#extent(width, height, x=0, y=0)
-extract widthxheight+x+y Image::Info.extract="widthxheight+ x+y"
-family font_family Draw#font_family(font_family) (for drawing)
Draw#font_family=font_family (for annotation)
-fft No equivalent
-fill color Draw#fill(color) (for drawing)
Draw#fill=color (for annotation)
-filter type This option corresponds to the filter option to Image#resize.
-flatten ImageList#flatten_images
-flip Image#flip
-floodfill geometry color Image#color_floodfill(x, y, color)
-flop Image#flop
-font name Draw#font(name) (for drawing)
Draw#font=name (for annotation)
-foreground color No equivalent
-format type Image#format=type
-frame widthxheight+outer-bevel-width+ inner-bevel-width Image#frame(width, height, x, y, inner_bevel_width, outer_bevel_width, color)
-function function arguments Image#function_channel(function, arguments)
-fuzz distance
-fuzz distance%
Image#fuzz=distance
Image#fuzz="distance%"
-fx expression ImageList#fx(expression)
-gamma red_gamma,green_gamma,blue_gamma Image#gamma_correct(red_gamma[, green_gamma[, blue_gamma]])
-gaussian-blur radiusxsigma Image#gaussian_blur(radius=0.0, sigma=1.0)
Image#gaussian_blur_channel( radius=0.0, sigma=1.0 [, channel...])
-geometry widthxheight+x+y Image#geometry="widthx height+x+y"
-gravity type Draw#gravity(type) (for drawing)
Draw#gravity= type (for annotation)
-green-primary x,y Image#chromaticity= chromaticity
-hald-clut No equivalent
-help No equivalent
-highlight-color color Image#compare_channel(ref_image, metric[, channels...]) { self.highlight_color color}
-iconGeometry No equivalent
-iconic No equivalent
-identify Image#inspect
-ift No equivalent
-immutable Image#freeze
-implode factor Image#implode(factor)
-insert index ImageList#insert(index)
ImageList#[index]
-intent type Image#rendering_intent= type
-interlace type Image#interlace=type
-interpolate type Image#pixel_interpolation_method= type
-interline-spacing value Draw#interline_spacing(value) (for drawing)
Draw#interline_spacing=value (for annotation)
-interword-spacing value Draw#interword_spacing(value) (for drawing)
Draw#interword_spacing=value (for annotation)
-kerning value Draw#kerning(value) (for drawing)
Draw#kerning=value (for annotation)
-label name Image#['Label']=name
-lat widthxheight+offset Image#adaptive_threshold( width, height, offset)
-layers method
-layers Composite
ImageList#optimize_layers(method)
ImageList#composite_layers(imagelist, operator=OverCompositeOp)
-level black-point,white-point,gamma Image#level_channel(channel, black_point=0.0, white_point=QuantumRange, gamma=1.0)
+level black_point,white_point,gamma Image#levelize_channel(black_point, white_point, gamma=1.0[, channels...])
-level-colors black_color-white_color Image#level_colors(black_color, white_color, gamma=1.0[, channels...])
-limit type value Magick.limit_resource(type, value)
-linear-stretch black-pointxwhite-point Image#linear_stretch(black_point [, white_point])
-linewidth width Draw#stroke_width(width) (for drawing)
Draw#stroke_width=width (for annotation)
-liquid-rescale geometry Image#liquid_rescale(new_width, new_height, delta_x, rigidity)
-list color
-list format
-list type
Magick.colors
Magick.formats
Magick.fonts
-log string Magick.set_log_format
-loop iterations ImageList#iterations=iterations
-lowlight-color color Image#compare_channel(ref_image, metric[, channels...]) { self.lowlight_color color}
-magnify Image#magnify
-map filename Image#map(reference, dither=false)
ImageList#map(reference, dither=false)
-mask filename Image#add_composite_mask(image)
-mattecolor color This option corresponds to the color option to Image#frame.
-median radius Image#median_filter(radius=1.0)
-metric type This option corresponds to the metric option to Image#distortion_channel.
-mode No equivalent
-modulate value Image#modulate(brightness=1.0, saturation=1.0, hue=1.0)
-monitor Image#monitor=
-monochrome Image#image_type= Magick::BilevelType
-morph frames ImageList#morph(frames)
-mosaic ImageList#mosaic
-motion-blur radiusxsigma+angle Image#motion_blur(radius=0.0, sigma=1.0, angle=0.0)
-name No equivalent
-negate
+negate
Image#negate
Image#negate(true)
-noise radius
+noise type
Image#reduce_noise(radius)
Image#add_noise( type)
-normalize Image#normalize
Image#normalize_channel
-opaque color
+opaque color
Image#opaque(color, fill)
Image#opaque_channel(color, fill, opacity, true)
-ordered-dither NxN Image#ordered_dither(N)
-orient orientation Image#orientation=orientation
-page widthxheight+x+y
-page media
Image::Info.page="widthxheight+ x+y"
Image::Info.page="media"
-paint radius Image#oil_paint(radius=3.0)
-path path No equivalent
-pause No equivalent
-ping Image.ping(filename)
-pointsize value Draw.pointsize(value) (for drawing)
Draw.pointsize=value (for annotation)
-polaroid angle Image.polaroid(angle=-5.0)
-posterize levels Image#posterize(levels=4, dither=false)
-preview type Image#preview(type)
-print No equivalent
-process command No equivalent
-profile filename
+profile name
Image#add_profile(filename)
Image#delete_profile(name)
-quality value Image::Info#quality=value
-quantize colorspace Image#quantize(number_colors=256, colorspace=RGBColorspace, dither=true, tree_depth=0, measure_error=false)
ImageList#quantize(number_colors=256, colorspace=RGBColorspace, dither=true, tree_depth=0, measure_error=false)
-quiet No equivalent
-radial-blur angle Image#radial_blur(angle)
-raise widthxheight
+raise widthxheight
Image#raise(width, height, true)
Image#raise(width, height, false)
-random-threshold lowxhigh Image#random_threshold_channel(" lowxhigh" [, channel...])
-recolor matrix Image#recolor(matrix)
-red-primary x,y Image#chromaticity= chromaticity
-regard-warnings No equivalent
-region widthxheight+x+y No equivalent
-remap
+remap
Image#remap(remap_image, dither=RiemersmaDitherMethod)
ImageList#remap()
-remote No equivalent
-render No equivalent
-repage geometry
+repage
Image#page=geometry
This option corresponds to adding true as the last argument to Image#crop.
-resample horizontalxvertical Image#resample(horizontal, vertical)
-resize widthxheight Image#resize(width, height)
-respect-parenthesis No equivalent
-reverse ImageList#reverse
-roll +x+y Image#roll(x, y)
-rotate degrees Image#rotate(degrees [, qualifier])
-sample widthxheight Image#sample(width, height)
-sampling-factor horizontal-factorxvertical-factor Image::Info#sampling_factor=horizontal-factorx vertical-factor
-scale widthxheight Image#scale(width, height)
-scene value ImageList#scene= value
Image::Info#scene= value
-screen No equivalent
-seed Kernel.srand
-segment cluster-thresholdxsmoothing-threshold Image#segment(colorspace= RGBColorspace, cluster_threshold=1.0, smoothing_threshold=1.5, verbose=false)
-selective-blur geometry Image#selective_blur(radius, sigma, threshold [, channel...])
-separate Image#separate(channel...])
-sepia-tone threshold Image#sepiatone(threshold=QuantumRange)
-set attribute value Image#['attribute'] = value
-shade azimuthxelevation Image#shade(shading=false, azimuth=30, elevation=30)
-shadow opacityxsigma+x+y Image#shadow(x=4, y=4, sigma=4.0, opacity=4.0)
-shared-memory No equivalent
-sharpen radiusxsigma Image#sharpen(radius=0.0, sigma=1.0)
-shave widthxheight Image#shave(width, height)
-shear x-degreesxy-degrees Image#shear(x_degrees, y_degrees)
-sigmoidal-contrast contrastxmid-point Image#sigmoidal_contrast_channel( contrast=3.0, mid_point=50.0, sharpen=false [, channel...])
-silent No equivalent
-size widthxheight+offset Image::Info#size="widthxheight+ offset"
-sketch radiusxsigma+angle Image#sketch(radius=0.0, sigma=1.0, angle=0.0)
-snaps No equivalent
-solarize threshold Image#solarize(threshold=50)
-sparse-color method, x, y, color... Image#sparse_color(method, x, y, color[, x, y, color...][, channel...])
-splice widthxheight+x+y Image#splice(x, y, width, height [, color])
-spread amount Image#spread(amount=3)
-stegano offset Image#stegano(watermark, offset)
-stereo Image#stereo(offset_image)
-storage-type type This option corresponds to the type argument to Image#import_pixels and Image#export_pixels_to_str
-stretch font_stretch Draw#font_stretch(font_stretch) (for drawing)
Draw#font_stretch=font_stretch (for annotation)
-strip Image#strip!
-stroke color Draw#stroke(color) (for drawing)
Draw#stroke=color (for annotation)
-strokewidth value Draw#stroke_width(value) (for drawing)
Draw#stroke_width=value (for annotation)
-style font_style Draw#font_style(font_style) (for drawing)
Draw#font_style=font_style (for annotation)
-swap index,index ImageList#[]=
-swirl degrees Image#swirl(degrees)
-taint No equivalent
-text-font No equivalent
-texture filename Image::Info#texture=image
-threshold value Image#bilevel_channel(value [, channel...])
-thumbnail widthxheight Image#thumbnail(width, height)
-tile filename Draw#tile(image)
-tile-offset +x+y Image::Info#tile_offset = "+x+y"
-tint No equivalent
-title No equivalent
-transform Image#affine_transform( matrix)
-transparent color
+transparent color
Image#transparent(color, opacity=TransparentOpacity)
Image#paint_transparent(color, opacity, true)
-transparent-color color Image#transparent_color= color
-transpose Image#transpose
-transverse Image#transverse
-treedepth value This option corresponds to the tree_depth argument to Image#quantize and ImageList#quantize.
-trim Image#trim
-type type Image#type=type
-undercolor color Draw#text_undercolor(color)
Draw#undercolor=color
-unique-colors Image#unique_colors
-units type Image#units=type
-unsharp radiusxsigma+amount+threshold Image#unsharp_mask(radius=0.0, sigma=1.0, amount=1.0, threshold=0.05)
-update No equivalent
-verbose No equivalent
-version Magick::Long_version
-view string Image::Info#view=string
-vignette radiusxsigma+amount+threshold Image#vignette(x, y, radius=0.0, sigma=10.0)
-virtual-pixel method Image#virtual_pixel_method= method
-visual No equivalent
-watermark brightness See watermark, below
-wave amplitudexwavelength Image#wave(amplitude=25.0, wavelength=150.0)
-weight type Draw#font_weight(type) (for drawing)
Draw#font_weight=type
-white-point x.y Image#chromaticity= chromaticity
-white-threshold threshold Image#white_threshold(red_channel [, green_channel[, blue_channel[, opacity_channel]]])
-window id No equivalent
-window-group No equivalent
-write filename Image#write(filename)
ImageList#write(filename)

composite

Magick Option RMagick Method
-blend src-percentxdst-percent Image#blend(overlay, src_percent, dst_percent, x_offset=0, y_offset=0)
-displace x-amplitudexy-amplitude Image#displace(displacement_map, x_amplitude, y_amplitude, x_offset=0, y_offset=0)
-dissolve src_percentxdst_percent Image#dissolve(overlay, src_percent, dst_percent, x_offset=0,y_offset=0)
-tile Image#composite_tiled(src, composite_op=OverCompositeOp)
-watermark lightness Image#watermark(mark, lightness=1.0, saturation=1.0, x_offset=0, y_offset=0)

montage

Notes

The RMagick methods that correspond to montage's options are in the Magick::ImageList::Montage class.

Magick Option RMagick Method
-backgroundcolor color Montage#background_color=color
-bordercolor color Montage#border_color=color
-borderwidth value Montage#border_width=value
-clone No equivalent
-compose operator Montage#compose=operator
-fill color Montage#fill=color
-frame geometry Montage#frame="geometry"
-geometry geometry Montage#geometry="geometry"
-gravity type Montage#gravity=type
-mattecolor color Montage#matte_color=color
-mode type No equivalent
-pointsize value Montage#pointsize=value
-shadow Montage#shadow=true
-stroke color Montage#stroke=color
-texture filename Montage#texture=image
-tile geometry Montage#tile=geometry
-title string Montage#title=string

 

rmagick-2.13.2/doc/struct.html0000644000004100000410000011313212147515547016237 0ustar www-datawww-data RMagick 2.13.2: Miscellaneous classes

Miscellaneous classes

The Image::View class

Introduction

A view is a rectangle in an image. Within the view pixels can be addressed by specifying their [i][j] coordinates. The i, j index values can identify a single pixel or multiple pixels. Pixels can be accessed or modified individually or collectively. Pixel channels (that is, the red, green, blue, and opacity components) can be accessed or modified individually or collectively. The sync method stores modified pixels back into the image.

class Image::View < Object

new

Image::View.new(img, x, y, width, height) -> view

Description

The easiest way to use an Image::View object is to create it with the Image#view method, which provides a block-scoped view and automatic syncing. You probably won't want to create a view by calling new.

Arguments
img
The image from which the view is taken.
x, y
The x- and y-offsets of the view relative to the top-left corner of the image. Within the view, pixel addresses are relative to the top-left corner of the view.
width, height
The number of columns and the number of rows in the view.

It is an error to specify a view that exceeds the boundaries of the image.

[][]

view[i][j] -> pixel or array

Description

Return one or more pixels in the view. If i and j are each a single integer value, returns a single pixel. For any other indexes, returns an array of one or more pixels. If any index exceeds the boundaries of the view, raises IndexError.

Arguments

The i index identifies a set of rows in the view. The j index identifies a set of columns in the view. The pixels that are returned are the intersection of these two sets. The indexes can be:

omitted
If i is omitted, all the rows are used. If j is omitted, all the columns are used.
an integer
or an object that can be converted to an integer. A single integer identifies a single row or column. Identify a single pixel by specifying integers for both indexes. If the index is negative, counts from the bottom row or right column of the view.
start, length
Identifies the set of length rows or columns starting with start. If start is negative, starts at the bottom row or right column of the view.
an object that responds to each
The index may be any object that responds to each by returning a sequence of objects that can be converted to integers. An array with integer values or a range of integers are two examples.
Examples
  # Get the 2nd pixel in the 4th row of the view.
  pixel = view[3][1]  # returns a pixel
  # Returns an array with only one value
  pixels = view[[3]][[1]]
  # Get all the pixels in the 4th row
  pixels = view[3][]
  # Use arrays to specify a non-contiguous set of rows and columns
  pixels = view[[1,3,5]][[2,4,6]]
  # Use ranges to specify a contiguous set of rows and columns
  pixels = view[1..5][2..6]

[][].red
[][].green
[][].blue
[][].opacity

[i][j].red -> integer or array
[i][j].green -> integer or array
[i][j].blue -> integer or array
[i][j].opacity -> integer or array

Description

If the indexes identify a single pixel, these methods return the value of the red, green, blue, or opacity channel of that pixel. If the indexes identify more than one pixel, these methods return an array of values. See [][] for a description of possible index arguments.

Examples
  # Get the value of the green channel of
  # the top-left pixel in the view.
  view[0][0] = Pixel(0,128,255)
  g = view[0][0].green  # returns 128

  # Get the maximum value of the red channel
  # for all the pixels in the top row of the view.
  m = view[0][].red.max

[][]=

view[i][j] = rvalue

Description

Replaces each pixel identified by the indexes with a duplicate of rvalue. The rvalue is either a Pixel object or a color name. If rvalue is a color name, calls Pixel.from_color to create a pixel.

Arguments

The indexes are the same as [][], above.

rvalue
Either a pixel or a color name.

[][].red=
[][].green=
[][].blue=
[][].opacity=

[i][j].red = integer
[i][j].green = integer
[i][j].blue = integer
[i][j].opacity = integer

Description

Assigns integer to the red, green, blue, or opacity channel of the pixel or pixels identified by the indexes.

Examples
  # Set the red channel of all the pixels in the 2nd
  # row of the view to QuantumRange
  view[1][].red = QuantumRange
  # Set the green channel of the pixel at [20][30] to
  # half that of its left-hand neighbor.
  view[20][30].green = view[20][29].green * 0.5

sync

view.sync(force=false) -> true or false

Description

If any of the pixels in the view have been modified, this method stores them in the image. If no pixels have been modified, this method has no effect.

Arguments
force
If true, forces the view pixels to be stored in the image even if none have been modified.
Returns
Returns true if the pixels were stored in the image either because the dirty flag was true or force was true, false otherwise.

dirty
dirty=

view.dirty -> true or false
view.dirty = true or false

Description

Any modification to a pixel in the view causes the dirty attribute to be set to true. You can (although normally you don't need to) set dirty=true to force sync to store the pixels in the image, or set dirty=false to keep sync from storing the pixels.

x
y
width
height

x -> integer
y -> integer
width -> integer
height -> integer

Description

The x, y, width, and height arguments specified when the view was created.

The Geometry class

Introduction

The Geometry class contains the same information as an ImageMagick geometry string. Geometry objects are interchangeable with geometry strings.

class Geometry < Object

new

Geometry.new(width=nil, height=nil, x=nil, y=nil, flag=nil) -> geometry

Description

Constructs a new Geometry object.

Attributes

A geometry string has the general form "WxH+x+y[!@%<>]. In a Geometry object,

width
specifies the W value
height
specifies the H value
x, y
specify the x and y values, respectively
flag
one of the constants shown in this table:
Geometry flag constants
Constant
name
Geometry
string flag
Explanation
PercentGeometry % Normally the attributes are treated as pixels. Use this flag when the width and height attributes represent percentages. For example, 125x75 means 125% of the height and 75% of the width. The x and y attributes are not affected by this flag.
AspectGeometry ! Use this flag when you want to force the new image to have exactly the size specified by the the width and height attributes.
LessGeometry < Use this flag when you want to change the size of the image only if both its width and height are smaller the values specified by those attributes. The image size is changed proportionally.
GreaterGeometry > Use this flag when you want to change the size of the image if either its width and height exceed the values specified by those attributes. The image size is changed proportionally.
AreaGeometry @ This flag is useful only with a single width attribute. When present, it means the width attribute represents the total area of the image in pixels.
MinimumGeometry ^ Use ^ to set a minimum image size limit. The geometry 640x480^, for example, means the image width will not be less than 640 and the image height will not be less than 480 pixels after the resize. One of those dimensions will match the requested size, but the image will likely overflow the space requested to preserve its aspect ratio.

If any attribute is omitted the default is nil or 0.

Example
g = Magick::Geometry.new(100,200,nil,nil,Magick::AspectGeometry)

from_s

Geometry.from_s(string) -> geometry

Description

Constructs a new Geometry object from a geometry string.

to_s

geom.to_s() -> string

Description

Returns the string equivalent of the Geometry object..

The Pixel class

Introduction

A pixel describes the smallest individually addressable part of an image. In the RGB colorspace, a pixel's color is described by its intensity in the red, green, and blue channels. Its opacity is described by its intensity in the opacity (also called alpha, or matte) channel. In the CMYK colorspace a pixel's color is described by its intensity in the cyan, magenta, yellow and black (K) channels. Intensity is a value between 0 and QuantumRange.

Usually, RMagick methods operate on entire images or on groups of pixels that have been selected by their position or color. Some methods, such as pixel_color and view, operate on individual pixels or even on the RGBA (or CMYK) components thereof.

class Pixel < Object
mixes in Comparable, Observable

new

Pixel.new(red, green, blue, opacity) -> pixel

Description

Constructs a pixel object from the specified red, green, blue, and opacity intensities. The intensity is a number between 0 and QuantumRange.

Attributes
red, green, blue
The red, green, and blue intensities of the pixel, respectively. If the colorspace is CMYKColorspace, these attributes are interpreted as the cyan, magenta, and yellow intensities.
opacity
The opacity level. Higher intensities are more transparent. If the colorspace is CMYKColorspace, this attribute is interpreted as the black intensity.
cyan, magenta, yellow, black
These attributes are aliases for red, green, blue, and opacity, respectively.

from_color

Pixel.from_color(color_name) -> pixel

Description

Constructs a new Pixel object from the color name. Raises ArgumentError if the name is unknown.

from_hsla

Pixel.from_hsla(hue, saturation, lightness, alpha=1.0) -> pixel

Description

Constructs a pixel object from the specified arguments.

Arguments
hue
Either a String percentage (e.g., "25%") or a value in the range [0.0, 360.0).
saturation
Either a String percentage (e.g., "25%") or a value in the range [0.0, 255.0].
lightness
Either a String percentage (e.g., "25%") or a value in the range [0.0, 255.0].
alpha
Either a String percentage (e.g., "25%") or a value in the range [0.0, 1.0], where 1.0 is fully opaque and 0.0 is fully transparent. This argument may be omitted. The default is 1.0.
See also

to_hsla

<=>

pixel1 <=> pixel2 -> -1, 0, or 1

Description

Returns -1, 0, or 1 depending on if pixel1 is "less than," equal, or "greater than" the pixel2.

Since there is no way to rank order pixels, and thus determine if one pixel is "greater than" or "less than" another, this method uses an arbitrary algorithm that ensures these two conditions:

  1. pixels with equal RGBA (or CMYK) values compare equal, and
  2. comparing the same two unequal pixels always returns the same result.
Returns

-1, 0, or 1

See also

fcmp

fcmp

pixel.fcmp(pixel, fuzz=0.0, colorspace=RGBColorspace) -> true or false

Description

Returns true if the argument is the same color as pixel.

Arguments
pixel
The pixel to which the receiver is compared.
fuzz
The amount of fuzz to allow before the colors are considered to be different.
colorspace
If the pixels are in the CMYK colorspace, specify Magick::CMYKColorspace.
Returns

true or false

See also

<=>

intensity

pixel.intensity() -> integer

Description

Returns the intensity of the pixel. The intensity is computed as 0.299*R+0.587*G+0.114*B.

to_color

pixel.to_color(compliance=AllCompliance, matte=false, depth=QuantumDepth, hex=false) -> string

Description

Returns the color name corresponding the the pixel values. If there is no such named color in the specified color standard, returns a string in the form "rgb(r,g,b,a)".

Arguments
compliance
A ComplianceType constant. The default value of AllCompliance causes to_color to search for a color name in any of the 3 defined color standards.
matte
If false, the pixel's opacity attribute is ignored.
depth
An image depth. The default is the quantum depth used when ImageMagick was compiled. The values 16 and 32 can be used only when ImageMagick was compiled with the appropriate QuantumDepth.
hex
If true, represent the color name in hex (#rrggbbaa or #rrrrggggbbbbaaaa) format. In this case compliance is meaningless.
See also

Compare this method to Image#to_color, in which the matte and depth values are taken from an image.

to_hsla

pixel.to_HSL -> array

Description

Converts the RGB representation of the pixel to hue, saturation, lightness, and alpha values.

Returns

An array of the form [hue, saturation, lightness, alpha]. Each value is in the range specified for it, as described in from_hsla, above.

Struct classes

Introduction

These classes are created by the Struct class and are used to create objects used as attribute and argument values in other RMagick classes. Like all the classes created by Struct, these classes define both getter and setter methods for their attributes. That is, for an attribute x both the x and x= methods are defined.

The Pixel and Geometry classes define additional constructors and conversion methods.

class AffineMatrix < Struct

new

AffineMatrix.new(sx, rx, ry, sy, tx, ty) -> matrix

Description

An AffineMatrix object describes a coordinate transformation. This object is used as an argument to the Image#affine_transform, Image#composite_affine, and Draw#affine methods.

Attributes
sx, sy
The amount of scaling on the x- and y- axes.
rx, ry
The amount of rotation on the x- and y-axes, in radians.
tx, ty
The amount of translation on the x- and y-axes, in pixels.

class Chromaticity < Struct

new

Chromaticity.new(red_primary, green_primary, blue_primary, white_point) -> chromaticity

Description

A Chromaticity object represents chromaticity values for the Image#chromaticity attribute.

Attributes

The attribute values are Primary objects.

red_primary
Red primary point (e.g. red_primary.x=0.64, red_primary.y=0.33)
green_primary
Green primary point (e.g. green_primary.x=0.3, green_primary.y=0.6)
blue_primary
Blue primary point (e.g. blue_primary.x=0.15, blue_primary.y=0.06)
white_point
White point (e.g. white_point.x=0.3127, white_point.y=0.329)

class Point < Struct

new

Point.new(x, y) -> point

Description

The value of the pixels_per_em attribute in the TypeMetric struct returned by Draw#get_type_metrics is a Point object..

Attributes
x
Character width
y
Character height

class Primary < Struct

new

Primary.new(x, y, z) -> primary

Description

See class Chromaticity.

Attributes
x
X ordinate
y
Y ordinate
z
Z ordinate. This attribute is always ignored.

class Rectangle < Struct

new

Rectangle.new(width, height, x, y) -> rectangle

Description

The value of the Image#tile_info and Image#bounding_box attributes.

Attributes
width
Rectangle width
height
Rectangle height
x
Offset from the left edge of the image
y
Offset from the top edge of the image

class Segment < Struct

new

Segment.new(x1, y1, x2, y2) -> segment

Description

The value of the bounds attribute in the TypeMetric class.

Attributes

x1, y1, x2, y2

Fill classes

Introduction

The Image#new and ImageList#new_image methods accept a Fill object as an optional third argument. A Fill object is an instance of a Fill class. Fill classes are designed to support custom background fills. Each Fill class defines only two methods, initialize and fill. The initialize method is called from the application to create an instance of the fill class. It accepts any arguments and does whatever is necessary to create the fill. The fill method is called from the initialize method of the new image object, after the image is completely initialized. The fill method gets the image as its only argument and sends whatever methods are necessary to the image to fill the image's background.

RMagick supplies three Fill classes, HatchFill, GradientFill, and TextureFill. These classes are explained below. The HatchFill class is intended as an example of how to write a Fill class and is written in pure Ruby. You can read it in RMagick.rb.

class GradientFill < Object

new

GradientFill.new(x1, y1, x2, y2, start_color, end_color) -> gradient_fill

Description

Creates a gradient fill. The x1, y1, and x2, y2 arguments describe either a line or a point. If x1 != x2 or y1 != y2, then the arguments describe the starting line for the gradient. The gradient will start with start_color at the starting line and gradually transform to end_color as the distance increases from the starting line.

If x1 == x2 and y1 == y2, the gradient radiates from the specified point, gradually transforming from start_color to end_color.

The line or point does not have to lie within the image bounds.

Arguments
x1, y1
One of the starting line end-points.
x2, y2
The other end-point on the starting line.
start_color
The color at the starting line.
end_color
The color to which the gradient transforms.
Example

GradientFill example

class HatchFill < Object

new

HatchFill.new(background_color, hatch_color='white', dist=10) -> hatch_fill

Description

Creates a cross-hatched fill.

Arguments

background_color
The image background color.
hatch_color
The color of the cross-hatch lines.
dist
The distance between cross-hatch lines, in pixels.

Example

HatchFill example

class TextureFill < Object

new

TextureFill.new(texture_image) -> texture_fill

Description

Creates a texture fill by tiling the texture_image to fill the image.

Arguments

The texture to be used as the background. May be an image or imagelist. If texture_image is an imagelist, uses the current image.

Example

TextureFill example

Exception classes

class ImageMagickError < StandardError

Description

RMagick raises this exception when an ImageMagick function returns an error condition.

class FatalImageMagickError < StandardError

Description

RMagick raises this exception when ImageMagick raises a fatal (unrecoverable) error condition.

class DestroyedImageError < StandardError

Description

RMagick raises this exception when any Image method (except destroyed? and inspect) is called after an image has been destroyed.

 

rmagick-2.13.2/doc/rvgstyle.html0000644000004100000410000002163412147515547016577 0ustar www-datawww-data RMagick 2.13.2: RVG Reference: Styles

The styles method

Table of Contents

instance methods

styles

styles

obj.styles(:style=>value[, :style=>value...]) [{|obj| }] -> obj

Description

Assigns styles to the target object, which may be a container, shape, text, raster image, or pattern. Styles are presentational attributes that define how the object is rendered.

Styles yields to a block if a block is present, passing the target object as an argument. This is useful when styles is chained to a container constructor method such as g or rvg. By default, objects within a container get the styles defined on the container.

Styles returns the target object, so other methods can be chained to it.

Arguments

The argument is a hash. The hash keys are style name symbols. The hash values are the style values. RVG supports the following style names.

:clip_path
An outline used to clip a shape or collection of shapes. The value is an clipping path.
:clip_rule
If the clip_path style is used, how to determine if a point is inside or outside a the clip path. The value is a string, either 'nonzero' or 'evenodd'. The default is 'nonzero'. See the fill_rule example below.
:fill
The fill color. The value must be a color name or a pattern. The default is 'black'.
:fill_opacity
The opacity of the fill color. A number between 0.0 (fully transparent) and 1.0 (fully opaque). The default is 1.0
:fill_rule
How to determine if a point is inside or outside a shape. The value is a string, either 'nonzero' or 'evenodd'. The default is 'nonzero'.
The following descriptions of 'nonzero' and 'evenodd' are from the SVG 1.1 standard.
nonzero
This rule determines the "insideness" of a point on the canvas by drawing a ray from that point to infinity in any direction and then examining the places where a segment of the shape crosses the ray. Starting with a count of zero, add one each time a path segment crosses the ray from left to right and subtract one each time a path segment crosses the ray from right to left. After counting the crossings, if the result is zero then the point is outside the path. Otherwise, it is inside.
evenodd
This rule determines the "insideness" of a point on the canvas by drawing a ray from that point to infinity in any direction and counting the number of path segments from the given shape that the ray crosses. If this number is odd, the point is inside; if even, the point is outside.
See the examples below.
:opacity
Both the stroke and the fill opacity. A number between 0.0 (fully transparent) and 1.0 (fully opaque). The default is 1.0. See below for an example.
:stroke
The stroke color. The value must be a color name or a pattern. The default is 'none', that is, transparent black ("#000000ff").
:stroke_dasharray
An array of numbers that specify the length of the dashes and gaps with which to draw a dashed line. If the array contains an odd number of values, the values are repeated to produce an even number of dashes and gaps. The numbers are in user coordinates. By default all lines are drawn as solid lines. See below for an example.
:stroke_dashoffset
Normally a dashed line is drawn using the first number in the stroke_dasharray as the length of the first dash. This style can be used to specify a different starting point in the array.
:stroke_linecap
The shape of the end of a line. The value may be one of the strings 'butt', 'round', or 'square'. The default is 'butt'. See below for an example.
:stroke_linejoin
The shape of the corner where two lines are joined. The value may be one of the strings 'miter', 'round', or 'bevel'. The default is 'miter'. See below for an example.
:stroke_miterlimit
If the stroke_linejoin value is 'miter', a number specifying the ratio of the miter to the thickness of the lines being joined. When the limit is exceeded the join is converted from a miter to a bevel. The value must be a number greater than or equal to 1.0. The default is 4.0.
:stroke_opacity
The opacity of the stroke color. A number between 0.0 (fully transparent) and 1.0 (fully opaque). The default is 1.0 unless stroke has the default value 'none'.
:stroke_width
The thickness of the stroke. The default is 1 user coordinate.

(Text styles are described with the Text class.)

Examples

:fill=>'#00ff00', :stroke=>'blue', :stroke_width=>8stroke and fill example

:fill_rule=>'nonzero'nonzero example

:fill_rule=>'evenodd'evenodd example

Three values of :opacityopacity example

:stroke_dasharray=>[10,5]stroke_dasharray example

Three values of :stroke_linecapstroke_linecap example

Three values of :stroke_linejoinstroke_linejoin example

Returns

obj

 

rmagick-2.13.2/doc/image2.html0000644000004100000410000026746112147515547016076 0ustar www-datawww-data RMagick 2.13.2: class Image (instance methods e-o)

class Image < Object (instance methods e-o)
mixes in Comparable

instance methods

each_iptc_dataset

img.each_iptc_dataset { |dataset, data_field| block} -> nil

Description

Iterates over the IPTC DataSet constants in Magick::IPTC. If the image's IPTC profile has the DataSet and the data field has non-0 length, yields to the block. The IPTC DataSet constants are listed here.

Arguments

The block arguments are:

dataset
The DataSet name
data_field
The data field

See also

get_iptc_dataset

each_pixel

img.each_pixel {|pixel, c, r| block } -> self

Description

Calls block with 3 arguments, a pixel from img, its column number c, and its row number r, for all the pixels in the image. The pixels are enumerated from top-to-bottom and left-to-right.

Returns

self

See also

get_pixels

each_profile

img.each_profile {|name, value| block} -> ??? (see Returns)

Description

Calls block once for each profile in the image, passing the profile name and value as parameters.

Returns

the last value returned by the block

See also

The color_profile and iptc_profile attributes return the ICC and IPTC profiles, respectively.

Magick API

GetNextImageProfile

edge

img.edge(radius=0.0) -> image

Description

Finds edges in the image.

Arguments

The radius of the convolution filter. If the radius is 0, edge selects a suitable default.

Returns

A new image

Example

edge example

Magick API

EdgeImage

emboss

img.emboss(radius=0.0, sigma=1.0) -> image

Description

Adds a 3-dimensional effect.

Arguments

radius
The radius of the Gaussian operator.
sigma
The sigma (standard deviation) of the Gaussian operator. This value cannot be 0.0.

Returns

A new image

Example

emboss example

Magick API

EmbossImage

encipher

img.encipher(passphrase) -> image

Description

Encipher an image.

Arguments

The passphrase.

Returns

A new image

Example

enciphered_img = img.encipher("magic word")

Magick API

EncipherImage

See also

decipher

enhance

img.enhance -> image

Description

Applies a digital filter that improves the quality of a noisy image.

Returns

A new image

Example

The left-hand side has had noise added by add_noise. The right-hand side is the result after using enhance.

enhance example

See also

median_filter, reduce_noise, unsharp_mask

Magick API

EnhanceImage

equalize

img.equalize -> image

Description

Applies a histogram equalization to the image.

Returns

A new image

Example

equalize example

Magick API

EqualizeImage

See also

equalize_channel

equalize_chanel

img.equalize_channel([channel...]) -> image

Description

Applies a histogram equalization to the image. Only the specified channels are equalized.

Arguments

channel...
0 or more ChannelType arguments. If no channels are specified, all the channels are normalized. Specifying no channel arguments has the same effect as the equalize method, above.

Returns

A new image

Magick API

EqualizeImageChannel

See also

equalize

erase!

img.erase! -> self

Description

Sets the entire image to the background color.

Returns

self

See also

color_reset!

Magick API

SetImage

excerpt

img.excerpt(x, y, width, height) -> image

Description

This method is very similar to crop. It extracts the rectangle specified by its arguments from the image and returns it as a new image. However, excerpt does not respect the virtual page offset and does not update the page offset and is more efficient than cropping.

It is the caller's responsibility to ensure that the rectangle lies entirely within the original image.

Arguments

x, y
The position of the upper-left corner of the excerpted rectangle.
width, height
The width and height of the excerpted rectangle. The resulting image will always be widthxheight in size.

Returns

A new image

See Also

crop, excerpt!

Magick API

ExcerptImage

excerpt!

img.excerpt!(x, y, width, height) -> img

Description

In-place form of excerpt.

export_pixels

img.export_pixels(x=0, y=0, columns=img.columns, rows=img.rows, map="RGB") -> array

Description

Extracts the pixel data from the specified rectangle and returns it as an array of Integer values.

The array returned by export_pixels is suitable for use as an argument to import_pixels.

Arguments

x, y
The offset of the rectangle from the upper-left corner of the image.
columns, rows
The width and height of the rectangle.
map
A string that describes which pixel channel data is desired and the order in which it should be stored. It can be any combination or order of R = red, G = green, B = blue, A = alpha, C = cyan, Y = yellow, M = magenta, K = black, I = intensity (for grayscale), or P = pad.

Returns

An array

Example

# Export the r'th scanline from an image in red-green-blue order
scanline = img.export_pixels(0, r, img.columns, 1, "RGB");

See also

dispatch, export_pixels_to_str, import_pixels, get_pixels

Magick API

ExportImagePixels

Note

This method replaces the dispatch method.

export_pixels_to_str

img.export_pixels_to_str(x=0, y=0, columns=img.columns, rows=img.rows, map="RGB", type=CharPixel) -> string

Description

Extracts the pixel data from the specified rectangle and returns it as a string. If you need to get the pixel data in a memory buffer (as input to another application, for example), this method is much, much faster than export_pixels or get_pixels.

The string returned by export_pixels_to_str is suitable for use as an argument to import_pixels.

Note: You can also use to_blob to convert an image into a string.

Arguments

x, y
The offset of the rectangle from the upper-left corner of the image.
columns, rows
The width and height of the rectangle.
map
A string that describes which pixel channel data is desired and the order in which it should be stored. It can be any combination or order of R = red, G = green, B = blue, A = alpha, C = cyan, Y = yellow, M = magenta, K = black, I = intensity (for grayscale), or P = pad.
type
A StorageType value that specifies the C datatype to which the pixel data will be converted. The default is CharPixel, which means that the pixel values will be stored as C unsigned chars.

Returns

a string

See also

dispatch, export_pixels, import_pixels, get_pixels

Magick API

ExportImagePixels

extent

img.extent(width, height, x=0, y=0) -> image

Description

If width or height is greater than the target image's width or height, extends the width and height of the target image to the specified values. The new pixels are set to the background color. If width or height is less than the target image's width or height, crops the target image.

Arguments

width
The width of the new image
height
The height of the new image
x, y
The upper-left corner of the new image is positioned at -x, -y.

Returns

A new image

Notes

The new image is composed over the background using the composite operator specified by target image's compose attribute.

Magick API

ExtentImage

find_similar_region

img.find_similar_region(target, x=0, y=0) -> [rx, ry]

Description

This interesting method searches for a rectangle in the image that is similar to the target. For the rectangle to be similar each pixel in the rectangle must match the corresponding pixel in the target image within the range specified by the fuzz attributes of the image and the target image.

Arguments

target
An image that forms the target of the search. This image can be any size.
x, y
The starting x- and y-offsets for the search. If omitted both x and y default to 0.

Returns

If the search succeeds, the return value is an array with 2 elements. These elements are the x- and y-offsets of the matching rectangle. If the search fails the return value is nil.

Magick API

IsImageSimilar

flip

img.flip -> image

Description

Create a vertical mirror image of the receiver.

Returns

A new image

Example

flip example

See also

affine_transform, flip!, flop, rotate, transpose, transverse

Magick API

FlipImage

flip!

img.flip! -> self

Description

In-place form of flip.

Returns

self

flop

img.flop -> image

Description

Create a horizontal mirror image of the receiver.

Returns

A new image

Example

flop example

See also

affine_transform, flip, flop!, rotate, transpose, transverse

Magick API

FlopImage

flop!

img.flop! -> self

Description

In-place form of flop.

Returns

self

frame

img.frame(width=25, height=25, x=25, y=25, inner_bevel=6, outer_bevel=6, color=matte_color) -> image

Description

Adds a simulated 3D border.

Arguments

width
The width of the left and right sides.
height
The height of the top and bottom sides.
x, y
The image does not have to be centered in the border. These two arguments specify the offset of the image from the upper-left outside corner of the border.
inner_bevel, outer_bevel
The width of the inner and outer shadows of the border. These values should be much smaller than the width and height and cannot be greater than 1/2 the lesser of the width or height.
color
The border color. By default the color is the matte color.

Returns

A new image

Example

frame example

See also

border

Magick API

FrameImage

freeze

img.freeze -> self

Description

Prevent further modifications to the image.

Returns

self

function_channel

img.function_channel(function [, parameters...][, channel...]) -< image

Description

Apply a function to channel values. This method is equivalent to the convert -function option. See the ImageMagick documentation for more information.

Arguments

function
One of the following values.
  • PolynomialFunction
  • SinusoidFunction
  • ArcsinFunction
  • ArctanFunction
Some of these values are not available in earlier versions of ImageMagick. To find out which values are available, enter the following statement in irb:
Magick::MagickFunction.values {|value| p value}
parameters
One or more floating-point numbers. The number of parameters depends on the function. See the ImageMagick documentation for details.
channel...
0 or more ChannelType arguments. If no channels are specified, the red, green, and blue channels are used.

Returns

A new image

Example

img2 = img.function_channel(Magick::PolynomialFunction,
                            -25, 53, -36, 8.3, 0.2)

See also

quantum_operator

gamma_channel

img.gamma_channel(gamma, [channel...]) = image

Description

Gamma-correct a particular image channel. The same image viewed on different devices will have perceptual differences in the way the image's intensities are represented on the screen.

Arguments

gamma
Values typically range from 0.8 to 2.3. You can also reduce the influence of a particular channel with a gamma value of 0.
channel...
0 or more ChannelType arguments. If no channels are specified, all the channels are corrected using the gamma value.

Returns

A new image

See also

The older gamma_correct method is implemented in terms of gamma_channel.

Magick API

GammaImageChannel

gamma_correct

img.gamma_correct(red_gamma[,green_gamma[, blue_gamma]]) -> image

Description

Gamma-correct an image. The same image viewed on different devices will have perceptual differences in the way the image's intensities are represented on the screen.

Arguments

You must specify at least red_gamma. Omitted arguments take on the value of the last specified argument. Values typically range from 0.8 to 2.3.

Returns

A new image

See also

gamma_channel

Magick API

GammaImage

gaussian_blur

img.gaussian_blur(radius=0.0, sigma=1.0) -> image

Description

Blurs an image. We convolve the image with a Gaussian operator of the given radius and standard deviation (sigma).

Arguments

radius
A Float value representing the radius of the Gaussian, in pixels, not counting the center pixel.
sigma
A Float value representing the standard deviation of the Gaussian operator, in pixels. This argument must be > 0.0.

Returns

A new image

Example

gaussian_blur(0.0, 3.0)

gaussian_blur example

See also

blur_image, motion_blur, radial_blur, selective_blur_channel

Magick API

GaussianBlurImage

gaussian_blur_channel

img.gaussian_blur_channel(radius=0.0, sigma=1.0[, channel...]) -> image

Description

Blurs the selected channel or channels using a Gaussian operator of the specified radius and standard deviation.

Arguments

radius
A Float value representing the radius of the Gaussian, in pixels, not counting the center pixel.
sigma
A Float value representing the standard deviation of the Gaussian operator, in pixels. This argument must be > 0.0.
channel...
0 or more ChannelType arguments. If no channels are specified, all the channels are blurred. This is the same as using gaussian_blur.

Returns

A new image

See also

blur_channel, motion_blur, radial_blur, selective_blur_channel

Magick API

GaussianBlurImageChannel

get_exif_by_entry

img.get_exif_by_entry([name]*) -> array

Description

Returns the value associated with the specified EXIF entry name or names. If no names are specified, returns all the entries. The return value is an array containing one or more [name, value] elements.

Arguments

Zero or more EXIF entry names.

Returns

The elements in the returned array are 2-element arrays in the form [name, value]. If ImageMagick does not know the name for an entry it uses "unknown." There may be more than one entry for "unknown" in the returned array. If there is no entry with the specified name the value is set to nil.

Example

image.get_exif_by_entry('Make') » [["Make", "Canon"]]
image.get_exif_by_entry("ShutterSpeedValue") »
    [["ShutterSpeedValue", "189/32"]]
image.get_exif_by_entry() »
    [["Make", "Canon"], ["ShutterSpeedValue", "189/32"] ...]

See also

get_exif_by_number

get_exif_by_number

img.get_exif_by_number([tag]*) -> hash

Description

Returns the value associated with the specified EXIF tag number or numbers. If no numbers are specified, returns all the tags. The return value is a hash. The hash keys are EXIF tag numbers. The values are the values associated with the tags.

Arguments

Zero or more EXIF tag numbers.

Returns

A hash. If there is no tag with the specified number the value is set to nil.

Example

image.get_exif_by_number(271) » {271=>"Canon"}
image.get_exif_by_number(37377) » {37377=>"189/32"}
image.get_exif_by_number() »
    {271=>"Canon", 37377=>"189/32" ...}

See also

get_exif_by_entry

get_iptc_dataset

img.get_iptc_dataset(ds) -> string

Description

Retrieves the data field for the specified DataSet, or nil if the DataSet is not used or the data field has length 0.

Arguments

RMagick defines the following constants for use as arguments to this method. All the constants are in the Magick::IPTC namespace. Notice that some DataSets have two names.

Constant Record:DataSet
Envelope::Model_Version 1:00
Envelope::Destination 1:05
Envelope::UNO 1:100
Envelope::Unique_Name_of_Object 1:100
Envelope::ARM_Identifier 1:120
Envelope::ARM_Version 1:122
Envelope::File_Format 1:20
Envelope::File_Format_Version 1:22
Envelope::Service_Identifier 1:30
Envelope::Envelope_Number 1:40
Envelope::Product_ID 1:50
Envelope::Envelope_Priority 1:60
Envelope::Date_Sent 1:70
Envelope::Time_Sent 1:80
Envelope::Coded_Character_Set 1:90
Application::Object_Type_Reference 2:03
Application::Object_Name 2:05
Application::Title 2:05
Application::Edit_Status 2:07
Application::Editorial_Update 2:08
Application::Urgency 2:10
Application::Country_Primary_Location_Code 2:100
Application::Country_Primary_Location_Name 2:101
Application::Original_Transmission_Reference 2:103
Application::Headline 2:105
Application::Credit 2:110
Application::Source 2:115
Application::Copyright_Notice 2:116
Application::Contact 2:118
Application::Subject_Reference 2:12
Application::Abstract 2:120
Application::Caption 2:120
Application::Caption_Writer 2:122
Application::Editor 2:122
Application::Rasterized_Caption 2:125
Application::Image_Type 2:130
Application::Image_Orientation 2:131
Application::Language_Identifier 2:135
Application::Category 2:15
Application::Audio_Type 2:150
Application::Audio_Sampling_Rate 2:151
Application::Audio_Sampling_Resolution 2:152
Application::Audio_Duration 2:153
Application::Audio_Outcue 2:154
Application::Supplemental_Category 2:20
Application::ObjectData_Preview_File_Format 2:200
Application::ObjectData_Preview_File_Format_Version 2:201
Application::ObjectData_Preview_Data 2:202
Application::Fixture_Identifier 2:22
Application::Keywords 2:25
Application::Content_Location_Code 2:26
Application::Content_Location_Name 2:27
Application::Release_Date 2:30
Application::Release_Time 2:35
Application::Expiration_Time 2:35
Application::Expiration_Date 2:37
Application::Special_Instructions 2:40
Application::Action_Advised 2:42
Application::Reference_Service 2:45
Application::Reference_Date 2:47
Application::Reference_Number 2:50
Application::Date_Created 2:55
Application::Time_Created 2:60
Application::Digital_Creation_Date 2:62
Application::Digital_Creation_Time 2:63
Application::Originating_Program 2:65
Application::Program_Version 2:70
Application::Object_Cycle 2:75
Application::Author 2:80
Application::By_Line 2:80
Application::Author_Position 2:85
Application::By_Line_Title 2:85
Application::City 2:90
Application::Sub_Location 2:92
Application::Province 2:95
Application::State 2:95
Pre_ObjectData_Descriptor::Size_Mode 7:10
Pre_ObjectData_Descriptor::Max_Subfile_Size 7:20
Pre_ObjectData_Descriptor::ObjectData_Size_Announced 7:90
Pre_ObjectData_Descriptor::Maximum_ObjectData_Size 7:95
ObjectData::Subfile 8:10
Post_ObjectData_Descriptor::Confirmed_ObjectData_Size 9:10

Example

img.get_iptc_dataset(Magick::IPTC::Application::Keywords)

Returns

The data field or nil

See also

each_iptc_dataset, iptc_profile

get_pixels

img.get_pixels(x, y, columns, rows) -> array

Description

Gets the pixels from the specified rectangle within the image.

Arguments

x, y
The x- and y-offset of the rectangle within the image.
columns, rows
The width and height of the rectangle.

Returns

An array of pixels. There will be columns*rows elements in the array.

Example

This example composites a black-and-white version of an image over the same image in its original colors. It uses get_pixels and store_pixels to make each column of pixels in the black-and-white image slightly more opaque than the column on its left, so that the resulting composite changes smoothly from color on the left to black-and-white on the right.

get_pixels example

See also

store_pixels, view

Magick API

AcquireImagePixels

gray?

img.gray? -> true or false

Description

Returns true if all the pixels in the image have the same red, green, and blue intensities.

Returns

true or false

See also

monochrome?

Magick API

IsGrayImage

grey?

img.grey? -> true or false

Description

Synonym for gray?

histogram?

img.histogram? -> true or false

Description

Returns true if the image has 1024 unique colors or less.

Returns

true or false

Magick API

IsHistogramImage

implode

img.implode(amount=0.50) -> image

Description

A funhouse mirror effect. See the example below.

Arguments

A Float value. Increasing the absolute value of the argument increases the effect. The value may be positive for implosion, or negative for explosion. The default is 0.50.

Returns

A new image

Example

This example is an animated image. Mouse over the image to start the animation.

implode example

Magick API

ImplodeImage

import_pixels

img.import_pixels(x, y, columns, rows, map, pixels, type=CharPixel) -> image

Description

Replaces the pixels in the specified rectangle with pixel data from the supplied array or string. When the pixels argument is an array of pixel data, this method is the reverse of export_pixels. When the pixels argument is a string, import_pixels is ideal for loading very large amounts of binary pixel data.

Arguments

x, y
The offset of the rectangle from the upper-left corner of the image
columns, rows
The width and height of the rectangle
map
A string describing the expected ordering of the pixel array. It can be any combination or order of R = red, G = green, B = blue, A = alpha, C = cyan, Y = yellow, M = magenta, K = black, or I = intensity (for grayscale).
pixels
The pixel data. Pixel data can be supplied as an array or as a string.
If pixels responds to :to_str
import_pixels assumes that pixels can be converted to a string by to_str and that the result is a C array of the type specified by type containing binary pixel data in the order specified by map. The elements in the buffer must be in the range specified by type.
Otherwise
import_pixels assumes that pixels is an array or an object that can be converted to an array by the Kernel::Array method. The elements in the array must be Numeric values in the range [0..QuantumRange]. In either case, the pixel data must be stored in scanline order: left-to-right and top-to-bottom.
type
A StorageType value that specifies the type and range of the pixel data when pixels is a string.

Returns

The image as transformed by the pixel data.

Example

# Replace the r'th scanline of the image using
# pixel data stored in red-green-blue order.
img.import_pixels(0, r, img.columns, 1, "RGB", scanline);

Example

This example is contrived since there's no need to convert the pixels array into a string by calling pack, but it does demonstrate the use of a string pixels argument. Note that this example assumes that ImageMagick is configured with QuantumDepth=8.

hat = Image.read("Flower_Hat.jpg").first
pixels = hat.export_pixels(0, 0, hat.columns, hat.rows, "RGB")
char_buffer = pixels.pack("C*")
img = Image.new(hat.columns, hat.rows)
img.import_pixels(0, 0, hat.columns, hat.rows, "RGB", char_buffer, CharPixel)

See also

constitute, export_pixels, store_pixels

Magick API

ImportImagePixels

Note

This method replaces the constitute method.

inspect

img.inspect -> string

Description

Constructs a description of the image as a string. The string contains some or all of the following fields:

original_filename=>
if different from the current filename.
filename
the current filename
[scene]
the scene number, if the image is part of an image sequence
format
the image format (GIF or JPEG, for example)
original width x height
if different from the current width x height
page width x height + x-offset + y-offset
if any of these fields is non-zero
storage class
DirectClass or PseudoClass
number of colors
total number of colors used in the image
mean error per pixel/normalized mean error/normalized maximum error
for PseudoClass images, if present
N-bit
bit depth
blob size
if present

Example

f.inspect » "images/Flower_Hat.jpg JPEG 200x250 DirectClass 8-bit 9kb"

level

img.level(black_point=0.0, white_point=QuantumRange, gamma=1.0) -> image

Description

Adjusts the levels of an image by scaling the colors falling between specified white and black points to the full available quantum range. The parameters provided represent the black, mid, and white points. The black point specifies the darkest color in the image. Colors darker than the black point are set to zero. Gamma specifies a gamma correction to apply to the image. White point specifies the lightest color in the image. Colors brighter than the white point are set to the maximum quantum value

Arguments

black_point
A black point level in the range 0-QuantumRange. The default is 0.0.
mid_point
A white point level in the range 0..QuantumRange. The default is QuantumRange - black_point.
gamma
A gamma correction in the range 0.0-10.0 The default is 1.0.

Returns

A new image

Example

level(0,1.50)

level example

Compatibility notes

Prior to version 1.11.0 RMagick defined the signature for level incorrectly:

img.level(white_point, gamma, black_point) -> image # wrong!

That is, the gamma and white_point arguments were swapped. In an effort to maintain compatibility with older scripts that expect that signature, level inspects its arguments and will interchange white_point and gamma if they "look" incorrect. That is, if gamma is > 10.0, or if white_point is < 10.0, or if gamma > white_point, then level will swap them.

If you want to avoid this behavior, use the level2 method instead. The level2 method is exactly the same as level except that it never swaps the arguments.

See also

level_channel

Magick API

LevelImage

level_channel

img.level_channel(channel, black_point=0, white_point=QuantumRange - black_point, gamma=1.0) -> image

Description

Same as level but operates only on the specified channel.

Arguments

channel
A ChannelType value.
black_point
A black point level in the range 0-QuantumRange. The default is 0.0.
white_point
A white point level in the range 0..QuantumRange. The default is QuantumRange - black_point.
gamma
A gamma correction in the range 0.0-10.0 The default is 1.0.

Returns

A new image

See also

level, levelize_channel

Magick API

LevelImageChannel

level_colors

img.level_colors(black_color="black", white_color="white", invert=true) -> image

Description

When invert is true, black and white will be mapped to the black_color and white_color colors, compressing all other colors linearly. When invert is false, black and white will be mapped to the black_color and white_color colors, stretching all other colors linearly. The default is true.

Arguments

black_color
The color to be mapped to black. The default is "black".
white_color
The color to be mapped to white. The default is "white".
invert
See the description above.

Returns

A new image

Example

level_colors example

See also

This method corresponds to the +level-colors option. See Examples of ImageMagick Usage for more information.

Magick API

LevelImageColors

levelize_channel

img.levelize_channel(black_point, white_point, gamma=1.0 [, channel...]) -> image

Description

Maps black and white to the specified points. The reverse of level_channel.

Arguments

black_point
A black point level in the range 0..QuantumRange. This argument is required.
white_point
A white point level in the range 0..QuantumRange. The default is QuantumRange - black_point.
gamma
A gamma correction in the range 0.0-10.0 The default is 1.0.
channel...
0 or more ChannelType arguments. If no channels are specified, the default channels are the red, green, and blue channels.

Returns

A new image

See also

level, level_channel

This method corresponds to the +level option. See Examples of ImageMagick Usage for more information.

Magick API

LevelizeImageChannel

linear_stretch

img.linear_stretch(black_point[, white_point]) -> image

Description

Linear with saturation stretch.

Arguments

black_point
black out at most this many pixels. Specify an absolute number of pixels as a numeric value, or a percentage as a string in the form 'NN%'.
white_point
burn at most this many pixels. Specify an absolute number of pixels as a numeric value, or a percentage as a string in the form 'NN%'. This argument is optional. If not specified the default is all pixels - black_point pixels.

Returns

A new image

Magick API

LinearStretchImage

liquid_rescale

img.liquid_rescale(new_width, new_height, delta_x=0.0, rigidity=0.0) -> image

Description

Rescale image with seam carving. To use this method, you must have installed and configured ImageMagick to use the Liquid Rescale Library.

Arguments

new_width, new_height

The desired width and height. Should not exceed 200% of the original dimension.

delta_x

Maximum seam transversal step (0 means straight seams).

rigidity

Introduce a bias for non-straight seams (typically 0).

Returns

A new image

Magick API

LiquidRescaleImage

magnify

img.magnify -> image

Description

A convenience method that scales the receiver to twice its size.

Returns

A new image

See also

magnify!, minify, resize, scale

Magick API

MagnifyImage

magnify!

img.magnify! -> self

Description

In-place form of magnify

Returns

self

map

img.map(img, dither=false) -> image

Description

Replaces the colors of an image with the closest color from a reference image.

Arguments

img
The reference image. May be either another image or an Image object.
dither
If true, dithers the mapped image.

Returns

A new image

Notes

This method is deprecated when using ImageMagick 6.4.3-6 and later. Use remap instead.

See also

ImageList#map

Magick API

MapImage

mask

img.mask([image or nil]) -> mask_image

Description

Sets an image clip mask created from the specified mask image. The mask image must have the same dimensions as the image being masked. If not, the mask image is resized to match. If the mask image has an alpha channel the opacity of each pixel is used to define the mask. Otherwise, the intensity (gray level) of each pixel is used.

In general, if the mask image does not have an alpha channel, a white pixel in the mask prevents changes to the corresponding pixel in the image being masked, while a black pixel allows changes. A pixel that is neither black nor white will allow partial changes depending on its intensity.

Use alpha to specify whether or not the mask image has an alpha channel.

Arguments

If the value is an imagelist, uses the current image as the mask image. To remove the mask, pass nil instead of an image.

To get a copy of the current mask, omit the argument entirely.

Example

mask example

Returns

A copy of the current mask, or nil if no mask is defined.

Notes

This method makes a copy of the image to use as the mask. This means that if you want to change the mask you must call this method to establish the changed image as the mask.

matte_fill_to_border

img.matte_fill_to_border(x, y) -> image

Description

Makes transparent all the pixels that are neighbors of the pixel at x,y and are not the border color.

Arguments

The x- and y- coordinates of the target pixel.

Returns

A new image

Example

In this example the border color is black. The fill starts in the center and makes all the pixels transparent until it reaches a black pixel. The resulting image has been composited over a plasma background, which shows through the transparent pixels.

matte_fill_to_border example

See also

matte_floodfill, Draw#matte

Magick API

MatteFloodfillImage

matte_floodfill

img.matte_floodfill(x, y) -> image

Description

Makes transparent all the pixels that are the same color as the pixel at x, y, and are neighbors.

Arguments

The x- and y-coordinates of the target pixel.

Returns

A new image

Example

In this example the fill starts at the center pixel and replaces all the yellow pixels - the color of the center pixel. The resulting image has been composited over a plasma background, which shows through the transparent pixels.

matte_floodfill example

See also

matte_replace, Draw#matte

Magick API

MatteFloodfilImage

matte_point

img.matte_point(x, y) -> image

Description

Makes the pixel at x, y transparent. This method makes a copy of the image, just to make one pixel transparent. I recommend using the Draw#matte method instead.

Arguments

The x- and y-coordinates of the target pixel.

Returns

A new image

See also

Draw#matte

matte_replace

img.matte_replace(x, y) -> image

Description

Makes transparent all the pixels that are the same color as the pixel at x, y.

Arguments

The x- and y-coordinates of the target pixel.

Returns

A new image

Example

In this example the target pixel is a black pixel in the center of the uppermost circle. The matte_replace method makes all the black pixels in the image transparent. The resulting image has been composited over a plasma background, which shows through the transparent pixels.

matte_replace example

See also

transparent, Draw#matte

Magick API

TransparentImage

matte_reset!

img.matte_reset! -> self

Description

Makes all the pixels in the image transparent.

Returns

self

See also

opacity=

Magick API

SetImageOpacity

median_filter

img.median_filter(radius=1.0) -> image

Description

Applies a digital filter that improves the quality of a noisy image. Each pixel is replaced by the median in a set of neighboring pixels as defined by radius.

Arguments

The filter radius. The larger the value, the longer it takes to render. Values larger than 8 or 9 may take longer than you want to wait, and will not have significantly better results than much smaller values.

Returns

A new image

Example

The left side of the image has been modified by add_noise. The right side has been filtered by median_filter(0.05).

median_filter example

See also

enhance, reduce_noise, unsharp_mask

Magick API

MedianFilterImage

minify

img.minify -> image

Description

A convenience method that scales the receiver to half its size.

Returns

A new image

See also

minify! magnify, resize, sample, scale, thumbnail

Magick API

MinifyImage

minify!

img.minify! -> self

Description

In-place form of minify.

Returns

self

modulate

img.modulate(brightness=1.0, saturation=1.0, hue=1.0) -> image

Description

Changes the brightness, saturation, and hue.

Arguments

The percent change in the brightness, saturation, and hue, represented as Float numbers. For example, 0.25 means "25%". All three arguments may be omitted. The default value of each argument is 1.0, that is, 100%.

Returns

A new image

Example

modulate(0.85)

modulate example

Magick API

ModulateImage

monochrome?

img.monochrome? -> true or false

Description

Returns true if all the pixels have the same red, green, and blue values and the values are either 0 or QuantumRange. That is, the image is black-and-white.

See also

gray?

Magick API

IsMonochromeImage

motion_blur

img.motion_blur(radius=0.0, sigma=1.0, angle=0.0) -> image

Description

Simulates motion blur. We convolve the image with a Gaussian operator of the given radius and standard deviation (sigma). Use a radius of 0 and motion_blur selects a suitable radius for you. Angle gives the angle of the blurring motion.

Arguments

radius
The radius of the Gaussian operator.
sigma
The standard deviation of the Gaussian operator. Must be non-0.
angle
The angle (in degrees) of the blurring motion.

Returns

A new image

Example

motion_blur example

See also

blur_image, gaussian_blur, radial_blur, selective_blur_channel

Magick API

MotionBlurImage

negate

img.negate(grayscale=false) -> image

Description

Negates the colors in the receiver.

Arguments

If the grayscale argument is true, only the grayscale values are negated.

Returns

A new image

Example

negate example

See also

negate_channel

Magick API

NegateImage

negate_channel

img.negate_channel(grayscale=false, [channel...]) = image

Description

Negate a particular image channel or channels.

Arguments

grayscale
if true, only negate grayscale pixels within the image
channel...
0 or more ChannelType arguments. If no channels are specified, all the channels are negated. Specifying no channel arguments has the same effect as the negate method, above.

Returns

A new image

Example

negate_channel(false, GreenChannel)

negate_channel example

See also

negate

.

Magick API

NegateImageChannel

normalize

img.normalize -> image

Description

Enhances the contrast of a color image by adjusting the pixel color to span the entire range of colors available.

Returns

A new image

Example

normalize example

Magick API

NormalizeImage

See also

normalize_channel

normalize_channel

img.normalize_channel([channel...]) = image

Description

Enhances the contrast of a color image by adjusting the pixel color to span the entire range of colors available. Only the specified channels are normalized.

Arguments

channel...
0 or more ChannelType arguments. If no channels are specified, all the channels are normalized. Specifying no channel arguments has the same effect as the normalize method, above.

Returns

A new image

Magick API

NormalizeImageChannel

See also

normalize

oil_paint

img.oil_paint(radius=3.0) -> image

Description

Applies a special effect filter that simulates an oil painting. Each pixel is replaced by the most frequent color occurring in a circular region defined by radius.

Returns

A new image

Example

oil_paint example

Magick API

OilPaintImage

opaque

img.opaque(target, fill) -> image

Description

Changes all pixels having the target color to the fill color.

Arguments

target
The color to be replaced. May be a color name or a Pixel
fill
The replacement color. May be a color name or a Pixel

Returns

A new image

Example

img.fuzz = 25
img = img.opaque('white', 'red')

See also

color_floodfill, opaque_channel

Magick API

OpaquePaintImageChannel

opaque_channel

img.opaque_channel(target, fill, invert=false, fuzz=img.fuzz [, channel...]) -> image

Description

Changes all pixels having the target color to the fill color. If invert is true, changes all the pixels that are not the target color to the fill color.

Arguments

target
The color to be replaced. May be a color name or a Pixel
fill
The replacement color. May be a color name or a Pixel
invert
If true, the target pixels are all the pixels that are not the target color. The default is the value of the target image's fuzz attribute
fuzz
Colors within this distance are considered equal to the target color.
channel...
0 or more ChannelType arguments. If no channels are specified, the default is DefaultChannels.

Returns

A new image

See also

opaque

Magick API

OpaquePaintImageChannel

opaque?

img.opaque? -> true or false

Description

Returns true if all of the pixels in the receiver have an opacity value of OpaqueOpacity.

Returns

true or false

Magick API

IsOpaqueImage

ordered_dither

img.ordered_dither(threshold_map='2x2') -> image

Description

Dithers the image to a predefined pattern. The threshold_map argument defines the pattern to use.

Arguments

The threshold_map argument can be any of the strings listed by this command:

convert -list Thresholds

If you have a sufficiently new version of ImageMagick, you can add a a uniform color map with the number of levels per color channel immediately following the threshold_map, separated by a comma. See the documentation for ImageMagick's -ordered-dither option for more information.

Returns

A new image

Example

ordered_dither example

See also

posterize, quantize

Magick API

OrderedPosterizeImage

 

rmagick-2.13.2/doc/rvgtspan.html0000644000004100000410000001371012147515547016560 0ustar www-datawww-data RMagick 2.13.2: RVG Reference: RVG::Tspan Class

class RVG::Tspan < TextBase

Table of Contents

class methods

instance methods

shared methods

In addition to the methods listed above, class RVG::Tspan also implements the styles method.

class methods

new

RVG::Tspan.new(text=nil, x=0, y=0) [ { |tspan| ...} ] -> tspan

Description

This method may be invoked indirectly via the tspan method in RVG::Text.

Tspan objects are containers, so this method yields to a block if one is present. The only objects that a tspan can contain are other tspans. Styles defined on a tspan propagate to any tspans contained within it.

Arguments

All arguments are optional.

text
A string. If present, this string is drawn at the current text position. By default the string is positioned with the lower-left corner of the first glyph at the current text position. Use the :text_anchor style to override this behavior. After the string is rendered, the current text position is moved to the end of the string.
x, y
Specify a new current text position within the current user coordinate system.

Examples

tspan example

instance methods

d

tspan.d(dx[, dy=0]) [ { |self| ...} ] -> self

Description

The dx and dy arguments are added to the the current text position to form a new current text position. Yields to a block if one is present.

Arguments

dx, dy
The distance, in the user coordinate system, to be added to the current text position.

Example

tspan example 2

Returns

self

rotate

tspan.rotate(degrees) [ { |self| ...} ] -> self

Description

Rotates the text about the current text position by the specified number of degrees. Yields to a block if one is present.

Arguments

degrees
The amount of rotation

Example

tspan example 3

Returns

self

tspan

tspan.tspan(string=0, x=nil, y=0) [ { |tspan| ...} ] -> tspan

Description

Calls RVG::Tspan.new to construct a tspan and adds it to the tspan. Yields to a block if one is present, passing the new tspan as an argument. Styles defined on the container tspan propagate to the contained tspan.

Arguments

string
A text string.
x, y
A new initial text position

Returns

The new tspan, so other RVG::Tspan methods can be chained to it.

 

rmagick-2.13.2/doc/rvgclip.html0000644000004100000410000001614112147515547016363 0ustar www-datawww-data RMagick 2.13.2: RVG Reference: RVG::ClipPath Class

class RVG::ClipPath < Object

Table of Contents

class methods

attributes

instance methods

shared methods

In addition to the methods listed above, class RVG::ClipPath also implements the styles method and the shape methods.

class methods

new

RVG::ClipPath.new(clip_path_units) [ { |clippath| drawing method calls } ] -> clippath

Description

Creates a clipping path. A clipping path is a combination of path, text, and basic shape objects that define an outline. Attach the clipping path to an object such as a raster image or RVG object with the :clip_path style. When RVG draws the object, things "outside" the path are not drawn.

The ClipPath.new method yields to a block. Within the block define the clipping path with a combination of path, basic shape, and text objects. You can also use the use method to refer to a previously-defined object or group of objects.

Arguments

clip_path_units
Defines the coordinate system for the contents of the clipping path. This argument can take either of two values, userSpaceOnUse, or objectBoundingBox. If userSpaceOnUse, the contents of the clipping path represent values in the current user coordinate system in place at the time when the clipping path is referenced. if objectBoundingBox, then the user coordinate system for the contents of the clipping path is established using the bounding box of the object to which the clipping path is applied. The default is userSpaceOnUse.

Example

clipping path example

See Also

The :clip_rule style.

attributes

desc, desc=

clippath.desc -> string
clippath.desc = string

Description

Use the desc attribute to assign a text description to the clipping path.

metadata, metadata=

clippath.metadata -> string
clippath.metadata = string

Description

Use the metadata attribute to assign additional metadata to the clipping path.

title, title=

clippath.title -> string
clippath.title = string

Description

Use the title attribute to assign a title to the clipping path.

instance methods

text

clippath.text(x=0, y=0, text=nil) [{|text| ...}] -> text

Description

Calls RVG::Text.new to construct a text object and adds it to the clipping path. Yields to a block if one is present, passing the new text object as an argument.

Returns

The RVG::Text object, so other RVG::Text methods can be chained to this method.

use

clippath.use(obj, x=0, y=0, width=nil, height=nil) -> use

Description

Calls RVG::Use.new to constructs a use object and adds it to the clipping path.

When the referenced argument is another RVG object, width and height can be used to specify the width and height of the viewport. If present and non-nil, these arguments override any width and height specified when the RVG object was created. You must specify the viewport size either when creating the RVG object or when referencing it with use.

Examples

See RVG::Use.new

Returns

The RVG::Use object, so other RVG::Use methods can be chained to this method.

 

rmagick-2.13.2/doc/comtasks.html0000644000004100000410000002521612147515547016544 0ustar www-datawww-data RMagick 2.13.2: Common Tasks

Common Tasks

Getting information about an image

One of the most fundamental operations on an image is simply getting basic information about the image. RMagick assigns dozens of attributes to an image. All you have to do is read the image and then call the attribute methods. Here's a Ruby program that takes image filenames from the command line and then prints a variety of information about each image to the terminal.

require 'RMagick'
ARGV.each { |file|
    puts file
    img = Magick::Image::read(file).first
    puts "   Format: #{img.format}"
    puts "   Geometry: #{img.columns}x#{img.rows}"
    puts "   Class: " + case img.class_type
                            when Magick::DirectClass
                                "DirectClass"
                            when Magick::PseudoClass
                                "PseudoClass"
                        end
    puts "   Depth: #{img.depth} bits-per-pixel"
    puts "   Colors: #{img.number_colors}"
    puts "   Filesize: #{img.filesize}"
    puts "   Resolution: #{img.x_resolution.to_i}x#{img.y_resolution.to_i} "+
        "pixels/#{img.units == Magick::PixelsPerInchResolution ?
        "inch" : "centimeter"}"
    if img.properties.length > 0
        puts "   Properties:"
        img.properties { |name,value|
            puts %Q|      #{name} = "#{value}"|
        }
    end
    }

Converting an image to another format

Converting an image to another format is as simple as writing the image to a file. ImageMagick uses the output filename suffix (".jpg" for JPEG, ".gif" for GIF, for example) or prefix ("ps:" for PostScript, for example) to determine the format of the output image.

Making thumbnails

RMagick gives you four different methods for resizing an image: resize, sample, scale, and thumbnail. All four are equally easy to use. Specify the number of columns and rows you want the thumbnail to have, like this:

img = Image.new "bigimage.gif"
thumb = img.scale(125, 125)
thumb.write "thumb.gif"

Alternatively, just pass a single Float argument that represents the change in size. For example, to proportionally reduce the size of an image to 25% of its original size, do this:

img = Image.new "bigimage.gif"
thumb = img.scale(0.25)
thumb.write "thumb.gif"

The resize method gives you more control by allowing you to specify a filter to use when scaling the image. Some filters produce a better-looking thumbnail at the expense of extra processing time. You can also use a blur argument, which specifies how much blurriness or sharpness the resize method should introduce.

The sample method, unlike the other two, does not do any color interpolation when resizing.

The thumbnail method is faster than resize if the thumbnail is less than 10% of the size of the original image.

flickr-style thumbnails

flickr thumbnails are 75 pixels wide and 75 pixels tall. If the original image isn't square, the thumbnail is cropped in its larger dimension so that the image isn't distorted. You can get make this kind of thumbnail with the resize_to_fill method.

thumb = img.resize_to_fill(75, 75)

Resizing to a maximum (or minimum) size

Say you need to make all your thumbnails no bigger than 64x64 but with the same aspect ratio as the original. Or, you don't want to resize the image if it's already smaller than 64x64. The change_geometry method can help.

The change_geometry method accepts an ImageMagick geometry string argument and a block. The geometry string specifies how to change the image's size: one or two numbers to specify the new size and optional flags to describe any constraints. The change_geometry method parses the geometry string and computes new width and height values. Then it calls the block, passing the values it computed.

Within the block you can do whatever you want with the new values. Typically you'll call one of the resize methods mentioned in the previous section and make the resized image the return value from the block. The change_geometry method then returns that value to its caller.

Simple thumbnails

If you just want to make sure your thumbnail is no bigger than a certain width and height, use the resize_to_fit method.

thumb = img.resize_to_fit(75, 75)

Writing to or reading from a string instead of a file

Use the Image.from_blob method to construct an Image object from a string. Use the Image#to_blob method to convert an image to a string. A blob is simply an in-memory version of an image file. That is, you could use File.read to read an JPEG file into a string, then create an image by using that string as an argument to from_blob. Similarly, if you create a string version of an image with to_blob, then write the string to a file, any image viewer will be able to display it just as if you had written the image directly to a file. Blobs are very useful in web applications when you want to modify an image and then stream it back to the client.

Use Image#import_pixels to load pixel data from a string buffer into an image. The pixel data must be in scanline order, right-to-left and top-to-bottom. The data can be packed as 8-bit bytes, 16-bit halfwords, 32-bit fullwords, or as C floats or doubles. The reciprocal method is Image#export_pixels_to_str.

Converting a color image to grayscale

Use the quantize method with the Magick::GRAYColorspace argument. If you want real "grayscale," quantize the image to 256 colors. If you want to convert a color image to black-and-white, use 2 colors. (See the demo.rb example.)

Compressing image files

Many image formats, including JPEG, PDF, and BMP, support compressed image files. The type of compression used depends on the format. Specify the compression type by assigning a CompressionType value to the compression optional argument to the write method.

The JPEGCompression and ZipCompression types support multiple levels of compression. Use the quality optional argument to the write method. The quality attribute is a number between 0 and 100, with 100 representing the least compression. When you compress an image using JPEGCompression, more compression usually results in a lower-quality image. When you compress an image using ZipCompression, more compression usually takes longer.

For more information, see the ImageMagick documentation for the -quality option to the utility commands.

img.write("myimage.jpg") { self.quality = 50 }

Making a drop shadow

Here's one way to make a drop shadow behind text. Make the shadow first by drawing the text in a light gray color. Position the text slightly to the right and down from where the real text will be. Then use the blur_image method to make the shadow by blurring the text. Finally, draw the text again in whatever color you want. (Click the image to see the Ruby program that created it.)

drop shadow example

rmagick-2.13.2/doc/info.html0000644000004100000410000011471512147515547015656 0ustar www-datawww-data RMagick 2.13.2: class Image::Info - Optional method arguments

class Image::Info - Optional method arguments

The Image::Info class

Some Image and ImageList methods, such as read and write, accept an "optional arguments" block in which you can set attributes that modify the method's output. These attributes belong to the Image::Info class. The Image::Info class exists only to accept optional arguments for those Image and ImageList methods.

This page explains the methods defined in the Image::Info class. Generally, each Image or ImageList method that uses the Image::Info class to get optional arguments will only accept some of the attributes listed on this page, that is, only those attributes that are meaningful for the particular method. Any other attributes that you set are ignored. Also, some attributes are only used by a subset of the image formats. See the ImageMagick documentation for more information.

Remember, you do not ever need to create an Image::Info object. The object is created for you before the optional arguments block is entered and destroyed after the block is exited.

All the attributes in the Image::Info class are read/write. For simplicity, and because usually you only set these attributes, this page only describes the setter version of each attribute method.

instance methods

[]=

self[format, key] = value -> self
self[key] = value -> self

Description

Define an option. An alternative to define, below. Use this method to set options for reading or writing certain image formats. The list of supported options changes from release to release. For a list of the valid image formats, keys, and values, refer to the documentation for the -define option for the release of ImageMagick installed on your system.

Arguments

format
An image format name such as "ps" or "tiff". (Depending on the key, this argument may be omitted.)
key
A string that identifies the option.
value
The value of the option. Value can be any object that responds to to_s. Use nil to set the key to a null value.

The "user" option

The "user" option is unique to RMagick. It may be set to any string. If this option is used when creating an image via one of the methods listed below then the new image gets the value assigned as a property as if img["user"] had been used. In addition, the value is displayed in the string returned by Image#inspect. The "user" property can be used to help distinguish otherwise similar images when debugging.

For example,

img = Magick::Image.new(10,10) do
   self['user'] = __FILE__ + ':' + __LINE__.to_s
end » 10x10 DirectClass 16-bit user:test.rb:3

These methods propogate the value of the "user" option to new image(s): Image.new, ImageList.new, ImageList.new_image, Image.capture, Image.from_blob, ImageList.from_blob, Image.read, ImageList.read, Image.read_inline, and Image.ping.

Returns

self

Example

self["tiff", "bits-per-sample"] = 2

Magick API

SetImageOption

[]

self[format, key] -> value
self[key] -> value

Description

Returns the value of the specified option for the specified format.

Arguments

format
An image format name such as "ps" or "tiff". (Depending on the key, this argument may be omitted.)
key
A string that identifies the option.

Returns

The value of the option. Always a string.

Example

self["tiff", "bits-per-sample"] » 2

Magick API

GetImageOption

channel

self.channel([channel [, channel...]])

Description

Restrict the method to the specified channel(s). This attribute is set-only.

Argument

The arguments may be any ChannelType values.

Notes

If you call channel with no arguments, all channels are included. If you do not call channel at all, the channels used do not include the alpha channel.

define

self.define(format, key[, value])

Description

Define a format-specific option. See []=, above.

Arguments

format
An image format name such as "ps" or "tiff".
key
A string that identifies the option.
value
The value of the option. Value can be any object that responds to to_s. If omitted, the key is simply defined to an null value.

Returns

self

Example

self.define("tiff", "bits-per-sample", 2)

Magick API

SetImageOption

undefine

self.undefine(format, key)

Description

Delete an option definition set by []= or define. This is not the same as setting the option to a null value. The undefine method removes the option name from the list of options for the specified format.

Arguments

format
An image format name such as "ps" or "tiff".
key
A string that identifies the option.

Returns

self

Example

self.undefine("tiff", "bits-per-sample")

attribute methods

antialias

self.antialias= true or false

Description

Control antialiasing of rendered Postscript and Postscript or TrueType fonts. The default is true.

attenuate

self.attenuate= number

Description

Lessen (or intensify) when adding noise to an image.

authenticate

self.authenticate= string

Description

Decrypt an image with this password.

This attribute can be used to specify the password to be used when reading an image or image sequence that is in an encrypted format, such as PDF.

background_color

self.background_color= string or pixel

Description

Set the image background color. The default is "white".

Arguments

A color name or a Pixel.

border_color

self.border_color= string or pixel

Description

Set the image border color. The default is "#dfdfdf".

Arguments

A color name or a Pixel.

caption

self.caption= string

Description

When used with Image.read, assigns a caption to an image. The caption is an image property:

img = Magick::Image.read("xc:white") do
  self.caption = "a new caption"
  self.size = "20x20"
end
p img.first.properties » {"caption"=>"a new caption"}
p img.first['caption'] » "a new caption"

Arguments

A string.

colorspace

self.colorspace= colorspace

Description

Specifies the image pixel interpretation.

Arguments

A ColorspaceType constant.

comment

self.comment= string

Description

Use this option to assign a specific comment to the image, when writing to an image format that supports comments.

Arguments

You can include the image filename, type, width, height, or other image attribute by embedding special format characters listed under the annotate method.

compression

self.compression= type

Description

Specifies the type of compression used when writing the image. Only some image formats support compression. For those that do, only some compression types are supported. If you specify an compression type that is not supported, the default compression type (usually NoCompression) is used instead.

Some compression types support varying levels of compression. See the quality attribute.

The following table shows the image formats that support compression. For each format, the right-hand column shows the supported compression types. The default compression type is shown in bold.

Supported Compression Types
Format Compression Types
BMP NoCompression, RLECompression
DIB NoCompression, RLECompression
FPX NoCompression, JPEGCompression
GIF LZWCompression
JNG NoCompression, JPEGCompression
JP2 JPEGCompression, LosslessJPEGCompression
JPG JPEGCompression, LosslessJPEGCompression
MIFF NoCompression, RLECompression
MNG NoCompression, JPEGCompression
PALM NoCompression, FaxCompression, RLECompression
PDB NoCompression, RLECompression
PDF NoCompression, JPEGCompression, LZWCompression, ZipCompression
PICT NoCompression, JPEGCompression
PNG NoCompression, ZIPCompression
PS NoCompression, RLECompression
PS2 RLECompression, FaxCompression, JPEGCompression, LZWCompression, NoCompression
PS3 FaxCompression, JPEGCompression, LZWCompression, NoCompression, RLECompression, ZipCompression
TIFF NoCompression, FaxCompression, Group4Compression, JPEGCompression, LZWCompression, RLECompression, ZipCompression
Notes
  1. NoCompression is accepted for all image formats. Except as noted in the table, it is the default.
  2. This table is based on my examination of the ImageMagick source code. It is not necessarily complete and it may contain mistakes. If you need an authoritative list, you should consult the ImageMagick developers.

Arguments

A CompressionType constant.

density

self.density= string or geometry

Description

Specifies the vertical and horizontal resolution in pixels. The default density is "72.0x72.0". This attribute can be used when writing JBIG, PCL, PS, PS2, and PS3 format images.

This attribute can also be used to specify the width and height of HISTOGRAM format images. For HISTOGRAM, the default is 256x200.

Arguments

The argument can be either a string in the form "XxY" where "X" is the horizontal resolution and "Y" is the vertical resolution, or a Geometry object where width is the horizontal resolution and height is the vertical resolution.

delay

self.delay= integer

Description

This attribute is useful for regulating the animation of image sequences. delay/100 seconds must expire before the display of the next image. The default is no delay between each showing of the image sequence. The maximum delay is 65535.

depth

self.depth= integer

Description

Specifies the image depth.

Arguments

Either 8, 16, or 32. You can specify 16 and 32 only when ImageMagick was compiled with a QuantumDepth that allows these depth values.

Use depth to specify the depth of CMYK, GRAY, RGB, RGBA, MAP, and XC format images. See also size.

dispose

self.dispose= type

Description

The argument indicates the way in which the graphic is to be treated after being displayed.

Argument

A DisposeType constant.

dither

self.dither= true or false

Description

This attribute can be used when writing GIF images.

Apply Floyd/Steinberg error diffusion to the image. The basic strategy of dithering is to trade intensity resolution for spatial resolution by averaging the intensities of several neighboring pixels. Images which suffer from severe contouring when reducing colors can be improved with this option.

endian

self.endian= type

Description

Specify the endianess of the image when reading the image file.

Argument

One of the following Magick::EndianType enum values:

  • MSBEndian
  • LSBEndian

extract

self.extract= string or geometry

Description

Specifies a portion of an image to be extracted when the image is constituted. This attribute can be used to identify a subset of an image that is otherwise too large to keep in memory.

Arguments

Either a geometry string or a Geometry object. For example: self.extract = "200x200+100+100".

filename

self.filename= string

Description

See capture.

fill

self.fill= string or pixel

Description

Specifies the fill color to use when creating an image with the "caption:" format..

Arguments

A color name or a pixel.

font

self.font= string

Description

Set the text rendering font.

format

self.format= string

Description

Set the image format, "GIF" or "JPG" for example.

Arguments

See File Formats.

fuzz

self.fuzz= number or string

Description

Set the level of "fuzziness" for comparing pixels. By default the pixels must be identical to be considered equal. The larger the fuzz value the more difference is tolerated. See Image#fuzz.

Arguments

The argument may be a numeric value or a string in the form "NN%". In the second case, the argument is computed as a percentage of QuantumRange. For example, a value of '5%' sets fuzz to 0.05*QuantumRange.

gravity

self.gravity= gravity

Description

The direction text gravitates to when annotating the image.

The direction you choose specifies where to position the text when annotating the image. For example, a gravity of CenterGravity forces the text to be centered within the image. By default, the image gravity is NorthWestGravity.

This attribute can be used to position the text when creating an image with the "caption:" format.

Arguments

A GravityType constant.

image_type

self.image_type= image_type

Description

The image type classification. For example, GrayscaleType. Don't confuse this attribute with the format such as "GIF" or "JPG".

Arguments

An ImageType constant.

interlace

self.interlace= type

Description

[S]pecify the type of interlacing scheme for raw image formats such as RGB or YUV. NoInterlace means do not interlace, LineInterlace uses scanline interlacing, and PlaneInterlace uses plane interlacing. PartitionInterlace is like PlaneInterlace except the different planes are saved to individual files (e.g. image.R, image.G, and image.B). Use LineInterlace or PlaneInterlace to create an interlaced GIF or progressive JPEG image. The default is NoInterlace.

Arguments

An InterlaceType constant.

label

self.label= string

Description

Use this option to assign a specific label to the image, when writing to an image format that supports labels, such as TIFF, PNG, MIFF, or PostScript. You can include the the image filename, type, width, height, or other image attribute by embedding special format characters. See annotate for details.

matte_color

self.matte_color= string or pixel

Description

Set the image transparent color. The default is "#bdbdbd".

Arguments

A color name or a pixel.

monitor

self.monitor= proc

Description

Set a Proc object as a progress monitor. This proc can be used to monitor the progress of methods that accept optional arguments such as read and write. To stop monitoring, set the monitor to nil. See Image#monitor for more information about the proc. This attribute is set-only.

If you assign a monitor to an image with self.monitor= when the image is created, the image object inherits the monitor. Any methods applied to the new image will be monitored as well.

This method supercedes the Magick.set_monitor method.

monochrome

self.monochrome= true or false

Description

Transform the image to black and white on input. Only the EPT, PDF, and PS formats respect this attribute.

orientation

self.orientation=type

Description

Specifies the orientation of the image pixels.

Argument

An OrientationType value.

origin

self.origin=string or geometry

Description

Set the image origin.

Argument

A geometry string of the form +x+y (a "-" may be used instead of "+" to indicate a negative offset) or a Geometry object.

page

self.page= string or geometry

Description

Set the equivalent size of the Postscript page. The default is "612x792>".

Arguments

A geometry string or a Geometry object.

pointsize

self.pointsize= number

Description

Set the font size in points. Useful when creating "caption:" format images, for example.

quality

self.quality= integer

Description

The compression level for JPEG, MPEG, JPEG-2000, MIFF, MNG, and PNG image format. Corresponds to ImageMagick's -quality option. The default is 75. See Compressing image files.

sampling_factor

self.sampling_factor= string

Description

sampling factors used by JPEG or MPEG-2 encoder and YUV decoder/encoder.

This attribute specifies the sampling factors to be used by the JPEG encoder for chroma downsampling. If this attribute is omitted, the JPEG library will use its own default values. When reading or writing the YUV format and when writing the M2V (MPEG-2) format, use sampling-factor="2x1" to specify the 4:2:2 downsampling method.

Argument

A string in the form "horizontal-factorxvertical-factor"

scene

self.scene= number

Description

Set the scene number of an image or the first image in a sequence.

server_name

self.server_name= string

Description

Set the X11 display to obtain fonts from.

size

self.size= string or geometry

Description

Set the width and height of the image when reading a built-in image format that does not have an inherent size, or when reading an image from a multi-resolution file format such as Photo CD, JBIG, or JPEG.

Use size to specify the width and height of images in the CMYK, DIB, EMF, GRAY, RGB, RGBA, UYVY, YUV, or XC formats, the width and height of some built in formats, or the subimage size of PTIF-format images.

Arguments

A geometry string or a Geometry object.

stroke

self.stroke= string or pixel

Description

Specifies the stroke color to use when creating an image with the "caption:" format..

Arguments

A color name or a pixel.

stroke_width

self.stroke_width= number

Description

Specifies the stroke width to use when creating an image with the "caption:" format..

Arguments

The stroke width.

texture

self.texture= image

Description

Set a texture to tile onto the image background. Corresponds to the -texture option to ImageMagick's convert and mogrify commands. This attribute is set-only.

Argument

An image

transparent_color

self.transparent_color= string or pixel

Description

The transparent color. Sometimes used for saving to image formats such as GIF and PNG8 which uses this color to represent boolean transparency. This does not make a color transparent, just defines what color the transparent color will be in the color pallette of the saved image.

This attribute allows you to have both a opaque visible color as well as a transparent color of the same color value without conflict. That is you can use the same color for both the transparent and opaque color areas within an image. This in turn frees to you to select a transparenct color that is appropriate when a image is displayed by application that does not handle a transparent color index, while allowing RMagick to correctly handle images of this type.

tile_offset

self.tile_offset= string or geometry

Description

Specifies the offset for tile images, relative to the background image it will be tiled on.

This attribute is useful with the "tile:" and "pattern:" image formats.

Arguments

A geometry string or a Geometry object.

undercolor

self.undercolor= string or pixel

Description

Specifies the undercolor color to use when creating an image with the "caption:" format..

Arguments

A color name or a pixel.

units

self.units= unit

Description

Specifies the units of image resolution.

Arguments

A ResolutionType constant.

view

self.view= string

Description

FlashPix viewing parameters.

 

rmagick-2.13.2/doc/ilist.html0000644000004100000410000017204312147515547016045 0ustar www-datawww-data RMagick 2.13.2: class ImageList

class ImageList
mixes in Comparable, Enumerable

class methods

new

Magick::ImageList.new [ { optional arguments } ] -> imagelist
Magick::ImageList.new(filename[, filename...]]) [ { optional arguments } ] -> imagelist

Description

Creates a new imagelist. If one or more image filenames are specified, opens and reads the files, adding a new image for each image in the image file(s). Sets the scene number to the index of the last image, or nil if no filenames are specified.

Arguments

Zero or more image file names. You can also specify optional arguments to be used when reading the file(s) by setting Image::Info attributes in the optional block.

Returns

A new imagelist. The imagelist contains an Image object for each image in the specified files. A file can contain more than one image. For example, new will create an image for each frame in an animated GIF or each layer in a multi-layer Photoshop file.

Example

i = Magick::ImageList.new
i = Magick::ImageList.new("Button_A.gif", "Cheetah.jpg")

attributes

delay=

ilist.delay=n

Description

In conjunction with ticks_per_second sets the length of time between each image in an animation. The delay= attribute assigns the same delay to all the images in the ilist. Use Image#delay= to set different delay values on individual images.

Arguments

An integer value representing the number of ticks that must elapse between each image in an animation.

Returns

self

Example

ilist.delay = 20 # delay 1/5 of a second between images.

See also

Image#delay=

iterations=

ilist.iterations=n

Description

Sets the number of times an animated image should loop.

The animate method and the ImageMagick animate command does not respect this number. Both will repeat the animation until you stop them. Mozilla (and presumably Netscape) do respect the value..

Arguments

The number of iterations.

Returns

self

Example

ilist.iterations = 10

length

ilist.length -> integer

Description

Returns the number of images in the imagelist.

Example

i = Magick::ImageList.new("images/Button_A.gif", "images/Button_B.gif")
i.length » 2

scene, scene=

ilist.scene -> integer
ilist.scene = integer

Description

Get/set the current scene number. The scene number indicates the image to which Image methods are sent.

Example

ilist.scene = 10
ilist.scene » 10

ticks_per_second=

ilist.ticks_per_second = integer

Description

Used in conjunction with delay to establish the elapsed time between frames in an animation. By default the number of ticks per second is 100.

Example

ilist.ticks_per_second = 1000

instance methods

Array methods

 

Description

ImageList delegates many methods to Array, so you can manipulate the images in an imagelist using almost all of the methods defined in Array. Typically these methods also update the scene number. The scene number will never exceed the number of images in the list, and if the imagelist contains no images the scene number will be nil.

Array methods that would normally return an array return an ImageList.

Most array methods keep the current image current. If the method moves the current image to a new position, the method updates the scene number to the new index. If the method deletes the current image, the scene number is set to the last image in the list. The following table lists the methods that do not follow these rules.

Array method behavior
Array method scene number will be...
<< set to index the last image in the list
clear set to nil
concat set to index the last image in the list
push set to index the last image in the list
unshift set to 0

Adding anything other than a image to an imagelist has undefined results. Most of the time RMagick will raise an ArgumentError exception. For example, if you call collect! on an imagelist you should make sure that the members of the imagelist remain images. If you need to replace images in an imagelist with non-image objects, convert the imagelist to an array with the to_a method, then modify the array.

The assoc, flatten, flatten!, join, pack, and rassoc methods are not defined in the ImageList class.

Example

Add noise to a model image. Append the resulting image to the imagelist in "example". (See the demo.rb example.)

example = Magick::ImageList.new
model = Magick::ImageList.new "model.miff"
example << model.add_noise Magick::LaplacisanNoise

See also

scene, scene=

<=>

ilist <=> other_imagelist -> -1, 0, 1

Description

Compares two imagelists and returns -1, 0, or 1 if the receiver is less than, equal to, or greater than the other imagelist. The comparison between the receiver (a) and the other (b) is performed this way:

  1. For all images n, if the result of a[n] <=> b[n] is not 0 then that is the result of a <=> b. Individual images are compared by comparing their signatures.
  2. If a.scene <=> b.scene is not 0, returns the result
  3. Returns a.length <=> b.length

ImageList mixes in the Comparable module.

See also

Image#<=>, signature

animate

ilist.animate([delay]) [ { optional arguments } ] -> self

Description

Animate the images to an X Window screen. By default displays to the local screen. You can specify a different screen by assigning the name to the server_name attribute in the optional arguments block.

Returns

self

Example

ilist.animate
ilist.animate { self.server_name = "other:0.0" }

See also

display

Note

The animate method is not supported on native MS Windows.

Magick API

AnimateImages

append

ilist.append(true or false) -> image

Description

Append all the images in the imagelist, either vertically or horizontally. If the images are not of the same width, any narrow images will be expanded to fit using the background color.

Arguments

If true, rectangular images are stacked top-to-bottom, otherwise left-to-right.

Returns

A image composed of all the images in the imagelist.

Magick API

AppendImages

average

ilist.average -> image

Description

Averages all the images together. Each image in the image must have the same width and height.

Returns

A single image representing the average of all the images in the imagelist.

Example

average example

Magick API

AverageImages

clone

ilist.clone -> other_imagelist

Description

Same as dup, but the frozen state of the original is propagated to the copy.

Returns

A new imagelist

See also

copy

coalesce

ilist.coalesce -> imagelist

Description

Merges all the images in the imagelist into a new imagelist. Each image in the new imagelist is formed by flattening all the previous images.

The length of time between images in the new image is specified by the delay attribute of the input image. The position of the image on the merged images is specified by the page attribute of the input image.

Returns

A new imagelist

Example

This example is an animated GIF created by coalescing 25 small images in a grid. Mouse over the image to start the animation.

coalesce example

See also

flatten_images, optimize_layers

Magick API

CoalesceImages

composite_layers

destination_list.composite_layers(source_list, operator=OverCompositeOp) -> imagelist

Description

An image from source_list is composited over an image from destination_list until one list is finished. Use the geometry and gravity attributes of the first image in destination_list to position the source images over the destination images. Unlike a normal composite operation, the canvas offset is also included to the composite positioning. If one of the image lists only contains one image, that image is applied to all the images in the other image list, regardless of which list it is. In this case it is the image meta-data of the list which preserved.

Arguments

The optional operator argument specifies a CompositeOperator to use for the compositing operations.

Returns

An imagelist

Example

This example is an animated GIF. Mouse over the image to start the animation.

composite_layers example

Notes

This method is equivalent to the -layers Composite option of ImageMagick's convert command. See the Layers Composition section in Examples of ImageMagick Usage for more information.

See also

optimize_layers

copy

ilist.copy -> other_imagelist

Description

Creates a deep copy of the imagelist. The new imagelist contains a copy of all the images in the original imagelist.

Returns

An imagelist

Example

imagelist2 = imagelist1.copy

See also

Image#copy, clone, dup

cur_image

ilist.cur_image -> image

Description

Retrieves the image indexed by scene. Raises IndexError if there are no images in the list.

Both the ImageList class and the Image class support the cur_image method. Of course, in the Image class, cur_image simply returns self. When a method accepts either an image or a imagelist as an argument, it sends the cur_image method to the argument to get the current image.

Returns

An image

deconstruct

ilist.deconstruct -> imagelist

Description

This method constructs a new imagelist containing images that include only the changed pixels between each image and its successor. The resulting imagelist usually produces a much smaller file.

The deconstruct method starts by copying the first image in the list to the output imagelist. Then, for each pair of images, deconstruct computes the smallest rectangle that encompasses all the changes between the first and second image and stores just the changed rectangle of the second image, along with the offset of the rectangle relative to the boundary of the first image.

Returns

A new imagelist

Magick API

DeconstructImages

See also

optimize_layers

dup

ilist.dup -> other_imagelist

Description

Makes a shallow copy of the receiver. The image elements in the new imagelist are references to the image elements in the original imagelist, not copies.

See also

copy, clone

display

ilist.display [ { optional arguments } ] -> self

Description

Displays the images in the imagelist to any X Window screen. By default displays to the local screen. You can specify a different screen by assigning the name to the server_name attribute in the optional arguments block.

Returns

self

See also

animate, Image#display

Note

The display method is not supported on native MS Windows.

Magick API

DisplayImages

flatten_images

ilist.flatten_images -> image

Description

Combines all the images in the imagelist into a single image by overlaying each successive image onto the preceding images. If a image has transparent areas, the underlying image will show through. Use the page attribute to specify the position of each image with respect to the preceding images.

This is useful for combining Photoshop layers into a single image.

Returns

An image

Example

flatten_images example

See also

coalesce, optimize_layers

Magick API

MergeImageLayers with the FlattenLayer method.

from_blob

ilist.from_blob(blob[, blob...]) [ { optional arguments } ] -> self

Description

Creates images from the blob (Binary Large Objects) arguments and appends the images to the imagelist.

Arguments

A blob can be a string containing an image file such as a JPEG or GIF. The string can contain a multi-image file such as an animated GIF or a Photoshop image with multiple layers. A blob can also be one of the strings produced by to_blob. Control how the image(s) are created by setting additional Image::Info attributes in the optional block argument. Useful attributes include scene, number_scenes, and extract.

Returns

An image created from the blob argument(s). The scene attribute is set to the last image in the imagelist.

Example

require 'RMagick'

f = File.open('Cheetah.jpg')
blob = f.read

ilist = Magick::ImageList.new
ilist.from_blob(blob)
ilist.display

See also

to_blob, Image#to_blob, Image.from_blob

Magick API

BlobToImageList

fx

ilist .fx(expression [, channel...]) -> image

Description

Applies the specified mathematical expression to the input images. This method corresponds to ImageMagick's -fx operator.

Arguments

expression
A mathematical expression of the form accepted by the -fx operator..
channel...
0 or more ChannelType arguments. Specify the output channels. If no channels are specified the result is set over all channels except the opacity channel.

Notes

  • Fx expressions are interpreted. Therefore this method can be quite slow depending on the complexity of the expression. Generally you will get better performance by accessing the image pixels as Pixel objects (see get_pixels and view) and using Ruby code to perform the mathematics.
  • The u and v symbols refer to the 0th and 1st image in the list. The image reference index (u[2] for example) works as expected. The current scene number has no meaning in the context of the fx method.
  • To specify a non-default pixel interpolation method, set the pixel_interpolation_method attribute of the last image in the list.

Returns

The image created by the expression.

Example

# Produce a navy blue image from a black image
imgl = Magick::ImageList.new
imgl << Magick::Image.new(64, 64) {self.background_color = 'black'}

res = imgl.fx('1/2', Magick::BlueChannel)

ImageMagick API

FxImageChannel

See also

get_pixels, view

inspect

ilist.inspect -> string

Description

Produces a string that describes the images in the imagelist.

Arguments

Returns

The returned string is a concatenation of the strings returned by Image#inspect for all the images in the imagelist.

Example

i = Magick::ImageList.new("images/Button_A.gif", "images/Button_B.gif")
» [images/Button_A.gif GIF 127x120+0+0 PseudoClass 256c 8-bit 18136b
images/Button_B.gif GIF 127x120+0+0 PseudoClass 256c 8-bit 5157b]
scene=1

See also

Image#inspect

map

ilist.map(reference, dither) -> imagelist

Description

Reduces the colors in the imagelist images to the set of colors in the reference image.

Arguments

reference
An image or a imagelist. If an imagelist, map uses the current image as the reference image.
dither
if true, dither the mapped images.

Returns

A new imagelist the same length as the receiver.

Notes

This method is deprecated when using ImageMagick 6.4.3-6 and later. Use remap instead.

See also

Image#map, quantize

Magick API

MapImages

montage

ilist.montage [ { optional arguments } ] -> imagelist

Description

Creates a composite image by reducing the size of the input images and arranging them in a grid on the background color or texture of your choice. There are many configuration options. For example, you can specify the number of columns and rows, the distance between images, and include a label with each small image (called a tile).

All of montage's configuration options are specified by assigning values to attributes in a block associated with the method call.

As you can see in the examples below, when you assign a value to a montage attribute you must specify self as the receiver so that Ruby can distinguish the method call from an assignment to a local variable.

You may assign a Pixel object to any attribute that accepts a color name.

Montage attributes

background_color=
The composite image background color.
border_color=
The tile border color.
border_width=
The tile border width in pixels.
compose=
The composite operator to use when compositing the tile images onto the background. The default composition operator is OverCompositeOp.
Hint: You can use a different composite operator for each tile by setting each image's compose= attribute to the desired operator. In the optional arguments block, set compose to UndefinedCompositeOp.
fill=
If the tiles have labels, the label fill color. The default fill color is black.
font=
If the tiles have labels, the label font. The default font is Helvetica.
frame=
The size of an ornamental frame surrounding each tile. The frame specification may be either a string or a Geometry object. If the argument is a string, it must have the form <width>x<height>+<outer bevel width>+<inner bevel width>. If the argument is a Geometry object, specify the width and height of the frame with the width and height attributes, and specify the outer bevel width and the inner bevel width with the x and y attributes. The values are in pixels. For example, to surround each tile with a frame 20 pixels wide by 20 pixels high and a 4-pixel inner and outer bevel, use:
self.frame = "20x20+4+4"
or
self.frame = Magick::Geometry.new(20,20,4,4)
If the tile has a label, the label is included in the frame. The default is to have no frame.
See Image#frame.
geometry=
The size of the tiles and the distance between tiles. The value can be either a geometry string or a Geometry object. The geometry string has the form: <tile-width>x<tile-height>+<distance-between-columns>+<distance-between-rows>. If you use a Geometry object, specify the tile width and height with the width and height attributes, and the distance between rows and distance between columns by the x and y attributes. To create tiles that are 130 pixels wide and 194 pixels tall, with 10 pixels between each column of tiles and 5 between each row, use:
self.geometry = "130x194+10+5"
or
self.geometry = Magick::Geometry.new(130, 194, 10, 5)
Both the geometry string and the Geometry object support flags that specify additional constraints. The default geometry is "120x120+4+3>".
gravity=
The direction used when adding the tile labels. (See annotate.)
matte_color=
The matte color. The default is #bdbdbd.
pointsize=
If the tiles have labels, the size of the label font in points. The default is 12 points.
shadow=
If set to true, adds a drop shadow to each tile. The default is false.
stroke=
If the tiles have labels, sets the stroke (outline) color of the label text. The default is "transparent".
texture=
A image to be tiled on the background of the composite image. If present, this attribute overrides the background color. For example, to use ImageMagick's built-in "granite" texture as the background, use:
self.texture = Magick::Image.read("granite:").first

The default is no texture.

tile=
The number of columns and rows to use when arranging the tiles on the composite image. The value can be either a string or a Geometry object. If the value is a string, it should have the form "<columns>x<rows>". If the value is a Geometry object, specify the number of columns as the width attribute and the number of rows as the height attribute. montage always generates all the rows, leaving empty cells if necessary. To arrange the tiles 4 across and 10 down, use:
self.tile = "4x10"
or
self.tile = Magick::Geometry.new(4,10)

The default is "6x4". If there are too many tiles to fit on one composite image, montage creates multiple composite images.

title=
Adds a title over the whole montage.

Tile labels

To add labels to the tiles, assign a "Label" property to each image. The montage method will use the value of the property as the label. For example,

img[2]['Label'] = "Mom's Birthday"

See []=.

Returns

An imagelist that contains as many images as are required to display all the tiles.

Magick API

MontageImages

morph

ilist.morph(n) -> imagelist

Description

Transforms a image into another image by inserting n in-between images. Requires at least two images. If more images are present, the 2nd image is transformed into the 3rd, the 3rd to the 4th, etc.

Arguments

The number of in-between images to insert between each pair of images.

Returns

An imagelist containing copies of the original images plus the in-between images.

Example

This animated GIF was created by reading the "0", "1", "2" and "3" images, then using morph to create 8 images between each original image. Mouse over the image to start the animation.

morph example

Magick API

MorphImages

mosaic

ilist.mosaic -> image

Description

Composites all the images into a single new image. The location of each image is determined by the value of its page attribute.

Returns

An image

Example

mosaic example

See also

coalesce, flatten_images, montage, optimize_images

Magick API

MergeImageLayers with the MosaicLayer method.

new_image

ilist.new_image(columns, rows[, fill]) [ { optional arguments } ] -> self

Description

Adds a new image to the imagelist. The image can have an optional fill applied to it.

Arguments

Creates a new image with the specified number of rows and columns. If the optional fill argument is used, calls the fill method to fill the image. Otherwise, the image is filled with the background color.

You can set any Image::Info attributes in an associated block. These attributes supply options to be used when creating the image. For example, you can specify the background color to fill the image with (see the example), the depth, border color, etc.

Returns

self

Example

Create a square red image.

ilist = Magick::ImageList.new
ilist.new_image(100, 100) { self.background_color = "red" }

optimize_layers

ilist.optimize_layers(layer_method) -> imagelist

Description

Optimizes or compares the images in the list. Equivalent to the -layers option in ImageMagick's mogrify command.

The optimize_layers method corresponds to the -layers option on ImageMagick's convert and mogrify commands. Anthony Thyssen's excellent Examples of ImageMagick Usage site has very detailed information and examples of the -layers option and and the optimization methods .

Arguments

One of the following ImageLayerMethod enum values:

CoalesceLayer
Equivalent to [coalesce]. Apply the GIF disposal methods set in the current image sequence to form a fully defined animation sequence without, as it should be displayed. Effectively converting a GIF animation into a 'film strip' like animation.
CompareAnyLayer
Crop the second and later frames to the smallest rectangle that contains all the differences between the two images. No GIF disposal methods are taken into account. This is exactly the same as [deconstruct], and does not preserve a animation's normal working, especially when a animation used GIF disposal methods such as 'Previous' or 'Background'.
CompareClearLayer
As [CompareAnyLayer] but crop to the bounds of any opaque pixels which become transparent in the second frame. That is the smallest image needed to mask or erase pixels for the next frame.
CompareOverlayLayer
As [CompareAnyLayer] but crop to pixels that add extra color to the next image, as a result of overlaying color pixels. That is the smallest single overlaid image to add or change colors. This can, be used with the -compose alpha composition method 'change-mask', to reduce the image to just the pixels that need to be overlaid.
DisposeLayer
This is like [CoalesceLayer] but shows the look of the animation after the GIF disposal method has been applied, before the next sub-frame image is overlaid. That is the 'dispose' image that results from the application of the GIF disposal method. This allows you to check what is going wrong with a particular animation you may be developing.
FlattenLayer
Create a canvas the size of the first images virtual canvas using the current background color, and compose each image in turn onto that canvas. Images falling outside that canvas will be clipped. Final image will have a zero virtual canvas offset. This is usually used as one of the final 'image layering' operations overlaying all the prepared image layers into a final image. For a single image this method can also be used to fillout a virtual canvas with real pixels, or to underlay a opaque color to remove transparency from an image. This method corresponds to flatten_images, above.
MergeLayers
As [FlattenLayer] but merging all the given image layers into a new layer image just large enough to hold all the image without clipping or extra space. The new image's virtual offset will prevere the position of the new layer, even if this offset is negative. the virtual canvas size of the first image is preserved. Caution is advised when handling image layers with negative offsets as few image file formats handle them correctly.
MosaicLayer
As [FlattenLayer] but expanding the initial canvas size of the first image so as to hold all the image layers. However as a virtual canvas is 'locked' to the origin, by definition, image layers with a negative offsets will still be clipped by the top and left edges. This method is commonly used to layout individual image using various offset but without knowing the final canvas size. The resulting image will, like FlattenLayer not have any virtual offset, so can be saved to any image file format. This method corresponds to mosaic, above.
OptimizeImageLayer
Optimize a coalesced animation into GIF animation by reducing the number of pixels per frame as much as possible by attempting to pick the best GIF disposal method to use, while ensuring the result will continue to animate properly. There is no guarantee that the best optimization will be found. But then no reasonably fast GIF optimization algorithm can do this. However this does seem to do better than most other GIF frame optimizers seen.
OptimizeLayer
Optimize a coalesced animation into GIF animation using a number of general techniques. This is currently a short cut to apply both the [OptimizeImageLayer] and [OptimizeTransLayer] methods but will expand to include other methods.
OptimizePlusLayer
As [OptimizeImageLayer] but attempt to improve the overall optimization by adding extra frames to the animation, without changing the final look or timing of the animation. The frames are added to attempt to separate the clearing of pixels from the overlaying of new additional pixels from one animation frame to the next. If this does not improve the optimization (for the next frame only), it will fall back to the results of the previous normal [OptimizeImageLayer] technique. There is the possibility that the change in the disposal style will result in a worsening in the optimization of later frames, though this is unlikely. In other words there no guarantee that it is better than the normal 'optimize-frame' technique.
OptimizeTransLayer
Given a GIF animation, replace any pixel in the sub-frame overlay images with transparency, if it does not change the resulting animation by more than the current fuzz factor. This should allow a existing frame optimized GIF animation to compress into a smaller file size due to larger areas of one (transparent) color rather than a pattern of multiple colors repeating the current disposed image of the last frame.
RemoveDupsLayer
Remove (and merge time delays) of duplicate consecutive images, so as to simplify layer overlays of coalesced animations. Usually this is a result of using a constant time delay across the whole animation, or after a larger animation was split into smaller sub-animations. The duplicate frames could also have been used as part of some frame optimization methods.
RemoveZeroLayer
Remove any image with a zero time delay, unless ALL the images have a zero time delay (and is not a proper timed animation, a warning is then issued). In a GIF animation, such images are usually frames which provide partial intermediary updates between the frames that are actually displayed to users. These frames are usually added for improved frame optimization in GIF animations.
TrimBoundsLayer
Find the minimal bounds of all the images in the current image sequence, then adjust the offsets so all images are contained on a minimal positive canvas. None of the image data is modified, only the virtual canvas size and offset. Then all the images will have the same canvas size, and all will have a positive offset, at least one image will touch every edge of that canvas with actual pixel data, though that data may be transparent.

Some of these values are not supported by older versions of ImageMagick. To see what values are available, enter the following code in irb:

Magick::ImageLayerMethod.values {|v| puts v}

In releases of ImageMagick before 6.3.6, this type was called MagickLayerMethod, so you may need to use this instead:

Magick::MagickLayerMethod.values {|v| puts v}

Returns

A new imagelist

See also

composite_layers

deconstruct is an alias for optimize_layers with the CompareAnyLayer argument.

coalesce is an alias for optimize_layers with the CoalesceLayer argument.

Magick API

OptimizeImageLayers, CompareImageLayers

ping

ilist.ping(filename[, filename...]) -> self
ilist.ping(file[, file...]) -> self

Description

Reads the image files and creates one or more images that contain all the image attributes but without the pixel data. If all you need is the image attributes, the ping method is much faster and consumes less memory than read.

Arguments

One or more image file names or open file objects.

Returns

self

Example

ilist = Magick::ImageList.new
ilist.ping "Button_A.gif"
puts "The image has #{i.columns} columns and #{i.rows} rows." »
      The image has 127 columns and 120 rows.

See also

read

Magick API

PingImage

quantize

ilist.quantize(nc=256, colorspace=RGBColorspace, dither=RiemersmaDitherMethod, tree_depth=0, measure_error=false) -> imagelist

Description

Analyzes the colors within a set of reference images and chooses a fixed number of colors to represent the set. The goal of the algorithm is to minimize the difference between the input and output images while minimizing the processing time.

Arguments

nc
The maximum number of colors to use in the output images. Must be less than or equal to QuantumRange.
colorspace
The colorspace to quantize in. Color reduction, by default, takes place in the RGB color space. Empirical evidence suggests that distances in color spaces such as YUV or YIQ correspond to perceptual color differences more closely than do distances in RGB space. The Transparent color space behaves uniquely in that it preserves the matte channel of the image if it exists.
dither
A DitherMethod value. See the documentation for the ImageMagick -dither option for more information.
tree_depth
Specify the tree depth to use while quantizing. The values 0 and 1 support automatic tree depth determination. The tree depth may be forced via values ranging from two to eight. The ideal tree depth depends on the characteristics of the input image, and may be determined through experimentation.
measure_error
Calculate quantization errors when quantizing the image. Stores the results for each image in the imagelist mean_error_per_pixel, normalized_maximum_error, and normalized_mean_error attributes. Stores the number of colors used for the image in the total_colors attribute.

Returns

A new imagelist containing quantized copies of the images in the original image.

Example

This example shows the effect of quantizing 3 images to a set of 16 colors in the RGB colorspace. Mouse over the image to see the images before quantizing.

quantize example

See also

Image#quantize

Magick API

QuantizeImages

read

ilist.read(filename[, filename...]) [ { optional arguments } ] -> self
ilist.read(file[, file...]) [ { optional arguments } ] -> self

Description

Reads one or more image files and adds the images to the imagelist. After reading all the files, sets the scene number to the last image in the list.

The image files may be multi-frame (animated or layered) files. In this case read adds multiple images per file to the imagelist.

Arguments

One or more filenames or open file objects. You can also specify optional arguments to be used when reading the file(s) by setting Image::Info attributes in the optional block.

Returns

self

Example

i = Magick::ImageList.new
number = '0'
4.times do
        i.read "images/Button_" + number + ".gif"
        number.succ!
        end

Also see the morph.rb example and the demo.rb example.

See also

Image.read

Magick API

ReadImage

Notes

You can create images using ImageMagick's built-in formats with the read method. See Built-in image formats.

remap

ilist.remap(remap_image=nil, dither=RiemersmaDitherMethod) -> self

Description

Reduce the colors used in the imagelist to the set of colors in remap_image.

Arguments

remap_image
The reference image
dither
A DitherMethod value. RiemersmaDitherMethod is the default. To disable dithering specify NoDitherMethod.

Returns

self

Example

This example shows the effect of reducing the colors used in the apple, beach scene, and leaf images to the set of colors used in the yellow rose image.

remap_images example

See also

Image#remap

Magick API

RemapImages (available in ImageMagick 6.4.3-6)

to_blob

ilist.to_blob [ { optional arguments } ] -> string

Description

Converts the images in the imagelist to a blob. A blob contains data that directly represent a particular image format in memory instead of on disk.

Control the format of the blob by setting Image::Info attributes in an associated block.

Returns

The blob in the form of a string

Example

i = Magick::ImageList.new "birthday.png"
s = i.to_blob » a string representing the image.

See also

from_blob, Image#to_blob, Image.from_blob

Magick API

ImageListToBlob

to_a

ilist.to_a -> array

Description

Returns an array containing all the images in the list.

Returns

An array

write

ilist.write(filename) [ { optional arguments } ] -> self
ilist.write(file) [ { optional arguments } ] -> self

Description

If the image format indicated by the filename supports multiple images per file (animated images), write writes all the images in the imagelist to a single file. Otherwise, write writes each image to a separate file.

Regardless of the original format, write converts the images to the format specified by the filename.

If the imagelist contains more than one image and the output format does not support multi-frame images, each image is written to a file that has the filename you specify followed by a period (.) and the scene number. You can change this behavior by embedding a %d, %0Nd, %o, %0No, %x, or %0Nx printf format specification in the file name.

Arguments

A filename or open file object. Indicate the desired image format either by the suffix (i.e. .jpg, .png) or the prefix (ps:) to the filename. If the argument is an open file object, you can specify a format for each image in the list by setting its format attribute. (See the Notes section for Image#write.)

You can also specify optional arguments by setting Image::Info attributes in an associated block.

Returns

self, or nil if the format cannot be determined.

Example

# The PNG format does not support multi-frame files,
# so each image is written to a separate file.
i = Magick::ImageList.new "animated.gif"
p i.length » 3 # contains 3 images
i.write "test.png" » test.png.0
                   » test.png.1
                   » test.png.2
# ImageMagick's MIFF format does support multi-frame
# files, so all 3 images are written to one file.
i.write "animated.miff" » animated.miff

See also

Image#write

Magick API

WriteImages

 

rmagick-2.13.2/doc/css/0000755000004100000410000000000012147515547014614 5ustar www-datawww-datarmagick-2.13.2/doc/css/popup.css0000644000004100000410000000061612147515547016474 0ustar www-datawww-data/* Styles for the example script popup */ body { background:#fffff0; margin:10px; } h1 { color: #663; width: 100%; text-align: center; } .bodybox { background-color:white; border:1px solid black; text-align:left; } .bodyfloat { padding:10px; color:black; text-align:left; } #close { width: 100%; text-align: center; } a:link { color:#663; font-weight:bold; } rmagick-2.13.2/doc/css/ref.css0000644000004100000410000000251512147515547016105 0ustar www-datawww-data/* Styles for struct.html and rvgref.html */ .subhd h2 { /* Same as h2.methods but different background-color */ margin-top: 2em; margin-bottom: .5em; padding: .5em 5px .5em 5px; background-color: #545454; color: white; clear: both; } .subhd h3 { /* Same as h2.methods */ margin-top: 0; margin-bottom: 0; padding: .5em 5px .5em 5px; background-color: #663; color: white; } .sig h4, .sig p { background-color: #c0c0c0; color: #000; margin-top: 0; } .sig h4 { /* method name: total width 210px */ width: 205px; float: left; padding-left: 5px; font-size: 110%; } .sig p { padding-right: 5px; padding-bottom: 1em; } .desc h5 { position: relative; left: -235px; padding-left: 5px; background-image: url(../ex/images/graydient230x6.gif); background-repeat: repeat-y; color: black; font-weight: normal; font-size: small; padding-bottom: 0; margin-bottom: 0; margin-top: 0; } .intro p { padding-bottom: 1em; margin-left: 215px; } .intro h3 { padding-left: 5px; background-color: white; background-image: url(../ex/images/graydient230x6.gif); background-repeat: repeat-y; color: black; font-weight: normal; font-size: small; padding-bottom: 0; margin: 0 0; } rmagick-2.13.2/doc/css/doc.css0000644000004100000410000001102212147515547016067 0ustar www-datawww-data /* Global styles. */ a:link { text-decoration: none; } a:visited { color: #7F7FFF; text-decoration: none; } a:hover { text-decoration: underline; } a:active { color: white; background-color: blue; text-decoration: underline; } body { background-color: white; color: black; font-size: 100.01%; } img { display: block; border-width: 0; } h1 { background-color: #900; font-size: x-large; font-weight: bold; color: #ebebeb; padding: .3em 5px .5em 5px; margin: 0 0; } h6#header { padding-top: 0.5em; font-size: small; font-weight: bold; color: #545454; letter-spacing: .5em; text-align: center; margin: 0 0; } /* * Table of Contents styles */ #toc h2 { background-color: #545454; color: white; padding: 5px .3em .3em .3em; margin: 0 0; } #toc h3 { clear: both; padding-left: 5px; padding-right: 1em; border-bottom: thin solid black; } #toc ul { list-style: none; } .toccol { float: left; width: 33%; } /* * Navigation bar. Appears at both top and bottom. */ div.nav { clear: both; background-color: #900; color: white; font-size: 8pt; font-family: sans-serif; font-weight: bold; margin-bottom: 0; margin-top: 1em; /* Separate from header at the top and */ /* from the last element at the bottom */ padding: 2px; padding-left: 8px; padding-right: 8px; text-align: right; } div.nav a:link { text-decoration: none; color: white; } div.nav a:visited { text-decoration: none; color: white; } div.nav a:hover { background-color: white; color: #900; } div.nav a:active { text-decoration: none; color: white; } span.superclass { font-size: normal; font-weight: normal; } span.mixin { font-size: smaller; padding-left: 1em; } /* * Method signatures, descriptions */ h2.methods { /* "class methods" */ margin-top: 2em; margin-bottom: 0; padding: .5em 5px .5em 5px; background-color: #663; color: white; clear: both; } /* * Method signatures */ div.sig { margin-bottom: .5em; } .sig h3 { /* method name: total width 210px */ background-color: #c0c0c0; color: #000; width: 225px; float: left; padding-left: 5px; margin-top: 0; } .sig p { background-color: #c0c0c0; color: #000; padding-right: 5px; padding-left: 230px; padding-bottom: 1em; margin-top: 0; } /* * Method descriptions */ .desc { margin-left: 235px; margin-bottom: 2em; } .desc h4 { position: relative; left: -235px; padding-left: 5px; background-image: url(../ex/images/graydient230x6.gif); background-repeat: repeat-y; color: black; font-weight: normal; font-size: small; padding-bottom: 0; margin-bottom: 0; margin-top: 0; } .desc dl,p,pre,img,ul { margin-top: 0; } .desc dt { font-style: italic; /* display: compact; */ } .arg { font-style: italic; } /* * The next 2 styles are for example scripts. */ .example, .desc pre { padding: 0 .5em 1em .5em; /* Tell Konq to not pad at the top. */ padd\ing-top: 1em; /* Tell everybody else to use 1em padding at the top. */ background-color: #f8f8f8; border-left: thin dotted black; border-top: thin dotted black; border-bottom: 4px solid #c0c0c0; border-right: 4px solid #c0c0c0 } .example { margin-left: 100px; margin-right: 100px; margin-bottom: 1em; } .example_cutline { margin-left: 100px; margin-right: 100px; font-style: italic; } /* * The following three styles govern the display of example * images with rollover effects and the "spin" image that * accompanies them. */ /* * This

encloses example images and the spin image. */ p.rollover { position: relative; } /* * Neither the example image nor the spin.gif get a border. */ .rollover img { display: inline; border-width: 0; } /* * The spin.gif image must be positioned at the upper-right * corner of the example image. */ img.spin { position: absolute; top: 0; left: 204px; } /* * Plain small gray tables */ .simple_table { border-collapse: collapse; border: thin solid black; background-color: #f8f8f8; margin-bottom: 1em; margin-top: 1em; width: 100%; } .simple_table td { padding: 3px 1em 3px 1em; } .simple_table caption { font-weight: bold; } /* * Miscellaneous styles */ /* * Insert white space between elements when CSS not enabled. */ p.spacer { display: none; } /* * Text quoted from the xMagick doc. */ .imquote { color: #545454; } .imquote p, .imquote ul { margin-left: 100px; margin-right: 100px; padding-bottom: 1em; } rmagick-2.13.2/doc/rvguse.html0000644000004100000410000001057712147515547016237 0ustar www-datawww-data RMagick 2.13.2: RVG Reference: RVG::Use Class

class RVG::Use < Object

Table of Contents

class methods

shared methods

This class implements the styles method and the transform methods.

class methods

new

RVG::Use.new(obj, x=0, y=0, width=nil, height=nil)-> use

Description

This method is usually invoked indirectly via the use method in the RVG, RVG::ClipPath, RVG::Group, and RVG::Pattern classes.

The use object is similar to a group. Any styles specified on the use will propagate to the referenced object. However, styles on the referenced object will override the styles specified on the RVG::Use object.

Arguments

obj
The object to be re-used. This is typically a group or RVG object but can also be any shape, text, or raster image, or even another use.
x, y
These arguments can be used to specify an additional translate transformation to be applied to the object within the user coordinate system.
width, height
The width and height of the rectangular region in which this object is placed. These arguments are ignored unless object is an RVG object. In this case, the values of width and height override the values of the width and height arguments that were specified when the RVG object was created.

Example

A simple 'use' on a 'rect'use example

What happens when a 'use' has chained transform methodsuse example

What happens when a 'use' has a chained 'style' methoduse example

Also see the example for RVG.new and the example for RVG::Group.new.

 

rmagick-2.13.2/doc/draw.html0000644000004100000410000023452512147515547015662 0ustar www-datawww-data RMagick 2.13.2: class Draw

class Draw < Object

class methods

new

Draw.new [ { optional parameters } ] -> draw

Description

Creates a new Draw object.

Arguments

If you plan to use the annotate method with this object you can initialize the attributes in the associated block.

Returns

A new Draw object.

Example

gc = Draw.new

instance methods

annotate

draw.annotate(img, width, height, x, y, text) [ { additional parameters } ] -> self

Description

Annotates a image with text. The text is positioned according to the gravity attribute around the rectangle described by the x, y, width, and height arguments. If either of the width or height arguments are 0, uses the image width-x and the image height-y to compute the rectangle width and height. The attributes described in annotate attributes, below, influence the appearance and position of the text. These attributes may be set in the Draw object before calling annotate, or within annotate's optional additional parameters block.

Note: all of the annotate attributes are set-only.

Arguments

img
the image or imagelist to be annotated
width
width of the rectangle within which the text is positioned
height
height of the rectangle within which the text is positioned
x
x offset of the rectangle
y
y offset of the rectangle
text
the text

Returns

self

Example

This example is an excerpt of colors.rb. Many other examples also use annotate.

title.annotate(montage, 0,0,0,40, 'Named Colors') {
    self.font_family = 'Helvetica'
    self.fill = 'white'
    self.stroke = 'transparent'
    self.pointsize = 32
    self.font_weight = BoldWeight
    self.gravity = NorthGravity
}

Special characters

Escape a blank, quote, or apostrophe by preceding it with a backslash ("\"). To include a backslash in the text, use two consecutive backslashes. To include a '%' in the text, use '%%'. You can include information about the image by including one or more of the special character sequences shown in this table.

Special characters
Replaced by  
%b file size in bytes
%c "comment" property string
%d directory in which the file resides
%e filename extension
%f original filename
%g group number
%h height
%i current filename
%k number of unique colors
%l "label" property string
%m file format
%n number of images in the sequence (for RMagick, this is always 1)
%o output filename
%p page number (for RMagick, this is always 1)
%q depth
%r A string of the form "ClasstypeColorspace," for example "DirectClassRGB". If the image's matte attribute is true, appends the word "Matte" to the end of the string.
%s scene number (always 1)
%t filename without extension
%u unique temporary filename
%w width
%x x resolution
%y y resolution
%z depth

See also

This method is also defined in the Image class.

Magick API

AnnotateImage

clone

draw.clone -> other_draw

Description

Same as dup except the frozen state of the original is propagated to the copy.

Returns

A new Draw object.

draw

draw.draw(img) -> self

Description

Draws the list of graphic primitives on the specified image. Calling draw does not affect the list of primitives. Each time you call draw the primitives will be re-executed from the beginning.

Arguments

Either an imagelist or a image. If an imagelist, draws on the current image.

Returns

self

Example

See the other examples on this page.

Magick API

DrawImage

dup

draw.dup -> other_draw

Description

Duplicate a Draw object.

Returns

An exact copy of the receiver, including the list of drawing primitives.

See also

clone

get_multiline_type_metrics

draw.get_multiline_type_metrics([image,] string) -> type_metrics

get_type_metrics

draw.get_type_metrics([image,] string) -> type_metrics

Description

Returns information for a specific string if rendered on a image. The get_multiline_type_metrics method is the same as get_type_metrics, except the former returns the maximum height and width for multiple lines of text. (Text lines are separated by "\n" characters.)

The Magick++ documentation for its TypeMetric class provides this useful additional information. (I've changed it a bit to use RMagick names.)

The TypeMetric class provides the means to pass data from the Draw class's get_type_metric method to the user. It provides information regarding font metrics such as ascent, descent, text width, text height, and maximum horizontal advance. The units of these font metrics are in pixels...(T)he metrics are dependent on the current Image font (default Ghostscript's "Helvetica"), pointsize (default 12 points), and x/y resolution (default 72 DPI) settings.

The pixel units may be converted to points (the standard resolution-independent measure used by the typesetting industry) via the following equation:

size_points = (size_pixels * 72)/resolution

where resolution is in dots-per-inch (DPI). This means that at the default image resolution, there is one pixel per point.

Note that a font's pointsize is only a first-order approximation of the font height (ascender + descender) in points. The relationship between the specified pointsize and the rendered font height is determined by the font designer.

See FreeType Glyph Conventions for a detailed description of font metrics related issues.

Arguments

image (optional)
The image on which the string will be rendered. ImageMagick uses the attributes of the image (font name, pointsize, etc.) to compute the metrics. If this argument is omitted, get_type_metrics substitutes a dummy image with default attributes. The string argument may not contain any of the special characters shown in this table.
string
The string to be rendered. If img is specified, the string may contain special characters that refer to the image attributes. See this table.

Returns

A TypeMetric struct. This structure has the following attributes. (The descriptions are taken from the Magick++ documentation and source code.)

TypeMetric attributes
Accessor Description
ascent Distance in pixels from the text baseline to the highest/upper grid coordinate used to place an outline point. Always a positive value.
descent Distance in pixels from the baseline to the lowest grid coordinate used to place an outline point. Always a negative value.
width Text width in pixels
height Text height in pixels
max_advance Maximum horizontal advance (advance from the beginning of a character to the beginning of the next character) in pixels.

Example

This example shows the details of a TypeMetric struct. get_type_metrics example

This example uses the width and height values returned by get_multiline_type_metrics to draw a border around the text lines. get_multiline_type_metrics example

Magick API

GetTypeMetrics, GetMultilineTypeMetrics

inspect

draw.inspect -> string

Description

Returns the list of primitives that have been added to the draw object. This is very handy for debugging.

Example

draw.inspect »
   "stroke red
    fill transparent
    rectangle 20,20 380,180
    line 200,20 200,180
    line 20,100 380,100
    stroke transparent
    fill black"

drawing primitive methods

affine

draw.affine(sx, rx, ry, sy, tx, ty) -> self

Description

Transforms the coordinate system by a 3x3 transformation matrix. See Coordinate system transformations in the Scalable Vector Graphics (SVG) 1.1 Specification.

Arguments

sx, sy
The amount of scaling in the x and y directions
rx, ry
The rotation in the x and y directions, in radians
tx, ty
The translation distances in the x and y directions, in pixels

Returns

self

Example

This example changes the default coordinate system to the standard Cartesian coordinate system: the x-axis points rightward and the y-axis points up.

gc.affine(1, 0, 0, -1, 0, max_y)

affine example

See also

rotate, scale, translate

arc

draw.arc(start_x, start_y, end_x, end_y, start_degrees, end_degrees) -> self

Description

Draws an arc within a rectangle.

Arguments

start_x, start_y
one corner of the bounding rectangle
end_x, end_y
the opposite corner of the bounding rectangle
start_degrees
where to start drawing the arc
end_degrees
where the arc ends

Returns

self

Example

gc.arc(40, 50, 250, 180, 0, 270)

arc example

See also

ellipse, the SVG elliptical arc commands (A and a)

bezier

draw.bezier(x1, y1, cx1, cy1, cx2, cy2, x2, y2...) -> self

Description

Draw a cubic Bezier curve.

Arguments

The arguments are pairs of points. At least 4 pairs must be specified. Each point xn, yn on the curve is associated with a control point cxn, cyn. The first point, x1, y1, is the starting point. The last point, xn, yn, is the ending point. Other point/control point pairs specify intermediate points on a polybezier curve.

Returns

self

Examples

The following examples are taken from the Paths section of the Scalable Vector Graphics (SVG) 1.1 Specification.

Example 1

gc.bezier(20,120, 20,20, 320,20, 320,120)

bezier example 1

Example 2

gc.bezier(25,125, 100,25, 400,25, 325,125)

bezier example 2

Example 3

gc.bezier(100,150, 25,50, 475,50, 400,150)

bezier example 3

Example 4

gc.bezier(20,180, 20,30, 320,330, 320,180)

bezier example 4

Example 5

gc.bezier(20,120, 95,20, 245,20, 320,120)

bezier example 5

Example 6

gc.bezier(50,150, 50,50, 200,50, 200,150, 200,250, 350,250, 350,150)

bezier example 6

circle

draw.circle(origin_x, origin_y, perim_x, perim_y) -> self

self

Description

Draw a circle.

Arguments

origin_x, origin_y
The center of the circle.
perim_x, perim_y
A point on the perimeter of the circle.

Returns

self

Example

gc.circle(125,125, 25,125)

circle example

clip_path

draw.clip_path(pathname) -> self

Description

Draws the clip path on the image mask. The clip path defines a clipping area, where only the contained area will be drawn upon. Areas outside of the clipping area are masked.

Before using a clip-path, you must create it using the define_clip_path method. You must precede clip_path with push and terminate the primitives that draw within the clip path with pop. For example,

gc.push
gc.clip_path('mypath')
# drawing primitives within the clip path
gc.pop
gc.draw

Also see the example below.

Arguments

The name of the clip path.

Returns

self

Example

In this example, the picture of the girl is drawn onto the canvas using a star-shaped clipping path.

clip_path example

See also

define_clip_path

clip_rule

draw.clip_rule("evenodd" or "nonzero") -> self

Description

Specify how to determine if a point on the image is inside clipping region. See the 'fill-rule' property in the Scalable Vector Graphics (SVG) 1.1 Specification for a complete description and examples.

Arguments

Either "evenodd" or "nonzero".

Returns

self

clip_units

draw.clip_units("userSpace" or "userSpaceOnUse" or "objectSpace") -> self

Description

Defines the coordinate space within the clipping region. See Establishing a New Clipping Path in the Scalable Vector Graphics (SVG) 1.1 Specification for a complete description and examples.

Arguments

Either "userSpace", "userSpaceOnUse", or "objectSpace".

Returns

self

color

draw.color(x, y, paint_method) -> self

Description

Set color in image according to the specified PaintMethod constant.

Arguments

A PaintMethod constant. If you use the FillToBorderMethod, assign the border color with the Draw#border_color= attribute before calling draw.

Returns

self

Example

  draw.border_color = 'black'
  draw.color(x, y, FillToBorderMethod)

See Also

matte

composite

draw.composite(x, y, width, height, composite_image, op=OverCompositeOp) -> self

Description

Composite composite_image with the receiver image.

Arguments

x, y
The offset of composite_image relative to the receiver image.
width, height
Scale the composite_image to this size. If either value is 0, composite_image is not scaled.
composite_image
Either an imagelist or a image. If an imagelist, uses the current image.
op
A CompositeOperator constant.

Returns

self

Example 1

composite example 1

Example 2

composite example 2

See also

composite

decorate

draw.decorate(decoration) -> self

Description

Specify text decoration.

Arguments

A DecorationType constant.

Returns

self

Example

draw.decorate(LineThroughDecoration)

define_clip_path

draw.define_clip_path(string) { block } -> self

Description

Define a clip-path. Within block, call other drawing primitive methods (rectangle, polygon, text, etc.) to define the clip-path. The union of all the primitives (excluding the effects of rendering methods such as stroke_width, etc.) is the clip-path. After the clip-path is invoked by the clip-path method, anything drawn on the image inside the clip-path will appear. Anything drawn outside the clip-path will be hidden. (See clip_rule for a definition of how ImageMagick decides what is "inside" and what is "outside" of the clip-path.)

Arguments

The name of the clip-path. This is the name that is specified in the clip_path method.

Returns

self

Example

See clip_path.

ellipse

draw.ellipse(origin_x, origin_y, width, height, arc_start, arc_end) -> self

Description

Draw an ellipse.

Arguments

origin_x, origin_y
The center of the ellipse
width, height
The horizontal and vertical radii
arc_start
Where to start the ellipse, in degrees. 0 degrees is at 3 o'clock.
arc_end
Where to end the ellipse, in degrees

Returns

self

Example

draw.ellipse(180,125, 150,75, 0, 270)

ellipse example

See also

arc, circle, path

encoding

draw.encoding(string) -> self

Description

Specify the font encoding.

Arguments

See the ImageMagick documentation for the -encoding option to the mogrify command

Returns

self

fill

draw.fill(string) -> self

Description

Specify the color or pattern with which graphical elements are filled.

Arguments

A color name or pattern name.

Returns

self

Example

  draw.fill('red')

Aliases

fill_color, fill_pattern

fill_opacity

draw.fill_opacity(float or string) -> self

Description

Specify the fill opacity.

Arguments

A number between 0 and 1, inclusive, or a percentage represented as a string, i.e. '30%'. The argument 0.3 is the same as '30%'.

Returns

self

Example

See the example for opacity.

See also

opacity, stroke_opacity

fill_rule

draw.fill_rule("evenodd" or "nonzero") -> self

Description

Specify how to determine if a point on the image is inside a shape. See the 'fill-rule' property in the Scalable Vector Graphics (SVG) 1.1 Specification for a complete description and examples.

Arguments

Either "evenodd" or "nonzero".

Returns

self

font

draw.font(string) -> self

Description

Specify the font to draw text with.

Arguments

The font name or filename. You can tag a font to specify whether it is a Postscript, Truetype, or OPTION1 font. For example, Arial.ttf is a Truetype font, ps:helvetica is Postscript, and x:fixed is OPTION1.

The font name can be a complete filename such as "/mnt/windows/windows/fonts/Arial.ttf". The font name can also be a fully qualified X font name such as "-urw-times-medium-i-normal--0-0-0-0-p-0-iso8859-13".

Returns

self

See also

font_family

font_family

draw.font_family(string) -> self

Description

Specify the font family.

Arguments

A font family name such as "arial" or "helvetica".

Returns

self

Example

See the example for text.

font_stretch

draw.font_stretch(stretch) -> self

Description

Specify the spacing between text characters.

Arguments

A StretchType constant.

Returns

self

font_style

draw.font_style(style) -> self

Description

Specify the font style, i.e. italic, oblique, or normal.

Arguments

A StyleType constant.

Returns

self

font_weight

draw.font_weight(weight) -> self

Description

Specify the font weight. For example, "bold" or "normal".

Arguments

A WeightType constant, or one of the numbers 100, 200, 300, 400, 500, 600, 700, 800, or 900.

Returns

self

gravity

draw.gravity(gravity) -> self

Description

Specify how the text is positioned. The default is NorthWestGravity.

Arguments

A GravityType constant.

Returns

self

Example

gravity example

See also

text_align

interline_spacing

draw.interline_spacing(space) -> self

Description

Modify the spacing between lines when text has multiple lines.

Argument

A numeric value. If positive, inserts additional space between lines. If negative, removes space between lines. The amount of space inserted or removed depends on the font.

Returns

self

interword_spacing

draw.interword_spacing(space) -> self

Description

Modify the spacing between words in text.

Argument

A numeric value. If positive, inserts additional space between words. If negative, removes space between words. The amount of space inserted or removed depends on the font.

Returns

self

kerning

draw.kerning(space) -> self

Description

Modify the spacing between letters in text.

Argument

A numeric value. If positive, inserts additional space between letters. If negative, removes space between letters. The amount of space inserted or removed depends on the font but is usually measured in pixels. That is, the following call adds about 5 pixels between each letter.

gc.kerning(5)

Returns

self

line

draw.line(here_x, here_y, there_x, there_y) -> self

Description

Draw a line from here to there.

Arguments

here_x, here_y
The starting point.
there_x, there_y
The ending point.

Returns

self

Example

gc.line(50,50, 50,200)
gc.line(50,200, 200,200)
gc.line(200,200, 50,50)

line example

matte

draw.matte(x,y, paint_method) -> self

Description

Make the image transparent according to the specified PaintMethod constant.

Arguments

x, y
Point in image to use, along with the PaintMethod constant, to set transparent pixels in the image.
paint_method
One of the following PaintMethod constants:
PointMethod
Make the pixel at (x,y) transparent.
ReplaceMethod
Make all pixels that are the same color as the pixel at (x,y) transparent.
FloodfillMethod
Make all the pixels surrounding the pixel at (x,y) transparent, until encountering pixels that fail to match color at (x,y).
FillToBorderMethod
Make all the pixels surrounding the pixel at (x,y) transparent, until encountering pixels that match the border color. Assign the border color with the Draw#border_color= attribute before calling draw.
ResetMethod
Make the entire image transparent.

Returns

self

See also

colormatte_point, matte_replace, matte_floodfill, matte_fill_to_border, opaque, transparent

opacity

draw.opacity(opacity) -> self

Description

Specify the fill and stroke opacities.

Arguments

Either a number between 0 and 1, or a percentage represented as a string, i.e. "25%". The string argument "25%" is the same as the numeric argument 0.25. Both the fill and stroke opacities are set to the specified value.

Returns

self

Example

This example demonstrates 4 levels of opacity.

opacity example

See also

fill_opacity, stroke_opacity

path

draw.path(string) -> self

Description

Draw using SVG-compatible path drawing commands. See "Paths" in the Scalable Vector Graphics (SVG) 1.1 Specification.

Arguments

A string containing SVG moveto, line, curve, arc, or closepath instructions. The string is equivalent to the d attribute in an SVG 'path' element.

Returns

self

Example

These examples are all taken from the SVG path examples.

Example 1 - Arcs

gc.path('M110,100 h-75 a75,75 0 1,0 75,-75 z')
gc.path('M97.5,87.5 v-75 a75,75 0 0,0 -75,75 z')

path example 1

Example 2 - Quadratic bezier

gc.path("M20,150 Q120,25 220,150 T420,150")

path example 2

Example 3 - Cubic bezier

gc.path("M20,120 C20,20 170,20 170,120 S320,220 320,120")

path example 3

pattern

draw.pattern(name, x, y, width, height) { pattern primitives } -> self

Description

Define a pattern that can be used as the fill or stroke pattern.

Arguments

name
The name of the pattern. The pattern is used in a fill or stroke method by specifying its name.
x, y, width, height
Define how the pattern is tiled. The pattern rectangles start at (x + m*width, y+n*height) for the values of n and m as necessary to fill the space.
pattern primitives
The method calls that draw the pattern.

Returns

self

Example 1

pattern example 1

Example 2

pattern example 2

See also

fill, stroke

point

draw.point(x, y) -> self

Description

Set the pixel at x,y to the fill color.

Arguments

x, y
The pixel location

Returns

self

pointsize

draw.pointsize(integer) -> self

Description

Set the font size in points. The default is 12.

Arguments

See the example for text.

Returns

self

Alias

font_size

polygon

draw.polygon(x1, y1,...,xN, yN) -> self

Description

Draw a polygon.

Arguments

The arguments are a sequence of 2 or more points. If the last point is not the same as the first, the polygon is closed by drawing a line from the last point to the first.

Returns

self

Example

This example is taken from the The 'polygon' element in the Scalable Vector Graphics (SVG) 1.1 Specification

polygon example

See also

path

polyline

draw.polyline(x1, y1,...,xN, yN) -> self

Description

Draw a polyline. Unlike a polygon, a polyline is not automatically closed.

Arguments

A sequence of 2 or more points.

Returns

self

Example

This example is taken from the The 'polyline' element in the Scalable Vector Graphics (SVG) 1.1 Specification

polyline example

pop

draw.pop -> self

Description

Restore the graphics context to the state it was in when push was called last.

Returns

self

See also

push

push

draw.push -> self

Description

Save the current state of the graphics context, including the attribute settings and the current set of primitives. Use the pop primitive to restore the state.

Note: The push and pop methods are probably not as useful in RMagick as they are in C language ImageMagick programs, since it is easy to create separate draw objects, each with its own set of properties and primitives.

Returns

self

See also

pop

rectangle

draw.rectangle(x1, y1, x2, y2) -> self

Description

Draw a rectangle.

Arguments

x1, y1
The upper left hand corner of the rectangle
x2, y2
The lower right hand corner of the rectangle

Returns

self

Example

gc.rectangle(20,20, 280,180)

rectangle example

rotate

draw.rotate(degrees) -> self

Description

Specify a rotation transformation to the coordinate space. The default is 0.

Arguments

The amount of rotation, in degrees. The angle of rotation is clockwise, so 90° is South.

Returns

self

Example

gc.rotate(45)

rotate example

See also

affine

roundrectangle

draw.roundrectangle(x1, y1, x2, y2, cw, ch) -> self

Description

Draw a rectangle with rounded corners.

Arguments

x1, y1
The upper left hand corner of the rectangle
x2, y2
The lower right hand corner of the rectangle
cw, ch
The corner width and height

Returns

self

Example

gc.roundrectangle(20,20, 280,180, 8, 8)

roundrectangle example

scale

draw.scale(sx, sy) -> self

Description

Define a scale transformation to the coordinate space. The default scale is (1.0, 1.0).

Arguments

sx, sy
The amount of scaling in the x and y dimensions.

Returns

self

See also

affine

skewx

draw.skewx(float) -> self

Description

Define a skew transformation along the x-axis.

Arguments

The amount of skew, in degrees.

Returns

self

Example

gc.skewx(30)

skewx example

See also

skewy, affine, rotate

skewy

draw.skewy(float) -> self

Description

Define a skew transformation along the y-axis.

Arguments

The amount of skew, in degrees.

Returns

self

Example

gc.skewy(30)

skewy example

See also

affine, skewx, rotate

stroke

draw.stroke(string) -> self

Description

Specify the stroke color or pattern.

Arguments

A color name or pattern name.

Returns

self

Aliases

stroke_color, stroke_pattern

stroke_antialias

draw.stroke_antialias(true or false) -> self

Description

Specify if the stroke should be antialiased. The default is true.

stroke_dasharray

draw.stroke_dasharray(x1,...,xn) -> self

Description

Describe a pattern of dashes to be used when stroking paths. The arguments are a list of pixel widths of alternating dashes and gaps.

Arguments

The first argument is the width of the first dash. The second is the width of the gap following the first dash. The third argument is another dash width, followed by another gap width, etc. If you specify an odd number of arguments, the arguments are repeated to produce an even number. All arguments must be > 0.

To produce a solid stroke, specify no arguments, i.e. stroke_dasharray()

Returns

self

Example

stroke_dasharray example

See also

stroke_dashoffset

stroke_dashoffset

draw.stroke_dashoffset(integer) -> self

Description

Specify the initial distance into the dash pattern.

Arguments

The initial distance into the dash pattern. The units are pixels.

Returns

self

Example

See stroke_dasharray.

stroke_linecap

draw.stroke_linecap(string) -> self

Description

Specify how the line ends should be drawn.

Arguments

One of "butt", "round", or "square".

Returns

self

Example

The following example is from the Stroke Properties section of the Scalable Vector Graphics (SVG) 1.1 Specification.

stroke_linecap example

stroke_linejoin

draw.stroke_linejoin(string) -> self

Description

Specify how corners are drawn.

Arguments

One of "miter", "round", or "bevel".

Returns

self

Example

The following example is from the Stroke Properties section of the Scalable Vector Graphics (SVG) 1.0 Specification.

stroke_linejoin example

See also

stroke_miterlimit

stroke_miterlimit

draw.stroke_miterlimit(float) -> self

Description

Specify a constraint on the length of the "miter" formed by two lines meeting at an angle. If the angle if very sharp, the miter could be very long relative to the line thickness. The miter limit is a limit on the ratio of the miter length to the line width.

Arguments

A number >= 1. The limit on the ratio of the miter length to the line width.

Returns

self

stroke_opacity

draw.stroke_opacity(float or string) -> self

Description

Specify the stroke opacity.

Arguments

A number between 0 and 1, inclusive, or a percentage represented as a string, i.e. '30%'. The argument 0.3 is the same as '30%'.

Returns

self

Example

draw.stroke_opacity(0.4)
draw.stroke_opacity('40%')

See also

fill_opacity, opacity

stroke_width

draw.stroke_width(integer) -> self

Description

Specify the stroke width in pixels. The default is 1.

Returns

self

Example

stroke_width example

text

draw.text(x,y, text) -> self

Description

Draw text at the location specified by (x,y). Use gravity to position text relative to (x, y). Specify the font appearance with the font, font_family, font_stretch, font_style, and font_weight methods. Specify the text attributes with the text_align, text_anchor, text_antialias, and text_undercolor methods.

Generally it is a good idea to surround the text string with quotes (""), apostrophes (''), or braces ({}). If the text string starts with a digit or contains an embedded blank, quote, or apostrophe, you must do this. ImageMagick removes these characters before drawing the text. You can also escape a blank, quote, or apostrophe by preceding it with a backslash ("\"). To include a backslash in the text, use two consecutive backslashes. To include a '%' in the text, use '%%'. See the examples below.

Arguments

x, y
The text position, influenced by gravity.
text
The text.

Returns

self

Quoting examples

The text to the right of » is the text that will be drawn.

gc.text(10,10, '"Hello there!"') » Hello there!
gc.text(10,10, "'What\'s up?'") » What's up?
gc.text(10,10, %q/"What's up?"/) » What's up?
gc.text(10,10, %q/{"What's up?"}/) » "What's up?"

Example

text example

See also

annotate

text_align

draw.text_align(alignment) -> self

Description

Align text relative to the starting point.

Arguments

An AlignType constant.

Returns

self

Example

text_align example

text_anchor

draw.text_anchor(anchor) -> self

Description

Align text relative to the starting point. This is the SVG 1.1 equivalent to text_align.

Arguments

One of the constants StartAnchor, MiddleAnchor, or EndAnchor.

Returns

self

text_antialias

draw.text_antialias(true or false) -> self

Description

Specify if the text is to be antialiased.

Arguments

Either true or false. The default is true.

Returns

self

Example

The character on the left is not antialiased. The character on the right is antialiased.

text_antialias example

See also

stroke_antialias

text_undercolor

draw.text_undercolor(string) -> self

Description

The color to draw underneath text. The default is transparent.

Arguments

A color name.

Returns

self

Example

text_undercolor example

translate

draw.translate(tx, ty) -> self

Description

Specify a translation operation on the coordinate space.

Arguments

tx, ty
The amount of translation in the x and y directions.

Returns

self

Example

gc.translate(125, 125)

translate example

See also

affine

annotate attributes

affine=

draw.affine = matrix

Description

The transformation matrix. The default is the null transformation.

Argument

An AffineMatrix.

align=

draw.align = alignment

Description

The text alignment. The default is LeftAlign.

Argument

A AlignType constant.

decorate=

draw.decorate = decoration

Description

The text decoration. The default is NoDecorationType.

Argument

A DecorationType constant.

density=

draw.density = string

Description

The text density in the x and y directions. The default is "72x72".

encoding=

draw.encoding = string

Description

The text encoding.

Argument

See the ImageMagick documentation for the -encoding option to the mogrify command.

fill=

draw.fill = string or pixel

Description

The fill color. The default is "black".

Argument

May be a color name or a Pixel object.

fill_pattern=

draw.fill_pattern = image

Description

Specify an image to use for the fill.

Argument

An image.

Example

fill_pattern and stroke_pattern example

font=

draw.font = string

Description

The font name. The default is "Helvetica". See font for more information about font names.

font_family=

draw.font_family = string

Description

The font family name. For example, "arial" or "helvetica".

font_stretch=

draw.font_stretch = stretch

Description

The font stretch.

Argument

A StretchType constant.

font_style=

draw.font_style = style

Description

The font style.

Argument

A StyleType constant.

font_weight=

draw.font_weight = weight

Description

The font weight.

Arguments

A WeightType constant or one of the numbers 100, 200, 300, 400, 500, 600, 700, 800, or 900.

gravity=

draw.gravity = gravity

Description

Specifies how to orient text with respect to the text's origin.

Arguments

A GravityType constant.

interline_spacing=

draw.interline_spacing = space

Description

Modifies the space between lines.

Arguments

A numeric value. May be positive or negative.

Notes

Available in ImageMagick 6.5.5-8.

interword_spacing=

draw.interword_spacing = space

Description

Modifies the space between two words.

Arguments

A numeric value. May be positive or negative.

Notes

Available in ImageMagick 6.4.8-0.

kerning=

draw.kerning = space

Description

Modifies the space between two letters.

Arguments

A numeric value. May be positive or negative.

Notes

Available in ImageMagick 6.4.7-8.

pointsize=

draw.pointsize = integer

Description

The font size in points. The default is 12.

rotation=

draw.rotation = number

Description

Apply rotation to text. The default is no rotation.

Arguments

The amount of rotation in degrees.

stroke=

draw.stroke = string or pixel

Description

The stroke color. This is the color used to outline the text. The default is "black".

Arguments

A color name or Pixel object.

stroke_pattern=

draw.stroke_pattern = image

Description

Specify an image to use for the stroke.

Argument

An image.

Example

See fill_pattern

stroke_width=

draw.stroke = integer

Description

The stroke width in pixels. The default is 1.

text_antialias=

draw.text_antialias = true or false

Description

Whether the text is antialiased or not. The default is true.

tile=

draw.tile = image

Description

Tile image when filling a graphic primitive.

Arguments

An image

undercolor=

draw.undercolor = string or pixel

Description

If set, causes the text to be drawn over a box of the specified color.

Arguments

A color name or a Pixel object.

 

rmagick-2.13.2/doc/rvgxform.html0000644000004100000410000001633712147515547016576 0ustar www-datawww-data RMagick 2.13.2: RVG Reference: Transforms

The transform methods

Table of Contents

About the transform methods

Transform methods

About the transform methods

The default coordinate system has its origin in the upper-left corner. The positive x-axis extends to the right. The positive y-axis extends downward. You can change this coordinate system by using one or more of the transform methods described on this page. This image shows the default coordinate system.

initial coordinates example

This image shows a drawing without transformations.

a drawing without transformations

The transform methods are defined in the RVG, RVG::Group, and RVG::Use classes. You can also chain these methods to the shape methods and to the image method.

Transform methods

matrix

obj.matrix(sx, rx, ry, sy, tx, ty) -> obj

Description

Replaces the current transformation matrix with a new matrix having the specified values. See the SVG standard for more information.

Arguments
sx, sy
The scale factor in the x-dimension and y-dimension, measured in user coordinates.
rx, ry
The amount of rotation about the x-axis and y-axis, measured in degrees.
tx, ty
The translation on the x-axis and the y-axis, measured in user coordinates.

rotate

obj.rotate(angle[, cx, cy]) -> obj

Description

Rotates the axes about the origin or, if cx and cy are present, about the specified point.

Arguments
angle
The amount of rotation. Positive angles rotate clockwise, negative angles rotate counter-clockwise.
cx, cy
If present, the point to rotate about.
Example

See scale.

scale

obj.scale(sx[, sy]) -> obj

Description

Scales the axes.

Arguments
sx
The amount of scaling on the x-axis.
sy
If present, the amount of scaling on the y-axis. Otherwise defaults to sx.
Example

rotate and scale example

skewX

obj.skewX(angle) -> obj

Description

Skews the x-axis.

Arguments
angle
The skew amount, measured in degrees.
Example

See skewY

skewY

obj.skewY(angle) -> obj

Description

Skews the y-axis.

Arguments
angle
The skew amount, measured in degrees.
Example

skewX and skewY example

translate

obj.translate(tx[, ty]) -> obj

Description

Moves the origin.

Arguments
tx
The location of the new origin on the x-axis.
ty
The location of the new origin on the y-axis. If omitted, defaults to tx.
Example

translate example

 

rmagick-2.13.2/doc/constants.html0000644000004100000410000012247612147515547016742 0ustar www-datawww-data RMagick 2.13.2: Constants

Constants

Constants

Miscellaneous constants

Long_version
An extended form of the Version constant with the format shown here:
This is RMagick 2.0.0 ($Date: 2009/09/05 20:10:15 $) Copyright (C) 2008 by Timothy P. Hunter
Built with ImageMagick 6.3.7 01/05/08 Q16 http://www.imagemagick.org
Built for ruby 1.8.6
Web page: http://rmagick.rubyforge.org
Email: rmagick@rubyforge.org
Magick_version
The ImageMagick version string. This has the form:
@(#)ImageMagick X.Y.Z MM/DD/YY Q:16 http://www.imagemagick.org
MANAGED_MEMORY
If true, RMagick is using Ruby managed memory for all allocations. If false, RMagick allocates memory for objects directly from the operating system. You can enable RMagick to use Ruby managed memory (when built with ImageMagick 6.4.0-11 and later) by setting

RMAGICK_ENABLE_MANAGED_MEMORY = true
before requiring RMagick.
QuantumRange
The maximum value of a Quantum. A quantum is one of the red, green, blue, or opacity elements of a pixel in the RGB colorspace, or cyan, yellow, magenta, or black elements in the CYMK colorspace.
MaxRGB (deprecated)
Same as QuantumRange.
QuantumDepth
The number of bits in a quantum. The relationship between QuantumDepth and QuantumRange is summarized in this table.
QuantumDepth QuantumRange
8 255
16 65535
32 4294967295
Version
The RMagick version string. This has the form:
RMagick 2.0.0

AlignType

Specify text alignment. See align=, text_align.

UndefinedAlign
No alignment specified. Equivalent to LeftAlign.
LeftAlign
Align the leftmost part of the text to the starting point.
CenterAlign
Center the text around the starting point.
RightAlign
Align the rightmost part of the text to the starting point.

ChannelType

Specify an image channel. A channel is a color component of a pixel. In the RGB colorspace the channels are red, green, and blue. There may also be an alpha (transparency/opacity) channel. In the CMYK colorspace the channels area cyan, magenta, yellow, and black. In the HSL colorspace the channels are hue, saturation, and lightness. In the Gray colorspace the only channel is gray. See Image#channel and Image::Info#channel=.

UndefinedChannel
RedChannel
GreenChannel
BlueChannel
CyanChannel
MagentaChannel
YellowChannel
BlackChannel
OpacityChannel
AllChannels
In the RGB colorspace, the red, blue, green, and alpha channels. In the CMYK colorspace, the cyan, magenta, yellow, and black channels.
GrayChannel
AlphaChannel
Same as OpacityChannel
DefaultChannels
Same as AllChannels, excluding OpacityChannel
HueChannel
LuminosityChannel
SaturationChannel

ClassType

Specify the image storage class. See class_type.

UndefinedClass
No storage class has been specified.
DirectClass
Image is composed of pixels which represent literal color values.
PseudoClass
Image is composed of pixels which specify an index in a color palette.

ColorspaceType

Specify the colorspace that quantization (color reduction and mapping) is done under or to specify the colorspace when encoding an output image. Colorspaces are ways of describing colors to fit the requirements of a particular application (e.g. Television, offset printing, color monitors).  Color reduction, by default, takes place in the RGBColorspace. Empirical evidence suggests that distances in color spaces such as YUVColorspace or YIQColorspace correspond to perceptual color differences more closely than do distances in RGB space. These color spaces may give better results when color reducing an image.

When encoding an output image, the colorspaces RGBColorspace, CMYKColorspace, and GRAYColorspace may be specified. The CMYKColorspace option is only applicable when writing TIFF, JPEG, and Adobe Photoshop bitmap (PSD) files. See colorspace.

Each version of ImageMagick defines a subset of the colorspaces listed below. To list the subset supported by your version, issue the command:

ruby -rRMagick -e"Magick::ColorspaceType.values {|cs| puts cs}"
UndefinedColorspace
No colorspace has been specified.
CMYColorspace
CMYKColorspace
Cyan-Magenta-Yellow-Black colorspace. CYMK is a subtractive color system used by printers and photographers for the rendering of colors with ink or emulsion, normally on a white surface.
GRAYColorspace
Full-range grayscale
HSBColorspace
HSLColorspace
Hue, saturation, luminosity
HWBColorspace
Hue, whiteness, blackness
LABColorspace
LogColorspace
OHTAColorspace
RGBColorspace
Red-Green-Blue colorspace
SRGBColorspace
Kodak PhotoCD sRGB. In ImageMagick, this constant is named sRGBColorspace, but since Ruby constants must start with an uppercase letter, I had to change it.
TransparentColorspace
The Transparent color space behaves uniquely in that it preserves the matte channel of the image if it exists.
XYZColorspace
CIE XYZ
YCbCrColorspace
YCCColorspace
Kodak PhotoCD PhotoYCC
YIQColorspace
YPbPrColorspace
YUVColorspace
Y-signal, U-signal, and V-signal colorspace. YUV is most widely used to encode color for use in television transmission.

The colorspaces in this group are typically associated with the DPX and Cineon image formats used in the motion picture industry.

Rec601LumaColorspace
Luma (Y) according to ITU-R 601
Rec601YCbCrColorspace
YCbCr according to ITU-R 601
Rec709LumaColorspace
Luma (Y) according to ITU-R 709
Rec709YCbCrColorspace
YCbCr according to ITU-R 709

ComplianceType

Specify the color standard from which color names are chosen. See to_color.

SVGCompliance
Adhere to SVG color standard.
X11Compliance
Adhere to X11 color standard.
XPMCompliance
Adhere to XPM color standard.
AllCompliance
The union of the 3 color standards.

CompositeOperator

Select the image composition algorithm used to compose a composite image with a image. By default, each of the composite image pixels are replaced by the corresponding image tile pixel. Specify CompositeOperator to select a different algorithm. See composite.

UndefinedCompositeOp
No composite operator has been specified.
AddCompositeOp
The result of composite image + image, with overflow wrapping around (mod 256).
AtopCompositeOp
The result is the same shape as image, with composite image obscuring image where the image shapes overlap. Note that this differs from OverCompositeOp because the portion of composite image outside of image's shape does not appear in the result.
BlurCompositeOp
?
BumpmapCompositeOp
The result image shaded by composite image.
ChangeMaskCompositeOp
Replace any destination pixel that is the similar to the source image's pixel (as defined by the current fuzz factor), with transparency.
ClearCompositeOp
Make the target image transparent. The composite image is ignored.
ColorBurnCompositeOp
Darkens the destination color to reflect the source color. Painting with white produces no change.
ColorDodgeCompositeOp
Brightens the destination color to reflect the source color. Painting with black produces no change.
ColorizeCompositeOp
Each pixel in the result image is the combination of the brightness of the target image and the saturation and hue of the composite image. This is the opposite of LuminizeCompositeOp.
CopyCompositeOp
Replace the target image with the composite image.
CopyBlackCompositeOp
Copy the black channel from the composite image to the target image.
CopyBlueCompositeOp
Copy the blue channel from the composite image to the target image.
CopyCyanCompositeOp
Copy the cyan channel from the composite image to the target image.
CopyGreenCompositeOp
Copy the green channel from the composite image to the target image.
CopyMagentaCompositeOp
Copy the magenta channel from the composite image to the target image.
CopyOpacityCompositeOp
If the composite image's matte attribute is true, copy the opacity channel from the composite image to the target image. Otherwise, set the target image pixel's opacity to the intensity of the corresponding pixel in the composite image.
CopyRedCompositeOp
Copy the red channel from the composite image to the target image.
CopyYellowCompositeOp
Copy the yellow channel from the composite image to the target image.
DarkenCompositeOp
Replace target image pixels with darker pixels from the composite image.
DifferenceCompositeOp
The result of abs(composite image - image). This is useful for comparing two very similar images.
DisplaceCompositeOp
Displace target image pixels as defined by a displacement map. The operator used by the displace method.
DissolveCompositeOp
The operator used in the dissolve method.
DistortCompositeOp
?
DivideCompositeOp
?
DstCompositeOp
The destination is left untouched.
DstAtopCompositeOp
The part of the destination lying inside of the source is composited over the source and replaces the destination.
DstInCompositeOp
The part of the destination lying inside of the source replaces the destination.
DstOutCompositeOp
The part of the destination lying outside of the source replaces the destination.
DstOverCompositeOp
The destination is composited over the source and the result replaces the destination.
ExclusionCompositeOp
Produces an effect similar to that of 'difference', but appears as lower contrast. Painting with white inverts the destination color. Painting with black produces no change.
HardLightCompositeOp
Multiplies or screens the colors, dependent on the source color value. If the source color is lighter than 0.5, the destination is lightened as if it were screened. If the source color is darker than 0.5, the destination is darkened, as if it were multiplied. The degree of lightening or darkening is proportional to the difference between the source color and 0.5. If it is equal to 0.5 the destination is unchanged. Painting with pure black or white produces black or white.
HueCompositeOp
Each pixel in the result image is the combination of the hue of the target image and the saturation and brightness of the composite image.
InCompositeOp
The result is simply composite image cut by the shape of image. None of the image data of image is included in the result.
LightenCompositeOp
Replace target image pixels with lighter pixels from the composite image.
LinearBurnCompositeOp
Same as LinearDodgeCompositeOp, but also subtract one from the result. Sort of a additive 'Screen' of the images.
LinearDodgeCompositeOp
This is equivelent to PlusCompositeOp in that the color channels are simply added, however it does not "plus" the alpha channel, but uses the normal OverCompositeOp alpha blending, which transparencies are involved. Produces a sort of additive multiply-like result.
LinearLightCompositeOp
Increase contrast slightly with an impact on the foreground's tonal values.
LuminizeCompositeOp
Each pixel in the result image is the combination of the brightness of the composite image and the saturation and hue of the target image. This is the opposite of ColorizeCompositeOp.
MinusCompositeOp
The result of composite image - image, with overflow cropped to zero. The matte chanel is ignored (set to 255, full coverage).
ModulateCompositeOp
Used by the watermark method.
MultiplyCompositeOp
Multiplies the color of each target image pixel by the color of the corresponding composite image pixel. The result color is always darker.
NoCompositeOp
No composite operator has been specified.
OutCompositeOp
The resulting image is composite image with the shape of image cut out.
OverCompositeOp
The result is the union of the the two image shapes with composite image obscuring image in the region of overlap. The matte channel of the composite image is respected, so that if the composite pixel is part or all transparent, the corresponding image pixel will show through.
OverlayCompositeOp
Multiplies or screens the colors, dependent on the destination color. Source colors overlay the destination whilst preserving its highlights and shadows. The destination color is not replaced, but is mixed with the source color to reflect the lightness or darkness of the destination.
PegtopLightCompositeOp
Almost equivalent to SoftLightCompositeOp, but using a continuious mathematical formula rather than two conditionally selected formulae.
PinLightCompositeOp
Similar to HardLightCompositeOp, but using sharp linear shadings, to similate the effects of a strong 'pinhole' light source.
PlusCompositeOp
The result is just the sum of the image data. Output values are cropped to 255 (no overflow). This operation is independent of the matte channels.
ReplaceCompositeOp
The resulting image is image replaced with composite image. Here the matte information is ignored.
SaturateCompositeOp
Each pixel in the result image is the combination of the saturation of the target image and the hue and brightness of the composite image.
ScreenCompositeOp
Multiplies the inverse of each image's color information.
SoftLightCompositeOp
Darkens or lightens the colors, dependent on the source color value. If the source color is lighter than 0.5, the destination is lightened. If the source color is darker than 0.5, the destination is darkened, as if it were burned in. The degree of darkening or lightening is proportional to the difference between the source color and 0.5. If it is equal to 0.5, the destination is unchanged. Painting with pure black or white produces a distinctly darker or lighter area, but does not result in pure black or white.
SrcAtopCompositeOp
The part of the source lying inside of the destination is composited onto the destination.
SrcCompositeOp
The source is copied to the destination. The destination is not used as input.
SrcInCompositeOp
he part of the source lying inside of the destination replaces the destination.
SrcOutCompositeOp
The part of the source lying outside of the destination replaces the destination.
SrcOverCompositeOp
The source is composited over the destination.
SubtractCompositeOp
The result of composite image - image, with underflow wrapping around (mod 256). The add and subtract operators can be used to perform reversable transformations.
ThresholdCompositeOp
?
VividLightCompositeOp
A modified LinearLightCompositeOp designed to preserve very stong primary and secondary colors in the image.
XorCompositeOp
The result is the image data from both composite image and image that is outside the overlap region. The overlap region will be blank.

CompressionType

Express the desired compression type when encoding an image. Be aware that most image types only support a sub-set of the available compression types. If the compression type specified is incompatible with the image, ImageMagick selects a compression type compatible with the image type. See compression.

UndefinedCompression
No compression type has been specified.
NoCompression
The default for most formats.
B44Compression
Available in ImageMagick 6.5.5-4 and later.
B44ACompression
Available in ImageMagick 6.5.5-4 and later.
BZipCompression
BZip (Burrows-Wheeler block-sorting text compression algorithm and Huffman coding) as used by bzip2 utilities
DXT1Compression
Available in ImageMagick 6.3.9-3 and later.
DXT3Compression
Available in ImageMagick 6.3.9-3 and later.
DXT5Compression
Available in ImageMagick 6.3.9-3 and later.
FaxCompression
CCITT Group 3 FAX compression
Group4Compression
CCITT Group 4 FAX compression (used only for TIFF)
JPEGCompression
JPEG compression. See The JPEG image compression FAQ.
JPEG2000Compression
JPEG2000 compression for compressed PDF images.
LosslessJPEGCompression
This compression format is almost never used.
LZWCompression
Lempel-Ziv-Welch (LZW) compression
PizCompression
Available in ImageMagick 6.5.5-4 and later.
Pxr24Compression
Available in ImageMagick 6.5.5-4 and later.
RLECompression
See the Wikipedia page for Run-length encoding.
ZipCompression
Lempel-Ziv compression (LZ77) as used in PKZIP and GNU gzip.
ZipSCompression
Available in ImageMagick 6.5.5-4 and later.

DecorationType

Use with the decorate= method in the Draw class to specify the text decoration for the annotate method.

NoDecoration
Don't decorate the text.
UnderlineDecoration
Underline the text.
OverlineDecoration
Overline the text.
LineThroughDecoration
Draw a horizontal line through the middle of the text.

DisposeType

The value of the dispose attribute.

UndefinedDispose
No disposal specified.
NoneDispose
Do not dispose between frames.
BackgroundDispose
Overwrite the image area with the background color.
PreviousDispose
Overwrite the image area with what was there prior to rendering the image.

DitherMethod

Specify the method of dithering for remap, quantize, posterize, etc.

NoDitherMethod
RiemersmaDitherMethod
FloydSteinbergDitherMethod

EndianType

The value of the endian attribute.

UndefinedEndian
LSBEndian
MSBEndian

FilterTypes

Used to adjust the filter algorithm used when resizing images. Different filters experience varying degrees of success with various images and can take significantly different amounts of processing time. ImageMagick uses the LanczosFilter by default since this filter has been shown to provide the best results for most images in a reasonable amount of time. Other filter types (e.g. TriangleFilter) may execute much faster but may show artifacts when the image is re-sized or around diagonal lines. The only way to be sure is to test the filter with sample images. See resize.

UndefinedFilter
Bartlett
BesselFilter
BlackmanFilter
Bohman
BoxFilter
CatromFilter
CubicFilter
GaussianFilter
HammingFilter
HanningFilter
HermiteFilter
KaiserFilter
LagrangianFilter
LanczosFilter
MitchellFilter
ParzenFilter
PointFilter
QuadraticFilter
SincFilter
TriangleFilter
WelshFilter

GravityType

Specify positioning of an object (e.g. text, image) within a bounding region (e.g. an image). Gravity provides a convenient way to locate objects irrespective of the size of the bounding region, in other words, you don't need to provide absolute coordinates in order to position an object. A common default for gravity is NorthWestGravity. See annotate and composite.

ForgetGravity
Don't use gravity.
NorthWestGravity
Position object at top-left of region
NorthGravity
Position object at top-center of region
NorthEastGravity
Position object at top-right of region
WestGravity
Position object at left-center of region
CenterGravity
Position object at center of region
EastGravity
Position object at right-center of region
SouthWestGravity
Position object at left-bottom of region
SouthGravity
Position object at bottom-center of region
SouthEastGravity
Position object at bottom-right of region

ImageType

Indicate the type classification of the image. See image_type and image_type=.

UndefinedType
No type has been specified.
BilevelType
Monochrome image
GrayscaleType
Grayscale image
PaletteType
Indexed color (palette) image
PaletteMatteType
Indexed color (palette) image with opacity
TrueColorType
Truecolor image
TrueColorMatteType
Truecolor image with opacity
ColorSeparationType
Cyan/Yellow/Magenta/Black (CYMK) image
ColorSeparationMatteType
OptimizeType
PaletteBilevelMatteType

InterlaceType

Specify the ordering of the red, green, and blue pixel information in the image. Interlacing is usually used to make image information available to the user faster by taking advantage of the space vs time tradeoff. For example, interlacing allows images on the Web to be recognizable sooner and satellite images to accumulate/render with image resolution increasing over time. Use LineInterlace or PlaneInterlace to create an interlaced GIF or progressive JPEG image. See interlace.

UndefinedInterlace
No interlace type has been specified.
NoInterlace
Don't interlace image (RGBRGBRGBRGBRGBRGB...)
LineInterlace
Use scanline interlacing (RRR...GGG...BBB...RRR...GGG...BBB...)
PlaneInterlace
Use plane interlacing (RRRRRR...GGGGGG...BBBBBB...)
PartitionInterlace
Similar to plane interlacing except that the different planes are saved to individual files (e.g. image.R, image.G, and image.B)
GIFInterlace
JPEGInterlace
PNGInterlace
See the ImageMagick documentation for the -interlace option.

InterpolatePixelMethod

The pixel color interpolation method. See pixel_interpolation_method.

AverageInterpolatePixel
BicubicInterpolatePixel
BilinearInterpolatePixel
FilterInterpolatePixel
IntegerInterpolatePixel
MeshInterpolatePixel
NearestNeighborInterpolatePixel
SplineInterpolatePixel

For FilterInterpolatePixel, specify the filter with the filter attribute. Specify the sharpness with the blur attribute.

MetricType

The distortion metric type. See compare_channel, distortion_channel.

MeanAbsoluteErrorMetric
MeanSquaredErrorMetric
PeakAbsoluteErrorMetric
PeakSignalToNoiseRatioMetric
RootMeanSquaredErrorMetric

NoiseType

Select the type of noise to be added to the image. See add_noise.

UniformNoise
GaussianNoise
MultiplicativeGaussianNoise
ImpulseNoise
LaplacianNoise
PoissonNoise
RandomNoise

Opacity

represent the maximum and minimum levels of opacity. You can specify a partial level of opacity by choosing a number between OpaqueOpacity and TransparentOpacity. For example, 25% opacity is abs(Magick::TransparentOpacity-Magick::OpaqueOpacity) * 0.25

TransparentOpacity
The minimum amount of opacity.
OpaqueOpacity
The maximum amount of opacity.

OrientationType

Specify the orientation of the image pixels. See Image#orientation and Info#orientation. See http://jpegclub.org/exif_orientation.html for an explanation of these values.

UndefinedOrientation
TopLeftOrientation
TopRightOrientation
BottomRightOrientation
BottomLeftOrientation
LeftTopOrientation
RightTopOrientation
RightBottomOrientation
LeftBottomOrientation

PaintMethod

Specify how pixel colors are to be replaced in the image. See matte_floodfill and texture_floodfill.

PointMethod
Replace pixel color at point.
ReplaceMethod
Replace color for all image pixels matching color at point.
FloodfillMethod
Replace color for pixels surrounding point until encountering pixel that fails to match color at point.
FillToBorderMethod
Replace color for pixels surrounding point until encountering pixels matching border color.
ResetMethod
Replace colors for all pixels in image with fill color.

RenderingIntent

Rendering intent is a concept defined by ICC Spec ICC.1:1998-09, "File Format for Color Profiles". ImageMagick uses RenderingIntent in order to support ICC Color Profiles.

From the specification: "Rendering intent specifies the style of reproduction to be used during the evaluation of this profile in a sequence of profiles. It applies specifically to that profile in the sequence and not to the entire sequence. Typically, the user or application will set the rendering intent dynamically at runtime or embedding time."

See rendering_intent.

UndefinedIntent
No intent has been specified.
SaturationIntent
A rendering intent that specifies the saturation of the pixels in the image is preserved perhaps at the expense of accuracy in hue and lightness.
PerceptualIntent
A rendering intent that specifies the full gamut of the image is compressed or expanded to fill the gamut of the destination device. Gray balance is preserved but colorimetric accuracy might not be preserved.
AbsoluteIntent
Absolute colorimetric
RelativeIntent
Relative colorimetric

ResolutionType

By default, ImageMagick defines resolutions in pixels per inch. ResolutionType provides a means to adjust this. See units.

UndefinedResolution
No resolution has been specified.
PixelsPerInchResolution
Density specifications are specified in units of pixels per inch (English units).
PixelsPerCentimeterResolution
Density specifications are specified in units of pixels per centimeter (metric units).

StretchType

See font_stretch=.

NormalStretch
UltraCondensedStretch
ExtraCondensedStretch
CondensedStretch
SemiCondensedStretch
SemiExpandedStretch
ExpandedStretch
ExtraExpandedStretch
UltraExpandedStretch
AnyStretch

StorageType

See import_pixels and export_pixels_to_str.

CharPixel
corresponds to a C unsigned char, range 0-255.
ShortPixel
corresponds to a C unsigned short, range 0-65535.
IntegerPixel
corresponds to a C unsigned int, range 0-4294967295.
LongPixel
corresponds to a C unsigned long, range 0-4294967295 (for 32-bit longs).
FloatPixel
corresponds to a C float, range 0.0-1.0.
DoublePixel
corresponds to a C double, range 0.0-1.0.
QuantumPixel
corresponds to the Quantum type used by ImageMagick, range 0-QuantumRange.

StyleType

See font_style=.

NormalStyle
ItalicStyle
ObliqueStyle
AnyStyle

WeightType

The font weight can be specified as one of 100, 200, 300, 400, 500, 600, 700, 800, or 900, or one of the following constants. See font_weight=.

AnyWeight
No weight specified.
NormalWeight
Equivalent to 400
BoldWeight
Equivalent to 700
BolderWeight
Increases weight by 100
LighterWeight
Decreases weight by 100

rmagick-2.13.2/doc/rvgimage.html0000644000004100000410000001665012147515547016523 0ustar www-datawww-data RMagick 2.13.2: RVG Reference: RVG::Image Class

class RVG::Image < Object

Table of Contents

class methods

attributes

instance methods

shared methods

In addition to the methods listed above, class RVG::Image also implements the styles method and the transform methods.

class methods

new

RVG::Image.new(raster_image, width=nil, height=nil, x=0, y=0) -> image

Description

Constructs a raster image object. The viewbox is defined by the image bounds. This method is usually called indirectly via the image method in the RVG, RVG::Group, or RVG::Pattern classes.

Arguments

raster_image
A Magick::Image object.
width, height
The width and height of the rectangle in which the image is placed.
x, y
The x- and y-axis location of the rectangle in which the image is placed.

Example

See preserve_aspect_ratio

attributes

desc, desc=

img.desc -> string
img.desc = string

Description

Use the desc attribute to assign a text description to the image.

metadata, metadata=

img.metadata -> string
img.metadata = string

Description

Use the metadata attribute to assign additional metadata to the image.

title, title=

img.title -> string
img.title = string

Description

Use the title attribute to assign a title to the image.

instance methods

preserve_aspect_ratio

img.preserve_aspect_ratio(align, meet_or_slice='meet') -> self

Description

Use preserve_aspect_ratio to specify whether or not the image is stretched to fit the rectangle in which it is placed. If not, you can specify how to fit the image into the space.

Arguments

align
When the value of the meet_or_slice argument is 'meet' or 'slice', this argument controls the placement of the image within the viewport. The align argument is the concatenation of an x-alignment and a y-alignment. The values are shown in these lists:
x-alignment
xMin
align the minimum x value of the image with the left corner of the viewport.
xMid
vertically center the image within the viewport.
xMax
align the maximum x value of the image with the right corner of the viewport.
y-alignment
YMin
align the minimum y value of the image with the top of the viewport.
YMid
horizontally center the image within the viewport.
YMax
align the maximum y value of the image with the bottom of the viewport
meet_or_slice
This argument can have one of these three values:
'none'
The image is scaled as necessary so that it fits exactly within the viewport. The aspect ratio is not maintained.
'meet'
The image is scaled as necessary so that the larger dimension exactly fits the viewport. There may be some unused space in the viewport. The aspect ratio is maintained.
'slice'
The image is scaled as necessary so that the smaller dimension exactly fits the viewport. Some of the image in the larger dimension may be cut off. The aspect ratio is maintained.

Example

preserve_aspect_ratio example

Returns

self

See Also

RVG#preserve_aspect_ratio

 

rmagick-2.13.2/doc/rvgtut.html0000644000004100000410000005164212147515547016255 0ustar www-datawww-data RMagick 2.13.2: RVG Tutorial

Drawing with RVG

A tutorial

duck|type

Introduction

RVG (Ruby Vector Graphics) is a facade for RMagick's Draw class that supplies a drawing API based on the Scalable Vector Graphics W3C recommendation.

RVG is a scalable vector drawing library. Scalable means that drawings are not fixed to a single size in pixels. The same drawing can be rendered for a screen display or for printing. Vector images are drawn using geometric objects like lines and circles. Unlike raster images, vector images don't get "pixelated" when you make them bigger.

As an introduction to the RVG library, let's see how to draw this little duck on the left. Here is the complete program.
 1  require 'rvg/rvg'
 2  include Magick
 3
 4  RVG::dpi = 72
 5
 6  rvg = RVG.new(2.5.in, 2.5.in).viewbox(0,0,250,250) do |canvas|
 7      canvas.background_fill = 'white'
 8
 9      canvas.g.translate(100, 150).rotate(-30) do |body|
10          body.styles(:fill=>'yellow', :stroke=>'black', :stroke_width=>2)
11          body.ellipse(50, 30)
12          body.rect(45, 20, -20, -10).skewX(-35)
13      end
14
15      canvas.g.translate(130, 83) do |head|
16          head.styles(:stroke=>'black', :stroke_width=>2)
17          head.circle(30).styles(:fill=>'yellow')
18          head.circle(5, 10, -5).styles(:fill=>'black')
19          head.polygon(30,0, 70,5, 30,10, 62,25, 23,20).styles(:fill=>'orange')
20      end
21
22      foot = RVG::Group.new do |_foot|
23          _foot.path('m0,0 v30 l30,10 l5,-10, l-5,-10 l-30,10z').
24                styles(:stroke_width=>2, :fill=>'orange', :stroke=>'black')
25      end
26      canvas.use(foot).translate(75, 188).rotate(15)
27      canvas.use(foot).translate(100, 185).rotate(-15)
28
29      canvas.text(125, 30) do |title|
30          title.tspan("duck|").styles(:text_anchor=>'end', :font_size=>20,
31                         :font_family=>'helvetica', :fill=>'black')
32          title.tspan("type").styles(:font_size=>22,
33                 :font_family=>'times', :font_style=>'italic', :fill=>'red')
34      end
35      canvas.rect(249,249).styles(:stroke=>'blue', :fill=>'none')
36  end
37
38  rvg.draw.write('duck.gif')

Summary

All drawings follow the same 3 steps:

  1. Create an RVG object. Specify the width and height of the final image. The RVG.new method yields to a block.
  2. Within the block, call methods on the RVG object to specify a background, add shapes, text, or raster images, or add groups of shapes, text, or raster images.
  3. Call the draw method to draw the shapes, text, or raster images onto the background.

I'll step through the example line-by-line.

Lines 1-3

 1   require 'rvg/rvg'
 2   include Magick

These are just the usual Ruby code to load the RVG extension. To save some typing, I've included the Magick module into Object's namespace.

Lines 4-6

 4   RVG::dpi = 72
 5
 6   rvg = RVG.new(2.5.in, 2.5.in).viewbox(0,0,250,250) do |canvas|

RVG::dpi enables the use of unit methods in RVG. When you set RVG::dpi to a non-nil value, RVG adds a number of conversion methods to the Fixnum and Float classes . These methods allow you to specify measurements in units such as inches, millimeters, and centimeters. DPI stands for "dots per inch," the image resolution. Here I set RVG::dpi to 72, a common value for displays.

The RVG.new method accepts 2 parameters. These parameters specify the width and height of the final image in pixels. Since I've defined RVG::dpi, I can specify these values in inches using the in conversion method. At 72dpi, the final image will be 2.5*72=180 pixels on a side.

By default, RVG uses pixels as its unit of measurement, but since I'm drawing a scalable picture I don't want to confine myself to pixels. The viewbox method defines a coordinate system with a logical unit. Viewbox takes 4 parameters, min_x, min_y, width, and height. On line 6 I define my coordinate system to have its origin at (0,0) and a width and height of 250 units. By using my own coordinate system, I can later change the size of the image to 5 inches square or 1 inch square just by changing the arguments to new.

default coordinate system

The default coordinate system

By default, the RVG coordinate system has its origin in the upper-left corner. The x-axis proceeds to the right. The y-axis proceeds downwards. The image on the left shows the axes of this coordinate system. I've added a light-blue "graph-paper" background to the example images to help associate the coordinate arguments to the actual locations in the image. Just remember that the axes and graph-paper background are not actually part of the image I'm producing.

The RVG class is one of the container classes defined by RVG. Container objects can contain graphic objects such as circles and lines, text, raster images, and other container objects. The outermost container is always an RVG object. I will add all the graphic objects that form the duck to this container.

Container constructors normally yield to a block. However, here I've chained viewbox to new, so viewbox takes responsibility for yielding and passes the new instance of RVG to the canvas argument.

Line 7

 7       canvas.background_fill = 'white'

By default, RVG graphics are drawn on a transparent background. This is convenient when you want to display your image over another image. You can override the default background color by assigning a color to the background_fill= attribute. Here I set the background color to "white."

Lines 9-13

 9      canvas.g.translate(100, 150).rotate(-30) do |body|
10          body.styles(:fill=>'yellow', :stroke=>'black', :stroke_width=>2)
11          body.ellipse(50, 30)
12          body.rect(45, 20, -20, -10).skewX(-35)
13      end

There's a lot going on in these few lines - seven method calls - so let's take it one method at a time.

Groups

Group is the second container class in RVG. The purpose of a group is to associate a set of coordinate system transformations and a set of styles with the graphic objects within the group. To create a Group object within another container, call the g method on the container. The g method yields if a block is present. In this example, there is no block associated with g, so g returns the new group. The g method adds the group to the content of its container. In this example, the group's container is the canvas object created in line 6. The graphic objects in the group are drawn as part of drawing the container. The translate and rotate chained to g modify the group by adding coordinate system transforms.

(Okay, there is a block, but there are 2 method calls between g and the block. I'll explain more later.)

Transforms

I'm going to use this group to contain the ellipse that forms the duck's body and the rectangle that forms the wing. I could just specify x- and y-coordinates to position these shapes relative to the origin, but it's easier to move the origin to where I want to draw the shapes. This is the purpose of the translate method. This method moves the origin to the (x,y) position specified by its arguments. I call translate on the group object, and since the content of the group gets the coordinate system transformations specified for the group, the ellipse and the rectangle will be drawn on a coordinate system with the origin at (100, 150) relative to the old coordinate system.

Also, I want the duck's body to slant upward, so I use the rotate method to rotate the axes. The argument to rotate is the number of degrees of rotation. A negative number indicates counter-clockwise rotation.

After translating and rotating the coordinate system, the axes look like this:

duck body

The transform methods

There are six transform methods. In addition to translate and rotate, there's scale, skewX, skewY, and matrix. When groups are nested, any transforms defined on the inner group(s) are added to the outer transforms.

Styles

Recall that the styles method modifies the default group styles. The styles method takes a hash as an argument. The hash keys are style names, and the hash values are, well, style values. In this example there are three style names. The :fill style sets the fill color to 'yellow'. The :stroke style sets the outline color to 'black'. The :stroke_width style sets the width of the outline to 2. I want the styles to apply to all objects within the group so in line 10 I call styles on the new group object.

The styles method is a real workhorse. It's defined in almost every class in RVG and there are many other style names in addition to these three..

Basic shapes

The group contains two basic shapes, an ellipse and a rectangle. I add the ellipse to the group with the ellipse method. Ellipse has four parameters. The first two, the radius on the x-axis and the radius on the y-axis, are required. The last two are the (x,y) coordinate of the center. When these are omitted, as here, they default to (0,0). I add the rectangle with the rect method, which also has four parameters. The first two are the width and height of the rectangle. The last two are the (x,y) coordinate of the upper-left corner. Both of these methods return self, so you can chain other methods to them.

Here's what the group looks like when rendered. The ellipse is centered on the origin. The upper-left corner of the rectangle is slightly up and to the left of the origin.

default coordinate system

The shape methods

There are 7 shape methods. In addition to ellipse and rect, there's circle, line, path, polygon, and polyline. You can also think of text as a shape. Shapes are stroked and filled, and can be modified by the transform methods and the styles method.

SkewX

Everybody knows that a wing doesn't look like a rectangle! A wing looks like a slanted parallelogram. (Well, it does in this example!) Fortunately, I can use the transform methods on shapes as well as containers. The skewX method makes it easy for us to give the rectangle a slant. The skewX method is another transform. It takes a single argument, the number of degrees to skew the x-axis. Since all the shape constructors, including rect, return self, I can chain skewX directly to rect and limit the effect of the transform to just the rectangle. The result looks like this. (I've drawn in the axes for the wing coordinate system.)

duck wing

That's it for the body. Let's tie up one loose end before moving on. I said earlier that container constructors (such as g) yield to a block if present. In this case, though, the translate and rotate methods intervene between g and the block. All the transform methods yield when there is an associated block, so I can easily chain them to a container constructor and still use a block argument to define the graphic objects in the group. Method chaining is a common RVG idiom. You'll see it a lot in the examples.

The next group draws the head.

Lines 15-20

15      canvas.g.translate(130, 83) do |head|
16          head.styles(:stroke=>'black', :stroke_width=>2)
17          head.circle(30).styles(:fill=>'yellow')
18          head.circle(5, 10, -5).styles(:fill=>'black')
19          head.polygon(30,0, 70,5, 30,10, 62,25, 23,20).styles(:fill=>'orange')
20      end

This section is very similar to the previous one. I'm defining a group to contain the graphic objects that draw the duck's head, eye, and beak. First I use the translate method to move the origin to (130,83):

duck head

In line 16 I define the stroke and stroke_width styles on the group. Styles defined on the group propagate to shapes within the group unless you override them. To do that, call styles on the shapes. In this group each shape has its own fill color. The yellow circle forms the head. The circle method takes 3 parameters. The first parameter is the radius of the circle. The other two parameters are the (x,y) coordinate of the center. If omitted, as here, they default to (0,0). I use a small black circle for the eye.

Last, I use the polygon method to draw the beak. This method draws a polygon from a series of (x,y) coordinates. If the last coordinate is not the same as the first, polygon implicitly adds it to close the polygon. Again, I use styles to set the fill color to orange.

duck head final

Lines 22-25

22      foot = RVG::Group.new do |_foot|
23          _foot.path('m0,0 v30 l30,10 l5,-10, l-5,-10 l-30,10z').
24                styles(:stroke_width=>2, :fill=>'orange', :stroke=>'black')
25      end

Here I create a group by directly calling new instead of calling the g method on a container. This creates a group object that is not contained within the canvas. You might think of the foot as not being attached to anything, like this:

duck foot

Lines 26-27

26       canvas.use(foot).translate(75, 188).rotate(15)
27       canvas.use(foot).translate(100, 185).rotate(-15)

To add the group to the canvas I use the use method. The use method can accept any container or graphic object as an argument. Optionally you can specify an (x,y) coordinate that specifies where to position the objects. In this example, however, I let those arguments default to (0,0) and use translate to position the feet. Here's how the left foot attaches to the duck:

duck foot 2

Of course, the duck is walking, so I have to give the foot a little slant with rotate:

duck foot 3

Attaching the right foot is easy. Call use again but give different arguments to translate and rotate:

final duck foot

Lines 29-34

29      canvas.text(125, 30) do |title|
30          title.tspan("duck|").styles(:text_anchor=>'end', :font_size=>20,
31                         :font_family=>'helvetica', :fill=>'black')
32          title.tspan("type").styles(:font_size=>22,
33                 :font_family=>'times', :font_style=>'italic', :fill=>'red')
34      end

All I need now is a title for the picture. Text in RVG is a job for the text method. Like the shape methods, text can be used with any container object. Text itself is a container, except that it can only contain text-related objects. The text method takes 2 or 3 arguments, an (x,y) pair and optionally a string. The (x,y) pair define a current text position at which rendering starts. If there is a string argument, it will be rendered starting at the current text position. Rendering text changes the current text position to the end of the text.

In the example, text is used as a container. Text objects can contain Tspan objects. Each tspan can specify its own styles. By default each tspan is rendered starting at the current text position.

As usual, I can change the appearance of the text with styles. Here I choose a font, a font style (the default is "normal"), its size in points, and the color.

duck title

Line 35

35       canvas.rect(249,249).styles(:stroke=>'blue', :fill=>'none')

I'm almost done. All I need to do it add a blue border. (I'm going to remove the graph paper background because we don't need it any more.)

duck with border

Line 38

38   rvg.draw.write('duck.gif')

The draw method call doesn't occupy a lot of space - just 4 letters - but does a lot of work. The draw method goes through all the graphics objects that I've added to the outermost RVG container and draws them on the background. When the drawing is complete, draw returns the drawing in the form of an RMagick Image object. You can use any Image class methods on the drawing. Here I simply write the image to a GIF file.

Scalable graphics

Are RVG images really scalable? Let's try. Change the RVG.new call to make an image that's 4 times as big. That's 5 inches on a side:

 6   rvg = RVG.new(5.in, 5.in).viewbox(0,0,250,250) do |canvas|

Change nothing else. Run the program again and see what you get.

big duck

 

rmagick-2.13.2/doc/image3.html0000644000004100000410000040050312147515547016061 0ustar www-datawww-data RMagick 2.13.2: class Image (instance methods p-w)

class Image < Object (instance methods p-w)
mixes in Comparable

instance methods

palette?

img.palette? -> true or false

Description

Returns true if the image is PseudoClass and has 256 unique colors or less.

Returns

true or false

Magick API

IsPaletteImage

paint_transparent

img.paint_transparent(color, opacity=TransparentOpacity, invert=false, fuzz=img.fuzz) -> image

Description

Changes the opacity value of all the pixels that match color to the value specified by opacity. If invert is true, changes the pixels that don't match color.

Arguments

color
Either a color name or a pixel.
opacity
The new opacity value, either an opacity value or a number between 0 and QuantumRange. The default is TransparentOpacity.
invert
If true, changes all the pixels that are not the target color.
fuzz
By default the pixel must match exactly, but you can specify a tolerance level by passing a positive value.

Returns

A new image

See also

matte_replace, Draw#matte, transparent

Magick API

TransparentPaintImage

pixel_color

img.pixel_color(x, y[, new_color]) -> pixel

Description

Returns the color of the pixel at x, y. Optionally, changes the color of the pixel to a new color.

If new_color is specified, pixel_color changes the image type to DirectClass if necessary.

Arguments

x, y
The x- and y-coordinates of the pixel.
new_color
If specified, the pixel is set to this color. May be either a color name or a Pixel.

Returns

A Pixel having the RGB values of the specified pixel.

Example

old = image.pixel_color(20,40,"white")

Magick API

AcquireImagePixels

polaroid

img.polaroid(angle=-5.0) [ { optional arguments } ] -> image

Description

Produce an image that looks like a Polaroid® instant picture. If the image has a "Caption" property, the value is used as a caption.

Optional arguments may be specified in a block associated with the method. These arguments control the shadow color and how the label is rendered. By default the shadow color is gray75. To specify a different shadow color, use self.shadow_color. To specify a different border color (that is, the color of the image border) use self.border_color. Both of these methods accept either a color name or a Pixel argument.

The following annotate attributes control the label rendering: align, decorate, density, encoding, fill, font, font_family, font_stretch, font_style, font_weight, gravity, pointsize, stroke, stroke_width, text_antialias, undercolor.

img.polaroid do
   self.shadow_color = "gray40"
   self.pointsize = 12
end

Arguments

angle
The resulting image is rotated by this amount, measured in degrees. The default is -5.0.

Example

polaroid example

Magick API

PolaroidImage

See also

The Polaroid Effect

Notes

"Polaroid" and the other names of products of Polaroid Corporation are trademarks of Polaroid Corporation.

posterize

img.posterize(levels=4, dither=false) -> image

Description

Reduces the image to a limited number of colors for a "poster" effect.

Arguments

levels
Number of color levels allowed in each channel. Very low values (2, 3, or 4) have the most visible effect. The default is 4.
dither
If true, dither the image. The default is false.

Returns

A new image

Example

posterize example

See also

ordered_dither, quantize

Magick API

PosterizeImage

preview

img.preview(preview) -> image

Description

Creates an image that contains 9 small versions of the receiver image. The center image is the unchanged receiver. The other 8 images are variations created by transforming the receiver according to the specified preview type with varying parameters.

A preview image is an easy way to "try out" a transformation method.

Arguments

One of the following PreviewType constants:

  • RotatePreview
  • ShearPreview
  • RollPreview
  • HuePreview
  • SaturationPreview
  • BrightnessPreview
  • GammaPreview
  • SpiffPreview
  • DullPreview
  • GrayscalePreview
  • QuantizePreview
  • DespecklePreview
  • ReduceNoisePreview
  • AddNoisePreview
  • SharpenPreview
  • BlurPreview
  • ThresholdPreview
  • EdgeDetectPreview
  • SpreadPreview
  • SolarizePreview
  • ShadePreview
  • RaisePreview
  • SegmentPreview
  • SwirlPreview
  • ImplodePreview
  • WavePreview
  • OilPaintPreview
  • CharcoalDrawingPreview
  • JPEGPreview

Returns

A new image

Example

This half-size preview demonstrates the SolarizePreview argument.

preview example

Magick API

PreviewImage

profile!

img.profile!(name, profile) -> self

Description

Adds or removes a ICM, IPTC, or generic profile from an image. If profile is nil, the specified profile is removed from the image. Use profile('*', nil) to remove all profiles from the image.

Arguments

name
The profile name, or "*" to represent all the profiles in the image.
profile
The profile value, or nil to cause the profile to be removed.

Returns

self

See also

add_profile and delete_profile perform very similar functions. However, add_profile accepts the name of a profile file on disk instead of the profile data itself and, if the file contains more than one profile, will load all the profiles at once.

Magick API

ProfileImage

Notes

ImageMagick does not automatically remove profiles when resizing images. If you are trying to make your JPEG thumbnail images as small as possible, use profile! to remove any profiles from the image as well. Also see strip!

properties

img.properties [ {|name,value| block} ] -> hash

Description

If called with an associated block, properties runs the block once for each property defined for the image. The block arguments are the property name and its value. If there is no block, properties returns a hash with one element for each property. The hash key is the property name and the associated value is the property value.

Returns

If called without a block, returns a hash, otherwise returns self.

See also

[ ], [ ]=

Note

The EXIF property is not created until the first time an EXIF tag or entry number is referenced.

quantize

img.quantize(number_colors=256, colorspace=RGBColorspace, dither=RiemersmaDitherMethod, tree_depth=0, measure_error=false) -> image

Description

Analyzes the colors within a reference image and chooses a fixed number of colors to represent the image. The goal of the algorithm is to minimize the difference between the input and output image while minimizing the processing time.

Arguments

number_colors
The maximum number of colors in the result image. Must be <= QuantumRange.
colorspace
The colorspace to quantize in. Color reduction, by default, takes place in the RGB color space.  Empirical evidence suggests that distances in color spaces such as YUV or YIQ  correspond  to  perceptual  color differences more closely than  do distances in RGB space. The Transparent color space behaves uniquely in that it preserves the matte channel of the image if it exists.
dither
A DitherMethod value. Set to NoDitherMethod to disable dithering. See the documentation for the ImageMagick -dither option for more information.
tree_depth
The tree depth to use while quantizing. The values 0 and 1 support automatic tree depth determination. The tree depth may be forced via values ranging from 2 to 8. The ideal tree depth depends on the characteristics of the input image, and may be determined through experimentation. See the documentation for the ImageMagick -treedepth option for more information.
measure_error
Set to true to calculate quantization errors when quantizing the image.

Returns

A new image

Example

See the example for colorize.

See also

ordered_dither, posterize, ImageList#quantize

Magick API

QuantizeImage

quantum_operator

img.quantum_operator(operator, rvalue, channel=AllChannels) -> self

Description

Performs the requested integer arithmetic operation on the selected channel of the image. This method allows simple arithmetic operations on the component values of all pixels in an image. Of course, you could also do this in Ruby using get_pixels and store_pixels, or view, but quantum_operator will be faster, especially for large numbers of pixels, since it does not need to convert the pixels from C to Ruby.

Arguments

operator
One of the following QuantumExpressionOperator constants:
  • AddQuantumOperator
  • AndQuantumOperator
  • DivideQuantumOperator
  • LShiftQuantumOperator
  • MaxQuantumOperator
  • MinQuantumOperator
  • MultiplyQuantumOperator
  • OrQuantumOperator
  • RShiftQuantumOperator
  • SubtractQuantumOperator
  • XorQuantumOperator
  • PowQuantumOperator
  • LogQuantumOperator
  • ThresholdQuantumOperator
  • ThresholdBlackQuantumOperator
  • ThresholdWhiteQuantumOperator
  • GaussianNoiseQuantumOperator
  • ImpulseNoiseQuantumOperator
  • LaplacianNoiseQuantumOperator
  • MultiplicativeNoiseQuantumOperator
  • PoissonNoiseQuantumOperator
  • UniformNoiseQuantumOperator
  • CosineQuantumOperator
  • SineQuantumOperator
  • AddModulusQuantumOperator
Some of these constants are not defined in older releases of ImageMagick. To see which ones are defined, enter this statement in IRB:
Magick::QuantumExpressionOperator.values {|v| puts v}
rvalue
a Numeric operation rvalue.
channel
A ChannelType value. The default is to operate on the R, G. and B channels.

Returns

self

Example

Divide the red component of all the pixels in the image by 2:

img.quantum_operator(DivideQuantumOperator, 2, RedChannel)

See also

function_channel

The Image:View class supports operations on individual pixels and collections of pixels, as well as operations on channels within pixels. See view, below.

Magick API

EvaluateImageChannel

radial_blur

img.radial_blur(float) -> image

Description

Applies a radial blur to the image.

Arguments

angle
Amount of blur, in degrees

Returns

A new image

Example

radial_blur example

See also

blur_image, gaussian_blur, motion_blur, radial_blur_channel, selective_blur_channel

Magick API

RadialBlurImage

radial_blur_channel

img.radial_blur_channel(float [, channel...]) -> image

Description

Applies a radial blur to the selected image channels.

Arguments

angle
Amount of blur, in degrees
channel...
0 or more ChannelType arguments. If no channels are specified, all the channels are blurred.

Returns

A new image

See also

radial_blur

Magick API

RadialBlurImageChannel

raise

img.raise(width=6, height=6, raised=true) -> image

Description

Creates a simulated three-dimensional button-like effect by lightening and darkening the edges of the image.

Arguments

width
The width of the raised edge in pixels. The default is 6.
height
The height of the raised edge in pixels. The default is 6.
raised
If true, the image is raised, otherwise lowered.

Returns

A new image

Example

raise example

Magick API

RaiseImage

random_threshold_channel

img.random_threshold_channel( thresholds, [channel...] ) -> image

Description

Changes the value of individual pixels based on the intensity of each pixel compared to a random threshold. The result is a low-contrast, two color image.

Arguments

thresholds
A geometry string containing LOWxHIGH thresholds. The string is in the form `XxY'. The Y value may be omitted, in which case it is assigned the value QuantumRange-X. If an % appears in the string then the values are assumed to be percentages of QuantumRange. If the string contains 2x2, 3x3, or 4x4, then an ordered dither of order 2, 3, or 4 will be performed instead. A Geometry object may be used as well.
channel...
0 or more ChannelType arguments. If no channels are specified, all the channels are thresholded.

Returns

A new image

Example

geom = Geometry.new(QuantumRange/2)
random_threshold_channel(geom, RedChannel)

random_threshold_channel example

See also

adaptive_threshold, bilevel_channel, threshold

Magick API

RandomThresholdImageChannel

recolor

img.recolor(color_matrix) -> image

Description

Use this method to translate, scale, shear, or rotate image colors. Although you can use variable sized matrices, typically you use a 5×5 for an RGBA image and a 6×6 for CMYKA. Populate the last row with normalized values to translate.

Arguments

An array of Float values representing the recolor matrix.

Magick API

RecolorImage

reduce_noise

img.reduce_noise(radius) -> image

Description

Smooths the contours of an image while still preserving edge information. The algorithm works by replacing each pixel with its neighbor closest in value.

Arguments

radius
A neighbor is defined by radius. Use a radius of 0 and reduce_noise selects a suitable radius for you.

Returns

A new image

Example

The left side of the image has been modified by add_noise. The right side has been filtered by reduce_noise(0).

reduce_noise example

See also

enhance, unsharp_mask

Magick API

ReduceNoiseImage

remap

img.remap(remap_image, dither=RiemersmaDitherMethod) -> self

Description

Reduce the number of colors in img to the colors used by remap_image. If a dither method is specified then the given colors are dithered over the image as necessary, otherwise the closest color (in RGB colorspace) is selected to replace that pixel in the image.

Arguments

remap_image
The reference image
dither
A DitherMethod value. RiemersmaDitherMethod is the default. To disable dithering specify NoDitherMethod.

Returns

self

Example

remap example

See also

ImageList#remap

Magick API

RemapImage (available in ImageMagick 6.4.3-6)

resample

img.resample(horizontal_res=72.0[, vertical_res]) -> image

Description

Resample image to specified horizontal and vertical resolution.

Resize the image so that its rendered size remains the same as the original at the specified target resolution. For example, if a 300 DPI image renders at 3 inches by 2 inches on a 300 DPI device, when the image has been resampled to 72 DPI, it will render at 3 inches by 2 inches on a 72 DPI device. Note that only a small number of image formats (e.g. JPEG, PNG, and TIFF) are capable of storing the image resolution. For formats which do not support an image resolution, the original resolution of the image must be specified via the density attribute prior to specifying the resample resolution.

Arguments

horizontal_res
the target horizontal resolution. The default is 72.0.
vertical_res
the target vertical resolution. The default is horizontal_res.

resize

img.resize(new_width, new_height, filter=LanczosFilter, support=1.0) -> image
img.resize(scale_factor) -> image

Description

Changes the size of the receiver to the specified dimensions.

Arguments

You can specify the new size in two ways. Either specify the new width and height explicitly, or specify a scale factor, a number that represents the percentage change.

Use the change_geometry method to resize an image with constraints such as "maintain the current proportions."

new_width, new_height
The desired width and height.
filter
The filter to use when resizing. If you do not specify a filter argument, resize uses the value of the receiver's filter attribute. Most of the filters are FIR (finite impulse response), however, Bessel, Gaussian, and Sinc are IIR (infinite impulse response). Bessel and Sinc are windowed (brought down to zero) with the Blackman filter.
support
Values > 1 increase the blurriness. Values < 1 increase the sharpness. If this argument is not specified, resize uses the value of the receiver's blur attribute.
scale_factor
You can use this argument instead of specifying the desired width and height. The percentage size change. For example, 1.25 makes the new image 125% of the size of the receiver. The scale factor 0.5 makes the new image 50% of the size of the receiver.

Returns

A new image

See also

change_geometry, resize!, magnify, minify, sample, scale, thumbnail

Magick API

ResizeImage

resize!

img.resize!(new_width, new_height, filter=LanczosFilter, support=1.0) -> self
img.resize!(scale_factor) -> self

Description

In-place form of resize.

Returns

self

resize_to_fill

img.resize_to_fill(width [, height [, gravity=CenterGravity]]) -> image

Description

A convenience method. Resize the image to fit within the specified dimensions while retaining the aspect ratio of the original image. If necessary, crop the image in the larger dimension.

Arguments

width
The width of the resulting image in pixels
height
(Optional) The height of the resulting image in pixels. If omitted, defaults to width.
gravity
Use this argument to specify which portion of the image to retain when cropping. The value can be any GravityType value. The effect is the same as the gravity argument to the crop method. The default is CenterGravity.

Returns

A new image

Example

In this example, some rows have been cropped from the top and bottom to produce a square thumbnail from a rectangular image without distorting the image.

resize_to_fill example

See also

crop, resize, resize_to_fit

Notes

crop_resized is an alias for this method.

resize_to_fill!

img.resize_to_fill!(width [, height [, gravity=CenterGravity]]) -> self

Description

The in-place form of resize_to_fill.

Returns

self

See also

crop!, resize!, resize_to_fit!

Notes

crop_resized! is an alias for this method.

resize_to_fit

img.resize_to_fit(new_width [, new_height]) -> image

Description

A convenience method. Resize the image to fit within the specified dimensions while retaining the original aspect ratio. The image may be shorter or narrower than specified in the smaller dimension but will not be larger than the specified values.

Arguments

new_width
The maximum width of the resized image.
new_height
(Optional) The maximum height of the resized image. If omitted it defaults to the value of new_width.

Returns

A new image

Example

Compare the result of this example to the result of the resize_to_fill example above.

resize_to_fit example

See also

resize, resize_to_fill

resize_to_fit!

img.resize_to_fit!(new_width [, new_height]) -> self

Description

In-place form of resize_to_fit.

Returns

self

See also

resize!, resize_to_fill!

roll

img.roll(x_offset, y_offset) -> image

Description

Offsets an image as defined by x_offset and y_offset.

Arguments

x_offset
The number of columns to offset the image.
y_offset
The number of rows to offset the image.

Returns

A new image

Example

This image has been offset 25% in both directions.

roll example

Magick API

RollImage

rotate

img.rotate(amount [, qualifier]) -> image

Description

Rotate the receiver by the specified angle. Positive angles rotate clockwise while negative angles rotate counter-clockwise. New pixels introduced by the rotation are the same color as the current background color. Set the background color to "none" to make the new pixels transparent black.

Arguments

amount
The number of degrees to rotate the image.
qualifier
If present, either ">" or "<". If ">", rotates the image only if the image's width exceeds its height. If "<" rotates the image only if its height exceeds its width. If this argument is omitted the image is always rotated.

Returns

A new image, or nil if the image was not rotated because it did not meet the qualification specified by the second argument.

Example

rotate example

See also

affine_transform, shear

Magick API

RotateImage

rotate!

img.rotate!(amount [, qualifier]) -> self

Description

In-place form of rotate.

Returns

self, or nil if the image was not rotated because it did not meet the qualification specified by the second argument.

sample

img.sample(new_width, new_height) -> image
img.sample(scale_factor) -> image

Description

Scales an image to the desired dimensions with pixel sampling. Unlike other scaling methods, this method does not introduce any additional color into the scaled image.

Arguments

new_width, new_height
The desired width and height.
scale_factor
You can use this argument instead of specifying the desired width and height. The percentage size change. For example, 1.25 makes the new image 125% of the size of the receiver. The scale factor 0.5 makes the new image 50% of the size of the receiver.

Returns

A new image

See also

sample!, magnify, minify, resize, scale, thumbnail

Magick API

SampleImage

sample!

img.sample!(new_width, new_height) -> self
img.sample!(scale_factor) -> self

Description

In-place form of sample.

Returns

self

scale

img.scale(new_width, new_height) -> image
img.scale(scale_factor) -> image

Description

Changes the size of an image to the given dimensions.

Arguments

new_width, new_height
The desired width and height.
scale_factor
You can use this argument instead of specifying the desired width and height. The percentage size change. For example, 1.25 makes the new image 125% of the size of the receiver. The scale factor 0.5 makes the new image 50% of the size of the receiver.

Returns

A new image

See also

scale!, magnify, minify, resize, sample, thumbnail

Magick API

ScaleImage

scale!

img.scale!(new_width, new_height) -> self
img.scale!(scale_factor) -> self

Description

In-place form of scale.

Returns

self

segment

img.segment(colorspace=RGBColorspace, cluster_threshold=1.0, smoothing_threshold=1.5, verbose=false) -> image

Description

Segments an image by analyzing the histograms of the color components and identifying units that are homogeneous with the fuzzy c-means technique.

Arguments

colorspace
A ColorspaceType value. Empirical evidence suggests that distances in YUV or YIQ correspond to perceptual color differences more closely than do distances in RGB space. The image is then returned to RGB colorspace after color reduction.
cluster_threshold
The number of pixels in each cluster must exceed the the cluster threshold to be considered valid.
smoothing_threshold
The smoothing threshold eliminates noise in the second derivative of the histogram. As the value is increased, you can expect a smoother second derivative.
verbose
If true, segment prints detailed information about the identified classes.

Returns

A new image

Example

segment(YUVColorspace, 0.4, 0.4)

segment example

Magick API

SegmentImage

selective_blur_channel

img.selective_blur_channel(radius, sigma, threshold[, channel...]) -> image

Description

Selectively blur pixels within a contrast threshold.

Arguments

radius, sigma
Use a Gaussian operator of the given radius and standard deviation (sigma).
threshold
Threshold level represented as a percentage of the quantum range. Either a floating-point number or a string in the form "NN%".
channel...
The channels to blur. 0 or more ChannelType arguments. If no channels are specified, the default is the red, green, and blue channels.

Returns

A new image

Example

   img2 = img.selective_blur_channel(0, 1, '10%')

See also

blur_channel, blur_image, gaussian_blur_channel, motion_blur, radial_blur

Magick API

SelectiveBlurImageChannel (available in ImageMagick 6.5.0-3)

separate

Image.separate(channel...) -> imagelist

Description

Constructs a grayscale image for each channel specified.

Arguments

0 or more ChannelType arguments. If no channels are specified, constructs an image for each of the red, green, and blue channels.

Returns

A new imagelist containing the new images.

See also

channel

Notes

If the image does not have an opacity channel an OpacityChannel argument is ignored.

Magick API

SeparateImages

sepiatone

img.sepiatone(threshold=QuantumRange) -> image

Description

Applies a special effect to the image, similar to the effect achieved in a photo darkroom by sepia toning.

Arguments

threshold
Threshold ranges from 0 to QuantumRange and is a measure of the extent of the sepia toning. A threshold of 80% is a good starting point for a reasonable tone. The default is QuantumRange.

Returns

A new image.

Example

sepiatone example

See also

You can get more control by using colorize.

Magick API

SepiaToneImage

set_channel_depth

img.set_channel_depth(channel, depth) -> self

Description

Sets the depth of the image channel.

Arguments

channel
A ChannelType value
depth
The desired depth (must be no greater than QuantumDepth)

Returns

self

See also

channel_depth

Magick API

SetImageChannelDepth

shade

img.shade(shading=false, azimuth=30, elevation=30) -> image

Description

Shines a distant light on an image to create a three-dimensional effect. You control the positioning of the light with azimuth and elevation; azimuth is measured in degrees off the x axis and elevation is measured in pixels above the Z axis.

Arguments

shading
If true, shade shades the intensity of each pixel.
azimuth, elevation
The light source direction. The azimuth is measured in degrees. 0° is at 9 o'clock. Increasing values move the light source counter-clockwise.

Returns

A new image

Example

shade(true, 50, 50)

shade example

Magick API

ShadeImage

shadow

img.shadow(x_offset=4, y_offset=4, sigma=4.0, opacity=1.0) -> image

Description

Draws the shadow of opaque parts of the image. This method only works when the image has opaque parts and transparent parts. Note that the resulting image is just the shadow. You must composite the original image over the shadow to produce the shadowed results.

Arguments

x_offset
The shadow x-offset
y_offset
The shadow y-offset
sigma
The standard deviation of the Gaussian operator used to produce the shadow. The higher the number, the "blurrier" the shadow, but the longer it takes to produce the shadow. Must be > 0.0.
opacity
The percent opacity of the shadow. May be either a number between 0.1 and 1.0, or a string in the form "NN%" between "1%" and "100%". If the percentage is greater than 100 it is reduced to 100.

Returns

A new image

Example

shadow example

Magick API

ShadowImage

Notes

The shadow image is 2×sigma pixels larger on a side than the original image, as can be seen in the example above.

sharpen

img.sharpen(radius=0.0, sigma=1.0) -> image

Description

Sharpens an image. We convolve the image with a Gaussian operator of the given radius and standard deviation (sigma). For reasonable results, radius should be larger than sigma. Use a radius of 0 and sharpen selects a suitable radius for you.

Arguments

The radius and standard deviation of the Gaussian operator.

Returns

A new image

Magick API

SharpenImage

See also

virtual_pixel_method

sharpen_channel

img.sharpen_channel( radius, sigma [,channel...] ) -> image

Description

Sharpens one or more image channels. We convolve the image with a Gaussian operator of the given radius and standard deviation (sigma) . For reasonable results, radius should be larger than sigma. Use a radius of 0 and sharpen_channel selects a suitable radius for you.

Arguments

radius, sigma
The radius and standard deviation of the Gaussian operator.
channel...
0 or more ChannelType arguments. If no channels are specified, all the channels are sharpened.

Returns

A new image

See also

sharpen

Magick API

SharpenImageChannel

shave

img.shave(width, height) -> image

Description

Removes pixels from the edges of the image, leaving the center rectangle.

Arguments

width
The number of pixels to remove from each side of the receiver, not to exceed half the original width.
height
The number of pixels to remove from the top and bottom of the receiver, not to exceed half the original height.

Returns

A new image

Example

shave example

See also

shave!, crop

Magick API

ShaveImage

shave!

img.shave!(width, height) -> self

Description

In-place form of shave.

Returns

self

shear

img.shear(x_shear, y_shear) -> image

Description

Shearing slides one edge of an image along the X or Y axis, creating a parallelogram. An X direction shear slides an edge along the X axis, while a Y direction shear slides an edge along the Y axis. The amount of the shear is controlled by a shear angle. For X direction shears, x_shear is measured relative to the Y axis, and similarly, for Y direction shears y_shear is measured relative to the X axis. Empty triangles left over from shearing the image are filled with the background color.

Arguments

The X and Y shear angles, measured in degrees. These values must not be 180.0. If either value is 0, no shearing will occur.

Returns

A new image

Example

shear example

See also

affine_transform, rotate

Magick API

ShearImage

sigmoidal_contrast_channel


img.sigmoidal_contrast_channel(contrast=3.0, midpoint=50.0, sharpen=false[,channel...]) -> image

Description

Adjusts the contrast of an image channel with a non-linear sigmoidal contrast algorithm. Increases the contrast of the image using a sigmoidal transfer function without saturating highlights or shadows.

Arguments

contrast
indicates how much to increase the contrast (0 is none; 3 is typical; 20 is pushing it)
midpoint
indicates where midtones fall in the resultant image (0 is white; 50% is middle-gray; 100% is black). Note that "50%" means "50% of the quantum range." This argument is a number between 0 and QuantumRange. To specify "50%" use QuantumRange * 0.50.
sharpen
Set sharpen to true to increase the image contrast otherwise the contrast is reduced.
channel...
0 or more ChannelType arguments. If no channels are specified, all the channels are adjusted.

Returns

A new image

See also

contrast

Magick API

SigmoidalContrastImageChannel

signature

img.signature -> string

Description

Computes a message digest from an image pixel stream with an implementation of the NIST SHA-256 Message Digest algorithm. This signature uniquely identifies the image and is convenient for determining if an image has been modified or whether two images are identical.

ImageMagick adds the computed signature to the image's properties.

Returns

The signature as a 64-character string.

Example

img = Image.read('ex/images/Flower_Hat.jpg').first »
  ex/images/Flower_Hat.jpg JPEG 200x250 DirectClass 8-bit 9761b
img.properties »
  {"comment"=>"File written by Adobe Photoshop\250 4.0"}
img.signature »
  "485e01ecba1a1f47924d67b887cb07b474f695841733796dfa3c2876965c7e8b"
img.properties »
  {"signature"=>"485e01ecba1a1f47924d67b887cb07b474f695841733796dfa3c2876965c7e8b",
   "comment"=>"File written by Adobe Photoshop\250 4.0"}

See also

<=>, difference

Magick API

SignatureImage

sketch

img.sketch(radius=0.0, sigma=1.0, angle=0.0) -> image

Description

Simulates a pencil sketch. For best results start with a grayscale image.

Arguments

radius, sigma
The radius and sigma of the Gaussian operator
angle
The angle toward which the image is sketched.

Returns

A new image

Example

sketch example

Magick API

SketchImage

solarize

img.solarize(threshold=50) -> image

Description

Applies a special effect to the image similar to the effect achieved in a photo darkroom by selectively exposing areas of photo sensitive paper to light.

Arguments

Ranges from 0 to QuantumRange and is a measure of the extent of the solarization. The default is 50.

Returns

A new image

Example

solarize example

Magick API

SolarizeImage

sparse_color

img.sparse_color(method, x1, y1, color1[, x2, y2, color2...][, channel...]) -> image

Description

Fills the image with the specified color or colors, starting at the x,y coordinates associated with the color and using the specified interpolation method.

For more information about this method see the ImageMagick documentation for the -sparse-color option. Also see Sparse Points of Color at Examples of ImageMagick Usage.

Arguments

method
One of the following interpolation methods:
BarycentricColorInterpolate
Three point triangle of color given 3 points. Giving only 2 points will form a linear gradient between those points. Gradient is however not restricted to just the triangle or line.
BilinearColorInterpolate
Like barycentric but for 4 points. Less than 4 points fall back to barycentric.
ShepardsColorInterpolate
Colors points basied on the ratio of inverse distance squared. Generating spots of color in a sea of the average of colors.
VoronoiColorInterpolate
Simply map each pixel to the to nearest color point given. The result are polygonal 'cells' of solid color.
xn, yn, colorn
One or more x,y, color triplets. X and y are floating-point values. Color can be either a color name or a pixel.
channel...
0 or more ChannelType arguments. If no channels are specified then DefaultChannels is used.

Example

sparse_color example

Returns

A new image

Magick API

SparseColorImage (available in 6.4.3)

splice

img.splice(x, y, width, height[, color]) -> image

Description

Splice a solid color into the image as defined by the x, y, width, and height arguments. This method is the opposite of chop.

Arguments

x, y, width, height
Describe the rectangle to be spliced.
color
The color to be spliced. Either a color name or a pixel. If omitted, uses the image's background color.

Returns

A new image

Example

splice example

See also

color_fill_to_border, color_floodfill, color_reset!, erase!, opaque

Magick API

SpliceImage

spread

img.spread(radius=3) -> image

Description

Randomly displaces each pixel in a block defined by the radius parameter.

Returns

A new image

Example

spread example

Magick API

SpreadImage

stegano

img.stegano(watermark, offset) -> image

Description

Hides a digital watermark in the receiver. You can retrieve the watermark by reading the file with the stegano: prefix, thereby proving the authenticity of the file.

The watermarked image must be saved in a lossless RGB format such as MIFF, or PNG. You cannot save a watermarked image in a lossy format such as JPEG or a pseudocolor format such as GIF. Once written, the file must not be modified or processed in any way.

Arguments

watermark
An image or imagelist to be used as the watermark. The watermark must be grayscale and should be substantially smaller than the receiver. The recovery time is proportional to the size of the watermark.
offset
The starting position within the receiver at which the watermark will be hidden. When you retrieve the watermark from the file, you must supply this value, along with the width and height of the watermark, in the size optional parameter to the read method.

Returns

A copy of the image containing the embedded watermark.

Example

stegano example

Magick API

SteganoImage

See also

watermark

stereo

img.stereo(offset_image) -> image

Description

Combines two images and produces a single image that is the composite of a left and right image of a stereo pair. Special red-green stereo glasses are required to view this effect.

Arguments

Another image or imagelist. If the argument is an imagelist, uses the current image.

Returns

A new image

Magick API

StereoImage

store_pixels

img.store_pixels(x, y, columns, rows, pixels) -> image

Description

Replace the pixels in the specified rectangle with the pixels in the pixels array.

Arguments

x, y
The x- and y-offset of the rectangle to be replaced.
columns, rows
The number of rows and columns in the rectangle.
pixels
An array of pixels. The number of pixels in the array must be the same as the number of pixels in the rectangle, that is, rows*columns.

Returns

The image, with the rectangle suitably altered.

Example

smile example

Also see the example for get_pixels.

See also

constitute, get_pixels, view

Magick API

SetImagePixels, SyncImagePixels

strip!

img.strip! -> self

Description

Strips an image of all profiles and comments.

Returns

self

Magick API

StripImage

swirl

img.swirl(degrees) -> image

Description

Swirls the pixels about the center of the image, where degrees indicates the sweep of the arc through which each pixel is moved. You get a more dramatic effect as the degrees move from 1 to 360.

Arguments

The number of degrees to swirl the image.

Returns

A new image

Example

This example is an animated image. Mouse over the image to start the animation.

swirl example

Magick API

SwirlImage

sync_profiles

img.sync_profiles -> true or false

Description

Synchronizes image properties with the image profiles.

Returns

True if everything went okay, false if there was a problem with the profile.

Notes

Currently we only support updating the EXIF resolution and orientation.

Magick API

SyncImageProfiles

texture_fill_to_border

img.texture_fill_to_border(x, y, texture) -> image

Description

Replaces the target pixel at x, y and its neighbors that are not the border color with copies of the texture image. Use the fuzz attribute to specify how closely a pixel must match the border color.

Arguments

x, y
The x- and y-offset of the target pixel.
texture
An image or imagelist. If an imagelist, uses the current image.

Returns

A new image

Example

In this example the target is the pixel in the center of the image. The texture - in this case a picture of a girl in a flowered hat - replaces this pixel and its neighbors until reaching a black pixel. Mouse over the image to see the original image. Notice the plum-colored circles are replaced as well. Compare this result with the result of texture_floodfill, below.

texture_fill_to_border example

See also

color_fill_to_border, matte_fill_to_border

Magick API

ColorFloodfillImage

texture_floodfill

img.texture_floodfill(x, y, texture) -> image

Description

Replaces the target pixel at x, y and its neighbors that are the same color with the texture image. By default, the neighbor pixels must be exactly the same color as the target pixel. Use the fuzz attribute to specify how much difference is acceptable.

Arguments

x, y
The x- and y-offset of the target pixel.
texture
An image or imagelist. If an imagelist, uses the current image.

Returns

A new image

Example

In this example the target is the pixel in the center of the image. The texture - in this case a picture of a girl in a flowered hat - replaces this pixel and its same-colored neighbors. Mouse over the image to see the original image. Notice the plum-colored circles are not replaced. Compare this result with the result of texture_fill_to_border, above.

texture_floodfill example

See also

color_floodfill, matte_floodfill

Magick API

ColorFloodfillImage

threshold

img.threshold(threshold) -> image

Description

Changes the value of individual pixels based on the intensity of each pixel compared to threshold. The result is a high-contrast, two color image.

Arguments

A value between 0 and QuantumRange.

Returns

A new image

Example

threshold(MaxRGB*0.55)

threshold example

See also

adaptive_threshold, bilevel_channel, random_threshold_channel

Magick API

ThresholdImage

thumbnail

img.thumbnail(new_width, new_height) -> image
img.thumbnail(scale_factor) -> image

Description

The thumbnail method is a fast resizing method suitable for use when the size of the resulting image is < 10% of the original.

Arguments

You can call thumbnail with either the new width and height or the scale factor.

new_width, new_height
The desired width and height in pixels.
scale_factor
The desired size represented as a floating-point number. For example, to make a thumbnail that is 9.5% of the size of the original image, use 0.095.

Returns

A new image

Example

img = Image.read("images/Cheetah.jpg").first
thumbnail = img.thumbnail(img.columns*0.09, img.rows*0.09)

See also

minify, resize, sample, scale

Magick API

ThumbnailImage

thumbnail!

img.thumbnail!(new_width, new_height) -> self
img.thumbnail!(scale_factor) -> self

Description

In-place form of thumbnail.

Returns

self

to_blob

img.to_blob [ { optional arguments } ]-> string

Description

Creates a Binary Large OBject, a direct-to-memory version of the image. The from_blob method constructs an image from a BLOB created by this method.

Arguments

No required arguments, however you can specify the image format (such as JPEG, PNG, etc.) and depth by calling the format and depth attributes, as well as other Image::Info attributes as appropriate, in a block associated with the method.

Returns

A string containing the image data represented as a BLOB.

Example

to_blob example

See also

from_blob

Magick API

ImageToBlob

to_color

img.to_color(pixel) -> string

Description

Returns the color name for a pixel. Unlike the Pixel#to_color method, to_color uses the depth and matte attributes of the image to determine the color name.

Arguments

A Pixel object.

Returns

A color name.

Example

img = Image.read('ex/images/Flower_Hat.jpg').first
» ex/images/Flower_Hat.jpg JPEG 200x250 DirectClass 8-bit 9761b
pixel = img.pixel_color(img.columns/2, img.rows/2)
» #<struct Pixel red=216, green=147, blue=106, opacity=0>
img.to_color(pixel)
» "#D8936A"

See also

Pixel#to_color

Magick API

QueryColorname

transparent

img.transparent(color, opacity=TransparentOpacity) -> image

Description

Changes the opacity value of all the pixels that match color to the value specified by opacity. By default the pixel must match exactly, but you can specify a tolerance level by setting the fuzz attribute on the image.

Arguments

color
Either a color name or a pixel.
opacity
The new opacity value, either an opacity value or a number between 0 and QuantumRange. The default is TransparentOpacity.

Returns

A new image

Example

Mouse over the image to see the original. In this example, all the black pixels are made transparent. The resulting image has been composited over a plasma background, which shows through the transparent pixels.

transparent example

See also

matte_replace, Draw#matte, paint_transparent, transparent_chroma

Magick API

TransparentPaintImage

transparent_chroma

img.transparent_chroma(low, high, opacity=TransparentOpacity, invert=false) -> image

Description

Changes the opacity value associated with any pixel between low and high to the value defined by opacity.

As there is one fuzz value for the all the channels, the transparent method is not suitable for the operations like chroma, where the tolerance for similarity of two color components (RGB) can be different, Thus we define this method take two target pixels (one low and one high) and all the pixels of an image which are lying between these two pixels are made transparent.

Arguments

low, high
The low and high ends of the pixel range
opacity
The desired opacity. The default value is transparent.
invert
If true, all pixels outside the range are set to opacity.

Returns

A new image

Magick API

TransparentPaintImageChroma (available in ImageMagick 6.4.5-6)

transpose

img.transpose -> image

Description

Creates a horizontal mirror image by reflecting the pixels around the central y-axis while rotating them by 90 degrees.

Returns

A new image

Example

transpose example

See also

flip, flop, rotate, transpose!, transverse

Magick API

TransposeImage

transpose!

img.transpose! -> self

Description

In-place form of transpose.

Returns

self

transverse

img.transverse -> image

Description

Creates a vertical mirror image by reflecting the pixels around the central x-axis while rotating them by 270 degrees

Returns

A new image

Example

transverse example

See also

flip, flop, rotate, transpose, transverse!

Magick API

TransposeImage

transverse!

img.transverse! -> self

Description

In-place form of transverse.

Returns

self

trim

img.trim(reset=false) -> image

Description

Removes the edges that are exactly the same color as the corner pixels. Use the fuzz attribute to make trim remove edges that are nearly the same color as the corner pixels.

Arguments

The trim method retains the offset information in the cropped image. This may cause the image to appear to be surrounded by blank or black space when viewed with an external viewer. This only occurs when the image is saved in a format (such as GIF) that saves offset information. To reset the offset data, use true as the argument to trim. See also crop.

Returns

A new image

Example

trim example

See also

crop

Magick API

CropImage

trim!

img.trim!(reset=false) -> self

In-place form of trim.

Returns

self

unique_colors

img.unique_colors -> image

Description

Constructs a new image with one pixel for each unique color in the image. The new image has 1 row. The row has 1 column for each unique pixel in the image.

Returns

A new image

Magick API

UniqueImageColors

unsharp_mask

img.unsharp_mask(radius=0.0, sigma=1.0, amount=1.0, threshold=0.05) -> image

Description

Sharpens an image. We convolve the image with a Gaussian operator of the given radius and standard deviation (sigma). For reasonable results, radius should be larger than sigma. Use a radius of 0 and unsharp_mask selects a suitable radius for you.

Arguments

All arguments are optional.

radius
The radius of the Gaussian operator. The default is 0.0.
sigma
The standard deviation of the Gaussian operator. A good starting value is 1.0, which is the default.
amount
The percentage of the blurred image to be added to the receiver, specified as a fraction between 0 and 1.0. A good starting value is 1.0, which is the default.
threshold
The threshold needed to apply the amount, specified as a fraction between 0 and 1.0. A good starting value is 0.05, which is the default.

Returns

A new image

Example

unsharp_mask example

See also

enhance, median_filter, reduce_noise, unsharp_mask_channel

Magick API

UnsharpMaskImage

unsharp_mask_channel

img.unsharp_mask_channel(radius=0.0, sigma=1.0, amount=1.0, threshold=0.05 [,channel...]) -> image

Description

Sharpens an image. We convolve the image with a Gaussian operator of the given radius and standard deviation (sigma). For reasonable results, radius should be larger than sigma. Use a radius of 0 and unsharp_mask_channel selects a suitable radius for you.

Only the specified channels are sharpened.

Arguments

All arguments are optional.

radius
The radius of the Gaussian operator. The default is 0.0.
sigma
The standard deviation of the Gaussian operator. A good starting value is 1.0, which is the default.
amount
The percentage of the blurred image to be added to the receiver, specified as a fraction between 0 and 1.0. A good starting value is 1.0, which is the default.
threshold
The threshold needed to apply the amount, specified as a fraction between 0 and 1.0. A good starting value is 0.05, which is the default.
channel...
0 or more ChannelType arguments. If no channels are specified, all the channels are sharpened. This is the equivalent of unsharp_mask.

Returns

A new image

See also

enhance, median_filter, reduce_noise, unsharp_mask

Magick API

UnsharpMaskImageChannel

view

img.view(x, y, width, height) -> aView
img.view(x, y, width, height) { |view| block } -> nil

Description

View is a convenience method that supports getting and setting individual image pixels by [i][j] coordinates. With no associated block, view returns an Image::View object. If the optional code block is given, it will be passed the Image::View object as an argument. The sync method will be called automatically when the block terminates. In this case, view returns nil.

Arguments

x, y
The offset of the view from the top-left corner of the image. Within the view, pixels are relative to the top-left corner of the view, not the image.
width, height
The width and height of the view. The view may not extend past the boundaries of img.

Returns

If the optional code block is present, view returns nil. If it is not present, view returns an Image::View object.

See

Image::View

Examples

The example image below has been scaled 500% for clarity.

view example

img = Image.new(40, 40) {self.background_color = 'lightcyan2'}

# The view is 400 pixels square, starting at
# column 10, row 5 from the top of the image.
img.view( 10, 5, 20, 20) do |view|

    # Set all the pixels in the view to green.
    view[][] = Pixel.new(0, QuantumRange)

    # Change the top and bottom rows to red.
    view[0][] = 'red'
    view[-1,1][] = 'red'

    # Set 6 pixels to black.
    view[[13,15]][[12,14,16]] = 'black'

    # Set 1 pixel to yellow.
    view[5][7] = 'yellow'

    # Change the green channel of all the
    # pixels on row 8.
    view[8][].green = QuantumRange/2

    # Change the blue channel of 8 pixels
    # on column 10.
    view[4,8][10].blue = QuantumRange
end

See also

pixel_color, get_pixels, store_pixels

Notes

The view method introduces a relatively high level of overhead to pixel manipulation compared to methods that use the ImageMagick API to identify and change pixels. I recommend that you use view only when the number of pixels identified in the view is fairly small (a few thousand to a few hundred thousand, depending on your patience and the speed of your computer) and you need this degree of control.

vignette

img.vignette(x, y, radius=0.0, sigma=10.0) -> image

Description

Gradually shades the edges of the image by transforming the pixels into the background color.

Arguments

x
Influences the amount of background color in the horizontal dimension. Larger values of x make the vignette narrower. This argument should be positive and less than image.columns / 2. This argument is optional. If omitted, the default value is 0.10 * img.columns.
y
Influences the amount of background color in the vertical dimension. Larger values of y make the vignette shorter. This argument should be positive and less than image.rows / 2. This argument is optional. If omitted, the default value is 0.10 * img.rows.
radius, sigma
Controls the amount of blurring. Larger values of sigma increase the blurring at the expense of increased execution time. In general, radius should be larger than sigma, although if radius is 0 then ImageMagick will choose a suitable value. Sigma must be non-zero. Choose a very small value for sigma to produce a "hard" edge.

Returns

A new image

Example

vignette example

Magick API

VignetteImage

Notes

The image produced by vignette is very similar to the image produced by RMagick's vignette.rb example script. However, the example script gives you more control over the size, shape, and background color of the vignette.

watermark

img.watermark(mark, lightness=1.0, saturation=1.0, x_offset=0, y_offset=0) -> image
img.watermark(mark, lightness=1.0, saturation=1.0, gravity, x_offset=0, y_offset=0) -> image

Description

Composites a watermark image on the target image using the Modulate composite operator. This composite operation operates in the HSL colorspace and combines part of the lightness, part of the saturation, and all of the hue of each pixel in the watermark with the corresponding pixel in the target image

Arguments

mark
The watermark image. Either an imagelist or an image. If an imagelist, uses the current image.
lightness
The fraction of the lightness component of the watermark pixels to be composited onto the target image. Must be a non-negative number or a string in the form "NN%". If lightness is a number it is interpreted as a percentage. Both 0.25 and "25%" mean 25%. The default is 100%.
saturation
The fraction of the saturation component of the watermark pixels to be composited onto the target image. Must be a non-negative number or a string in the form "NN%". If lightness is a number it is interpreted as a percentage. Both 0.25 and "25%" mean 25%. The default is 100%.
x_offset
The offset of the watermark, measured from the left-hand side of the target image. The default is 0.
y_offset
The offset of the watermark, measured from the top of the target image. The default is 0.

Watermark can be called with a gravity argument or without. When a gravity argument is specified but the x- and y-offsets are omitted, the watermark is positioned based on the value of the gravity argument:

NorthWestGravity
The watermark abuts the top and left sides of the image.
NorthGravity
The watermark is centered left-to-right and abuts the top of the image.
NorthEastGravity
The watermark abuts the top and right sides of the image.
EastGravity
The watermark is centered top-to-bottom and abuts the right side of the image.
SouthEastGravity
The watermark abuts the bottom and right sides of the image.
SouthGravity
The watermark is centered left-to-right and abuts the bottom of the image.
SouthWestGravity
The watermark abuts the bottom and left sides of the image.
WestGravity
The watermark is centered top-to-bottom and abuts the left side of the image.
CenterGravity
The watermark is centered left-to-right and top-to-bottom.

When the gravity argument is present and the x-offset (and optionally the y-offset) is present, the x- and y-offset are measured from the right and/or bottom edges of the target image based on the value of gravity. If the argument is NorthEastGravity, EastGravity, or SouthEastGravity, the x-offset is measured from the right side of the image. If the argument is SouthEastGravity, SouthGravity, or SouthWestGravity, the y-offset is measured from the bottom of the image. All other values are ignored and the x- and y-offset are measured from the upper-left corner of the image.

Returns

A new image

Example

See "Watermarking with Images" in Anthony Thyssen's Examples of ImageMagick Usage.

watermark example

See also

composite, stegano

wave

img.wave(amplitude=25.0, wavelength=150.0) -> image

Description

Creates a "ripple" effect in the image by shifting the pixels vertically along a sine wave whose amplitude and wavelength is specified by the given parameters.

Returns

A new image

Example

wave example

Magick API

WaveImage

See also

virtual_pixel_method

wet_floor

img.wet_floor(initial=0.5, rate=1.0) -> image

Description

Creates a "wet floor" reflection. The reflection is an inverted copy of the image that changes from partially transparent to entirely transparent. By default only the bottom third of the image appears in the reflection.

Note that the output image is just the reflection. This makes it easy to apply further transformations to the reflection before combining it with the original image.

Arguments

initial
A value between 0.0 and 1.0 that specifies the initial percentage of transparency. Higher values cause the top of the reflection to be more transparent, lower values less transparent. The default is 0.5, which means that the top of the reflection is 50% transparent.
rate
A non-negative value that specifies how rapidly the reflection transitions from the initial level of transparency to entirely transparent. The default value is 1.0, which means that the transition occurs in 1/3 the image height. Values greater than 1.0 speed up the transition (the reflection will have fewer rows), values lower than 1.0 slow down the transition (the reflection will have more rows). A value of 0.0 means that the level of transparency will not change.

Returns

A new image

Example

Here are four examples of wet_floor. The top image shows the result of appending the default reflection to the original image. The second image shows the result of decreasing the initial transparency to 0.25 and using 0.5 as the rate argument. The third image uses the same reflection as the second image but has a slant added. The bottom image is the same as the third image but with a ripple effect.

wet floor example

white_threshold

img.white_threshold(red_channel [, green_channel[, blue_channel[, opacity_channel]]]) -> image

Description

Forces all pixels above the threshold into white while leaving all pixels below the threshold unchanged.

Arguments

Each channel argument is a number between 0 and QuantumRange. All arguments except the first may be omitted. If the green_channel or blue_channel argument is omitted, the default value is the red_channel value. If the opacity_channel argument is omitted, the default value is OpaqueOpacity.

Returns

A new image

See also

black_threshold, bilevel_channel

Magick API

WhiteThresholdImage

write

img.write(filename) [ { optional arguments } ] -> self
img.write(file) [ { optional arguments } ] -> self

Description

Writes the image to the specified file. ImageMagick determines image format from the prefix or extension.

If the argument is an open file, ImageMagick will write the image in its current format. You can force a different format by setting the image's format attribute.

Arguments

A file name or open file object. You may also specify optional arguments by setting Image::Info attributes in an associated block.

Returns

self, or nil if the image format cannot be determined.

Example

Almost all of the examples call write.

Notes

When the argument is a filename, specify the output format via the filename extension (for example ".jpg" or ".gif") or by prefixing the filename with the desired format (for example, "jpeg:myfile"), not via format=.

Do not use a StringIO object or a Tempfile object as the argument. Neither of these work. Use to_blob to write to a String. Instead of a tempfile, get the path of the tempfile from the path method. Prefix the path with the desired image format. For example,

temp = Tempfile.new("image")
img.write("jpeg:"+ temp.path)

See also

ImageList#write

Magick API

WriteImage

 

rmagick-2.13.2/doc/imusage.html0000644000004100000410000003765012147515547016357 0ustar www-datawww-data RMagick 2.13.2: ImageMagick Conventions

RMagick: ImageMagick Conventions

Image formats and filenames

ImageMagick supports over 100 major image formats.

ImageMagick determines the format (GIF, PNG, JPEG, etc.) of an image file either from its magic number, the filename suffix (.gif, .png, .jpg) or from a prefix attached to the filename. For example, ps:mydoc indicates that mydoc is a Postscript file. The magic number takes precedence over the filename suffix and the prefix takes precedence over the magic number and the suffix in input files. The prefix takes precedence over the filename suffix in output files.

This makes it easy to convert an image file to another format. Simply write the image file using a name that has either a prefix or a suffix corresponding to the format you want.

Note: Keep in mind that files in some formats may only be read by ImageMagick, not written.

Selecting frames from a multi-frame image file

When reading a multi-frame image file such as an AVI you can specify the subset of frames by adding a list of frame number(s) to the end of the file name enclosed in square brackets. For example, "my_movie.avi[0]" tells ImageMagick to read only the first frame. In general,

[N]
identifies a single frame. Frame numbers start at 0. Negative numbers cause frames to be selected from the end of the image file.
[M,N,O]
identifies multiple non-sequential frame numbers.
[N-M]
identifies the sequence of frames numbered N through M.
[M,N-O,P]
identifies both non-sequential and sequential frame numbers

Note that the entire image file will be read into memory before the frames are selected. See this page for additional uses of the [] modifier.

Color names

Many RMagick methods expect color name arguments or return color names. A color name can be

  1. an X11 color name such as "red", "chocolate", or "lightslategray".
  2. an SVG color name (similar to the X color names), or
  3. a string in one of the formats shown in the following table.
Color name formats
#RGB 4 bits for each channel
#RRGGBB 8 bits for each channel
#RRRGGGBBB 12 bits for each channel
#RRRRGGGGBBBB 16 bits for each channel
#RGBA 4 bits for each channel, plus the alpha channel
#RRGGBBAA 8 bits for each channel, plus the alpha channel
#RRRGGGBBBAAA 12 bits for each channel, plus the alpha channel
#RRRRGGGGBBBBAAAA 16 bits for each channel, plus the alpha channel
cmyk(c,m,y,k) CMYK functional notation. c, m, y, and k are either 4 integers 0-QuantumRange or 4 percentages 0%-100%.
cmyka(c,m,y,a) CMYK functional notation plus the alpha channel.
rgb(r,g,b) SVG functional notation. r, g, and b are either 3 integers 0-QuantumRange or 3 percentages 0%-100%.
rgba(r,g,b,a) SVG functional notation plus the alpha channel.
hsl(h,s,l) Hue, saturation, lightness. The hue value (h) should be a number in the range 0 <= n < 360. The saturation (s) and lightness (l) values should be numbers in the range 0 <= n <= 100.
hsla(h,s,l,a) Hue, saturation, lightness, plus the alpha channel.

The alpha channel is the opacity of the image, which can range from 0 (Magick::OpaqueOpacity) to QuantumRange (Magick::TransparentOpacity).

A Pixel object contains the numeric representation of a color. The Pixel.from_color method converts a color name to a pixel. There are two methods to convert a pixel to a color name. The Pixel#to_color method requires that you specify whether the alpha (opacity) channel is used, the depth (8 or 16) and the color standard to use. The Image#to_color method uses the image's depth and matte attributes. If matte is false the opacity value is ignored.

Hint: You can specify the transparent color as "none", "transparent", "#00000000", or rgba(0, 0, 0, 0.0).

This is ImageMagick's page about color names.

The geometry string

RMagick methods frequently require a geometry string argument. This string generally specifies width and height values as well as x and y offset values. The values are usually specified in pixels (but see the % flag, below).

This is the format of the geometry string. Any of the values may be omitted, depending on the context:

<width>x<height>+-<x>+-<y>{%@!<>}

This is the ImageMagick description of the geometry string:

By default, the width and height are maximum values. That is, the image is expanded or contracted to fit the width and height value while maintaining the aspect ratio of the image. Append an exclamation point to the geometry to force the image size to exactly the size you specify. For example, if you specify 640x480! the image width is set to 640 pixels and height to 480.

If only the width is specified, the width assumes the value and the height is chosen to maintain the aspect ratio of the image. Similarly, if only the height is specified (e.g., "x256"), the width is chosen to maintain the aspect ratio. To specify a percentage width or height instead, append %. The image size is multiplied by the width and height percentages to obtain the final image dimensions. To increase the size of an image, use a value greater than 100 (e.g. 125%). To decrease an image's size, use a percentage less than 100.

Use @ to specify the maximum area in pixels of an image.

Use > to change the dimensions of the image only if its width or height exceeds the geometry specification. < resizes the image only if both of its dimensions are less than the geometry specification. For example, if you specify '640x480>' and the image size is 256x256, the image size does not change. However, if the image is 512x512 or 1024x1024, it is resized to 480x480.

Use ^ to set a minimum image size limit. The geometry 640x480^, for example, means the image width will not be less than 640 and the image height will not be less than 480 pixels after the resize. One of those dimensions will match the requested size, but the image will likely overflow the space requested to preserve its aspect ratio.

The x and y offsets, if present, can be preceded with either a + or - sign. The + causes x and y to be measured from the left or top edges, respectively. Conversely, - measures from the right or bottom edges. Offsets are always measured in pixels.

Any method that accepts a geometry string will also accept a Geometry object.

Some RMagick methods interpret the geometry string values differently. Where this is the case the documentation for the method will explain the differences.

DirectClass and PseudoClass

ImageMagick classifies all images into two classes, PseudoClass and DirectClass.

DirectClass images are continuous-tone images stored as RGB (red, green, blue), RGBA (red, green, blue, alpha), or CMYK (cyan, yellow, magenta, black) intensity values as defined by the colorspace [attribute].

PseudoClass images are colormapped RGB images. The colormap is stored as a series of red, green, and blue pixel values, each value being a byte in size. If the image depth is 16, each colormap entry consumes two bytes with the most significant byte being first. The number of colormap entries is defined by the colors [attribute].

GIF format images are PseudoClass. JPEG format images are DirectClass. You can change the class of a image with the class_type= method.

Built-in image formats

Some of the image formats that ImageMagick supports are special-purpose formats that are built-in to ImageMagick itself. That is, even though you can "read" images in these formats, they do not correspond to any real image files.

These are the built-in formats that I know something about. (There are more but I've never used them.) When the format is marked with an *, you must supply the desired size of the image in order to "read" it. Specify the size by assigning a string in the form "WxH" to the size attribute in the read method's additional parms block. For example, to create a image in the gradient format that is 100 pixels wide and 200 pixels high, use:

i = Image.read("gradient:red-blue") { self.size = "100x200" }

See demo.rb for more examples of reading built-in formats.

caption*

The caption format is used to create an image from a text string. Ex: "caption:My caption text".

If you specify only the width in the size argument, ImageMagick will wrap the text and compute the necessary height. In addition to size (which is required) you can use the following optional arguments:

  • antialias
  • background_color
  • border_color
  • density
  • fill
  • font
  • gravity
  • pointsize
  • stroke
  • stroke_width
  • undercolor

gradient*

Gradient filenames have the form "gradient:color1-color2". These images are created by gradually changing from color1 at the top edge to color2 at the bottom. Don't confuse this image format with the GradientFill class, which is part of RMagick.

granite

A mottled gray image suitable for use as a tiled background texture. Ex: "granite:".

logo

The ImageMagick logo. Ex: "logo:".

netscape

The 216-color "Web safe" cube. Ex: "netscape:".

null*

An empty image. Ex: "null:".

pattern

This format supplies a number of built-in patterns that may be referenced by specifying the pattern name. For example, pattern:checkerboard. For a list of acceptable patterns, see this page. If you do not specify a size the pattern's default size is used. If you specify a size the pattern will be repeated as necessary to fill the image.

plasma*

Creates a swirly, psychedelic image. Specify a pair of colors in the filename ("plasma:red-blue") or specify the filename "plasma:fractal" for best results.

rose

A small picture of a rose. Ex: "rose:".

xc*

Specify a color name after the xc: prefix. For example, "xc:red". This format is simply an image of the specified color. You can get exactly the same results by specifying the background color when creating an image.

rmagick-2.13.2/doc/image1.html0000644000004100000410000037655212147515547016077 0ustar www-datawww-data RMagick 2.13.2: class Image (class methods and instance methods a-d)

class Image < Object (class methods and instance methods a-d)
mixes in Comparable

class methods

capture

Image.capture(silent=false, frame=false, descend=false, screen=false, borders=false) [ { optional arguments } ] -> image

Description

Reads an image from an X window. Unless you identify a window to capture via the optional arguments block, when capture is invoked the cursor will turn into a cross. Click the cursor on the window to be captured.

Within the optional arguments block, specify self.filename = "root" to capture the entire desktop. To programatically specify the window to be captured, use self.filename = window_id, where window_id is the id displayed by xwininfo(1).

Arguments

silent
If true, suppress the beeps that signal the start and finish of the capture process. The bell rings once to signal the start of the capture and twice to signal the finish.
frame
If true, include the window frame.
descend
If true, obtain image by descending window hierarchy.
screen
If true, specifies that the GetImage request used to obtain the image should be done on the root window, rather than directly on the specified window. In this way, you can obtain pieces of other windows that overlap the specified window, and more importantly, you can capture menus or other popups that are independent windows but appear over the specified window.
borders
If true, include the border in the image.
optional arguments
You can specify any of these Image::Info attributes in the optional arguments block: colorspace, depth, dither, interlace, and type.

Returns

A new image.

Example

img = Image.capture {
 self.filename = "root"
 }

combine

Image.combine(red_ch=nil, green_ch=nil, blue_ch=nil, opacity_ch=nil) ->image

Description

Combines the grayscale value of the pixels in each image to form a new image.

Arguments

The red channel of the image specified in the first argument is used as the red channel in the new image. The green channel of the image specified in the second argument is used as the green channel in the new image. The blue channel of the image specified in the third argument is used as the blue channel in the new image. The opacity channel of the image specified in the fourth argument is used as the opacity channel in the new image.

Any of the arguments may be nil. Trailing nil arguments may be omitted. You must specify at least one image argument.

Returns

A new image

See also

The same results can be obtained using the composite method and the CopyRed/Green/Blue/OpacityCompositeOp CompositeOperator enum values.

Magick API

CombineImages

constitute

Image.constitute(width, height, map, pixels) -> image

Description

Creates an image from an array of pixels. This method is the reverse of dispatch.

Arguments

width
The number of columns in the image
height
The number of rows in the image
map
A string describing the expected ordering of the pixel array. It can be any combination or order of R = red, G = green, B = blue, A = alpha, C = cyan, Y = yellow, M = magenta, K = black, or I = intensity (for grayscale).
pixels
The pixel data. The pixel data in the array must be stored in scanline order, left-to-right and top-to-bottom. The elements in the array must be either all Integers or all Floats. If the elements are Integers, the Integers must be in the range [0..QuantumRange]. If the elements are Floats, they must be in the range [0..1].

Returns

An image constructed from the pixel data.

Example

image = Image.constitute(width, height, "RGB", pixels)

See also

import_pixels, store_pixels

Magick API

ConstituteImage

from_blob

Image.from_blob(string) [ { optional arguments } ] -> array

Description

Creates an array of images from a BLOB, that is, a Binary Large OBject. In RMagick, a BLOB is a string.

Arguments

A blob can be a string containing an image file such as a JPEG or GIF. The string can contain a multi-image file such as an animated GIF or a Photoshop image with multiple layers. A blob can also be one of the strings produced by to_blob. Control the format of the created image(s) by setting additional Image::Info attributes in the optional block argument.

Returns

An array of one or more images constructed from the BLOB.

Example

See to_blob.

Magick API

BlobToImage

new

Image.new(columns, rows [, fill]) [ { optional arguments } ] -> image

Description

Creates a new instance with the specified number of columns and rows. You can specify other arguments by setting Image::Info attributes in the optional block. If the optional fill argument is not specified, the image is set to the background color.

Arguments

columns
The number of columns
rows
The number of rows
fill
A Fill object

Returns

A new image.

Example

img = Image.new(256, 64) {
 self.background_color = 'red'
 }

See also

ImageList.new_image

Magick API

AllocateImage

ping

Image.ping(filename) [ { optional arguments } ] -> array
Image.ping(file) [ { optional arguments } ] -> array

Description

Creates one or more images from the image file, omitting the pixel data. Only the attributes are stored in the images. This method is faster than read and uses less memory.

Arguments

An image file name or open file object. You can specify other arguments by setting Image::Info attributes in the optional block.

Returns

An array containing 0 or more images.

Example

cheetah = Image.ping("Cheetah.jpg") »
 [Cheetah.jpg JPEG 1024x768 DirectClass 8-bit 101684b]
p cheetah[0].rows » 768
p cheetah[0].columns » 1024

See also

read

Magick API

PingImage

read

Image.read(filename) [ { optional arguments } ] -> array
Image.read(file) [ { optional arguments } ] -> array

Description

Reads all the images from the specified file.

Note: Because an image file can contain multiple images or multiple image layers, read always returns an array containing 0 or more elements, one element for each image or image layer in the file.

Arguments

An image file name or open file object. You can specify other arguments by setting Image::Info attributes in the optional block.

Returns

An array containing 0 or more Image objects. If the file is a multi-image file such as an animated GIF or a Photoshop PSD file with multiple layers, the array contains an Image object for each image or layer in the file.

Example

animated = Image.read("animated.gif") »
[animated.gif GIF 127x120+0+0 PseudoClass 256c 8-bit 54395b
animated.gif[1] GIF 127x120+0+0 PseudoClass 256c 8-bit 54395b,
animated.gif[2] GIF 127x120+0+0 PseudoClass 256c 8-bit 54395b]

See also

ping

Note

The read method does not accept a StringIO object. If you want to create an image from a string buffer, use from_blob.

Magick API

ReadImage

read_inline

Image.read_inline(content) [ { optional arguments } ] -> array

Description

Converts a Base64-encoded image or multi-image sequence to an array of Image objects.

Arguments

A Base64-encoded string. Generally no optional arguments are required. If the image format cannot be deduced from the image data, you can use the format attribute. If you want to extract a subset of an image sequence, see here.

Returns

An array containing 0 or more Image objects. If the content is a multi-image sequence such as an animated GIF or a Photoshop PSD file with multiple layers, the array contains an Image object for each image or layer in the file.

Example

content = "R0lGODlhnAEuAferAAAAAAcIBggJBgw..."
img = Image.read_inline(content)

See also

read

instance methods

[ ]

img[key] -> string

Description

Returns the value of the image property identified by key. An image may have any number of properties. Each property is identified by a string (or symbol) key. The property value is a string. ImageMagick predefines some properties, including Label, Comment, Signature, and in some cases EXIF.

Arguments

The key may be a String or a Symbol.

Returns

The value of the property.

Example

 mom['Label'] = 'My Mother'

See also

[ ]=, properties

Magick API

GetImageAttribute

Note

ImageMagick calls properties "attributes." I use the word "properties" to reduce the confusion with image object attributes such as rows and columns.

[ ]=

img[key] = string -> self

Description

Sets the value of an image property. An image may have any number of properties.

Arguments

The key may be a string or a symbol. The value can be any string.

Returns

self

Example

See demo.rb for an example of the use of the Label property.

See also

[ ], properties

Magick API

SetImageAttribute

<=>

img <=> other_image -> -1, 0, 1

Description

Compares two images and returns -1, 0, or 1 if img is less than, equal to, or greater than other_image as determined by comparing the signatures of the images. If one of the arguments is not an image, this method raises a TypeError exception (in Ruby 1.6) or returns nil (in Ruby 1.8)

In addition to <=>, Image mixes in the Comparable module, which defines the <, <=, == >=, >, and between? methods.

The difference method compares images (for equality only) but also returns information about the amount two images differ, which may be more useful.

Returns

The value of img.signature <=> other_image.signature.

See also

signature, difference, compare_channel

Magick API

SignatureImage

adaptive_blur

img.adaptive_blur(radius=0.0, sigma=1.0) -> image

Description

Adaptively blurs the image by blurring more intensely near image edges and less intensely far from edges. The adaptive_blur method blurs the image with a Gaussian operator of the given radius and standard deviation (sigma). For reasonable results, radius should be larger than sigma. Use a radius of 0 and adaptive_blur selects a suitable radius for you.

Arguments

radius
The radius of the Gaussian in pixels, not counting the center pixel. The default is 0.0.
sigma
The standard deviation of the Laplacian, in pixels. The default is 1.0.

Returns

A new image

See also

adaptive_blur_channel

Magick API

AdaptiveBlurImage

adaptive_blur_channel

img.adaptive_blur(radius=0.0, sigma=1.0 [,channel...]) -> image

Description

The same as adaptive_blur except only the specified channels are blurred.

Arguments

radius
The radius of the Gaussian in pixels, not counting the center pixel. The default is 0.0.
sigma
The standard deviation of the Laplacian, in pixels. The default is 1.0.
channel...
0 or more ChannelType arguments. If no channels are specified, blurs all the channels. Specifying no channel arguments has the same effect as the adaptive_blur method, above.

Returns

A new image

See also

adaptive_blur

Magick API

AdaptiveBlurImageChannel

adaptive_resize

img.adaptive_resize(new_width, new_height) -> image
img.adaptive_resize(scale_factor) -> image

Description

Resizes the image with data dependent triangulation.

Arguments

You can specify the new size in two ways. Either specify the new width and height explicitly, or specify a scale factor, a number that represents the percentage change.

Use the change_geometry method to compute new dimensions for an image with constraints such as "maintain the current proportions."

new_width, new_height
The desired width and height.
scale_factor
You can use this argument instead of specifying the desired width and height. The percentage size change. For example, 1.25 makes the new image 125% of the size of the receiver. The scale factor 0.5 makes the new image 50% of the size of the receiver.

Returns

A new image

See also

resize

Magick API

AdaptiveResizeImage

adaptive_sharpen

img.adaptive_sharpen(radius=0.0, sigma=1.0) -> image

Description

Adaptively sharpens the image by sharpening more intensely near image edges and less intensely far from edges. The adaptive_sharpen method sharpens the image with a Gaussian operator of the given radius and standard deviation (sigma). For reasonable results, radius should be larger than sigma. Use a radius of 0 and adaptive_sharpen selects a suitable radius for you.

Arguments

radius
The radius of the Gaussian in pixels, not counting the center pixel. The default is 0.0.
sigma
The standard deviation of the Laplacian, in pixels. The default is 1.0.

Returns

A new image

See also

adaptive_sharpen_channel

Magick API

AdaptiveSharpenImage

adaptive_sharpen_channel

img.adaptive_sharpen(radius=0.0, sigma=1.0 [,channel...]) -> image

Description

The same as adaptive_sharpen except only the specified channels are sharpened.

Arguments

radius
The radius of the Gaussian in pixels, not counting the center pixel. The default is 0.0.
sigma
The standard deviation of the Laplacian, in pixels. The default is 1.0.
channel...
0 or more ChannelType arguments. If no channels are specified, sharpens all the channels. Specifying no channel arguments has the same effect as the adaptive_sharpen method, above.

Returns

A new image

See also

adaptive_sharpen

Magick API

AdaptiveSharpenImageChannel

adaptive_threshold

img.adaptive_threshold(width=3, height=3, offset=0) -> image

Description

Selects an individual threshold for each pixel based on the range of intensity values in its local neighborhood. This allows for thresholding of an image whose global intensity histogram doesn't contain distinctive peaks.

Arguments

width, height
define the width and height of the local neighborhood
offset
constant to subtract from pixel neighborhood mean

Returns

A new image

Example

adaptive_threshold example

See also

bilevel_channel, random_threshold_channel, threshold

Magick API

AdaptiveThresholdImage

add_compose_mask

img.add_compose_mask(mask) -> self

Description

Associates a mask with an image that will be used as the destination image in a composite operation. The areas of the destination image that are masked by white pixels will be modified by the composite method, while areas masked by black pixels are unchanged.

See Using a Compose Mask to Limit the Composed Area in Anthony Thyssen's Examples of ImageMagick Usage.

Arguments

The mask image must have the same dimensions as the destination image.

Returns

self

Example

Source image for add_compose_mask example Background image for add_compose_mask example Mask image for compose_mask example Result image for compose_mask example
Background Source Mask Result

See also

composite, delete_compose_mask

Notes

This method uses a copy of the argument as the mask. If you change the mask image you must call this method again to update the mask.

Magick API

SetImageMask

add_noise

img.add_noise(noise_type) -> image

Description

Adds random noise to the image. The amount of time add_noise requires depends on the NoiseType argument.

Arguments

A NoiseType value.

Returns

A new image

Example

Notes

The RandomNoise type was added in ImageMagick 6.3.5.

Magick API

AddNoiseImage

See also

add_noise_channel

add_profile

img.add_profile(filename) -> self

Description

Adds an ICC (a.k.a. ICM), IPTC, or generic profile. If the file contains more than one profile all the profiles are added.

Arguments

The filename of a file containing the profile.

Returns

self

Example

    img.add_profile('my_cmyk.icm')

See also

The iptc_profile and color_profile attributes provide very similar functionality, except that these attributes accept the profile data in the form of a string. The profile! method can also be used to add a profile. The type of profile must be specified and the profile data must be in the form of a string. Also see delete_profile and each_profile.

Magick API

ProfileImage

add_noise_channel

img.add_noise_channel(noise_type [,channel...]) -> image

Description

Adds random noise to the specified channel or channels in the image.

Arguments

noise_type
A NoiseType value.
channel...
0 or more ChannelType arguments. If no channels are specified, adds noise to all the channels. Specifying no channel arguments has the same effect as the add_noise method, above.

Returns

A new image

Magick API

AddNoiseImageChannel

See also

add_noise

affine_transform

img.affine_transform(matrix) -> image

Description

Transforms the image as specified by the affine matrix.

See Coordinate system transformations in the Scalable Vector Graphics (SVG) 1.0 Specification for more information about transformation matrices.

Arguments

An AffineMatrix object.

Returns

A new image

Example

The affine matrix in this example skews the receiver by π/6 radians along both axes.

affine_transform example

See also

rotate, shear

Magick API

AffineTransformImage

alpha

img.alpha(type) -> type

Description

Set a flag to indicate whether or not to use alpha channel data.

Arguments

One of the following values of the AlphaChannelType enumeration:

ActivateAlphaChannel
Enable the images use of transparency. If transparency data did not exist, allocate the data and set to opaque. If the image previously had transparency data, the data is again enable as it was when turned off. The transparency data is not changed or modified in any way.
BackgroundAlphaChannel
Set fully transparent pixels to the background color. (Available in IM 6.5.2-5.)
CopyAlphaChannel
Turns on the alpha/matte channel, then copies the gray-scale intensity of the image, as an alpha mask, into the alpha channel, converting a gray-scale mask into a transparent shaped image ready to be colored appropriately. The color channels are not modified.
DeactivateAlphaChannel
Disables the image's transparency channel. Does not delete or change the existing data, just turns of the use of that data. This is the same as assigning false to the old matte= attribute.
ExtractAlphaChannel
Creates a grayscale mask of the image's shape by copying the alpha channel values into all the color channels, and then turning off the image's transparency. The inverse of CopyAlphaChannel
OpaqueAlphaChannel
Turns on the alpha/matte channel and forces it to be fully opaque.
ResetAlphaChannel
(Deprecated as of IM 6.4.3-7.) Set the alpha channel to fully opaque.
SetAlphaChannel
Turns on the alpha/matte channel and if it was previously turned off resets the channel to opaque. If the image already had the alpha channel turned on, it will have no effect.
ShapeAlphaChannel
As CopyAlphaChannel but also colors the resulting shape mask with the current background color.
TransparentAlphaChannel
Turns on the alpha/matte channel and forces it to be fully transparent. This effectivally creates a transparent image the same size as the original, with all its meta-data still attached.

Returns

The argument.

See also

alpha?

Notes

Available in ImageMagick 6.3.5 and later.

Magick API

SetImageAlphaChannel

alpha?

img.alpha? -> true or false

Description

Returns true if the alpha channel will be used, false otherwise.

See also

alpha

Magick API

GetImageAlphaChannel

annotate

img.annotate(draw, width, height, x, y, text) [ { additional parameters } ] -> self

Description

This is the same method as the annotate method in the Draw class, except that the first argument is a Draw object. Refer to the documentation for Draw#annotate for more information. Some users feel like annotate is better placed in Image than in Draw. Okay, here it is!

Returns

self

auto_gamma_channel

img.auto_gamma_channel([channel...]) -> image

Description

"Automagically" adjust the gamma level of an image.

Arguments

channel...
0 or more ChannelType arguments. If no channels are specified, automagically adjusts the gamma level of all the channels.

Returns

A new image

auto_level_channel

img.auto_level_channel([channel...]) -> image

Description

"Automagically" adjust the color levels of an image.

Arguments

channel...
0 or more ChannelType arguments. If no channels are specified, automagically adjusts the color level of all the channels.

Returns

A new image

auto_orient

img.auto_orient -> image

Description

Rotates or flips the image based on the image's EXIF orientation tag. Note that only some models of modern digital cameras can tag an image with the orientation. If the image does not have an orientation tag, or the image is already properly oriented, then auto_orient returns an exact copy of the image.

Returns

A new image

See also

auto_orient!

Magick API

FlipImage, FlopImage, RotateImage, TransposeImage, TransverseImage

auto_orient!

img.auto_orient! -> self

Description

Rotates or flips the image based on the image's EXIF orientation tag. Note that only some models of modern digital cameras can tag an image with the orientation. If the image does not have an orientation tag, or the image is already properly oriented, then auto_orient! returns nil.

Returns

self. or nil if the image is already properly oriented

See also

auto_orient

bilevel_channel

img.bilevel_channel(threshold [,channel...]) -> image

Description

Changes the value of individual pixels based on the intensity of each pixel channel. The result is a high-contrast image.

Arguments

threshold
The threshold value, a number between 0 and QuantumRange.
channel...
0 or more ChannelType arguments. If no channels are specified, all the channels are thresholded.

Returns

A new image

Example

bilevel_channel(2*QuantumRange/3, RedChannel)

bilevel_channel example

See also

adaptive_threshold, random_threshold_channel

Magick API

BilevelImageChannel

black_threshold

img.black_threshold(red_channel [, green_channel [, blue_channel [, opacity_channel]]]) -> image

Description

Forces all pixels below the threshold into black while leaving all pixels above the threshold unchanged.

Arguments

Each channel argument is a number between 0 and QuantumRange. All arguments except the first may be omitted. If the green_channel or blue_channel argument is omitted, the default value is the red_channel value. If the opacity_channel argument is omitted, the default value is OpaqueOpacity.

Returns

A new image

See also

white_threshold, bilevel_channel

Magick API

BlackThresholdImage

blend

img.blend(overlay, src_percentage, dst_percentage, x_offset=0, y_offset=0) -> image
img.blend(overlay, src_percentage, dst_percentage, gravity, x_offset=0, y_offset=0) -> image

Description

Adds the overlay image to the target image according to src_percent and dst_percent.

This method corresponds to the -blend option of ImageMagick's composite command.

Arguments

overlay
The source image for the composite operation. Either an imagelist or an image. If an imagelist, uses the current image.
src_percentage
Either a non-negative number a string in the form "NN%". If src_percentage is a number it is interpreted as a percentage. Both 0.25 and "25%" mean 25%. This argument is required.
dst_percentage
Either a non-negative number a string in the form "NN%". If src_percentage is a number it is interpreted as a percentage. Both 0.25 and "25%" mean 25%. This argument may omitted if no other arguments follow it. In this case the default is 100%-src_percentage.

The blend method can be called with or without a gravity argument. The gravity, x_offset, and y_offset arguments are described in the documentation for watermark.

Example

See "Blend Two Images Together" in Anthony Thyssen's Examples of ImageMagick Usage.

Returns

A new image

See also

dissolve, composite

blue_shift

img.blue_shift(factor=1.5) -> image

Description

Simulate a scene at nighttime in the moonlight.

Arguments

factor
Larger values increase the effect. The default is 1.5.

Returns

A new image

Notes

Available in ImageMagick 6.5.4-3 and later.

Magick API

BlueShiftImage

blur_channel

img.blur_channel(radius=0.0, sigma=1.0[, channel...]]) -> image

Description

Blurs the specified channel. We convolve the image with a Gaussian operator of the given radius and standard deviation (sigma) . The blur_channel method differs from gaussian_blur_channel in that it uses a separable kernel which is faster but mathematically equivalent to the non-separable kernel.

Arguments

For reasonable results, the radius should be larger than sigma. Use a radius of 0 and blur_channel selects a suitable radius for you.

channel...
One or more ChannelType values. If none are specified, the red, green, and blue channels are blurred. This is the equivalent of blur_image.

Returns

A new image

See also

blur_image, gaussian_blur_channel, motion_blur, radial_blur, selective_blur_channel

Magick API

BlurImageChannel

blur_image

img.blur_image(radius=0.0, sigma=1.0) -> image

Description

Blurs the image. We convolve the image with a Gaussian operator of the given radius and standard deviation (sigma).

Arguments

For reasonable results, the radius should be larger than sigma. Use a radius of 0 and blur_image selects a suitable radius for you.

Returns

A new image.

Example

blur_image example

See also

blur_channel, gaussian_blur, motion_blur, radial_blur, selective_blur_channel

Magick API

BlurImage

border

img.border(width, height, color) -> image

Description

Add a border around the image.

Arguments

width
Border width in pixels
height
Border height in pixels
color
Border color. Use a named color or a pixel object.

Returns

A new image

Example

border example

See also

border!, frame

Magick API

BorderImage

border!

img.border!(width, height, color) -> self

Description

In-place form of border

Returns

self

bounding_box

img.bounding_box -> rectangle

Description

The image's bounding box. The bounding box is the rectangle that encloses all the pixels not in the border color. Uses the current fuzz value.

Returns

A Rectangle object.

Example

In this example, the bounding box is the gray square enclosing the blue circle. (The coordinates and red circles were added after the bounding box was computed.)

ex/bounding_box.rb

change_geometry

img.change_geometry(string) {|cols,rows,image| block} -> ??? (see Returns)
img.change_geometry(geometry) {|cols,rows,image| block} -> ??? (see Returns)

Description

The change_geometry method supports resizing a method by specifying constraints. For example, you can specify that the image should be resized such that the aspect ratio should be retained but the resulting image should be no larger than 640 pixels wide and 480 pixels tall.

The argument may be either a geometry string or a Geometry object. Change_geometry yields to the block, passing new width and height values based on the argument with respect to self. The return value is the return value of the block.

Arguments

An geometry string or a Geometry object

Returns

The value returned by the block

Example

mona = Image.read('MonaLisa.jpg').first
mona.change_geometry!('320x240') { |cols, rows, img|
 img.resize!(cols, rows)
 }

Magick API

ParseSizeString

Note

change_geometry! is an alias for change_geometry.

changed?

img.changed? -> true or false

Description

Returns true if any pixel has been altered since the image was constituted.

Magick API

IsTaintImage

channel

img.channel(channel) -> image

Description

Extracts a channel from the image. A channel is a particular color component of each pixel in the [image].

Arguments

A ChannelType value.

Returns

An image in which the RGB values of all the pixels have been set to a gray corresponding to the specified channel value. For example, given a pixel in the original image with the value R=255, G=128, B=0 and the RedChannel argument, the equivalent pixel in the result image will have the value R=255, G=255, and B=255. For the BlueChannel argument, the pixel would have the value R=0, G=0, B=0.

Example

The channel image preserves the tone of the selected RGB component.

channel example

Magick API

ChannelImage

channel_depth

img.channel_depth([channel...]) -> number

Description

Returns the maximum depth for the specified channel or channels.

Arguments

channel...
Zero or more ChannelType values. If no arguments are specified, the default is all channels.

Returns

The maximum depth

See also

set_channel_depth

Magick API

GetImageChannelDepth

channel_extrema

img.channel_extrema([channel...]) -> [number, number]

Description

Returns the minimum and maximum intensity values for the specified channel or channels.

Arguments

channel...
Zero or more ChannelType values. If no arguments are specified, the default is all channels.

Returns

An array. The first element in the array is the minimum value. The second element is the maximum value.

Magick API

GetImageChannelExtrema

channel_mean

img.channel_mean([channel...]) -> [number, number]

Description

Returns the mean and standard deviation values for the specified channel or channels.

Arguments

channel...
Zero or more ChannelType values. If no arguments are specified, the default is all channels.

Returns

An array. The first element in the array is the mean value. The second element is the standard deviation.

Magick API

GetImageChannelMean

charcoal

img.charcoal(radius=0.0, sigma=1.0) -> image

Description

Adds a "charcoal" effect to the image. You can alter the intensity of the effect by changing the radius and sigma arguments.

Arguments

radius
The radius of the pixel neighborhood.
sigma
The standard deviation of the Gaussian, in pixels.

Returns

A new image

Example

charcoal example

Magick API

CharcoalImage

check_destroyed

img.check_destroyed -> nil

Description

Raises DestroyedImageError if the image has been destroyed. Returns nil otherwise.

See also

destroy!, destroyed?

chop

img.chop(x, y, width, height) -> image

Description

Removes the specified rectangle and collapses the rest of the image to fill the removed portion.

Arguments

x
The x offset of the rectangle from the upper-left corner of the image.
y
The y offset of the rectangle from the upper-left corner of the image.
width
The width of the rectangle.
height
The height of the rectangle.

Returns

A new image

Example

The chop rectangle is highlighted in the "before" image. The result may seem counter-intuitive!

chop example

See also

crop

Magick API

ChopImage

clone

img.clone -> image

Description

Same as dup except the frozen state of the original is propagated to the new copy.

Returns

A new image

See also

dup

clut_channel

img.clut(clut_image [, channel...]) -> self

Description

Replace the channel values in the target image with a lookup of its replacement value in an LUT gradient image.

The LUT image should be either a single row or column image of replacement colors. The lookup is controlled by the -interpolate setting, especially for an LUT which is not the full length needed by the IM installed Quality (Q) level. Good settings for this is the default 'bilinear' or 'bicubic' interpolation setting for a smooth color gradient, or 'integer' for a direct unsmoothed lookup of color values.

This method is especially suited to replacing a grayscale image with specific color gradient from the CLUT image.

Note that color replacements involving transparency (alpha/matte channel) will lookup the replacement alpha/matte value using the alpha/matte value of the original image. As such correct alpha channel lookup for a pure gray-scale original image will require a copy of that grayscale to be transferred into its alpha channel before applying the -clut operator.

Arguments

clut_image
The LUT gradient image. Specify which interpolation method to use by setting this image's pixel_interpolation_method attribute to a InterpolatePixelMethod value.
channel...
Limit which channels are modified by specifying one or more ChannelType values. Only these channels will be changed. If no channels are specified, all channels will be changed.

Returns

self

See also

ImageMagick's -clut option.

color_fill_to_border

img.color_fill_to_border(x, y, fill_color) -> image

Description

Changes any pixel that is a neighbor of the target pixel and is not the border color to the fill color.

Arguments

x, y
The target pixel's location.
fill_color
The fill color. The fill color can be either color name or a Pixel object.

Returns

A new image

Example

In this example, the aquamarine fill starts at the center of the circle and fills to the black border. All non-black pixels are replaced by the fill color. Contrast the result of color_fill_to_border with that of color_floodfill example, below.

color_fill_to_border example

See also

color_floodfill

Magick API

ColorFloodfillImage

color_floodfill

img.color_floodfill(x, y, fill_color) -> image

Description

Changes any pixel that is the same color and is a neighbor of the target pixel to the fill color.

Arguments

x, y
The target pixel's location.
fill_color
The fill color, either color name or a Pixel object.

Returns

A new image

Example

In this example, the aquamarine fill starts at the center of the circle and replaces all neighboring white pixels. Contrast the result of color_floodfill with that of color_fill_to_border, above.

color_floodfill example

See also

color_fill_to_border, opaque

Magick API

ColorFloodfillImage

color_histogram

img.color_histogram() -> hash

Description

Computes the number of times each unique color appears in the image.

Returns

A hash. Each key in the hash is a pixel representing a color that appears in the image. The value associated with the key is the number of times that color appears in the image. Caution: if the image contains many colors the hash will be very large. You may want to use the quantize method to reduce the number of colors before using color_histogram.

Example

This histogram was produced by sorting the hash returned by color_histogram by increasing frequency.

color_histogram example

Magick API

GetImageHistogram

colorize

img.colorize(red_pct, green_pct, blue_pct, [matte_pct, ] fill) -> image

Description

Blend the fill color with the image pixels. The red_pct, green_pct, blue_pct and matte_pct arguments are the percentage to blend with the red, green, blue and matte channels.

Arguments

red_pct, green_pct, blue_pct, matte_pct
The percentage of the fill color red, green, blue and matte (transparency) components to blend with the image pixel. For example, .25 is 25%. The matte_pct argument is optional.
fill
A color name or a Pixel

Returns

A new image

Example

This example converts a color image to a "sepia-tone-ish" image using the quantize and colorize methods.

colorize example

See also

sepiatone

Magick API

ColorizeImage

colormap

img.colormap(index[, new_color]) -> string

Description

Returns the color in the color map at the specified index. If the new_color argument is specified, replaces the color at that index with the new color.

Raises IndexError if the image does not contain a color map. Only PseudoClass images have a color map.

Arguments

index
A number between 0 and the number of colors in the color map. If the value is out of range, colormap raises an IndexError. You can get the number of colors in the color map from the colors attribute.
new_color
Optional. If specified, may be either a color name or a pixel.

Returns

The name of the color at the specified location in the color map

color_point

img.color_point(x, y, fill) -> image

Description

Set the color of the pixel at x,y to the fill color. This method creates a new image object. If you want to set a single pixel in the image without creating a new image, use pixel_color or the Draw#point method.

Arguments

x, y
The location of the pixel.
fill
The fill color, either color name or a Pixel object.

Returns

A new image

Example

f.color_point(50,50, 'red')

See also

pixel_color, Draw#point

Magick API

GetImagePixels, SyncImagePixels

color_reset!

img.color_reset!(fill) -> self

Description

Sets all the pixels in the image to the specified fill color.

Arguments

The fill color, either color name or a Pixel object.

Returns

self

Example

f.color_reset!(red)

See also

erase!

Magick API

SetImage

compare_channel

img.compare_channel(img, metric [, channel...]) [ { optional arguments } ] -> [image, float]

Description

Compares img with the receiver.

Arguments

image
Either an imagelist or an image. If an imagelist, uses the current image.
metric
The desired distortion metric. A MetricType value.
channel...
Zero or more ChannelType values. All the specified channels contribute to the comparison and the distortion value. If no channels are specified, compares all channels.
optional arguments
If present, compare_channel yields to a block in which you can set optional arguments by setting attributes on self. In both cases color may be either a color name or a pixel.
self.highlight_color = color
Emphasize pixel differences with this color. The default is partially transparent red.
self.lowlight_color = color
Demphasize pixel differences with this color. The default is partially transparent white.

Returns

An array. The first element is a difference image, the second is a the value of the computed distortion represented as a Float.

See also

difference, <=>, distortion_channel

Magick API

ImageCompareChannels

Notes

This method was named channel_compare in earlier releases of RMagick. That name remains an alias for compare_channel.

composite

dest.composite(src, x, y, composite_op) -> image
dest.composite(src, gravity, composite_op) -> image
dest.composite(src, gravity, x, y, composite_op) -> image

Description

Composites src onto dest using the specified composite operator.

Arguments

The composite method can be called three different ways:

1. Without a gravity argument:
src
Either an imagelist or an image. If an imagelist, uses the current image.
x, y
The x- and y-offset of the composited image, measured from the upper-left corner of the image.
composite_op
A CompositeOperator value.
2. With a gravity argument, without x and y arguments:
src
Either an imagelist or an image. If an imagelist, uses the current image.
gravity
A GravityType value that specifies the location of img on image:
NorthWestGravity
The composited image abuts the top and left sides of the image.
NorthGravity
The composited image is centered left-to-right and abuts the top of the image.
NorthEastGravity
The composited image abuts the top and right sides of the image.
EastGravity
The composited image is centered top-to-bottom and abuts the right side of the image.
SouthEastGravity
The composited image abuts the bottom and right sides of the image.
SouthGravity
The composited image is centered left-to-right and abuts the bottom of the image.
SouthWestGravity
The composited image abuts the bottom and left sides of the image.
WestGravity
The composited image is centered top-to-bottom and abuts the left side of the image.
CenterGravity
The composited image is centered left-to-right and top-to-bottom.
composite_op
A CompositeOperator value.
3. With gravity, x, and y arguments:
src
Either an imagelist or an image. If an imagelist, uses the current image.
gravity
A GravityType value.
x, y
The x- and y-offset of the composited image, measured relative to the gravity argument.
composite_op
A CompositeOperator value.

Returns

A new image

Example

This example shows the effect of some of the composite operators.

composite example

See also

composite!, dissolve, watermark

Magick API

CompositeImage

composite!

dest.composite!(src, x, y, composite_op) -> self
dest.composite!(src, gravity, composite_op) -> self
dest.composite!(src, gravity, x, y, composite_op) -> self

Description

In-place form of composite.

Returns

self

composite_affine

dest.composite_affine(src, affine) -> image

Description

Composite src over dest as dictated by the affine argument.

Arguments

img
An image or imagelist
affine
An AffineMatrix

Returns

A new image

See also

composite, affine_transform

Magick API

DrawAffineImage

composite_mathematics

dest.composite_mathematics(src, a, b, c, d, gravity) -> image
dest.composite_mathematics(src, a, b, c, d, x, y) -> image
dest.composite_mathematics(src, a, b, c, d, gravity, x, y) -> image

Description

Merge the source and destination images according to the formula a*Sc*Dc + b*Sc + c*Dc + d where Sc is the source pixel and Dc is the destination pixel.

Equivalent to the -compose Mathematics -set option:compose:args a,b,c,d options to ImagMagick's convert command. See Examples of ImageMagick Usage.

Arguments

src
Either an imagelist or an image. If an imagelist, uses the current image.
a, b, c, d
See the description.
gravity
A GravityType value. If omitted, the default gravity is NorthWestGravity.
x, y
The x- and y-offset of the composited image, measured relative to the gravity argument. If omitted, the default value is 0.0.

Returns

A new image

See also

composite

Magick API

CompositeImage

composite_tiled

img.composite_tiled(src, composite_op = Magick::OverCompositeOp) -> image

Description

Composites multiple copies of the source image across and down the image, producing the same results as ImageMagick's composite command with the -tile option.

Arguments

src
The source image
composite_op
A CompositeOperator value

Returns

A new image

See also

composite, composite_tiled!

Magick API

CompositeImage

composite_tiled!

img.composite_tiled!(src, composite_op = Magick::OverCompositeOp) -> self

Description

In-place form of composite_tiled.

Example

composite_tiled example

Returns

self

See also

composite!, composite_tiled

Magick API

CompositeImage

compress_colormap

img.compress_colormap! -> self

Description

Removes duplicate or unused entries in the colormap. Only PseudoClass images have a colormap. If the image is DirectClass then compress_colormap! converts it to PseudoClass.

Returns

self

Example

f = Image.read('cbezier1.gif').first »
 cbezier1.gif GIF 500x350+0+0 PseudoClass 128c 8-bit 177503b
f.colors » 128
f.compress_colormap! »
 cbezier1.gif GIF 500x350+0+0 PseudoClass 108c 8-bit 177503b
f.colors » 108

Magick API

CompressColormap

contrast

img.contrast(sharpen=false) -> image

Description

Enhances or reduces the intensity differences between the lighter and darker elements of the image.

Arguments

If sharpen is true, the contrast is increased, otherwise it is reduced.

Returns

A new image

Example

In this example the contrast is reduced in each successive image.

contrast example

See also

contrast_stretch_channel, sigmoidal_contrast_channel

Magick API

ContrastImage

contrast_stretch_channel

img.contrast_stretch_channel(black_point [, white_point] [, channel...]) -> image

Description

This method is a simple image enhancement technique that attempts to improve the contrast in an image by `stretching' the range of intensity values it contains to span a desired range of values. It differs from the more sophisticated histogram equalization in that it can only apply a linear scaling function to the image pixel values. As a result the `enhancement' is less harsh.

Arguments

black_point
black out at most this many pixels. Specify an absolute number of pixels as a numeric value, or a percentage as a string in the form 'NN%'.
white_point
burn at most this many pixels. Specify an absolute number of pixels as a numeric value, or a percentage as a string in the form 'NN%'. This argument is optional. If not specified the default is all pixels - black_point pixels.
channel...
0 or more ChannelType arguments. If no channels are specified all channels are included.

Returns

A new image

See also

contrast, equalize

Magick API

ContrastStretchImage

convolve

img.convolve(order, kernel) -> image

Description

Applies a custom convolution kernel to the image.

Arguments

order
The number of columns and rows in the kernel.
kernel
An order*order matrix of Float values.

Returns

A new image

See also

convolve_channel. The edge, emboss, gaussian_blur, motion_blur and sharpen methods use convolution to do their work.

Magick API

ConvolveImage

Note

See Convolution in the Hypermedia Image Processing Reference

convolve_channel

img.convolve_channel(order, kernel [, channel...]) -> image

Description

Applies a custom convolution kernel to the specified channel or channels in the image.

Arguments

order
The number of columns and rows in the kernel.
kernel
An order*order matrix of Float values.
channel...
0 or more ChannelType arguments. If no channels are specified the effect is the same as calling convolve.

Returns

A new image

Magick API

ConvolveImageChannel

See also

convolve

copy

img.copy -> other_image

Description

Returns a copy of the image. The tainted state of the original is propagated to the copy.

Example

f2 = f.copy

See also

clone, dup, ImageList#copy

Magick API

CloneImage

crop

img.crop(x, y, width, height) -> image
img.crop(gravity, x, y, width, height) -> image
img.crop(gravity, width, height) -> image

Description

Extracts the specified rectangle from the image.

Arguments

The crop method can be called three different ways:

1. Without a gravity argument:
x, y
The x- and y-offset of the rectangle relative to the upper-left corner of the image
width, height
The width and height of the rectangle.
2. With a gravity argument, but without x and y arguments:
gravity
A GravityType value specifying the position of the rectangle.
NorthWestGravity
The rectangle abuts the top and left sides of the image.
NorthGravity
The rectangle is centered left-to-right and abuts the top of the image.
NorthEastGravity
The rectangle abuts the top and right sides of the image.
EastGravity
The rectangle is centered top-to-bottom and abuts the right side of the image.
SouthEastGravity
The rectangle abuts the bottom and right sides of the image.
SouthGravity
The rectangle is centered left-to-right and abuts the bottom of the image.
SouthWestGravity
The rectangle abuts the bottom and left sides of the image.
WestGravity
The rectangle is centered top-to-bottom and abuts the left side of the image.
CenterGravity
The rectangle is centered left-to-right and top-to-bottom.
width, height
The width and height of the rectangle.
3. With gravity, x, and y arguments:
gravity
A GravityType value. If the argument is NorthEastGravity, EastGravity, or SouthEastGravity, the x-offset is measured from the right side of the image. If the argument is SouthEastGravity, SouthGravity, or SouthWestGravity, the y-offset is measured from the bottom of the image. All other values are ignored and the x- and y-offsets are measured from the upper-left corner of the image.
x, y
The x- and y-offset of the rectangle from the sides specified by the gravity argument.
width, height
The width and height of the rectangle.

Notes

The crop method retains the offset information in the cropped image. This may cause the image to appear to be surrounded by blank or black space when viewed with an external viewer. This only occurs when the image is saved in a format (such as GIF) that saves offset information. To reset the offset data, add true as the last argument to crop. For example,
cropped = img.crop(x, y, width, height, true)

You can add true as the last argument with any of the three argument list formats described above.

Returns

A new image

Example

The crop rectangle is highlighted in the "before" image.

crop example

Example 2

crop_with_gravity.rb

See also

crop!, chop, excerpt

Magick API

CropImage

crop!

img.crop!(x, y, width, height) -> self
img.crop!(gravity, x, y, width, height) -> self
img.crop!(gravity, width, height) -> self

Description

The in-place form of crop.

Returns

self

crop_resized

img.crop_resized(width, height, gravity=CenterGravity) -> image

Description

An alias for resize_to_fill.

cycle_colormap

img.cycle_colormap(amount) -> image

Description

Displaces the colormap by a given number of positions. If you cycle the colormap a number of times you can produce a psychedelic effect.

The returned image is always a PseudoClass image, regardless of the type of the original image.

Arguments

The number of positions to cycle.

Returns

A new image

Example

Mouse over the image to see an animation made by cycling the colormap between each copy.

cycle_colormap example

Magick API

CycleColormapImage

decipher

img.decipher(passphrase) -> image

Description

Decipher an enciphered image.

Arguments

The passphrase used to encipher the image.

Returns

A new image

Example

deciphered_img = img.decipher("magic word")

Magick API

DecipherImage

See also

encipher

delete_compose_mask

img.delete_compose_mask() -> self

Description

Deletes the mask added by add_compose_mask.

Returns

self

See also

add_compose_mask

Magick API

SetImageMask

delete_profile

img.delete_profile(profile_name) -> self

Description

Deletes the specified profile. This method is effectively the same as passing a nil 2nd argument to profile!.

Arguments

The profile name, "IPTC" or "ICC" for example. Specify "*" to delete all the profiles in the image.

See also

Setting the iptc_profile attribute or color_profile attribute to nil causes the profile to be deleted. Also see strip! and add_profile.

Magick API

ProfileImage

deskew

img.deskew(threshold=0.40, auto_crop_width=nil) -> image

Description

Straightens an image. A threshold of 40% works for most images.

Arguments

threshold
A percentage of QuantumRange. Either a Float between 0 and 1.0, inclusive, or a string in the form "NN%" where NN is between 0 and 100.
auto_crop_width
Specify a value for this argument to cause the deskewed image to be auto-cropped. The argument is the pixel width of the image background (e.g. 40).

Returns

A new image

Example

img2 = img.deskew

Magick API

DeskewImage (available in 6.4.2)

despeckle

img.despeckle -> image

Description

Reduces the speckle noise while preserving the edges.

Returns

A new image

Magick API

DespeckleImage

destroy!

img.destroy! -> self

Description

Returns all the memory associated with the image to the system. After an image has been destroyed, all Image methods (except destroyed? and inspect) called on the image will raise a DestroyedImageError.

It is not possible to recover a destroyed image.

Returns

self

See also

check_destroyed, destroyed?

destroyed?

img.destroyed? -> true or false

Description

Returns true if the image has been destroyed, false otherwise.

See also

check_destroyed, destroy!

difference

img.difference(other) -> array

Description

Compares two images and computes statistics about their difference.

A small normalized mean square error...suggests the images are very similar in spatial layout and color.

Returns

An array of three Float values:

mean error per pixel
The mean error for any single pixel in the image.
normalized mean error
The normalized mean quantization error for any single pixel in the image. This distance measure is normalized to a range between 0 and 1. It is independent of the range of red, green, and blue values in the image.
normalized maximum error
The normalized maximum quantization error for any single pixel in the image. This distance measure is normalized to a range between 0 and 1. It is independent of the range of red, green, and blue values in your image.

After difference returns, these values are also available from the mean_error_per_pixel, normalized_mean_error, and normalized_maximum_error attributes.

See also

<=>

Magick API

IsImagesEqual

dispatch

img.dispatch(x, y, columns, rows, map, float=false) -> array

Description

Extracts the pixel data from the specified rectangle and returns it as an array of either Integer or Float values.

The array returned by dispatch is suitable for use as an argument to constitute.

Arguments

x, y
The offset of the rectangle from the upper-left corner of the image.
columns, rows
The width and height of the rectangle.
map
A String reflecting the order of the pixel data. It can be any combination or order of R = red, G = green, B = blue, A = alpha, C = cyan, Y = yellow, M = magenta, K = black, or I = intensity (for grayscale).
float
If true, the returned array elements will be Float values in the range 0..1. If false, the returned array elements will be Integer values in the range 0..QuantumRange.

Returns

An array

Example

pixels = f.dispatch(0, 0, f.columns, f.rows, "RGB")

See also

constitute, export_pixels, get_pixels

Magick API

ExportImagePixels

Note

This method is deprecated in ImageMagick. Use the export_pixels method instead.

displace

img.displace(displacement_map, x_amplitude, y_amplitude, x_offset=0, y_offset=0) -> image
img.displace(displacement_map, x_amplitude, y_amplitude, gravity, x_offset=0, y_offset=0) -> image

Description

Uses displacement_map to move color from img to the output image.

This method corresponds to the -displace option of ImageMagick's composite command.

Arguments

displacement_map
The source image for the composite operation. Either an imagelist or an image. If an imagelist, uses the current image.
x_amplitude
The maximum displacement on the x-axis.
y_amplitude
The maximum displacement on the y-axis. This argument may omitted if no other arguments follow it. In this case the default is the value of x_amplitude.

The displace method can be called with or without a gravity argument. The gravity, x_offset, and y_offset arguments are described in the documentation for watermark.

Example

See "Composite Displacement Maps" in Anthony Thyssen's Examples of ImageMagick Usage.

Returns

A new image

See also

composite

display

img.display [ { optional arguments } ] -> self

Description

Display the image on an X Window screen. By default, the screen is the local monitor. Right-click the window to display a context menu.

Arguments

You can specify additional arguments by setting Info attributes in a block associated with the method call. Specifically, you can set the name of a non-default X Window screen with the server_name attribute.

Returns

self

Note

The display method is not supported on native MS Windows.

Magick API

DisplayImages

dissolve

img.dissolve(overlay, src_percentage, dst_percentage, x_offset=0, y_offset=0) -> image
img.dissolve(overlay, src_percentage, dst_percentage, gravity, x_offset=0, y_offset=0) -> image

Description

Composites the overlay image into the target image. The opacity of img is multiplied by dst_percentage and opacity of overlay is multiplied by src_percentage.

This method corresponds to the -dissolve option of ImageMagick's composite command.

Arguments

overlay
The source image for the composite operation. Either an imagelist or an image. If an imagelist, uses the current image.
src_percentage
Either a non-negative number a string in the form "NN%". If src_percentage is a number it is interpreted as a percentage. Both 0.25 and "25%" mean 25%. This argument is required.
dst_percentage
Either a non-negative number a string in the form "NN%". If src_percentage is a number it is interpreted as a percentage. Both 0.25 and "25%" mean 25%. This argument may omitted if no other arguments follow it. In this case img's opacity is unchanged.

The dissolve method can be called with or without a gravity argument. The gravity, x_offset, and y_offset arguments are described in the documentation for watermark.

Example

See " Dissolve One Image Over Another" in Anthony Thyssen's Examples of ImageMagick Usage.

bgnd.dissolve(overlay, 0.50, 1.0)

dissolve example

Returns

A new image

See also

blend, composite

distort

img.distort(type, points, bestfit=false) [ { optional arguments } ] -> image

Description

Distort an image using the specified distortion type and its required arguments. This method is equivalent to ImageMagick's -distort option.

Arguments

type
One of the following values:
  • AffineDistortion
  • AffineProjectionDistortion
  • ArcDistortion
  • BarrelDistortion
  • BarrelInverseDistortion
  • BilinearDistortion
  • PerspectiveDistortion
  • PerspectiveProjectionDistortion
  • PolynomialDistortion
  • ScaleRotateTranslateDistortion
  • ShepardsDistortion
points
An array of numbers. The size of the array depends on the distortion type.
bestfit
If bestfit is enabled, and the distortion allows it, the destination image is adjusted to ensure the whole source image will just fit within the final destination image, which will be sized and offset accordingly. Also in many cases the virtual offset of the source image will be taken into account in the mapping.
optional arguments
If present, distort yields to a block in which you can set optional arguments by calling methods on self.
self.define("distort:viewport", "WxH+X+Y")
Specify the size and offset of the generated viewport image of the distorted image space. W and H are the width and height, and X and Y are the offset.
self.define("distort:scale", N)
N is an integer factor. Scale the output image (viewport or otherwise) by that factor without changing the viewed contents of the distorted image. This can be used either for 'super-sampling' the image for a higher quality result, or for panning and zooming around the image (with appropriate viewport changes, or post-distort cropping and resizing).
self.verbose(true)
Attempt to output the internal coefficients, and the -fx equivalent to the distortion, for expert study, and debugging purposes. This many not be available for all distorts.

Returns

A new image

Example

result = img.distort(Magick::ScaleRotateTranslateDistortion, [0]) do
                     self.define "distort:viewport", "44x44+15+0"
                     self.define "distort:scale", 2
                  end

Note

See Distortion Operator in Anthony Thyssen's excellent Examples of ImageMagick Usage for more information about distortion operations.

distortion_channel

img.distortion_channel(reconstructed_image, metric[, channel...]) -> float

Description

(C)ompares one or more image channels of an image to a reconstructed image and returns the specified distortion metric.

Arguments

reconstructed_image
Either an imagelist or an image. If an imagelist, uses the current image.
metric
The desired distortion metric. A MetricType value.
channel...
Zero or more ChannelType values. All the specified channels contribute to the comparison and the distortion value. If no channels are specified, compares all channels.

Returns

The distortion metric, represented as a floating-point number.

Magick API

GetImageChannelDistortion

See also

compare_channel, difference

dup

img.dup -> other_image

Description

Same as copy.

Returns

A new image

See also

clone

 

rmagick-2.13.2/doc/scripts/0000755000004100000410000000000012147515547015513 5ustar www-datawww-datarmagick-2.13.2/doc/scripts/stripeTables.js0000644000004100000410000000131112147515547020506 0ustar www-datawww-data// Alternate gray/white rows in all the tables having the class "striped" function stripeTables() { if (!document.getElementsByTagName) { return false; } var tables = document.getElementsByTagName("table"); for (var i = 0; i < tables.length; i++) { if (tables[i].className == "striped") { var gray = true; var rows = tables[i].getElementsByTagName("tr"); for (var j = 0; j < rows.length; j++) { if (gray) { rows[j].style.backgroundColor = "#f0f0f0"; gray = false; } else { gray = true; } } } } } rmagick-2.13.2/doc/scripts/doc.js0000644000004100000410000000103712147515547016617 0ustar www-datawww-data// Show an example script in a popup window function popup(URL) { day = new Date(); id = day.getTime(); eval("page" + id + " = window.open(URL, '" + id + "','toolbar=0,scrollbars=1,location=0,statusbar=0,menubar=0,resizable=1');"); } // Run a function on window onload event function addLoadEvent(func) { var oldonload = window.onload; if (typeof window.onload != 'function') { window.onload = func; } else { window.onload = function () { oldonload(); func(); } } } rmagick-2.13.2/doc/rvgtext.html0000644000004100000410000003270512147515547016424 0ustar www-datawww-data RMagick 2.13.2: RVG Reference: RVG::Text Class

class RVG::Text < Object

Table of Contents

class methods

instance methods

shared methods

In addition to the methods listed above, class RVG::Text also implements the styles method.

text styles

class methods

new

RVG::Text.new(x=0, y=0, text=nil) [ { |text| ...} ] -> text

Description

This method is usually invoked indirectly via the text method in the RVG::ClipPath, RVG::Group, RVG::Pattern, and RVG classes.

Text objects are containers, so this method yields to a block if one is present. A text object can contain RVG::Tspan objects that are added directly via tspan, or indirectly via tref.

Arguments

All arguments are optional. You can omit all the arguments when you just want to use the text object as a container for tspans.

x, y
The [x, y] coordinate of the initial text position within the current user coordinate system. If omitted the default is [0, 0].
text
A string. If present, this string is drawn at the initial text position. If omitted, only the initial text position is established. By default the string is positioned with the lower-left corner of the first glyph at [x, y]. Use the :text_anchor style to override this behavior. After the string is rendered, the current text position is moved to the end of the string.

Example

text example

instance methods

d

text.d(dx[, dy=0]) [ { |self| ...} ] -> self

Description

The dx and dy arguments are added to the x and y text arguments to form the initial text position. Yields to a block if one is present.

Arguments

dx, dy
The distance, in the user coordinate system, to be added to the x and y coordinates of the initial text position.

Returns

self

rotate

text.rotate(degrees) [ { |text| ...} ] -> self

Description

Rotates the text about the initial text position by the specified number of degrees. Yields to a block if one is present.

Arguments

degrees
The amount of rotation

Returns

self

tref

text.tref(tspan, x=0, y=0) -> self

Description

Adds the referenced Tspan object to the text container.

Arguments

tspan
A Tspan object.
x, y
The absolute text position

Example

tref example

tspan

text.tspan(string=nil, x=nil, y=nil) [ { |tspan| ...} ] -> tspan

Description

Calls RVG::Tspan.new to construct a tspan and adds it to the enclosing RVG::Text object. Yields to a block if one is present, passing the new tspan as an argument.

Although tspan has the same arguments as RVG::Text.new they are not in the same order. The tspan method has the string argument first followed by the [x, y] arguments. The RVG::Text.new arguments are just the opposite.

Arguments

string
A text string.
x, y
The absolute text position

Returns

The new tspan, so other RVG::Tspan methods can be chained to it.

text styles

basic styles

Description

The basic styles include font styles and text styles. Note that ImageMagick uses the font styles to select a font from the available fonts. If it cannot find a font that exactly matches it will use the closest matching font. Unlike MS Windows, ImageMagick will not alter a font - by artificially slanting it to to simulate italics, for example - to produce a match.

Styles

:font
font name or font file name, such as "C:/Windows/Fonts/Arial.ttf" or "pfb:-urw-helvetica-medium-o-condensed--0-0-0-0-p-0-iso10646-1"
:font_family
font family name, such as "serif" or "courier"
:font_size
the font size in points
:font_stretch
one of the following strings: 'normal', 'ultra_condensed', 'extra_condensed', 'condensed', 'semi_condensed', 'semi_expanded', 'expanded', 'extra_expanded', 'ultra_expanded'
:font_style
one of the following strings: 'normal', 'italic', 'oblique'
:font_weight
one of the following strings: 'normal', 'bold', 'bolder', 'lighter', or a multiple of 100 between 100 and 900
:text_anchor
one of the following strings: 'start', 'middle', 'end'
:text_decoration
one of the following strings: 'none', 'underline', 'overline', 'line_through'

Examples

font stylesfont styles exampleDepending on the fonts that ImageMagick is configured with you may not see the effect of some of the styles used in this example.

text stylestext styles example

advanced styles

Description

These styles are emulated by RVG by orienting and positioning each glyph individually. Consequently any use of a non-default value for one of these styles will probably cause your script to dramatically slow down. If you specify an invalid value for any of these styles RVG ignores the value and uses the default. RVG frequently uses approximate measurements to emulate these styles so the results will not be as precise as when ImageMagick is doing the work.

Styles

:writing_mode
There are two possible values for :writing_mode, 'lr' for left-to-right (most Latin-based documents) and 'tb' for top-to-bottom (or vertical) text such as for column labels. The default is 'lr'.
:baseline_shift
Adjusts the baseline. There are five possible values: 'baseline' (the default), 'super', 'sub', a percentage specified as 'NN%', or a number. For the last two choices, positive numbers move the baseline upward. The percentage is a percentage of the line height.
:letter_spacing
Specifies an amount of space to be added between each letter. The default is 0.
:word_spacing
Specifies an amount of space to be added between each word. This amount is added for each blank between words, so if the words are separated by two blanks, for example, then twice the additional space is added. The default is 0.
RVG uses this statement to separate words: words = text.split(::Magick::RVG::WORD_SEP) You can change the regular expression that RVG uses to determine word breaks by assigning a new regular expression to the ::Magick::RVG::WORD_SEP constant. By default the value of ::Magick::RVG::WORD_SEP is / /.
:glyph_orientation_vertical
Applies only when :writing_mode='tb'. This style can have one of four values: 0, 90, 180, 270. The default is 90. This style specifies a rotation on each glyph. With the default value, each glyph is rotated 90 degrees. When :glyph_orientation_vertical=0 each glyph appears in its "normal" (upright) orientation.
:glyph_orientation_horizontal
Applies only when :writing_mode='lr'. This style can have one of four values: 0, 90, 180, 270. The default is 0. This style specifies a rotation on each glyph. With the default value, each glyph appears in its "normal" (upright) orientation.

Examples

:writing_mode='tb'writing mode 'tb' style example

:writing_mode='lr'writing mode 'lr' style example

:baseline_shift=>'sub'
:baseline_shift=>'super'
baseline shift style example

 

rmagick-2.13.2/doc/rvggroup.html0000644000004100000410000002052212147515547016566 0ustar www-datawww-data RMagick 2.13.2: RVG Reference: RVG::Group Class

class RVG::Group < Object

Table of Contents

class methods

attributes

instance methods

shared methods

In addition to the methods listed above, class RVG::Group also implements the styles method, the shape methods and the transform methods.

class methods

new

RVG::Group.new [ { |self| drawing method calls } ] -> group

Description

Drawing objects defined within a group share the transforms and styles defined on the group. Groups can be nested arbitrarily deep. RVG::Group.new is commonly invoked within another group or RVG object by calling the g method (RVG#g, RVG::Group#g) , which nests the group within the target object.

RVG::Group.new yields to a block if one is present, passing self as an argument.

Returns

An RVG::Group object

Example

See the tutorial for examples of the most common uses of groups. In this example, I use RVG::Group.new to construct a "stand-alone" group that is then referenced in multiple calls to the use method.

group example

See also

RVG

attributes

desc, desc=

group.desc -> string
group.desc = string

Description

Use the desc attribute to assign a text description to the group.

metadata, metadata=

group.metadata -> string
group.metadata = string

Description

Use the metadata attribute to assign additional metadata to the group.

title, title=

group.title -> string
group.title = string

Description

Use the title attribute to assign a title to the group.

instance methods

g

group.g [{|grp| ...}] -> group

Description

Calls new to construct a new group and nests it within the target group. Yields to a block if one is present, passing the new group as an argument.

Returns

Returns the new group, so other methods in this class can be chained to this method.

image

group.image(raster_image, width=nil, height=nil, x=0, y=0) -> image

Description

Calls RVG::Image.new to construct an image and adds it to the group.

Returns

Returns the new image, so RVG::Image methods can be chained to this method.

rvg

group.rvg(width, height, x=0, y=0) [{|new_rvg| ...}] -> rvg

Description

Calls RVG.new to construct a new RVG object and adds it to the group. See the rvg method in the RVG class.

Returns

The RVG object, so other RVG methods can be chained to this method.

text

group.text(x=0, y=0, text=nil) [{|text| ...}] -> text

Description

Calls RVG::Text.new to construct a text object and adds it to the group. Yields to a block if one is present, passing the new text object as an argument.

Returns

The RVG::Text object, so other RVG::Text methods can be chained to this method.

use

group.use(obj, x=0, y=0, width=nil, height=nil) -> use

Description

Calls RVG::Use.new to constructs a use object and adds it to the RVG object.

When the referenced argument is an RVG object, width and height can be used to specify the width and height of the viewport. If present and non-nil, these arguments override any width and height specified when the RVG object was created. You must specify the viewport size either when creating the RVG object or when referencing it with use.

Example

See RVG::Use.new

Returns

The RVG::Use object, so other RVG::Use methods can be chained to this method.

 

rmagick-2.13.2/doc/rvgshape.html0000644000004100000410000002701612147515547016537 0ustar www-datawww-data RMagick 2.13.2: RVG Reference: Shapes

The shape methods

Table of Contents

About the shape methods

Shape methods

About the shape methods

The shape methods listed below are defined in the RVG, RVG::ClipPath, RVG::Group, and RVG::Pattern classes. You can chain the styles method and the transform methods to the shape methods.

shape

circle

obj.circle(radius, cx=0, cy=0) -> circle

Description

Adds a circle to the target object. The arc of a circle begins at the "3 o'clock" point on the radius and progresses towards the "9 o'clock" point. The starting point and direction of the arc are affected by the user space transform in the same manner as the geometry of the object.

Arguments
radius
The radius of the circle
cx, cy
The center of the circle
Example

circle example

ellipse

obj.ellipse(rx, ry, cx=0, cy=0) -> ellipse

Description

Adds an ellipse to the target object. The arc of an ellipse begins at the "3 o'clock" point on the radius and progresses towards the "9 o'clock" point. The starting point and direction of the arc are affected by the user space transform in the same manner as the geometry of the object.

Arguments
rx, ry
The x- and y-radii of the ellipse
cx, cy
The center of the ellipse
Example

ellipse example

line

obj.line(x1=0, y1=0, x2=0, y2=0) -> line

Description

Adds a line to the target object. Lines are never filled.

Arguments
x1, y1
The starting point of the line
x2, y2
The ending point of the line
Example

line example

path

obj.path(path_data) -> path

Description

Adds a path to the target object.

Arguments

A path string. The path string has the same syntax as the d= attribute on SVG's path element. See the SVG standard for a complete description of the syntax.

Examples

moveto, lineto, and closepath commandstriangle example

simple uses of cubic Bézier commands within a pathcubic Bezier commands example

cubic Bézier commands change their shape according to the position of the control pointscubic Bezier commands example

simple uses of quadratic Bézier commands within a path quadratic Bezier commands example

simple uses of arc commands within a patharc commands example

Elliptical arcs: The following illustrates the four combinations of large-arc-flag and sweep-flag and the four different arcs that will be drawn based on the values of these flags. elliptical arc example

polygon

obj.polygon(x1, y1, x2, y2...) -> polygon
obj.polygon(array) -> polygon
obj.polygon(array1, array2) -> polygon

Description

Adds a closed shape consisting of a series of connected line segments to the target object.

Arguments

The arguments to polygon and polyline can be

  1. At least 4 numbers that describe the [x, y] coordinates of the points of the polygon/polyline.
  2. One array containing at least 4 numbers.
  3. Two arrays. The first array is a list of x-coordinates. The second array is a list of y-coordinates. Both arrays must have at least one element. If one array is shorter than the other, the shorter array is extended by duplicating its elements as necessary. The combined arrays must describe at least 2 pairs of [x,y] coordinates. For example
        x = [1, 3, 5, 7, 9]
        y = [2,4]
        canvas.polygon(x, y)
        # is equivalent to canvas.polygon(1,2, 3,4, 5,2, 7,4, 9,2)
    

It is an error to specify an odd number of coordinates. Array arguments can be any objects that can be converted to arrays by the Kernel#Array method.

Example

polygon example

polyline

obj.polyline(x1, y1, x2, y2...) -> polyline
obj.polyline(array) -> polyline
obj.polyline(array1, array2) -> polyline

Description

Adds a set of connected lines segments to the target object. Typically a polyline defines an open shape.

Arguments

See polygon

Example

polyline example

rect

obj.rect(width, height, x=0, y=0) -> rect

Description

Adds a rectangle to the target object.

Arguments
width, height
The width and height of the rectangle
x, y
The x- and y-axis coordinates of the upper-left corner
Example

rect example

Rounded rectangles

You can define a rounded rectangle by chaining the round method to rect:

obj.rect(width, height, x=0, y=0).round(rx[, ry])

The round method accepts two arguments.

rx
The x-axis radius of the ellipse used to round off the corners of the rectangle
ry
The y-axis radius of the ellipse used to round off the corners of the rectangle

If the second argument is omitted it defaults to the value of the first argument.

Example

rect example

 

rmagick-2.13.2/doc/usage.html0000644000004100000410000015042712147515547016027 0ustar www-datawww-data RMagick 2.13.2: How to use RMagick

How to use RMagick

Basic concepts

Let's look at the RMagick equivalent of "Hello, world". This program reads an image file named "Cheetah.jpg" and displays1 it on your monitor

1. require 'RMagick'
2. include Magick
3.
4. cat = ImageList.new("Cheetah.jpg")
5. cat.display
6. exit

MS Windows users note: The display method does not work on native MS Windows. You must use an external viewer to view the images you create.

Line 1 requires 2 the RMagick.rb file, which defines the Magick module. The Magick module contains 3 major classes, ImageList, Image, and Draw. This section - Basic Concepts - describes the ImageList and Image classes. The Draw class is explained in the Drawing on and adding text to images section, below.

The statement on line 5 creates an imagelist object and initializes it by reading the Cheetah.jpg file in the current directory. Line 6 sends the display method to the object. When you send display to an imagelist, it causes all the images in the imagelist to be displayed on the default X Window screen. In this case, the display method makes a picture of a cheetah appear on your monitor.

Type this program in and try running it now. The Cheetah.jpg file is in the ex/images subdirectory where you installed the RMagick documentation.

The Image and ImageList classes are closely related. An Image object describes one image or one frame in an image with multiple frames. (An animated GIF or a Photoshop image with multiple layers are examples of images with multiple frames.) You can create a image object from an image file such as a GIF, PNG, or JPEG. You can create a image from scratch by specifying its dimensions. You can write an image to disk, display it on a screen, change its size or orientation, convert it to another format, or otherwise modify it using one of over 100 methods.

An ImageList object is a list of images. It contains zero or more images and a scene number. The scene number indicates the current image. The ImageList class includes methods that operate on all the images in the list. Also, with a very few exceptions, any method defined in the Image class can be used as well. Since Image methods always operate on a single image, when an Image method is sent to an imagelist, the ImageList class sends the method to the current image, that is, the image specified by the scene number.

The ImageList class is a subclass of the Array class, so you can use most Array methods to change the images in the imagelist. For example, you can use the << method to add an image to the list.

Going back to the example, let's make one modification.

1. require 'RMagick'
2. include Magick
3.
4. cat = ImageList.new("Cheetah.jpg")
5. smallcat = cat.minify
6. smallcat.display
7. exit

The difference is the statement on line 5. This statement sends the minify method to the imagelist. The minify method is an Image method that reduces the size of an image to half its original size. Remember, since minify is an Image method, the ImageList class sends minify to the current (and only) image. The return value is a new image, half the size of the original.

Line 6 demonstrates the Image class's display method, which displays a single image on the X Window screen. Image#display makes a picture of a (in this case, small) cheetah appear on your monitor.

Here's how to write the small cheetah to a file in GIF format.

1. require 'RMagick'
2. include Magick
3.
4. cat = ImageList.new("Cheetah.jpg")
5. smallcat = cat.minify
6. smallcat.display
7. smallcat.write("Small-Cheetah.gif")
8. exit

The statement on line 7 writes the image to a file. Notice that the filename extension is gif. When writing images, ImageMagick uses the filename extension to determine what image format to write. In this example, the Small-Cheetah.gif file will be in the GIF format. Notice how easy it is to covert an image from one format to another? (For more details, see Image formats and filenames.)

So why, in the previous example, did I create cat as an ImageList object containing just one image, instead of creating an Image object? No reason, really. When you only have one image to deal with, imagelists and images are pretty much interchangeable.

Note: In most cases, an Image method does not modify the image to which it is sent. Instead, the method returns a new image, suitably modified. For example, the resize method returns a new image, sized as specified. The receiver image is unaltered. (Following the Ruby convention, when a method alters the receiver object, the method name ends with "!". For example, the resize! method resizes the receiver in place.)

Reading, writing, and creating images

You've already seen that you can create an imagelist and initialize it by specifying the name of an image file as the argument to ImageList.new. In fact, new can take any number of file name arguments. If the file contains a single image, new reads the file, creates an image, and adds it to the imagelist. If the file is a multi-frame image file, new adds an image for each frame or layer in the file. Lastly, new changes the scene number to point to the last image in the imagelist. In the simple case, new reads a single image from a file and sets the scene number to 0.

You can also create an image from scratch by calling Image.new. This method takes 2 or 3 arguments. The first argument is the number of columns in the new image (its width). The second argument is the number of rows (its height). If present, the 3rd argument is a Fill object. To add a "scratch" image to an imagelist, call ImageList#new_image. This method calls Image.new, adds the new image to the imagelist, and sets the scene number to point to the new image. Scratch images are good for drawing on or creating images by compositing.

Like many other methods in the Image and ImageList classes, Image.new accepts an optional block that can be used to set additional optional parameters. If the block is present, Image.new creates a parameter object and yields to the block in the scope of that object. You set the parameters by calling attribute setter methods defined in the parameter object's class. For example, you can set the background color of a new image to red with the background_color= method, as shown here:

require 'RMagick'
include Magick
# Create a 100x100 red image.
f = Image.new(100,100) { self.background_color = "red" }
f.display
exit

Within the parameter block you must use self so that Ruby knows that this statement is a method call, not an assignment to a variable.

You can create an image by capturing it from the XWindow screen using Image.capture. This method can capture the root window, a window identified by name or ID number, or perform an interactive capture whereby you designate the desired window by clicking it or by drawing a rectangle on the screen with your mouse.

Both the Image class and the ImageList class have write methods. Both accept a single argument, the name of the file to be written. Image#write simply writes the image to a file. Like the Image#read method, write yields to an optional block that you can use to set parameters that control how the image is written.

If an ImageList object contains only one image, then ImageList#write is the same as Image#write. However, if the imagelist contains multiple images and the file format (determined by the file name extension, as I mentioned earlier) supports multi-frame images, Image#write will automatically create a multi-frame image file.

For example, the following program reads three GIF files and then uses ImageList#write to combine all the images in those files (remember, each input file can contain multiple images) into one animated GIF file.

#! /usr/local/bin/ruby -w
require 'RMagick'
anim = ImageList.new("start.gif", "middle.gif", "finish.gif")
anim.write("animated.gif")
exit

Displaying images

RMagick defines 3 methods for displaying images and imagelists. Both the Image class and the ImageList class have a display method. The Image#display method displays the image on the default X Window screen. For imagelists with just one image, ImageList#display is identical to Image#display. However, if the imagelist contains multiple images, ImageList#display displays each of the images in turn. With both methods, right-clicking the display window will produce a menu of other options.

The ImageList#animate method repeatedly cycles through all the images in an imagelist, displaying each one in turn. You can control the speed of the animation with the ImageList#delay= method.

Examining and modifying images

Once you've created an image or imagelist, what can you do with it? The Image and ImageList classes define over 100 methods for examining and modifying images, both individually and in groups. Remember, unless the ImageList class defines a method with the same name, you can send any method defined in the Image class to an instance of the ImageList class. The ImageList class sends the method to the current image and returns the result.

The methods can be classified into the following broad groups. ImageList method descriptions look like this. Some of the listed methods are not available in some releases of ImageMagick. See the method documentation for details.

Utility methods

<=>
Compare 2 images
<=>
Compare 2 imagelists
[ ]
Reference an image property
[ ]=
Set an image property
add_profile
Add an ICC, IPTC, or generic profile
changed?
Has the image been changed?
channel
Extract a color channel from the image
compare_channel
Compare one or more channels between two images
channel_depth
Return the depth of the specified channel or channels
channel_extrema
Return the maximum and minimum intensity values for one or more channels in the image
check_destroyed
Raise an exception if the image has been destroyed
clone
Return a shallow copy of the image
clone
Return a shallow copy of the imagelist
color_histogram
Count the number of times each unique color appears in the image
combine
Combines the grayscale value of the pixels in each image to form a new image.
copy
Return a deep copy of the image
copy
Return a deep copy of the imagelist
delete_profile
Delete an ICC, IPTC, or generic profile
destroy!
Return all memory associated with the image to the system
destroyed?
Has the image has been destroyed?
difference
Compute the difference between two images
distortion_channel
Compare one or more channels to a reconstructed image
dup
Return a shallow copy of the image
dup
Return a shallow copy of the imagelist
each_pixel
Iterate over all the pixels in the image
each_profile
Iterate over all the profiles associated with the image
export_pixels
Extract pixel data from the image into an array
export_pixels_to_str
Extract pixel data from the image into a string
find_similar_region
Search for a rectangle matching the target
get_exif_by_entry, get_exif_by_number
Get one or more EXIF property values for the image
get_pixels
Copy a region of pixels from the image
gray?
Are all the pixels in the image gray?
histogram?
Does the image have <= 1024 unique colors??
import_pixels
Replace pixels in the image with pixel data from an array
monochrome?
Are all the pixels in the image either black or white?
opaque?
Are all the pixels in the image opaque?
palette?
Is the image a PseudoClass type image with 256 colors or less?
preview
Show the effect of a transformation method on the image
profile!
Add or remove an ICM, IPTC, or generic profile from the image
properties
Iterate over all the properties associated with the image
separate
Construct a grayscale image for each channel specified
set_channel_depth
Set the specified channel's depth
signature
Compute the 64-byte message signature for the image
store_pixels
Replace a region of pixels in the image
strip!
Strip the image of all comments and profiles
sync_profiles
Synchronize the image properties with the image profiles
unique_colors
Construct an image from the unique colors
view
Access pixels by their coordinates.

Reduce the number of colors

compress_colormap!
Remove duplicate or unused entries in the image's colormap
ordered_dither
Dither the image to a predefined pattern
posterize
Reduce the number of colors for a "poster" effect
quantize
Choose a fixed number of colors to represent the image
quantize
Choose a fixed number of colors to represent all the images in the imagelist
remap
Change the colors in the image to the colors in a reference image.
remap
Change the images in the imagelist to use a common color map.

Resize

change_geometry
Compute a new constrained size for the image
liquid_rescale
Rescale image with seam-carving
magnify
Double the size of the image
minify
Halve the size of the image
resample
Resample the image to the specified horizontal and vertical resolution
resize
Resize the image using a filter
resize_to_fill
Resize and crop while retaining the aspect ratio
resize_to_fit
Resize the image retaining the aspect ratio
sample
Resize the image using pixel sampling
scale
Resize the image
thumbnail
Quickly create a thumbnail of the image

Change colors or opacity

color_fill_to_border
Change the color of neighboring pixels. Stop at the image's border color.
color_floodfill
Change the color of neighboring pixels that are the same color
colormap
Get or set a color in the image's colormap
color_point
Change the color of a single pixel in the image
color_reset!
Set the entire image to a single color
cycle_colormap
Displace the image's colormap
erase!
Set the entire image to a single color
matte_fill_to_border
Make transparent neighboring pixels. Stop at the image's border color.
matte_floodfill
Make transparent neighboring pixels that are the same color
matte_point
Make a single pixel transparent
matte_reset!
Make the entire image transparent
opaque, opaque_channel
Change all pixels from the specified color to a new color
pixel_color
Get or set the color of a single pixel
splice
Splice a solid color into the image.
texture_fill_to_border
Replace neighbor pixels with pixels from a texture image. Stop at the image's border color.
texture_floodfill
Replace neighboring pixels that are the same color with pixels from a texture image
paint_transparent, transparent
Change the opacity value of pixels having the specified color
transparent_chroma
Change the opacity value of pixels within the specified range

Rotate, flip, or shear

affine_transform
Transform the image as dictated by an affine matrix
auto_orient
Rotate or flip the image using the EXIF orientation tag
deskew
Straighten the image
flip
Create a vertical mirror image
flop
Create a horizontal mirror image
rotate
Rotate the image by the specified angle
shear
Shear the image along the X or Y axis, creating a parallelogram
transpose
Create a horizontal mirror image
transverse
Create a vertical mirror image

Composite

add_compose_mask
Add a mask to the background image in a composite operation
average
Average all the images in the imagelist into a single image
blend
Blend two images together
composite
Composite a source image onto the image
composite_affine
Composite a source image onto the image as dictated by an affine matrix
composite_layers
Composite two imagelists
composite_mathematics
Merge a source image onto the image according to a formula.
composite_tiled
Composite multiple copies of an image over another image
delete_compose_mask
Delete a compose mask
displace
Distort the image using a displacement map
dissolve
Dissolve two images into each other
extent
Extend or crop the image over the background color.
watermark
Composite a watermark onto the image

Transform

append
Append all the images in the imagelist into a single image
chop
Chop a region from the image
coalesce
Merge successive images in the imagelist into a new imagelist
crop
Extract a region from the image
decipher
Convert enciphered pixels to plain pixels
deconstruct
Construct a new imagelist containing images that include only the changed pixels between each image and its successor
distort
Distort the image
encipher
Encipher plain pixels
excerpt
Excerpt a rectangle from the image
flatten_images
Merge all the images in the imagelist into a single image
mosaic
Inlay all the images in the imagelist into a single image
optimize_layers
Optimize or compare image layers
resize_to_fill
Resize and crop while retaining the aspect ratio
roll
Offset the image
shave
Shave regions from the edges of the image
trim
Remove borders from the edges of the image

Enhance

clut_channel
Replace the channel values in the image with a lookup of its replacement value in an LUT gradient image.
contrast
Enhance the intensity differences between the lighter and darker elements in the image
contrast_stretch_channel
Improve the contrast in the image by stretching the range of intensity values
despeckle
Reduce the speckle noise in the image
enhance
Apply a digital filter that improves the quality of a noisy image
equalize, equalize_channel
Apply a histogram equalization to the image
function_channel
Apply a function to selected channel values
fx
Apply a mathematical expression to an image
auto_gamma_channel, gamma_correct, gamma_channel
Gamma correct the image
auto_level_channel, level, level_channel, level_colors, levelize_channel
Adjust the levels of one or more channels in the image
linear_stretch
Stretch with saturation the image contrast
median_filter
Apply a digital filter that improves the quality of a noisy image
modulate
Change the brightness, saturation, or hue of the image
negate, negate_channel
Negate the colors of the image
normalize, normalize_channel
Enhance the contrast of the image
quantum_operator
Performs an integer arithmetic operation on selected channels values
reduce_noise
Smooth the contours of an image while still preserving edge information
adaptive_sharpen, adaptive_sharpen_channel, sharpen, sharpen_channel, unsharp_mask, unsharp_mask_channel
Sharpen the image
sigmoidal_contrast_channel
Adjusts the contrast of an image channel with a non-linear sigmoidal contrast algorithm

Add effects

adaptive_threshold
Threshold an image whose global intensity histogram doesn't contain distinctive peaks
add_noise, add_noise_channel
Add random noise
bilevel_channel
Change the value of individual image pixels based on the intensity of each pixel channel
black_threshold
Force all pixels below the threshold into black
blue_shift
Simulate a scene at nighttime in the moonlight
adaptive_blur, adaptive_blur_channel, blur_image, blur_channel, gaussian_blur, gaussian_blur_channel, motion_blur, radial_blur, radial_blur_channel, selective_blur_channel
Blur the image
colorize
Blend the fill color with each pixel in the image
convolve, convolve_channel
Apply a custom convolution kernel to the image
segment
Segment an image by analyzing the histograms of the color components and identifying units that are homogeneous with the fuzzy c-means technique
random_threshold_channel
Change the value of individual pixels based on the intensity of each pixel compared to a random threshold.
recolor
translate, scale, shear, or rotate the image colors
threshold
Change the value of individual pixels based on the intensity of each pixel compared to threshold
white_threshold
Force all pixels above the threshold into white

Add special effects

charcoal
Add a charcoal effect
edge
Find edges in the image
emboss
Add a three-dimensional effect
implode
Implode or explode the center pixels in the image
morph
Transform each image in the imagelist to the next in sequence by creating intermediate images
oil_paint
Add an oil paint effect
polaroid
Simulate a Polaroid® instant picture
sepiatone
Applies an effect similar to the effect achieved in a photo darkroom by sepia toning.
shade
Shine a distant light on an image to create a three-dimensional effect
shadow
Add a shadow to an image
sketch
Simulate a pencil sketch
solarize
Apply a special effect to the image, similar to the effect achieved in a photo darkroom by selectively exposing areas of photo sensitive paper to light
spread
Randomly displace each pixel in a block
stegano
Hide a digital watermark within the image
stereo
Combine two images into a single image that is the composite of a left and right image of a stereo pair
swirl
Swirl the pixels about the center of the image
vignette
Soften the edges of the image to create a vignette
wave
Add a ripple effect to the image
wet_floor
Create a "wet floor" reflection of the image

Decorate

border
Surround the image with a solid-colored border
frame
Add a simulated three-dimensional border around the image
raise
Create a simulated three-dimensional button-like effect by lightening and darkening the edges of the image

Create thumbnail montages

montage
Tile image thumbnails across a canvas

Create image blobs

from_blob
Create an image from a BLOB
from_blob
Create an imagelist from one or more BLOBs
to_blob
Construct a BLOB from an image
to_blob
Construct a BLOB from all the images in the imagelist

Marshaling images

ImageList, Image, Draw, and Pixel objects are marshaled using custom serialization methods. Images are marshaled with ImageMagick's Binary Large OBject functions ImageToBlob (for dumping) and BlobToImage (for loading).

Notes

  1. Some image formats cannot be dumped. The only way to be sure it will work is to try it.
  2. Images in lossy formats, such as JPEG, will have a different signature after being reconstituted and therefore will not compare equal (using <=>) to the original image.
  3. Image metadata may be changed by marshaling.

Drawing on and adding text to images

The Draw class is the third major class in the Magick module. This class defines two kinds of methods, drawing methods and annotation methods.

Drawing

ImageMagick supports a set of 2D drawing commands that are very similar to the commands and elements defined by the W3C's Scalable Vector Graphics (SVG) 1.1 Specification. In RMagick, each command (called a primitive) is implemented as a method in the Draw class. To draw on an image, simply

  1. Create an instance of the Draw class.
  2. Call one or more primitive methods with the appropriate arguments.
  3. Call the draw method.

The primitive methods do not draw anything directly. When you call a primitive method, you are simply adding the primitive and its arguments to a list of primitives stored in the Draw object. To "execute" the primitive list, call draw. Drawing the primitives does not destroy them. You can draw on another image by calling draw again, specifying a different image as the "canvas." Of course you can also draw on an image with multiple Draw objects, too. The canvas can be any image or imagelist, created by reading an image file or from scratch using ImageList#new_image or Image.new. (If you pass an imagelist object to draw, it draws on the current image.)

Drawing coordinate system

Here's an illustration of the default drawing coordinate system. The origin is in the top left corner. The x axis extends to the right. The y axis extends downward. The units are pixels. 0° is at 3 o'clock and rotation is clockwise. The units of rotation are usually degrees.3

You can change the default coordinate system by specifying a scaling, rotation, or translation transformation.

(Click the image to see the Ruby program that created it.)

RMagick's primitive methods include methods for drawing points, lines, Bezier curves, shapes such as ellipses and rectangles, and text. Shapes and lines have a fill color and a stroke color. Shapes are filled with the fill color unless the fill opacity is 0. Similarly, shapes are stroked with the stroke color unless the stroke opacity is 0. Text is considered a shape and is stroked and filled. Other rendering properties you can set include the stroke width, antialiasing, stroke patterns, and fill patterns.

As an example, here's the section of the Ruby program that created the circle in the center of the above image.

 1. !# /usr/local/bin/ruby -w
 2. require 'RMagick'
 3.
 4. canvas = Magick::ImageList.new
 5. canvas.new_image(250, 250, Magick::HatchFill.new('white', 'gray90'))
 6.
 7. circle = Magick::Draw.new
 8. circle.stroke('tomato')
 9. circle.fill_opacity(0)
10. circle.stroke_opacity(0.75)
11. circle.stroke_width(6)
12. circle.stroke_linecap('round')
13. circle.stroke_linejoin('round')
14. circle.ellipse(canvas.rows/2,canvas.columns/2, 80, 80, 0, 315)
15. circle.polyline(180,70, 173,78, 190,78, 191,62)
16. circle.draw(canvas)

The statements on lines 4 and 5 create the drawing canvas with a single 250x250 image. The HatchFill object fills the image with light-gray lines 10 pixels apart. The statement on line 7 creates a Draw object. The method calls on lines 8-15 construct a list of primitives that are "executed" by the draw method call on line 16.

The stroke method sets the stroke color, as seen on line 8. Normally, shapes are filled (opacity = 1.0), but the call to fill_opacity on line 9 sets the opacity to 0, so the background will show through the circle. Similarly, the stroke lines are normally opaque, but the tomato-colored stroke line in this example is made slightly transparent by the call to stroke_opacity on line 10. The method calls on lines 11 through 13 set the stroke width and specify the appearance of the line ends and corners.

The ellipse method call on line 14 describes an circle in the center of the canvas with a radius of 80 pixels. The ellipse occupies 315° of a circle, starting at 0° (that is, 3 o'clock). The polyline call on line 15 adds the arrowhead to the circle. The arguments (always an even number) are the x- and y-coordinates of the points the line passes through.

Finally, the draw method on line 16 identifies the canvas to be drawn on and executes the stored primitives.

Annotation

The annotate method draws text on an image. In its simplest form, annotate requires only arguments that describe where to draw the text and the text string.

Most of the time, you'll want to specify text properties such as the font, its size, font styles such as italic, font weights such as bold, the fill and stroke color, etc. The Draw class defines attribute writers for this purpose. You can set the desired text properties by calling the attribute writers before calling annotate, or you can call them in an image block associated with the annotate call.

The following example shows how to use annotate to produce this image.

annotate example
 1.   #! /usr/local/bin/ruby -w
 2.   require 'RMagick'
 3.
 4.   # Demonstrate the annotate method
 5.
 6.   Text = 'RMagick'
 7.
 8.   granite = Magick::ImageList.new('granite:')
 9.   canvas = Magick::ImageList.new
10.   canvas.new_image(300, 100, Magick::TextureFill.new(granite))
11.
12.   text = Magick::Draw.new
13.   text.font_family = 'helvetica'
14.   text.pointsize = 52
15.   text.gravity = Magick::CenterGravity
16.
17.   text.annotate(canvas, 0,0,2,2, Text) {
18.      self.fill = 'gray83'
19.   }
20.
21.   text.annotate(canvas, 0,0,-1.5,-1.5, Text) {
22.      self.fill = 'gray40'
23.   }
24.
25.   text.annotate(canvas, 0,0,0,0, Text) {
26.      self.fill = 'darkred'
27.   }
28.
29.   canvas.write('rubyname.gif')
30.   exit

This program uses three calls to annotate to produce the "etched" appearance. All three calls have some parameters in common but the fill color and location are different.

First, the statements in lines 8-10 create the background. See Fill classes for information about the TextureFill class. The "granite:" image format is one of ImageMagick's built-in image formats. See "Built-in image formats" for more information. The statement on line 12 creates the Draw object that does the annotation. The next 3 lines set the values of the attributes that are common to all 3 annotate calls.

The first annotate argument is the image on which the text will be drawn. Arguments 2-5, width, height, x, and y, describe a rectangle about which the text is drawn. This rectangle, combined with the value of gravity, define the position of the text. When the gravity value is CenterGravity the values of width and height are unused.

The first call to annotate, on lines 17-19, draws the text 2 pixels to the right and down from the center. The self.fill = 'gray83' statement sets the text color to light gray. The second call to annotate, on lines 21-22, draws dark gray text 1.5 pixels to the left and up from the center. The last call, on lines 25-27, draws the text a third time, in dark red, exactly in the center of the image.

Where to go from here

The next section, "ImageMagick Conventions," describes some conventions that you need to know, such as how ImageMagick determines the graphic format of an image file, etc. The ImageMagick (www.imagemagick.org) web site (from which much of the information in these pages has been taken) offers a lot of detail about ImageMagick. While this web sites doesn't describe RMagick, you can often use the documentation to learn more about a RMagick method by reading about the Magick API the method calls. (In the Reference section of this document, most of the method descriptions include the name of the Magick API that the method calls.) Check out the example programs. Almost every one of the methods is demonstrated in one of the examples.

Good luck!

Footnotes

1The display and animate methods do not work on MS Windows. You will have to write the image to a file and view it with a separate image viewer.

2If you installed RMagick using Rubygems you must set up the RubyGems environment before using RMagick. You can do one of

  1. add the require 'rubygems' statement to your program
  2. use the -rubygems command line option
  3. add rubygems to the RUBYOPT environment variable

See the RubyGems doc for more information.

3The rotation attributes rx and ry in the AffineMatrix class use radians instead of degrees.

rmagick-2.13.2/doc/imageattrs.html0000644000004100000410000012540312147515547017057 0ustar www-datawww-data RMagick 2.13.2: class Image (attribute methods)

class Image < Object (attribute methods)
mixes in Comparable

attribute methods

background_color

img.background_color -> string
img.background_color = string or pixel

Description

The image's background color. By default the background color is "white".

Argument

Either a color name or a Pixel object.

Returns

A color name.

base_columns

img.base_columns -> integer

Description

The number of columns in the image before any transformations. Get-only.

base_filename

img.base_filename -> string

Description

The image's original filename before any transformations. Get-only.

base_rows

img.base_rows -> integer

Description

The number of rows in the image before any transformations. Get-only.

bias

img.bias -> float
img.bias = float
img.bias = string

Description

Add bias when convolving an image

Argument

Either a number between 0.0 and 1.0 or a string in the form "NN%".

black_point_compensation

img.black_point_compensation -> true or false
img.black_point_compensation = true or false -> self

Description

Use black point compensation. Typically used in CMYK-to-RGB conversion along with image.rendering_intent=Magick::RelativeIntent

blur

img.blur -> float
img.blur = float

Description

The blur factor to use when resizing. See resize.

Argument

> 1.0 is blurry, < 1.0 is sharp.

border_color

img.border_color -> string
img.border_color = string or pixel

Description

The image's border color. The default border color is "#dfdfdf" (gray).

Argument

Either a color name or a Pixel object.

Returns

A color name.

chromaticity

img.chromaticity -> chromaticity
img.chromaticity = chromaticity

Description

The red, green, blue, and white-point chromaticity values..

Argument

A Chromaticity object.

Returns

A Chromaticity object.

class_type

img.class_type -> storage_class
img.class_type = storage_class

Description

The image's storage class. If DirectClass then the pixels contain valid RGB or CMYK colors. If PseudoClass then the image has a colormap referenced by the pixel's index member.

Argument

A ClassType constant.

Returns

A ClassType constant.

color_profile

img.color_profile -> string
img.color_profile = string

Description

The ICC color profile.

Argument

A color profile is represented as a string. If the argument is nil instead of string then any ICC color profile present in the image is deleted.

The setter form of this attribute deletes any existing ICC color profile(s) before adding the new one. If you need to add both source and destination profiles use add_profile or profile!.

Returns

The current color profile, or nil if there is no profile.

See also

add_profile, delete_profile, each_profile, profile!

colors

img.colors -> integer

Description

The number of colors in the colormap. Only meaningful for PseudoClass images. Get-only.

colorspace

img.colorspace -> colorspace
img.colorspace = colorspace

Description

Image pixel interpretation. If the colorspace is RGBColorspace the pixels are red, green, blue. If matte is true, then red, green, blue, and opacity. If it is CMYKColorspace, the pixels are cyan, yellow, magenta, black. Otherwise the colorspace is ignored.

Argument

A ColorspaceType constant.

Returns

A ColorspaceType constant.

columns

img.columns -> integer

Description

The width of the image in pixels. Get-only.

compose

img.compose -> operator
img.compose = operator

Description

The image composite operator. The default is OverCompositeOp. See montage.

Argument

A composite operator constant.

Returns

A composite operator constant.

compression

img.compression -> type
img.compression = type

Description

The image compression type. The default is the compression type of the specified image file.

Argument

A CompressionType constant.

Returns

A CompressionType constant.

delay

img.delay -> integer
img.delay = integer

Description

Number of ticks which must expire before displaying the next image in an animated sequence. The default number of ticks is 0. By default there are 100 ticks per second but this number can be changed via the ticks_per_second attribute.

Argument

An integer value between 0 and 65535, inclusive.

Returns

The current delay value.

density

img.density -> string
img.density = string or geometry

Description

The vertical and horizontal resolution in pixels of the image. The default is "72x72".

Argument

The density may be expressed either as a string or a Geometry object. If a string, it is in the form "XxY", or simply "X". If "Y" is omitted it is set to "X". To specify the density with a Geometry object, set the width attribute to the x resolution and the height argument to the y resolution. If height is nil, width will be used as the y resolution as well.

Returns

The image density represented as a string.

See also

Also see x_resolution and y_resolution.

depth

img.depth -> integer

Description

The image depth (8, 16, or 32). Get-only.

directory

img.directory -> string

Description

Tile names from within an image montage. Only valid after calling montage or reading a MIFF file which contains a directory. Get-only.

Returns

A newline ("\n")-delimited list of the images in the montage.

dispose

img.dispose -> method
img.dispose = method

Description

GIF disposal method. This attribute is used to control how successive images are rendered (how the preceding image is disposed of) when creating a GIF animation.

Argument

An integer corresponding to the disposal method.

Returns

A DisposeType constant.

extract_info

img.extract_info -> rectangle
img.extract_info = rectangle

Description

Specify a rectangle within an image, or retrieve the rectangle specified when the image was constituted. See extract=.

Argument

A Rectangle object.

Returns

A Rectangle object.

filename

img.filename -> string

Description

The image filename. Get-only.

filesize

img.filesize -> integer

Description

The image filesize in bytes. Get-only.

filter

img.filter -> type
img.filter = type

Description

Filter to use when resizing image. The reduction filter employed has a significant effect on the time required to resize an image and the resulting quality. The default filter is Lanczos which has been shown to produce high quality results when reducing most images.

Argument

A FilterTypes constant.

Returns

A FilterTypes constant.

format

img.format -> string
img.format = string

Description

The image encoding format. For example, "GIF" or "PNG". See formats.

Argument

The format name.

Returns

The format name.

fuzz

img.fuzz -> float
img.fuzz = integer or string

Description

Colors within this distance are considered equal. A number of algorithms search for a target color. By default the color must be exact. Use this [attribute] to match colors that are close to the target color in RGB space.

See opaque, texture_floodfill, and transparent.

Argument

The argument may be a floating-point numeric value or a string in the form "NN%". In the second case, the argument is computed as a percentage of QuantumRange. For example, a value of '5%' sets fuzz to 0.05*QuantumRange.

Returns

A Float

gamma

img.gamma -> float
image.gamma = float

Description

Gamma level of the image. The same color image displayed on two different workstations may look different due to differences in the display monitor. Use gamma correction to adjust for this color difference.

geometry

img.geometry -> string
img.geometry = string or geometry

Description

Preferred size of the image when encoding.

Argument

A geometry string or a Geometry object.

Returns

A geometry string.

gravity

img.gravity -> gravity
img.gravity = gravity

Description

Used with the ImageList#composite_layers method. The direction that the image gravitates within the composite.

Argument

A GravityType value.

Returns

A GravityType value.

image_type

img.image_type -> type
img.image_type = type

Description

The image type classification. For example, GrayscaleType. Don't confuse this attribute with the format, that is "GIF" or "JPG". Get-only.

Argument

An ImageType value.

Returns

An ImageType value.

interlace

img.interlace -> type
img.interlace = type

Description

The type of interlacing scheme (default NoInterlace). This option is used to specify the type of interlacing scheme for raw image formats such as RGB or YUV. NoInterlace means do not interlace, LineInterlace uses scanline interlacing, and PlaneInterlace uses plane interlacing. PartitionInterlace is like PlaneInterlace except the different planes are saved to individual files (e.g. image.R, image.G, and image.B). Use LineInterlace or PlaneInterlace to create an interlaced GIF or progressive JPEG image.

Argument

An InterlaceType constant.

Returns

An InterlaceType constant.

iptc_profile

img.iptc_profile -> string
img.iptc_profile = string

Description

The International Press Telecommunications Council profile.

Argument

A IPTC profile is represented as a string. If the argument is nil instead of string then any IPTC profile present in the image is deleted.

Returns

The current IPTC profile, or nil if there is no profile.

See also

add_profile, delete_profile, each_profile. profile!

matte

img.matte -> true or false
img.matte = true or false

Description

If true, honor the opacity values in the image pixels. See Pixel.

This attribute is deprecated in ImageMagick 6.3.5 and later. Use alpha instead.

mean_error_per_pixel

img.mean_error_per_pixel -> float

Description

The mean error per pixel computed when a image is color reduced. This attribute is only valid if the measure_error argument to quantize[ImageList][Image] is set to true. Get-only.

mime_type

img.mime_type -> string

Description

Returns the officially registered (or de facto) MIME media-type. If there is no registered media-type, returns "image/x-magick". Get-only.

monitor

img.monitor = proc

Description

Establish a progress monitor. Most Image and ImageList methods will periodically call the monitor with arguments indicating the progress of the method. The argument is a Proc object that accepts the three arguments listed here:

method_name
The name of the monitored method.
quantum
A number between 0 and span that identifies how much of the operation has been completed (or, in some cases, remains to be completed).
span
The number of quanta needed to complete the operation.

If the monitor proc returns nil or false the operation will be immediately terminated. To stop monitoring, set monitor to nil. Set-only.

Argument

Any object that can respond to

    obj.call(method_name, quantum, span)

With very large images it is possible, though not very likely, for the quantum and span arguments to be Bignum objects.

Example

img.monitor = Proc.new do |method, offset, span|
    printf("%s is %3.0f%% complete.\n", method, (offset.to_f/span)*100)
    true
    end

img.blur_image(0,20)

produces:

blur_image is   0% complete.
blur_image is   0% complete.
blur_image is   0% complete.
blur_image is   1% complete.
blur_image is   2% complete.
blur_image is   4% complete.
blur_image is   7% complete.
blur_image is  14% complete.
blur_image is  28% complete.
blur_image is  56% complete.
blur_image is  56% complete.
blur_image is  56% complete.
blur_image is  56% complete.
blur_image is  57% complete.
blur_image is  59% complete.
blur_image is  63% complete.
blur_image is  70% complete.
blur_image is  84% complete.
blur_image is 100% complete.

See also

Image::Info#monitor=

montage

img.montage -> string

Description

Tile size and offset within an image montage. Only valid for [images produced by montage.] The string is in the form of a geometry string. Get-only.

normalized_mean_error

img.normalized_mean_error -> float

Description

The normalized mean error computed when an image is color reduced. This attribute is only valid if the measure_error argument to quantize[ImageList][Image] is set to true. Get-only.

normalized_maximum_error

img.normalized_maximum_error -> float

Description

The normalized mean error per pixel computed when an image is color reduced. This attribute is only valid if the measure_error argument to quantize[ImageList][Image] is set to true. Get-only.

number_colors

img.number_colors -> integer

Description

Number of unique colors in the image. Get-only.

offset

img.offset -> integer
img.offset = integer

Description

Number of initial bytes to skip over when reading raw image.

opacity

img.opacity = integer

Description

Attenuates the opacity channel of an image. If the image pixels are opaque, they are set to the specified opacity level. Otherwise, the pixel opacity values are blended with the supplied transparency value. Set-only.

Argument

A number between 0 and QuantumRange. Higher numbers increase transparency.

orientation

img.orientation -> type
img.orientation = type

Description

The value of the Exif Orientation Tag.

Returns

An OrientationType value.

Notes

See http://jpegclub.org/exif_orientation.html for more information about the Exif Orientation Tag.

page

img.page -> rectangle
img.page = rectangle

Description

When compositing, this attribute describes the position of this image with respect to the underlying image. See coalesce, flatten_images, and mosaic.

Argument

A Rectangle object.

Returns

A Rectangle object.

pixel_interpolation_method

img.pixel_interpolation_method -> method
img.pixel_interpolation_method = method

Description

Get/set the pixel color interpolation method. Some methods (such as wave, swirl, implode, and composite) use the pixel color interpolation method to determine how to blend adjacent pixels.

Argument

An InterpolatePixelMethod enum value.

Returns

An InterpolatePixelMethod enum value.

quality

img.quality -> integer

Description

For JPEG images, returns the Independent JPEG Group quality value. This number is a measurement of the amount of compression used when the image was saved. Lower numbers mean higher compression.

Returns

A number between 0-100.

Notes

For more information, see The JPEG image compression FAQ.

quantum_depth

img.quantum_depth -> integer

Description

The image depth to the nearest Quantum (8, 16, or 32). Get-only.

rendering_intent

img.rendering_intent -> type
img.rendering_intent = type

Description

The type of rendering intent. See http://www.cambridgeincolour.com/tutorials/color-space-conversion.htm

Argument

A RenderingIntent constant.

Returns

A RenderingIntent constant.

rows

img.rows -> integer

Description

The height of the image in pixels. Get-only.

scene

img.scene -> integer

Description

The scene number assigned to the image the last time the image was written to a multi-image image file. Don't confuse this attribute with ImageList's scene attribute, which denotes the image to which Image methods will be sent.

start_loop

img.start_loop -> true or false
img.start_loop = true or false

Description

Indicates the first image in an animation.

ticks_per_second

img.ticks_per_second -> integer
image.ticks_per_second = integer

Description

Gets/sets the number of ticks per second. This attribute is used in conjunction with the delay attribute to establish the amount of time that must elapse between frames in an animation.The default is 100.

Returns

The current number of ticks per second

total_colors

img.total_colors -> integer

Description

The number of colors in the image after quantization. Set by quantize [ImageList][Image] if the measure_error argument is true. Get-only.

total_ink_density

img.total_ink_density -> float

Description

The total ink density for a CMYK image. Total Ink Density (TID) is determined by adding the CMYK values in the darkest shadow area in an image. Get-only.

units

img.units -> type
img.units = type

Description

Units of image resolution.

Argument

A ResolutionType constant.

Returns

A ResolutionType constant.

See also

x_resolution, y_resolution

virtual_pixel_method

img.virtual_pixel_method -> method
img.virtual_pixel_method = method

Description

Specify how "virtual pixels" behave. Virtual pixels are pixels that are outside the boundaries of the image. Methods such as blur_image, sharpen, and wave use virtual pixels.

Argument

The virtual pixel method can be any one of the following VirtualPixelMethod constants:

EdgeVirtualPixelMethod
Extend the edge pixel toward infinity. This is the default.
MirrorVirtualPixelMethod
Mirror the image.
TileVirtualPixelMethod
Tile the image.
BackgroundVirtualPixelMethod
The area surrounding the image is the background color.
TransparentVirtualPixelMethod
The area surrounding the image is transparent blackness.
BlackVirtualPixelMethod
The area surrounding the image is black.
GrayVirtualPixelMethod
The area surrounding the image is gray.
WhiteVirtualPixelMethod
The area surrounding the image is white.
RandomVirtualPixelMethod
Choose a random pixel from the image.
DitherVirtualPixelMethod
use a dithered pattern to choose a pixel in a 32x32 neighborhood.
HorizontalTileVirtualPixelMethod
Horizontally tile the image
VerticalTileVirtualPixelMethod
Vertically tile the image
HorizontalTileEdgeVirtualPixelMethod
Horizontally tile the image and replicate the side edge pixels
VerticalTileEdgeVirtualPixelMethod
Vertically tile the image and replicate the side edge pixels
CheckerTileVirtualPixelMethod
Alternate squares with image and background color

Some of these values are not supported by older versions of ImageMagick. To see what values are available, enter the following code in irb:

Magick::VirtualPixelMethod.values {|v| puts v}

Returns

A VirtualPixelMethod constant.

Example

  img.virtual_pixel_method = Magick::TransparentVirtualPixelMethod

x_resolution

img.x_resolution -> float
img.x_resolution = float

Description

Horizontal resolution of the image.

See also

units

y_resolution

img.y_resolution -> float
img.y_resolution = float

Description

Vertical resolution of the image.

See also

units

 

rmagick-2.13.2/examples/0000755000004100000410000000000012147515547015075 5ustar www-datawww-datarmagick-2.13.2/examples/demo.rb0000644000004100000410000002167712147515547016363 0ustar www-datawww-data#!/usr/local/bin/ruby -w # # Simple demo program for RMagick # # Concept and algorithms lifted from Magick++ demo script written # by Bob Friesenhahn. # require 'RMagick' include Magick # # RMagick version of Magick++/demo/demo.cpp # Font = "Helvetica" begin puts "Read images..." model = ImageList.new("../doc/ex/images/model.miff") model.border_color = "black" model.background_color = "black" model.cur_image[:Label] = "RMagick" smile = ImageList.new("../doc/ex/images/smile.miff") smile.border_color = "black" smile.cur_image[:Label] = "Smile" # # Create image stack # puts "Creating thumbnails" # Construct an initial list containing five copies of a null # image. This will give us room to fit the logo at the top. # Notice I specify the width and height of the images via the # optional "size" attribute in the parm block associated with # the read method. There are two more examples of this, below. example = ImageList.new 5.times { example.read("NULL:black") { self.size = "70x70"} } puts " add noise..." example << model.add_noise(LaplacianNoise) example.cur_image[:Label] = "Add Noise" puts " annotate..." example << model.cur_image.copy example.cur_image[:Label] = "Annotate" draw = Draw.new draw.annotate(example, 0, 0, 0, 20, "RMagick") { self.pointsize = 18; self.font = Font; self.stroke = "gold" self.fill = "gold" self.gravity = NorthGravity } puts " blur..." example << model.blur_image(0.0, 1.5) example.cur_image[:Label] = "Blur" puts " border..." example << model.border(6, 6, "gold") example.cur_image[:Label] = "Border" puts " channel..." example << model.channel(RedChannel) example.cur_image[:Label] = "Channel" puts " charcoal..." example << model.charcoal example.cur_image[:Label] = "Charcoal" puts " composite..." example << model.composite(smile, 35, 65, OverCompositeOp) example.cur_image[:Label] = "Composite" puts " contrast..." example << model.contrast(false) example.cur_image[:Label] = "Contrast" puts " convolve..." kernel = [ 1, 1, 1, 1, 4, 1, 1, 1, 1 ] example << model.convolve(3, kernel) example.cur_image[:Label] = "Convolve" puts " crop..." example << model.crop(25, 50, 80, 80) example.cur_image[:Label] = "Crop" puts " despeckle..." example << model.despeckle example.cur_image[:Label] = "Despeckle" puts " draw..." example << model.cur_image.copy example.cur_image[:Label] = "Draw" gc = Draw.new gc.fill "black" gc.fill_opacity 0 gc.stroke "gold" gc.stroke_width 2 gc.circle 60,90, 60,120 gc.draw(example) puts " edge..." example << model.edge(0) example.cur_image[:Label] = "Detect Edges" puts " emboss..." example << model.emboss example.cur_image[:Label] = "Emboss" puts " equalize..." example << model.equalize example.cur_image[:Label] = "Equalize" puts " explode..." example << model.implode(-1) example.background_color = "#000000ff" example.cur_image[:Label] = "Explode" puts " flip..." example << model.flip example.cur_image[:Label] = "Flip" puts " flop..." example << model.flop example.cur_image[:Label] = "Flop" puts " frame..." example << model.frame example.cur_image[:Label] = "Frame" puts " gamma..." example << model.gamma_correct(1.6) example.cur_image[:Label] = "Gamma" puts " gaussian blur..." example << model.gaussian_blur(1, 1.5) example.cur_image[:Label] = "Gaussian Blur" # To add an Image in one of ImageMagick's built-in formats, # call the read method. The filename specifies the format and # any parameters it needs. The gradient format can be created in # any size. Specify the desired size by assigning it, in the form # "WxH", to the optional "size" attribute in the block associated # with the read method. Here we create a gradient image that is # the same size as the model image. puts " gradient..." example.read("gradient:#20a0ff-#ffff00") { self.size = Geometry.new(model.columns, model.rows) } example.cur_image[:Label] = "Gradient" puts " grayscale..." example << model.cur_image.quantize(256, GRAYColorspace) example.cur_image[:Label] = "Grayscale" puts " implode..." example << model.implode(0.5) example.cur_image[:Label] = "Implode" puts " median filter..." example << model.median_filter(0) example.cur_image[:Label] = "Median Filter" puts " modulate..." example << model.modulate(1.10, 1.10, 1.10) example.cur_image[:Label] = "Modulate" puts " monochrome..." example << model.cur_image.quantize(2, GRAYColorspace, false) example.cur_image[:Label] = "Monochrome" puts " negate..." example << model.negate example.cur_image[:Label] = "Negate" puts " normalize..." example << model.normalize example.cur_image[:Label] = "Normalize" puts " oil paint..." example << model.oil_paint(3.0) example.cur_image[:Label] = "Oil Paint" # The plasma format is very similar to the gradient format, above. puts " plasma..." example.read("plasma:fractal") { self.size = Geometry.new(model.columns, model.rows) } example.cur_image[:Label] = "Plasma" puts " quantize..." example << model.cur_image.quantize example.cur_image[:Label] = "Quantize" puts " raise..." example << model.raise example.cur_image[:Label] = "Raise" puts " reduce noise..." example << model.reduce_noise(3.0) example.cur_image[:Label] = "Reduce Noise" puts " resize..." example << model.resize(0.50) example.cur_image[:Label] = "Resize" puts " roll..." example << model.roll(20, 10) example.cur_image[:Label] = "Roll" puts " rotate..." example << model.rotate(45).transparent("black") example.cur_image[:Label] = "Rotate" puts " scale..." example << model.scale(0.60) example.cur_image[:Label] = "Scale" puts " segment..." example << model.segment example.cur_image[:Label] = "Segment" puts " shade..." example << model.shade(false, 30, 30) example.cur_image[:Label] = "Shade" puts " sharpen..." example << model.sharpen(0.0, 1.0) example.cur_image[:Label] = "Sharpen" puts " shave..." example << model.shave(10, 10) example.cur_image[:Label] = "Shave" puts " shear..." example << model.shear(45, 45).transparent("black") example.cur_image[:Label] = "Shear" puts " spread..." example << model.spread(3) example.cur_image[:Label] = "Spread" puts " solarize..." example << model.solarize(50.0) example.cur_image[:Label] = "Solarize" puts " swirl..." temp = model.copy temp.background_color = "#000000ff" example << temp.swirl(90) example.cur_image[:Label] = "Swirl" puts " unsharp mask..." example << model.unsharp_mask(0.0, 1.0, 1.0, 0.05) example.cur_image[:Label] = "Unsharp Mask" puts " wave..." temp = model.copy temp.cur_image[:Label] = "Wave" temp.matte = true temp.background_color = "#000000ff" example << temp.wave(25, 150) # # Create image montage - notice the optional # montage parameters are supplied via a block # puts "Montage images..." montage = example.montage { self.geometry = "130x194+10+5>" self.gravity = CenterGravity self.border_width = 1 rows = (example.size + 4) / 5 self.tile = Geometry.new(5,rows) self.compose = OverCompositeOp # Use the ImageMagick built-in "granite" format # as the background texture. # self.texture = Image.read("granite:").first self.background_color = "white" self.font = Font; self.pointsize = 18; self.fill = "#600" self.filename = "RMagick Demo" # self.shadow = true # self.frame = "20x20+4+4" } # Add the ImageMagick logo to the top of the montage. The "logo:" # format is a fixed-size image, so I don't need to specify a size. puts "Adding logo image..." logo = Image.read("logo:").first if /GraphicsMagick/.match Magick_version then logo.resize!(200.0/logo.rows) else logo.crop!(98, 0, 461, 455).resize!(0.45) end # Create a new Image for the composited montage and logo montage_image = ImageList.new montage_image << montage.composite(logo, 245, 0, OverCompositeOp) # Write the result to a file montage_image.compression = RLECompression montage_image.matte = false puts "Writing image ./rm_demo_out.miff" montage_image.write "rm_demo_out.miff" # Uncomment the following lines to display image to screen # puts "Displaying image..." # montage_image.display rescue puts "Caught exception: #{$!}" end exit rmagick-2.13.2/examples/constitute.rb0000644000004100000410000000040112147515547017616 0ustar www-datawww-data#! /usr/local/bin/ruby -w require 'RMagick' f = Magick::Image.read("../doc/ex/images/Flower_Hat.jpg").first pixels = f.dispatch(0,0,f.columns, f.rows, "RGB") image = Magick::Image.constitute(f.columns, f.rows, "RGB", pixels) image.write("constitute.miff") rmagick-2.13.2/examples/image_opacity.rb0000644000004100000410000000134012147515547020232 0ustar www-datawww-data # Ccreate a semi-transparent title for an image. require 'RMagick' include Magick puts <" if base_filename != filename puts filename + "\n" puts "\tFormat: #{format}\n" puts "\tGeometry: #{columns}x#{rows}\n" puts "\tClass: #{class_type.to_s}\n" puts "\tType: #{image_type.to_s}\n" puts "\tEndianess: #{endian}\n" puts "\tColorspace: #{colorspace}\n" puts "\tChannelDepth:\n" color_space = gray? ? Magick::GrayColorspace : colorspace case color_space when Magick::RGBColorspace puts "\t\tRed: #{channel_depth(Magick::RedChannel)}-bits\n" puts "\t\tGreen: #{channel_depth(Magick::GreenChannel)}-bits\n" puts "\t\tBlue: #{channel_depth(Magick::BlueChannel)}-bits\n" puts "\t\tOpacity: #{channel_depth(Magick::OpacityChannel)}-bits\n" if matte when Magick::CMYKColorspace puts "\t\tCyan : #{channel_depth(Magick::CyanChannel)}-bits\n" puts "\t\tMagenta: #{channel_depth(Magick::MagentaChannel)}-bits\n" puts "\t\tYellow: #{channel_depth(Magick::YellowChannel)}-bits\n" puts "\t\tBlack: #{channel_depth(Magick::BlackChannel)}-bits\n" puts "\t\tOpacity: #{channel_depth(Magick::OpacityChannel)}-bits\n" if matte when Magick::GrayColorspace puts "\t\tGray: #{channel_depth(Magick::GrayChannel)}-bits\n" puts "\t\tOpacity: #{channel_depth(Magick::OpacityChannel)}-bits\n" if matte end scale = Magick::QuantumRange / (Magick::QuantumRange >> (Magick::QuantumDepth-channel_depth)) puts "\tChannel statistics:\n" case color_space when Magick::RGBColorspace puts "\t\tRed:\n" puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::RedChannel)[0]/scale, channel_extrema(Magick::RedChannel)[0]/Magick::QuantumRange) puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::RedChannel)[1]/scale, channel_extrema(Magick::RedChannel)[1]/Magick::QuantumRange) puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::RedChannel)[0]/scale, channel_mean(Magick::RedChannel)[0]/Magick::QuantumRange) puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::RedChannel)[1]/scale, channel_mean(Magick::RedChannel)[1]/Magick::QuantumRange) puts "\t\tGreen:\n" puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::GreenChannel)[0]/scale, channel_extrema(Magick::GreenChannel)[0]/Magick::QuantumRange) puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::GreenChannel)[1]/scale, channel_extrema(Magick::GreenChannel)[1]/Magick::QuantumRange) puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::GreenChannel)[0]/scale, channel_mean(Magick::GreenChannel)[0]/Magick::QuantumRange) puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::GreenChannel)[1]/scale, channel_mean(Magick::GreenChannel)[1]/Magick::QuantumRange) puts "\t\tBlue:\n" puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::BlueChannel)[0]/scale, channel_extrema(Magick::BlueChannel)[0]/Magick::QuantumRange) puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::BlueChannel)[1]/scale, channel_extrema(Magick::BlueChannel)[1]/Magick::QuantumRange) puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::BlueChannel)[0]/scale, channel_mean(Magick::BlueChannel)[0]/Magick::QuantumRange) puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::BlueChannel)[1]/scale, channel_mean(Magick::BlueChannel)[1]/Magick::QuantumRange) when Magick::CMYKColorspace puts "\t\tCyan:\n" puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::CyanChannel)[0]/scale, channel_extrema(Magick::CyanChannel)[0]/Magick::QuantumRange) puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::CyanChannel)[1]/scale, channel_extrema(Magick::CyanChannel)[1]/Magick::QuantumRange) puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::CyanChannel)[0]/scale, channel_mean(Magick::CyanChannel)[0]/Magick::QuantumRange) puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::CyanChannel)[1]/scale, channel_mean(Magick::CyanChannel)[1]/Magick::QuantumRange) puts "\t\tMagenta:\n" puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::MagentaChannel)[0]/scale, channel_extrema(Magick::MagentaChannel)[0]/Magick::QuantumRange) puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::MagentaChannel)[1]/scale, channel_extrema(Magick::MagentaChannel)[1]/Magick::QuantumRange) puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::MagentaChannel)[0]/scale, channel_mean(Magick::MagentaChannel)[0]/Magick::QuantumRange) puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::MagentaChannel)[1]/scale, channel_mean(Magick::MagentaChannel)[1]/Magick::QuantumRange) puts "\t\tYellow:\n" puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::YellowChannel)[0]/scale, channel_extrema(Magick::YellowChannel)[0]/Magick::QuantumRange) puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::YellowChannel)[1]/scale, channel_extrema(Magick::YellowChannel)[1]/Magick::QuantumRange) puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::YellowChannel)[0]/scale, channel_mean(Magick::YellowChannel)[0]/Magick::QuantumRange) puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::YellowChannel)[1]/scale, channel_mean(Magick::YellowChannel)[1]/Magick::QuantumRange) puts "\t\tBlack:\n" puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::BlackChannel)[0]/scale, channel_extrema(Magick::BlackChannel)[0]/Magick::QuantumRange) puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::BlackChannel)[1]/scale, channel_extrema(Magick::BlackChannel)[1]/Magick::QuantumRange) puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::BlackChannel)[0]/scale, channel_mean(Magick::BlackChannel)[0]/Magick::QuantumRange) puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::BlackChannel)[1]/scale, channel_mean(Magick::BlackChannel)[1]/Magick::QuantumRange) when Magick::GrayColorspace puts "\t\tGray:\n" puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::GrayChannel)[0]/scale, channel_extrema(Magick::GrayChannel)[0]/Magick::QuantumRange) puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::GrayChannel)[1]/scale, channel_extrema(Magick::GrayChannel)[1]/Magick::QuantumRange) puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::GrayChannel)[0]/scale, channel_mean(Magick::GrayChannel)[0]/Magick::QuantumRange) puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::GrayChannel)[1]/scale, channel_mean(Magick::GrayChannel)[1]/Magick::QuantumRange) end if matte puts "\t\tOpacity:\n" puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::OpacityChannel)[0]/scale, channel_extrema(Magick::OpacityChannel)[0]/Magick::QuantumRange) puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::OpacityChannel)[1]/scale, channel_extrema(Magick::OpacityChannel)[1]/Magick::QuantumRange) puts "\t\t\tMean:" + sprintf("%u (%g)\n", channel_mean(Magick::OpacityChannel)[0]/scale, channel_mean(Magick::OpacityChannel)[0]/Magick::QuantumRange) puts "\t\t\tStandard deviation:" + sprintf("%u (%g)\n", channel_mean(Magick::OpacityChannel)[1]/scale, channel_mean(Magick::OpacityChannel)[1]/Magick::QuantumRange) end if class_type == Magick::DirectClass puts "\tColors: #{total_colors}\n" else if total_colors <= colors puts "\tColors: #{colors}\n" else puts "\tColors: #{total_colors}=>#{colors}\n" end end # Histogram goes here puts "\tMean error per pixel: #{mean_error_per_pixel}\n" if mean_error_per_pixel != 0.0 puts "\tNormalized mean error: #{normalized_mean_error}\n" if normalized_mean_error != 0.0 puts "\tNormalized maximum error: #{normalized_maximum_error}\n" if normalized_maximum_error != 0.0 puts "\tRendering-intent: #{rendering_intent.to_s}\n" puts "\tGamma: #{gamma}\n" if gamma != 0.0 chrom = chromaticity if chrom.red_primary.x != 0.0 || chrom.green_primary.x != 0.0 || chrom.blue_primary.x != 0.0 || chrom.white_point.x != 0.0 puts "\tChromaticity:\n" puts "\t\tred primary: (#{sprintf("%g,%g", chrom.red_primary.x, chrom.red_primary.y)})\n" puts "\t\tgreen primary: (#{sprintf("%g,%g", chrom.green_primary.x, chrom.green_primary.y)})\n" puts "\t\tblue primary: (#{sprintf("%g,%g", chrom.blue_primary.x, chrom.blue_primary.y)})\n" puts "\t\twhite point: (#{sprintf("%g,%g", chrom.white_point.x, chrom.white_point.y)})\n" end ex_info = extract_info if ex_info.width * ex_info.height != 0.0 puts "\tTile geometry: #{ex_info.width}x#{ex_info.height}+#{ex_info.x}+#{ex_info.y}\n" end if x_resolution != 0.0 && y_resolution != 0.0 puts "\tResolution: #{sprintf("%gx%g", x_resolution, y_resolution)}\n" end puts "\tUnits: #{units.to_s}\n" size = filesize if size >= 1048576 puts "\tFilesize: #{"%.1f" % (size/1048576.0)}mb\n" elsif size >= 1024 puts "\tFilesize: #{"%.0f" % (size/1024.0)}kb\n" else puts "\tFilesize: #{size}b\n" end puts "\tInterlace: #{interlace.to_s}\n" puts "\tBackground Color: #{background_color}\n" puts "\tBorder Color: #{border_color}\n" puts "\tMatte Color: #{matte_color}\n" pg = page if pg.width != 0 || pg.height != 0 || pg.x != 0 || pg.y != 0 puts "\tPage geometry: #{pg.width}x#{pg.height}+#{pg.x}+#{pg.y}\n" end puts "\tDispose: #{dispose.to_s}\n" puts "\tDelay: #{delay}\n" if delay != 0 puts "\tIterations: #{iterations}\n" unless iterations == 1 puts "\tScene: #{scene}\n" if scene != 0 puts "\tCompression: #{compression.to_s}\n" puts "\tQuality: #{quality}\n" unless quality == 0 puts "\tOrientation: #{orientation.to_s}\n" puts "\tMontage: #{montage}\n" if montage signature # compute but ignore - will be displayed along with the other properties properties.each do |prop, value| next if prop[0,1] == '[' puts "\t#{prop}: #{value}\n" end clip_path = self["8BIM:1999,2998:#1"] if clip_path puts "\tClipping path: #{clip_path}\n" end each_profile do |name, value| puts "\tProfile-#{name}: #{value.length}\n" if name == 'exif' exif_attrs = get_exif_by_entry exif_attrs.each do |attr| puts "\t\t#{attr[0]}: #{attr[1]}\n" end end end puts "\tTainted: True\n" if changed? puts "\tTainted: False\n" unless changed? puts "\tVersion: #{Magick::Version}\n" puts "\t #{Magick::Magick_version}\n" end end end if ARGV.length == 0 puts <<-'END_USAGE' This example displays information about the specified image file(s) that is similar to ImageMagick/GraphicsMagick's identify command. Usage: ruby identify.rb filename [filename...] END_USAGE exit end ilist = Magick::ImageList.new(*ARGV) ilist.each do |img| img.identify end exit rmagick-2.13.2/examples/import_export.rb0000644000004100000410000000142212147515547020334 0ustar www-datawww-data# # Demonstrate the export_pixels and import_pixels methods. # require 'RMagick' include Magick puts <= HISTOGRAM_ROWS - (red[x] * scale) red_column[y].red = QuantumRange red_column[y].green = 0 red_column[y].blue = 0 rgb_column[y].red = QuantumRange end if yf >= HISTOGRAM_ROWS - (green[x] * scale) green_column[y].green = QuantumRange green_column[y].red = 0 green_column[y].blue = 0 rgb_column[y].green = QuantumRange end if yf >= HISTOGRAM_ROWS - (blue[x] * scale) blue_column[y].blue = QuantumRange blue_column[y].red = 0 blue_column[y].green = 0 rgb_column[y].blue = QuantumRange end if yf >= HISTOGRAM_ROWS - (int[x] * scale) int_column[y].opacity = TransparentOpacity end end rgb_histogram.store_pixels( x, 0, 1, HISTOGRAM_ROWS, rgb_column) red_histogram.store_pixels( x, 0, 1, HISTOGRAM_ROWS, red_column) green_histogram.store_pixels(x, 0, 1, HISTOGRAM_ROWS, green_column) blue_histogram.store_pixels( x, 0, 1, HISTOGRAM_ROWS, blue_column) int_histogram.store_pixels( x, 0, 1, HISTOGRAM_ROWS, int_column) rgb_column.reset(bg) red_column.reset(bg) green_column.reset(bg) blue_column.reset(bg) int_column.reset(bg) end return red_histogram, green_histogram, blue_histogram, rgb_histogram, int_histogram end # Make the color histogram. Quantize the image to 256 colors if necessary. def color_hist(fg, bg) img = number_colors > 256 ? quantize(256) : self begin hist = img.color_histogram rescue NotImplementedError $stderr.puts "The color_histogram method is not supported by this version "+ "of ImageMagick/GraphicsMagick" else pixels = hist.keys.sort_by {|pixel| hist[pixel] } scale = HISTOGRAM_ROWS / (hist.values.max*AIR_FACTOR) histogram = Image.new(HISTOGRAM_COLS, HISTOGRAM_ROWS) { self.background_color = bg self.border_color = fg } x = 0 pixels.each do |pixel| column = Array.new(HISTOGRAM_ROWS).fill {Pixel.new} HISTOGRAM_ROWS.times do |y| if y >= HISTOGRAM_ROWS - (hist[pixel] * scale) column[y] = pixel; end end histogram.store_pixels(x, 0, 1, HISTOGRAM_ROWS, column) x = x.succ end histogram['Label'] = 'Color Frequency' return histogram end end # Use AnnotateImage to write the stats. def info_text(fg, bg) klass = class_type == DirectClass ? "DirectClass" : "PsuedoClass" text = <<-END_TEXT Format: #{format} Geometry: #{columns}x#{rows} Class: #{klass} Depth: #{depth} bits-per-pixel component Colors: #{number_colors} END_TEXT info = Image.new(HISTOGRAM_COLS, HISTOGRAM_ROWS) { self.background_color = bg self.border_color = fg } gc = Draw.new gc.annotate(info, 0, 0, 0, 0, text) { self.stroke = 'transparent' self.fill = fg self.gravity = CenterGravity } info['Label'] = 'Info' return info end def intensity_hist(int_histogram) gradient = (Image.read("gradient:#ffff80-#ff9000") { self.size="#{HISTOGRAM_COLS}x#{HISTOGRAM_ROWS}" }).first int_histogram = gradient.composite(int_histogram, CenterGravity, OverCompositeOp) int_histogram['Label'] = 'Intensity' return int_histogram end # Returns a value between 0 and MAX_QUANTUM. Same as the PixelIntensity macro. def pixel_intensity(pixel) (306*(pixel.red & MAX_QUANTUM) + 601*(pixel.green & MAX_QUANTUM) + 117*(pixel.blue & MAX_QUANTUM))/1024 end public # Create the histogram montage. def histogram(fg='white', bg='black') red = Array.new(HISTOGRAM_COLS, 0) green = Array.new(HISTOGRAM_COLS, 0) blue = Array.new(HISTOGRAM_COLS, 0) alpha = Array.new(HISTOGRAM_COLS, 0) int = Array.new(HISTOGRAM_COLS, 0) rows.times do |row| pixels = get_pixels(0, row, columns, 1) pixels.each do |pixel| red[pixel.red & MAX_QUANTUM] += 1 green[pixel.green & MAX_QUANTUM] += 1 blue[pixel.blue & MAX_QUANTUM] += 1 # Only count opacity channel if some pixels are not opaque. if !opaque? alpha[pixel.opacity & MAX_QUANTUM] += 1 end v = pixel_intensity(pixel) int[v] += 1 end end # Scale to chart size. When computing the scale, add some "air" between # the max frequency and the top of the histogram. This makes a prettier chart. # The RGBA and intensity histograms are all drawn to the same scale. max = [red.max, green.max, blue.max, alpha.max, int.max].max scale = HISTOGRAM_ROWS / (max*AIR_FACTOR) charts = ImageList.new # Add the thumbnail. thumb = copy thumb['Label'] = File.basename(filename) charts << thumb # Compute the channel and intensity histograms. channel_hists = channel_histograms(red, green, blue, int, scale, fg, bg) # Add the red, green, and blue histograms to the list charts << channel_hists.shift charts << channel_hists.shift charts << channel_hists.shift # Add Alpha channel or image stats if !opaque? charts << alpha_hist(alpha, scale, fg, bg) else charts << info_text(fg, bg) end # Add the RGB histogram charts << channel_hists.shift # Add the intensity histogram. charts << intensity_hist(channel_hists.shift) # Add the color frequency histogram. charts << color_hist(fg, bg) # Make a montage. histogram = charts.montage { self.background_color = bg self.stroke = 'transparent' self.fill = fg self.border_width = 1 self.tile = "4x2" self.geometry = "#{HISTOGRAM_COLS}x#{HISTOGRAM_ROWS}+10+10" } return histogram end end end puts < END_INFO # Get filename from command line. if !ARGV[0] then puts "No filename argument. Defaulting to Flower_Hat.jpg" filename = '../doc/ex/images/Flower_Hat.jpg' else filename = ARGV[0] end # Only process first frame if multi-frame image image = Magick::Image.read(filename) if image.length > 1 puts "Charting 1st image" end image = image.first # Give the user something to look at while we're working. name = File.basename(filename).sub(/\..*?$/,'') $defout.sync = true printf "Creating #{name}_Histogram.miff" timer = Thread.new do loop do sleep(1) printf "." end end # Generate the histograms histogram = image.histogram(Magick::Pixel.from_color('white'), Magick::Pixel.from_color('black')) # Write output file histogram.compression = Magick::ZipCompression histogram.write("./#{name}_Histogram.miff") Thread.kill(timer) puts "Done!" exit rmagick-2.13.2/examples/find_similar_region.rb0000644000004100000410000000202212147515547021421 0ustar www-datawww-datarequire 'RMagick' # The Image#find_similar_region searches for a region in the image # similar to the target. This example uses a rectangle from the image # as the target, assuring that find_similar_region will succeed. # Draw a red rectangle over the image that shows where the target matched. img = Magick::Image.read('../doc/ex/images/Flower_Hat.jpg').first target = img.crop(21, 94, 118, 126) begin res = img.find_similar_region(target) if res gc = Magick::Draw.new gc.stroke('red') gc.stroke_width(2) gc.fill('none') gc.rectangle(res[0], res[1], res[0]+target.columns, res[1]+target.rows) gc.draw(img) img.matte = false puts "Found similar region. Writing `find_similar_region.gif'..." img.write('find_similar_region.gif') else puts "No match!" end rescue NotImplementedError $stderr.puts <<-END_MSG The find_similar_region method is not supported by this version of ImageMagick/GraphicsMagick. END_MSG end exit rmagick-2.13.2/examples/pattern_fill.rb0000644000004100000410000000175412147515547020114 0ustar www-datawww-data # Demonstrate ImageMagick's new (5.5.7-3 and later) built-in patterns. # Create a Fill class that can be reused to fill in new Image backgrounds. # Usage: pattern_fill.rb # Try 'checkerboard' or 'verticalsaw' require 'RMagick' include Magick puts < 0 puts " Properties:" img.properties { |name,value| puts %Q| #{name} = "#{value}"| } end }rmagick-2.13.2/examples/thumbnail.rb0000644000004100000410000000353312147515547017411 0ustar www-datawww-datarequire 'RMagick' include Magick puts <> where `filename' is the name of an image file and `size' is the size of the thumbnail in pixels. The default size is 120 pixels. If you don't specify any arguments this script uses a default image. END_INFO DEFAULT_SIZE = 120 case ARGV.length when 2 size = ARGV[1].to_i image = ARGV[0] when 1 image = ARGV[0] size = DEFAULT_SIZE else size = DEFAULT_SIZE image = "../doc/ex/images/Flower_Hat.jpg" end geom = "#{size}x#{size}" # Read the image and resize it. The `change_geometry' method # computes the new image geometry and yields to a block. The # return value of the block is the return value of the method. img = Image.read(image)[0] img.change_geometry!(geom) { |cols, rows| img.thumbnail! cols, rows } # We need a background to display the thumbnail. # Create a square, neutral gray background with raised edges. # Make this background slightly larger than the image to allow # for the raised border. A 3-pixel raised edge means that the # background needs to be 6 pixels larger in each dimension. bg = Image.new(size+6, size+6) { self.background_color = "gray75" } bg = bg.raise(3,3) # Just for the purposes of this example, display the thumbnail background on # a larger white background. white_bg = Image.new(size+50, size+50) {self.background_color = "white"} white_bg = white_bg.composite(bg, CenterGravity, OverCompositeOp) # Finally, center the thumbnail on the gray background. thumbnail = white_bg.composite(img, CenterGravity, OverCompositeOp) thumbnail.write("thumbnail.gif") exit rmagick-2.13.2/rmagick.gemspec0000644000004100000410000000134312147515547016242 0ustar www-datawww-datarequire 'date' Gem::Specification.new do |s| s.name = %q{rmagick} s.version = "2.13.2" s.date = Date.today.to_s s.summary = %q{Ruby binding to ImageMagick} s.description = %q{RMagick is an interface between Ruby and ImageMagick.} s.authors = [%q{Tim Hunter}, %q{Omer Bar-or}, %q{Benjamin Thomas}] s.email = %q{rmagick@rubyforge.org} s.homepage = %q{http://rubyforge.org/projects/rmagick} s.files = Dir.glob('**/*') s.bindir = 'bin' s.executables = Dir.glob('bin/*').collect {|f| File.basename(f)} s.require_paths << 'ext' s.rubyforge_project = %q{rmagick} s.extensions = %w{ext/RMagick/extconf.rb} s.has_rdoc = false s.required_ruby_version = '>= 1.8.5' s.requirements << 'ImageMagick 6.4.9 or later' end rmagick-2.13.2/build_tarball.rake0000644000004100000410000001155512147515547016732 0ustar www-datawww-data # Build the tar.gz, tar.bz2, and .gem files for an RMagick Release # Expects the CVS tag for release RMagick x.y.z to be in the form RMagick_x-y-z. # To use: cd to $HOME # run: rake -f path/to/build_tarball.rake clean # rake -f path/to/build_tarball.rake release=tag beta=whatever # # Specify the release as release=RMagick_x-y-z or nothing if release=HEAD # Specify a beta Release as beta=beta1 require 'rubygems' require 'redcloth' require 'find' require 'fileutils' include FileUtils CVSSERVER = ":ext:rmagick@rubyforge.org/var/cvs/rmagick" # CVS_Tag is the CVS tag for this release. Dist_Directory is CVS_Tag, # modified for use as a directory name. if ENV.include?("release") CVS_Tag = ENV["release"] Dist_Directory = CVS_Tag.tr('_-','-.') else CVS_Tag = "HEAD" Dist_Directory = "RMagick-0.0.0" end # RMagick_Version is just X.Y.Z RMagick_Version = Dist_Directory.sub(/RMagick-/, "") # RMagick_Version2 is X.Y.Z + "-beta1" if beta=beta1 RMagick_Version2 = RMagick_Version + (ENV.include?("beta") ? "-" + ENV["beta"] : "") # Release is RMagick-X.Y.Z, plus "-beta1" if beta=beta1 Release = Dist_Directory + (ENV.include?("beta") ? "-" + ENV["beta"] : "") README = "README.html" MANIFEST = "ext/RMagick/MANIFEST" # Change the version number placeholders in a file. # Returns an array of lines from the file. def reversion(name) now = Time.new now = now.strftime("%m/%d/%y") lines = File.readlines name lines.each do |line| line.gsub!(%r{0\.0\.0\$}, RMagick_Version2) line.gsub!(%r{0\.0\.0}, RMagick_Version) line.gsub!(%r{YY/MM/DD}, now) end lines end # Rewrite a file containing embedded version number placeholders. def reversion_file(name) lines = reversion(name) tmp_name = name + "_tmp" mv name, tmp_name begin File.open(name, "w") { |f| lines.each { |line| f.write line } } rescue mv tmp_name, name ensure rm tmp_name end end task :extconf do Dir.chdir(Dist_Directory) { reversion_file "ext/RMagick/extconf.rb" } end task :gemspec do Dir.chdir(Dist_Directory) { reversion_file "rmagick.gemspec" } end task "README.txt" do Dir.chdir Dist_Directory do reversion_file "README.rc" body = File.readlines "README.rc" body = RedCloth.new(body.join).to_html + "\n" File.open("README.txt", "w") { |f| f.write body } end end task README => "README.txt" do puts "writing #{README}" Dir.chdir Dist_Directory do File.open(README, "w") do |html| html.write < RMagick #{RMagick_Version2} README END_HTML_HEAD html.write File.readlines("README.txt") html.write < END_HTML_TAIL end end end task :doc do Dir.chdir(File.join(Dist_Directory, "doc")) do FileList["*.html"].each { |d| reversion_file(d) } end end # Remove files we don't want in the tarball. # Ensure files are not executable. (ref: bug #10080) task :fix_files do Dir.chdir Dist_Directory do rm_rf "test", :verbose => true rm "lib/rvg/to_c.rb", :verbose => true rm "README.rc", :verbose => true rm "README.txt", :verbose => true chmod 0644, FileList["doc/*.html", "doc/ex/*.rb", "doc/ex/images/*", "examples/*.rb"] end end task :manifest do now = Time.new now = now.strftime("%H:%M:%S %m/%d/%y") puts "generating #{MANIFEST}" Dir.chdir Dist_Directory do File.open(MANIFEST, "w") do |f| f.puts "MANIFEST for #{Release} - #{now}\n\n" Find.find('.') do |name| next if File.directory? name f.puts name[2..-1] # remove leading "./" end end end end task :export do sh "cvs -d#{CVSSERVER} export -r #{CVS_Tag} -d #{Dist_Directory} RMagick" end task :collateral => [README, :gemspec, :extconf, :doc] GEM = Dist_Directory.downcase + ".gem" task :default => [:export, :collateral, :fix_files, :manifest] do sh "tar czf #{Release}.tar.gz #{Dist_Directory}" sh "tar cjf #{Release}.tar.bz2 #{Dist_Directory}" sh "tar c #{Release} | 7z a -t7z -m0=lzma -mx=9 -mfb=64 -ms=on -si#{Release}.tar #{Release}.tar.lzma" # Extract with # 7z e RMagick-x.y.z.tar.lzma -so | tar xv #sh "tar cf #{Release}.tar #{Dist_Directory}" #sh "7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on #{Release}.tar.lzma #{Release}.tar" #rm_rf Release+".tar", :verbose => true Dir.chdir(Dist_Directory) do sh "gem build rmagick.gemspec" mv GEM, "../", :verbose => true end end task :clean do rm_rf Dist_Directory, :verbose => true rm_rf Release+".tar.gz", :verbose => true rm_rf Release+".tar.bz2", :verbose => true rm_rf Release+".tar.lzma", :verbose => true rm_rf GEM, :verbose => true end rmagick-2.13.2/ChangeLog0000644000004100000410000010751312147515547015040 0ustar www-datawww-dataRMagick 2.13.2 o Fixed issues preventing RMagick from working with version 6.8 or higher o Fixed issues preventing RMagick from working with ruby 1.9.3 RMagick 2.13.1 o Fixed bug preventing RMagick from working with version 6.5.9 or higher RMagick 2.13.0 o Added Doxygen documentation, for automatic documentation o Fixed bug #27467, get RMagick to compile witH ImageMagick 6.5.7 o Fixed bug #27607, switch Pixel#from_hsla and Pixel#to_hsla to use ranges 0-255 instead of 0-100 for saturation and lightness (range used by ImageMagick 6.5.6-5 and higher). Also added ability to specify all arguments to these functions as percentages (bug report by Arthur Chan). RMagick 2.12.2 o Add feature tests for SinusoidFunction and PolynomialFunction enum values to allow compiling with ImageMagick 6.4.8-7 (bug report by Mark Richman) RMagick 2.12.1 o Fix bug #27239, allow 2.12.0 to compile with older releases of ImageMagick (bug report by Sam Lown) RMagick 2.12.0 o Added Image#function_channel (available in ImageMagick 6.4.8-8) o Added Image#auto_level_channel, Image#auto_gamma_channel (available in ImageMagick 6.5.5-1) o Added Draw#interline_spacing, #interline_spacing= (available in ImageMagick 6.5.5-8) RMagick 2.11.1 o Applied Alexey Borzenkov's mingw patches to extconf.rb. o Fixed a bug in Magick.trace_proc that could cause a segv at program exit with Ruby 1.9.1 (bug report by Larry Young) o Added new CompressionType enum values ZipSCompression, PixCompression, Pxr24Compression, B44Compression, B44ACompression (available in ImageMagick 6.5.5-4) RMagick 2.11.0 o Fix bug #26475, dissolve and watermark don't work with new versions of ImageMagick (reported by Jim Crate) o Add Image#composite_mathematics (available in ImageMagick 6.5.4-3) o Add new LinearDodgeCompositeOp, LinearBurnCompositeOp, PegtopCompositeOp, PinLightCompositeOp, VividLightCompositeOp enum values (available in ImageMagick 6.5.4-3) RMagick 2.10.0 o ImageMagick releases earlier than 6.3.5-10 and Ruby releases earlier than 1.8.5 no longer supported. o (Experimental) Support the use of Ruby managed memory for all memory allocations (available in ImageMagick 6.5.3-10) o Add Image#selective_blur_channel (available in ImageMagick 6.5.0-3) o Add new AlphaBackgroundChannel enum value (available in ImageMagick 6.5.2-5) o Add new DistortCompositeOp enum value (available in ImageMagick 6.5.3-7) RMagick 2.9.2 o Add new HorizontalTileEdgeVirtualPixelMethod, VerticalTileEdgeVirtualPixelMethod, CheckerTileVirtualPixelMethod VirtualPixelMethod enum values (available in ImageMagick 6.5.0-1) o Added BilinearForwardDistortion, BilinearReverseDistortion enums (available in ImageMagick 6.5.1-2) o Add missing composite operators to Magick::Draw#composite method o Add warning about dropping support for ImageMagick < 6.3.5 and Ruby < 1.8.5 o Fix bug #25892, stack buffer overflow in Magick::TypeMetric.to_s (reported by Roman Simecek) RMagick 2.9.1 o Fix a bug that prevents the use of transparent background colors when built with ImageMagick 6.4.9-0 RMagick 2.9.0 o Fix #23209, improve RVG's letter spacing (patch from Jonah Fox) o Add Draw#kerning= attribute (available in ImageMagick 6.4.7-8) o Add Draw#interword_spacing= attribute (available in ImageMagick 6.4.8-0) o Add Draw#kerning, Draw#interword_spacing primitive methods (available in ImageMagick 6.4.8-3) o Feature #23171, support ImageList, Draw, Pixel marshaling. o Support all the new EvaluateOperator constants RMagick 2.8.0 o Add the endian, scene, and transparent_color attributes to Image::Info o Deprecate Image#endian= attribute setter o Add the transparent_chroma method to the Image class (available in ImageMagick 6.4.5-6) o Add the sparse_color method to the Image class (available in ImageMagick 6.4.3) o Update Image#change_geometry to work with the new ParseSizeGeometry API in ImageMagick 6.4.6-9. RMagick 2.7.2 o Fix bug #22740, some Image::Info attribute values are not propogated to the image object (bug report by Thomas Watson) RMagick 2.7.1 o Fix bug #22471, Magick::fonts can abend on 64-bit systems (bug report and patch by James Le Cuirot) o ImageList.new accepts a block which is passed on to Image::read when reading the input images. The block is executed in the context of an Image::Info object. o Add support for the "user" image property. o Define the Magick::FatalImageMagickError exception class, raised if ImageMagick raises a fatal (unrecoverable) exception. o Added feature #22618, Image#total_ink_density (request by F. Behrens) RMagick 2.7.0 o Fix bug #22152, extconf.rb does not respect the LDFLAGS environment variable (bug report by Joseph Sokol-Margolis) o Fix bug #22190, the NoDitherMethod enum value is not defined in ImageMagick 6.4.2 o Add the TrimBoundsLayer ImageLayerMethod enum value (available in ImageMagick 6.4.3-8) o Add the CopyAlphaChannel, ExtractAlphaChannel, OpaqueAlphaChannel, ShapeAlphaChannel, and TransparentAlphaChannel AlphaChannelType enum values (available in ImageMagick 6.4.3-7) o Rename Image#affinity and ImageList#affinity to Image#remap and ImageList#remap. Retain the old names as aliases. (Changed in ImageMagick 6.4.4-0) RMagick 2.6.0 o Fix bug #21237, Image::write ignores format attribute when called with a Tempfile pathname (bug report by Jack Shedd) o Fix bug #21897, ImageList#from_blob abends when certain corrupt JPEG images are used (bug report by Peter Szabo) o Add Image#composite_tiled, Image#composite_tiled! (ref: http://rubyforge.org/forum/forum.php?thread_id=27347&forum_id=33) o Add Image#deskew (available with ImageMagick 6.4.2-5) o Add Image#define, Image#undefine (available in ImageMagick 6.3.6) o Add Image#level_colors (available in ImageMagick 6.4.2-1) o Add Image#levelize_channel (available in ImageMagick 6.4.2-1) o Add Image#affinity, ImageList#affinity (available in ImageMagick 6.4.3-6). These methods replace Image#map and ImageList#map. o Accept DitherMethod values for the dither argument to Image#quantize, ImageList#quantize o Add the BarrelDistortion, PolynomialDistortion, ShepardsDistortion, PolarDistortion, and DePolarDistortion MagickDistortion Method enum values (available in ImageMagick 6.4.2-6) o Add the HorizontalTileVirtualPixelMethod and VerticalTileVirtualPixelMethod VirtualPixelMethod enum values (available in ImageMagick 6.4.2-6) o Add DitherMethod enum class o Added general-purpose OptionalMethodArguments class to handle ad-hoc optional arguments. o Support optional "distort:viewport" and "distort:scale" arguments to Image#distort o Support optional highlight_color and lowlight_color arguments to Image#compare_channel RMagick 2.5.2 o Add support for MergeLayer to Magick::ImageList#optimize_layers (patch #21189, submitted by Andrew Watson) o Add PowQuantumOperator argument for Image#quantum_operator (available in ImageMagick 6.4.1-9) RMagick 2.5.1 o Update Pixel#to_color to work with the new QueryMagickColorname API in ImageMagick 6.4.1-9. RMagick 2.5.0 o Added Image#add_compose_mask, #delete_compose_mask (feature #20531) RMagick 2.4.0 o Added Image#image_type= (feature #20490) RMagick 2.3.0 o Added Image#encipher, Image#decipher (available with ImageMagick 6.3.8-6) o Added DTX1Compression, DTX1Compression, and DTX1Compression CompressionType enums (available in ImageMagick 6.3.9-4) o Added optional "use hex format" argument to Pixel#to_color o Support :area resource type in Magick.limit_resource o Pixel.from_HSL and Pixel#to_HSL are deprecated. Use Pixel.from_hsla and Pixel#to_hsla instead. The new methods rely on the ImageMagick 6.3.5 and later API. o The Image#alpha and alpha= attributes are deprecated. Use alpha() and alpha? instead. o The Image#mask= attribute is deprecated. Use mask() instead. o The use of Ruby older than version 1.8.4 with RMagick is deprecated and will not be supported in a future release. o Fix bug #18271, rvg width and height attributes wrong after a call to viewbox (reported by Greg Jarman) RMagick 2.2.2 o Fix bug #18016, add test for InitializeMagick in libMagickCore to extconf.rb RMagick 2.2.0 o Added Image#opaque_channel, Image#paint_transparent (available with ImageMagick 6.3.7-10) o Added Image#liquid_rescale (available with ImageMagick 6.3.8-2) o Added CMYColorspace ColorspaceType value o Fixed bug #17148, compiler error message on Solaris (bug report by Trever Wennblom) o Fixed bug #17470, get_exif_by_number, get_exif_by_entry may fail when called with one or more arguments RMagick 2.1.0 o Added Image::Info#caption= attribute o Rename Image#crop_resized, #crop_resized! to #resize_to_fill, #resize_to_fill!. Add aliases for the old names. o Fix bug #16776, in the axes.rb example the last 2 arguments to border.rectangle are swapped (bug report by Alain Feler) o Fix bug #16931, apostrophe in #error directive causes error in some versions of GCC (bug report by Justin Dossey) RMagick 2.0.0 o Replaced configure/make/make install with standard Ruby setup.rb, extconf.rb o Removed support for Ruby earlier than 1.8.2 o Removed support for GraphicsMagick. As a result these methods are no longer available: Image#grayscale_pseudo_class, Image#statistics. o Removed support for all releases of ImageMagick earlier than 6.3.0. o Removed deprecated Image#random_channel_threshold. Use Image#random_threshold_channel instead o Removed deprecated Image#channel_threshold. Use Image#random_threshold_channel instead o Removed unecessary Image#montage= o Removed unecessary and undocumented Image#image_type= o Removed deprecated Image::Info#tile_info, tile_info= attributes. o Removed deprecated Image::Info#tile, tile= attributes. Use #extract, #extract= instead o Removed deprecated Image::Info#subimage, subimage= attributes. Use scene, scene= instead o Removed deprecated Image::Info#subrange, subrange= attributes. Use number_scenes, number_scenes= instead o Removed deprecated Magick.set_monitor. Use Image#set_monitor, Image::Info#set_monitor instead o Removed deprecated RunlengthEncodedCompression CompressionType. Use RLECompression instead o Deprecated Image#matte, matte= with ImageMagick 6.3.5 and later o Added Image::Info#stroke=, stroke_width= and undercolor= attributes o Added Image::Info#tile_offset= attribute o Added Draw#fill_pattern= and #stroke_pattern= annotate attributes o Changed Image::Info[] and Image::Info[]= to allow an omitted "format" argument o Added Image#destroy!, destroyed?, check_destroyed methods o Support Image object creation/destruction tracing with the Magick.trace_proc attribute o Added Magick::QuantumRange. Magick::MaxRGB is deprecated. o Added OptimizeTransLayer, RemoveDupsLayer, RemoveZeroLayer, OptimizeImageLayer ImageLayerMethods enum values (available with ImageMagick 6.3.3), MosaicLayer, FlattenLayer (available with ImageMagick 6.3.6) o RMagick works with Q32 version of ImageMagick o Added ChangeMaskCompositeOp, DivideCompositeOp, LinearLightCompositeOp CompositeOperator enum values o Added SplineInterpolatePixel InterpolatePixelMethod enum value o Added DitherVirtualPixelMethod, RandomVirtualPixelMethod, BlackVirtualPixelMethod, GrayVirtualPixelMethod, WhiteVirtualPixelMethod (available with ImageMagick 6.3.5), and MaskVirtualPixelMethod (available with ImageMagick 6.3.3) VirtualPixelMethod enum values o Added GIFInterlace, JPEGInterlace, PNGInterlace Interlace type enum values (available with ImageMagick 6.3.4) o Added SentinelFilter FilterTypes enum value (available in ImageMagick 6.3.6) o Added Image.combine o Added Image#separate (available with ImageMagick 6.3.2) o Added Image#distort (available with ImageMagick 6.3.5) o Added Image#each_pixel (thanks to Russell Norris for the suggestion and code) o Added Image#histogram? (available with ImageMagick 6.3.5) o Added Image#sync_profiles (available with ImageMagick 6.3.2) o Added Image#extent (available with ImageMagick 6.3.1) o Added Image#excerpt, Image#excerpt! (available with ImageMagick 6.3.5) o Added Image::Info#attenuate o Added Image#clut_channel (available with ImageMagick 6.3.5) o Feature Request #16264, added ImageList#composite_layers (available with ImageMagick 6.3.3, request from Steve Martocci) o Added Image#alpha= (available with ImageMagick 6.3.5) o Added Image#gravity= o Added Image#equalize_channel (available with ImageMagick 6.3.6) o Added new FilterTypes values KaiserFilter, WelshFilter, ParzenFilter, LagrangeFilter, BohmanFilter, BartlettFilter (available with ImageMagick 6.3.6) o Fix bug #10339, Image#trim does not support "reset page information option" (bug report from Nobody) o Renamed RMagick.so to RMagick2.so to prevent confusion between RMagick.rb and RMagick.so o Feature Request #16276, re-organize doc to not split Image method pages in the middle of an initial letter (request from Roy Leban) o Updated for ImageMagick 6.3.7-5 o Made changes as necessary to work with current Ruby 1.9.0 RMagick 1.15.12 o Fix bug #16221, starting with ImageMagick 6.3.2, get_exif_by_entry/number returns empty array/hash when no arguments are specified, even though the image has EXIF data (bug report from Paul Clegg) RMagick 1.15.11 o Fix bug #15887, the x_ and y_resolution attributes don't respect the units attribute (bug report from Ben Greenburg) o Fix bug #15889, memory leak in Draw#composite method (bug report from Till Vollmer) RMagick 1.15.10 o Update Magick::Pixel.from_HSL, #to_HSL to work with new APIs in ImageMagick 6.3.5-9. RMagick 1.15.9 o Fixed bug #12089 (bug report from Hans de Graaff) RMagick 1.15.8 o Fixed bug #12671, incorrect link in HTML doc (bug report from Thomas R. Koll o Fixed bug #11890, incorrect usage description for Draw#text_undercolor in HTML doc (bug report from Ezra Freedman) o Fixed bug #12706, specifying both a gravity and offsets to Image#composite positions the composite image incorrectly (bug report from Benoit Larroque) RMagick 1.15.7 o Fix bug #11033, make distclean misses some files (bug report from Lucas Nussbaum) o Work around SetMagickRegistry problem in ImageMagick 6.3.4-7 RMagick 1.15.6 o Fix bug #10070, memory leak in Draw#get_type_metrics, Draw#get_multiline_type_metrics, Draw#annotate (bug report from Sinclair Bain) o Fix bug #10080, scripts in examples directory should not be marked executable (bug report from Lucas Nussbaum) RMagick 1.15.5 o Fix bug #9637, export_pixels always exports all 0's for 1-bit images (bug report from Doug Patterson) RMagick 1.15.4 o Fix bug #8927, RMagick and rbgsl both export the name ID_call (bug report from Shin Enomoto) RMagick 1.15.3 o Fix bug #8697, Image::Info.fill= doesn't work when creating "caption:" format images (bug report from choonkeat) RMagick 1.15.2 o Fix bug #8408, a compatibility problem with some versions of ImageMagick before 6.2.5 (bug report from Geir Gluckstad) RMagick 1.15.1 o Fix bug #8307, compatibility problems with older (6.0.x) versions of ImageMagick (bug report from Chris Taggart) RMagick 1.15.0 o Added fx method to ImageList class o Added wet_floor method to the Image class o Added linear_stretch method to the Image class (available with ImageMagick 6.3.1-1) o Added recolor method to the Image class (available with ImageMagick 6.3.1-3) o Added polaroid method to the Image class (available with ImageMagick 6.3.1-6) o Added origin attribute to the Image::Info class (supported by ImageMagick 6.3.1-4 and later) o Added PaletteBilevelMatteType to the ImageType enum o Fix bug #6260, some RVG examples produce all-black GIF images o Fix bug #7034, fix the matte method in the Draw class o Fix bug #7373, default channels should be RGB instead of RGBA o Fix bug #7716, Pixel#intensity wrong for gray images (bug report from Morio Miki) o Fix bug #7949, Magick::Draw.new abends when an exception occurs before the draw object is fully initialized (bug report from Andrew Kaspick) o Fix bug #8015, Magick::Draw.new doesn't call the optional arguments block in the right scope (bug report from Andrew Kaspick) o Tested with ImageMagick 6.3.2-0 RMagick 1.14.1 o Handle change to the type of the ColorInfo.color field introduced by ImageMagick 6.3.0 RMagick 1.14.0 o Feature request #5015, support CMYK->RGB conversions. Added the add_profile and delete_profiles to the Image class. Fixed the profile!, iptc_profile, and color_profile methods. Added the black_point_compensation attribute. (requested by Niklas Ekman) o Added adaptive_blur, adaptive_blur_channel, find_similar_region, sketch methods to the Image class (available with ImageMagick 6.2.8-6) o Added adaptive_resize to the Image class (available with ImageMagick 6.2.9) o Added resample method to the Image class (thanks to Ant Peacocke for the idea) o Added four new compositing methods to the Image class: blend, displace, dissolve, and watermark o Feature request #5418, add get_iptc_dataset and each_iptc_dataset to the Image class (requested by Oliver Andrich) o Added the bias and mask attributes to the Image class o Added optional qualifier argument to Image#rotate o Patch #5742 from Douglas Sellers, adds channel method to the Image::Info class. o Added new ChannelType enum values o Added texture= attribute writer to the Image::Info class o Added tile= attribute writer to the Draw class o Added pixel_interpolation_method attribute, InterpolatePixelMethod enum class to the Image class (available with ImageMagick 6.2.9) o Added "Magick Command Options and Their Equivalent Methods" page to the documentation o Fix bug #5079, Image#quantum_operator method doesn't work (bug report from Pedro Martins) o Fix bug #5080, incorrect RVG images when non-0 values used for the min_x or min_y arguments to RVG#viewbox (bug report from Daniel Harple) o Fix bug #5370, the clip_mask= attribute doesn't work o Fix bug #5506, wrong argument used to intialize AffineMatrix (bug report from Michael Shantzis) RMagick 1.13.0 o Added transform, transform!, transpose, transpose! methods to Image class (available with ImageMagick 6.2.8) o Feature #4844, add auto_orient, auto_orient! methods to Image class (suggestion from John Oordopjes, available with ImageMagick 6.2.8) o Added adaptive_sharpen, adaptive_sharpen_channel methods to Image class (available with ImageMagick 6.2.7) o Added composite_image_channel, composite_image_channel! methods to Image class (added in ImageMagick 6.2.6) o Added radial_blur_channel method to Image class (available in ImageMagick 6.2.4) o Fix bug #4806, add hash, eql? methods to Pixel class (bug report from Tim Pease) o Change extension filename to match RubyGems 0.9.0 expectations. o Fix bug #4821, correct doc for Image#rotate (bug report from Tim Pease) o Update the Draw#annotate documentation RMagick 1.12.0 o Fix bug #4630, the new signature for #level is incompatible with releases prior to 1.10.1 (bug report from Al Evans) RMagick 1.11.1 o Fix bug #4511, add Makefile, rmagick_config.h as dependencies in the Makefile (bug report from Eric Hodel) o Ensure ExceptionInfo structures are freed RMagick 1.11.0 o Feature #3705, add resize_to_fit (thanks to Robert Manni for the code) o Added optimize_layers method to the ImageList class (available with ImageMagick 6.2.6) o Added limit_resource method to the Magick module o Replaced install.rb with setup.rb, improved gem install (bug report from Ryan Davis) o Added --disable-htmldoc option to setup.rb o Fix bug #4104, incorrect label on example (reported by Jason Lee) o Added contrast_stretch_channel to the Image class (available with ImageMagick 6.2.6) o Improved Magick exception handling to eliminate memory leaks when an exception is rescued and execution continues. o Tested with ImageMagick 6.2.7 RMagick 1.10.1 o Fix bug #3437, memory leak in ImageList#to_blob o Fix bug #3363, Image#composite doesn't work when the source image is bigger than the destination o Fix bug #3635, Image#import_pixels doesn't accept FloatPixel or DoublePixel storage types o Feature #3597, add border_color attribute to the Draw class RMagick 1.10.0 o Added add_noise_channel method to Image class (available with ImageMagick 6.2.5) o Added vignette method to the Image class (available with ImageMagick 6.2.6) o Added crop_resize method to the Image class (thanks to Jerret Taylor for the suggestion and original code) o Added export_pixels_to_str method to the Image class o Provided default arguments to Image#export_pixels o Added "order" option to Image#ordered_dither o Added cyan, magenta, yellow, and black attribute accessors to the Pixel class o Added CineonLogRGBColorspace, LABColorspace, Rec601LumaColorspace, Rec601YCbCrColorspace, Rec709LumaColorspace, Rec709YCbCrColorspace, LogColorspace enumerators to the ColorspaceType enumeration class. o Fixed bug #2844, Image#to_blob exits if the image is a 0x0 JPEG o Fixed bug #2688, Image#annotate, Draw#get_multiline_type_metrics handle newline characters properly o Tested with ImageMagick 6.2.6 o Removed support for all versions of ImageMagick prior to 6.0.0 RMagick 1.9.3 o Feature #2521, add Image#distortion_channel method o Fixed bug #2546, ImageList#to_blob builds multi-image blobs again. (ImageMagick 6.2.0 silently broke the ImageToBlob method.) Thanks to Tom Werner for reporting this bug. o Test with GraphicsMagick 1.1.7 RMagick 1.9.2 o Feature #2412, add the virtual_pixel_method attribute and the VirtualPixelMethod enumeration o Feature #2462, add the ticks_per_second attribute RMagick 1.9.1 o Fixed bug #2157, Image#total_colors is now an alias of Image#number_colors o Fixed bug #2155, Image#dispose= now accepts a DisposeType enum, #dispose now returns a DisposeType enum. o Fixed bug #2156, Image#properties no longer returns garbage for the property name and value. o Fixed bug #2190, Image#compose now returns a CompositeOperator o Fixed bug #2191, Image#composite no longer abends when called with 0 arguments o Fixed bug #2213, ImageList#montage method no longer leaves the imagelist corrupt after raising an ImageMagickError o Feature #2159, added GrayChannel ChannelType enum value, BlendCompositeOp and ColorBurnCompositeOp CompositeOperator enum values, RLECompression CompressionType enum value, deprecate RunlengthCompression o Feature #2172, added optional argument to crop and crop! to reset the saved page offsets after cropping o Deprecated Image#channel_threshold. This method is deprecated in ImageMagick. o Feature #2373, change Image#import_pixels to accept a pixel data buffer as well as a pixel data array. (Thanks to Ara T. Howard for this suggestion!) o Fixed to compile without errors with ImageMagick 6.2.4-4. RMagick 1.9.0 o Added Image#monitor=, Image::Info#monitor=. Deprecated Magick.set_monitor. o Fixed bug #2070, support color names with embedded spaces o Fixed bug #2109, properly scope Magick constants in RVG RMagick 1.8.3 o Tested with ImageMagick 6.2.3-2 o Added comment, delay, dispose, fill, gravity, and label attributes to Image::Info RMagick 1.8.2 o Fix bug #1983, potential buffer overflow in version_constants o Added feature #2015, support the pointsize, authenticate, and sampling_factor attributes in Image::Info RMagick 1.8.1 o Fix bugs #1876, #1888, #1919 o Added feature #1941, RVG's polyline, polygon accept array arguments o Numerous fixes to the RVG documentation RMagick 1.8.0 o Added Image#shadow (ImageMagick 6.1.7) o Added Image::Info#undefine, #[], #[]= o Added sigmoidal_contrast_channel, sepiatone to Image class (ImageMagick 6.2.1) o Added JPEG2000Compression constant (ImageMagick 6.2.2) o Incorporated RVG classes o Added RVG documentation, examples, updated installer o Tested with ImageMagick 6.2.2-0, latest GraphicsMagick 1.2 RMagick 1.7.4 o Fix bug #1727 o Fix affine_transform.rb o Tested with ImageMagick 6.2.1 RMagick 1.7.3 o Fix bug #1553, a build issue with ImageMagick 6.0.x RMagick 1.7.2 o Fix bugs #1308, #1310, #1314, #1533 RMagick 1.7.1 o Fix bugs #1250, #1253 o Tested with ImageMagick 6.1.7, Ruby 1.8.2 RMagick 1.7.0 o Added splice, set_channel_depth to Image class (ImageMagick 6.0.0) o Added sharpen_channel, blur_channel to Image class (ImageMagick 6.0.1) o Added get_multiline_type_metrics to Draw class (ImageMagick 6.1.5), added new example scripts and images o Added normalize_channel, unsharp_mask_channel to Image class (ImageMagick 6.1.0) o Added read_inline to Image class o Renamed channel_compare to compare_channel, retained old name as an alias for backward compatibility. o Added default values for unsharp_mask arguments o Fixed bug #1193 o Fixed segfault in destroy_Draw when Ruby gc'd the temp file name array before calling destroy_Draw o Tested with ImageMagick 6.1.6, GraphicsMagick 1.1.4, Ruby 1.8.2preview3. RMagick 1.6.2 o Fixed ImageList#deconstruct to return an imagelist o Fixed installation procedure to propagate user's CFLAGS, CPPFLAGS, and LDFLAGS through to the low-level Makefile o Fixed bugs #1048, #1127 RMagick 1.6.1 o Changed to match changes in ImageMagick 6.1.4 API o Fixed bug #950 RMagick 1.6.0 o Added posterize, gaussian_blur_channel, convolve_channel methods to Image class (ImageMagick 6.0.0) o Added new CompositeOperator constants (ImageMagick 6.0.0) o Added trim and trim! methods to Image class o Added each method to Enum subclasses o Added stroke_width= attribute to the Draw class o Fixed bugs #624, #642, #716, applied patch #819 (thanks to Daniel Quimper) o Tested with ImageMagick 6.0.5-2, GraphicsMagick 1.1.3, Ruby 1.8.2 RMagick 1.5.0 o Added meaningful implementations of dup and clone to the Image and Draw classes. Clarified the documentation. o Do not allow changes to frozen Image, ImageList, and Draw objects. o Raise TypeError if freeze method sent to Image::Info or ImageList::Montage object. o Added view method to Image, Image::View class (thanks to Ara T. Howard and Charles Comstock on c.l.r for the discussion which prompted me to add this class) o Added grayscale_pseudo_class method to Image class (GraphicsMagick 1.1) o Added radial_blur, random_threshold_channel methods to Image class (ImageMagick 6.0.0) o Added quantum_operator method to Image class (GraphicsMagick 1.1, ImageMagick 6.0.0) o Added statistics method to Image class (GraphicsMagick 1.1) o Support channel_extrema, channel_mean with GraphicsMagick 1.1 o Added endian attribute to Image class o Added composite! method to Image class o Deprecated random_channel_threshold method when linked with ImageMagick 6.0.0. RMagick 1.4.0 o Revised and updated documentation o Implemented enumeration values as instances of an Enum class. Based on a description by Paul Brannon in ruby-talk 79041. o Added HSLColorspace, HWBColorspace constants (ImageMagick 5.5.7, GraphicsMagick 1.0.2) o Added CopyCyanCompositeOp, CopyMagentaCompositeOp, CopyYellowCompositeOp, CopyBlackCompositeOp constants (ImageMagick 5.5.7, GraphicsMagick 1.1) o Added ReplaceCompositeOp. CopyCompositeOp constants (ImageMagick 6.0.0) o Added color_histogram to Image class. (ImageMagick 6.0.0, GraphicsMagick 1.1) o Added define method to Image::Info class (ImageMagick 6.0.0, GraphicsMagick 1.1) o Added tint, each_profile, channel_extrema, channel_compare, channel_depth, channel_mean, quantum_depth, preview, gamma_channel, negate_channel, bilevel_channel methods to Image class (ImageMagick 6.0.0) o Added get_exif_by_entry, get_exif_by_tag to Image class o Added border! method to Image class o Added fcmp, intensity methods to Pixel class o Added Version_long constant o The 'fuzz' attribute in the Image and ImageInfo classes now accepts a percentage value as well as a numeric value. o Added Geometry class and changed all methods that accept a geometry string to accept a Geometry object as well o Added dup and clone methods to the ImageList, Image, and Draw classes (Fix for bug #254.) o Tested with latest ImageMagick 6.0.0 beta and GraphicsMagick 1.1 snapshot RMagick 1.3.2 o Fix profile! to require only 2 arguments, as documented. o Correct spelling of 'transparent' in text_antialias.rb example. o Add output of `Magick-config --libs` to LIBS variable in configure o Minor fixes in documentation o Test with GraphicsMagick 1.0.4 o Test with latest ImageMagick 5.5.8 beta RMagick 1.3.1 o Fixed default base URI in the links to the installed xMagick doc o Applied the patch for bug #76 that caused the rubyname.rb example to hang when installing on FreeBSD. o Fixed the <=> method in Image to return nil when the class of the other object is not Image o Added code to ensure that the `text' argument to Draw#text is not nil or empty o Fixed the handle_error function to re-initialize the exception structure after destroying its contents. RMagick 1.3.0 o Added strip!, import_pixels, export_pixels, random_channel_threshold to the Image class. (Available only with ImageMagick 5.5.8, which is still in beta.) o Added black_threshold and white_threshold to the Image class. o Added format= attribute writer to the Image class o Added monochrome= attribute writer to the Image::Info class o Added annotate to the Image class. o Made the image argument to get_type_metrics optional. (Thanks to Hal Fulton for suggesting this change and the annotate change!) o Enhance the read, write, and ping methods in both the Image class and the ImageList class to accept an open File object as well as a filename argument. o Added change_geometry to the Image class o Changed configure to generate top-level Makefile with install and uninstall targets. (Thanks to Bob Friesenhahn for the suggestion and the the Makefile!) o Incorporated 1.2.2.1 patch to correct problems when building with Ruby 1.6.7. o Added "magick_location" attribute to the ImageMagickError class. (Available only with GraphicsMagick 1.1, not yet released.) o Tested with ImageMagick 5.5.8 beta o Tested with GraphicsMagick 1.0.2 and 1.1 snapshot o Tested with Ruby 1.8.0 o Changed to MIT license RMagick 1.2.2 o Fixed many bugs in configuration script o Added support for GraphicsMagick 1.0 (with assistance from Bob Friesenhahn) o Changed default documentation directory (--doc-dir option default) to $prefix/share/RMagick o Added "examples" directory to contain example programs that aren't referenced by the documentation RMagick 1.2.1 o Yet another fix to the Cygwin installation procedure RMagick 1.2.0 o Changed install to work correctly on Cygwin (Cygwin testing by Yuki Hirakawa and David Martinez Garcia.) o Changed install to support Gentoo ebuild (Gentoo support provided by Tom Payne.) o Changed configure script to find IM doc in IM 5.5.7 o Added Image#capture o Added optional matte_pct argument to Image#colorize o Add default argument values to Image#gaussian_blur o Fix bug in Image#store_pixels that prevented it from working with GIF and other PseudoClass image formats o Changed Image#crop and Image#crop! to accept a GravityType constant as the first argument, instead of the x- and y-offset arguments. (Suggested by Robert Wagner.) o Added Image::Info#filename=, image_type= o Added ImageList#__map__ as an alias for Enumerable#map o Added fetch, insert, select, reject methods to ImageList class for Ruby 1.8.0 o Undefined zip and transpose methods in ImageList class for Ruby 1.8.0 o ImageMagick 5.5.7 supported RMagick 1.1.0 o Fixed bug in handle_error that caused an abend when linked with IM 5.5.6 o Added RMAGICK image "format". When read, returns 252x108 RMagick logo in PNG format. o Changed examples to give all floating point constants a leading digit. o Added Image#rotate! o Tested with Ruby 1.8.0preview2 o Added Image#extract_info, Image::Info#extract=, Image::Info#scene=, Image::Info#number_scenes=, Image::Info#tile= o Added Draw#text_align, Draw#text_anchor, Draw#text_undercolor o ImageMagick 5.5.6 supported RMagick 1.0.0 o Fixed warnings when compiling with Ruby 1.8.0 o Added Draw#rotation=, rotated_text.rb o Fixed temp image files in Montage_texture and Draw_composite o ImageMagick 5.5.5 supported RMagick 0.9.5 o Added channel.rb example o Fixed install problems with IM 5.5.1 RMagick 0.9.4 o Cleaned up documentation. o Added logging methods Magick.set_log_event_mask and Magick.set_log_format o Added Magick.set_monitor o Added custom serialization methods _dump and _load to Image class. Added marshaling section to usage doc. o Added Image#mime_type o Changed install to use autoconf-generated configure script o Replaced makedoc.rb with post-install.rb hook o Added rmconst.rb utility script o ImageMagick 5.5.4 supported RMagick 0.9.3 o Changed ImageList#<=> to use same algorithm as Array#<=> o Changed Draw class variables to class constants o Fixed bug in Magick::colors method that caused some colors to be repeated or missed when the optional block is used o Changed fill classes to not inherit from common Fill class. Removed Fill class. o Improved usage documentation o Added Image#level_channel, introduced with IM 5.5.3 o ImageMagick 5.5.3 supported o Ruby 1.6.8, 1.8.0preview1 supported RMagick 0.9.2 o Added crop!, flip!, flop!, magnify!, minify!, resize!, sample!, scale!, shave!, channel_threshold methods to Image class o Documented DisposeType, ColorSeparationMatteType and OptimizeType constants o Changed Image#<=>, ImageList#<=> to raise TypeError if the other argument is not in the same class o Deleted Image#==, ImageList#==, include Comparable in both classes o Added Image#thumbnail, thumbnail!, adaptive_threshold for 5.5.2 & later o Used image list functions in 5.5.2 & later o ImageMagick 5.5.2 supported o Removed last vestiges of 5.4.9 support RMagick 0.9.1 o Added -Wl,rpath option to $LDFLAGS in extconf.rb o #include in rmagick.h o Changed set_cache_threshold to call SetMagickResourceLimit instead of SetCacheThreshold o Changed Image_texture_flood_fill to clone texture image instead of adding a reference o Many fixes to the Array methods in ImageList o Defined Image#<=>, defined Image#== in terms of Image#<=> o Defined ImageList#<=> in terms of Image#<=> RMagick 0.9.0 1st beta rmagick-2.13.2/README.html0000644000004100000410000002605612147515547015113 0ustar www-datawww-data RMagick 2.13.2 README ["

RMagick 2.13.2 README

\n", "

02/02/13

\n", "

Table of Contents

\n", "\n", "

Introduction

\n", "

RMagick is an interface between the Ruby programming language and the
\n", "ImageMagick image processing library.

\n", "

Prerequisites

\n", "

O/S Linux, *BSD, OS X, Windows 2000, XP, Vista, other *nix-like systems.

\n", "

Ruby Version 1.8.2 or later. You can get Ruby from www.ruby-lang.org.
\n", "The use of versions of Ruby older than 1.8.4 with RMagick is deprecated. Support will be
\n", "removed in a future release.

\n", "

ImageMagick Version 6.3.0 or later. You can get ImageMagick from www.imagemagick.org.

\n", "

Installing RMagick

\n", "

First install ImageMagick. Complete and up-to-date instructions for installing
\n", "ImageMagick on Linux, *BSD, and other *nix-type O/S’s are available
\n", "here. Use steps 0, 1, and 2.
\n", "Similarly, instructions for installing ImageMagick using MacPorts on OS X
\n", "are available here. Use steps
\n", "1 and 2.

\n", "

This release of RMagick uses Minero Aoki’s setup.rb script for installation.
\n", "See the next section for configuration options. Usually you do not need to
\n", "specify any of these options. You can get more information about setup.rb from
\n", "his “web site”:<http://i.loveruby.net.

\n", "

I assume you’ve already decompressed the tarball, or you wouldn’t be reading
\n", "this. If you have not decompressed the tarball, do so with one of these commands,
\n", "depending on which tarball you have:

\n", "
\n", "    tar xvzf RMagick-2.13.2-tar.gz              (gzipped tarball)\n", "    tar xvjf RMagick-2.13.2-tar.bz2             (bzipped tarball)\n", "    7z e RMagick-x.y.z.tar.lzma -so | tar xv    (7zipped tarball)\n", "
\n", "

Change to the RMagick-2.13.2 directory. If you are not using any
\n", "configuration options (usually you don’t need to) enter the command

\n", "
\n", "   ruby setup.rb\n", "
\n", "

Note that setup.rb executes all the example programs, so this can take
\n", "some time. This process both builds the example images used in the
\n", "documentation and validates your RMagick installation.

\n", "

After this command completes, make sure you have root privileges (that
\n", "is, login as root or use su or sudo) and enter the command

\n", "
\n", "    ruby setup.rb install\n", "
\n", "

Configuration options

\n", "

Type ruby setup.rb --help to see a list of configuration options. In
\n", "addition to the regular options, there are a few RMagick-specific options:

\n", "

—doc-dir=directory

\n", "

Specify the directory to install the RMagick documentation.
\n", "By default this is $prefix/share/RMagick, where $prefix is the
\n", "prefix specified by —prefix. For example, to install the
\n", "documentation in /Users/me/RMagick, specify:

\n", "
\n", "    ruby setup.rb --doc-dir=/Users/me/RMagick\n", "
\n", "

—allow-example-errors

\n", "

Normally the documentation installation terminates if 5 examples fail.
\n", "If you use this option, the installation does not check for failing
\n", "examples and will always complete. This option is useful if you’re
\n", "having trouble installing RMagick and you want to see all the failing examples.

\n", "

— disable-htmldoc

\n", "

By default the install process runs all the RMagick example programs and
\n", "generates HTML versions of all the examples. This option causes the
\n", "install process to skip this step. No install verification will take
\n", "place and no documentation will be installed.

\n", "

Things that can go wrong

\n", "

The RMagick installation FAQ
\n", "has answers to the most commonly reported problems.

\n", "

Can’t install RMagick. Can’t find libMagick or one of the dependent libraries. Check the mkmf.log file for more detailed information.

\n", "

Typically this message means that one or more of the libraries that ImageMagick
\n", "depends on hasn’t been installed. Examine the mkmf.log file in the ext/RMagick
\n", "subdirectory of the installation directory for any error messages. These messages
\n", "typically contain enough additional information for you to be able to diagnose
\n", "the problem. Also see this FAQ.

\n", "

Cannot open shared object file

\n", "

If you get a message like this:

\n", "
\n", "    $DIR/RMagick.rb:11:in `require': libMagick.so.0:\n", "      cannot open shared object file: No such file or directory -\n", "      $DIR/RMagick2.so (LoadError)\n", "
\n", "

you probably do not have the directory in which the ImageMagick library
\n", "is installed in your load path. An easy way to fix this is to define
\n", "the directory in the LD_LIBRARY_PATH environment variable. For
\n", "example, suppose you installed the ImageMagick library libMagick.so in
\n", "/usr/local/lib. (By default this is where it is installed.) Create the
\n", "LD_LIBRARY_PATH variable like this:

\n", "
\n", "        export LD_LIBRARY_PATH=/usr/local/lib\n", "
\n", "

On Linux, see ld(1) and ld.so(8) for more information. On other operating
\n", "systems, see the documentation for the dynamic loading facility.

\n", "

No such file or directory – “/tmp/rmagick6872.6”

\n", "

When setup.rb is running the examples, if you get a message like this:

\n", "
\n", "    hook /home/me/src/RMagick-2.13.2/./post-setup.rb failed:\n", "    No such file or directory - \"/tmp/rmagick6872.6\"\n", "
\n", "

you probably do not have a temporary directory environment variable set. Set
\n", "the TMPDIR environment variable to your temporary directory. For example:

\n", "
\n", "    export TMPDIR=/home/me/tmp\n", "
\n", "

Upgrading

\n", "

If you upgrade to a newer release of ImageMagick, make sure you’re using a
\n", "release of RMagick that supports that release. It’s safe to install a new
\n", "release of RMagick over an earlier release.

\n", "

Uninstalling

\n", "

The uninstall.rb script will uninstall RMagick completely. Make sure you
\n", "have administrator priviledges. Then run this command:

\n", "
\n", "    ruby uninstall.rb\n", "
\n", "

More samples

\n", "

You can find more sample RMagick programs in the /example directory.
\n", "These programs are not installed in the RMagick documentation tree.

\n", "

Reporting bugs

\n", "

Please report bugs in RMagick, its documentation, or its installation
\n", "programs to me via the bug tracker on the RMagick project page.
\n", "However, I can’t help with Ruby installation and configuration or ImageMagick
\n", "installation and configuration. Information about reporting problems and
\n", "getting help for ImageMagick is available at the ImageMagick web site
\n", "or the ImageMagick Forum.

\n", "

Contact Information

\n", "

Author: Tim Hunter, Omer Bar-or, Benjamin Thomas

\n", "

Email: rmagick@rubyforge.org

\n", "

Web site: http://rmagick.rubyforge.org

\n", "

Credits

\n", "

Thanks to ImageMagick Studio LLC for ImageMagick
\n", "and for hosting the RMagick documentation.

\n", "

License

\n", "
\n", "Copyright &copy; 2002-2009 by Timothy P. Hunter\n", "\n", "Changes since Nov. 2009 copyright &copy; by Benjamin Thomas and Omer Bar-or\n", "\n", "Permission is hereby granted, free of charge, to any person obtaining a\n", "copy of this software and associated documentation files (the \"Software\"),\n", "to deal in the Software without restriction, including without limitation\n", "the rights to use, copy, modify, merge, publish, distribute, sublicense,\n", "and/or sell copies of the Software, and to permit persons to whom the\n", "Software is furnished to do so, subject to the following conditions:\n", "\n", "The above copyright notice and this permission notice shall be included in\n", "all copies or substantial portions of the Software.\n", "\n", "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n", "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n", "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\n", "THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n", "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n", "FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n", "DEALINGS IN THE SOFTWARE.\n", "
\n", "
\n", "

This file is marked up using Textile and converted
\n", "to HTML with RedCloth.

\n"] rmagick-2.13.2/post-clean.rb0000644000004100000410000000057712147515547015662 0ustar www-datawww-data# delete RMagick documentation created by post-setup.rb # doc/*.rb.html # doc/ex/* (!rb) # Bug #246: Don't use chdir! require 'fileutils' targets = Dir['doc/*.rb.html'] FileUtils.safe_unlink(targets) unless targets.empty? targets = Dir['doc/ex/*'] targets.delete_if { |entry| File.directory?(entry) || %r{\.rb\z}.match(entry) } FileUtils.safe_unlink(targets) unless targets.empty? rmagick-2.13.2/post-setup.rb0000644000004100000410000001340012147515547015725 0ustar www-datawww-data#=============================================================================== # post-setup.rb - setup documentation #=============================================================================== EXAMPLES = '.examples' STD_URI = 'http:\/\/www.imagemagick.org' STD_URI_RE = /"#{STD_URI}/ DONT_RUN = ['fonts.rb'] # never run these examples ENTITY = Hash['&' => '&', '>' => '>', '<' => '<'] if defined?(Installer) && self.class == Installer RUBYPROG = get_config('ruby-prog') SRCDIR = curr_srcdir() ALLOW_EXAMPLE_ERRORS = get_config('allow-example-errors') == 'yes' BUILD_HTMLDOC = get_config('disable-htmldoc') != 'yes' else RUBYPROG = 'ruby' SRCDIR = '.' ALLOW_EXAMPLE_ERRORS = true BUILD_HTMLDOC = true end # # A set of example programs in a directory and the output image each example produces. # class ExampleSet def initialize(of) @status_quo = get_status_quo() @errs = 0 begin File.open(EXAMPLES) do |f| @targets = Marshal.load(f) end rescue @targets = Hash.new @n = 0 @of = of @first_time = true else @first_time = false end end def persist File.open(EXAMPLES, 'w') do |f| Marshal.dump(@targets, f) end end def targets(example) @targets[example] || Array.new end def get_status_quo sq = Dir["*"] sq.delete_if { |entry| File.directory?(entry) } end def update_targets(example, new) t = targets(example) + new @targets[example] = t.uniq end def update_status_quo(example) new_status_quo = get_status_quo() new = new_status_quo - @status_quo update_targets(example, new) @status_quo = new_status_quo end def build(example) cmd = "#{RUBYPROG} -I #{SRCDIR}/lib -I #{SRCDIR}/ext/RMagick #{example}" print cmd print " (example #{@n += 1} of #{@of})" if @first_time puts system cmd if $? != 0 then puts("post-setup.rb: #{example} example returned error code #{$?}") @errs += 1 unless ALLOW_EXAMPLE_ERRORS if @errs > 4 err(<<-END_EXFAIL Too many examples failed. Search for "Help!" at http://rmagick.rubyforge.org/install-faq.html. END_EXFAIL ) end end update_status_quo(example) end def update(example) targets = targets(example) up_to_date = ! targets.empty? targets.each do |target| up_to_date &&= File.exists?(target) && (File.stat(target) >= File.stat(example)) end build(example) unless up_to_date end # # print message and exit # def err(msg) $stderr.puts "#{$0}: #{msg}" exit 1 end end # # Modify file lines via proc. If no lines changed, discard new version. # def filter(filename, backup=nil, &filter) if ! File.writable? filename then raise ArgumentError, "`#{filename}' is write-protected" end backup_name = filename + '.' + (backup || 'old') File.rename(filename, backup_name) changed = false begin File.open(filename, 'w') do |output| File.foreach(backup_name) do |line| old = line line = filter.call(line) output.puts(line) changed ||= line != old end end rescue File.rename(backup_name, filename) raise end if !changed newname = filename + '.xxx' File.rename(filename, newname) File.rename(backup_name, filename) File.unlink(newname) elsif !backup # Don't remove old copy if a backup extension was specified File.unlink(backup_name) rescue nil end end # # Copy an example to the doc directory, wrap in HTML tags # def filetoHTML(file, html) return if File.exists?(html) && File.stat(html) >= File.stat(file) File.open(file) do |src| File.open(html, 'w') do |dest| dest.puts <<-END_EXHTMLHEAD RMagick example: #{file}

#{file}

        END_EXHTMLHEAD

      src.each do |line|
        line.gsub!(/[&><]/) { |s| ENTITY[s] }
        dest.puts(line)
      end

      dest.puts <<-END_EXHTMLTAIL
END_EXHTMLTAIL end File.chmod(0644, html) end end puts "setup.rb: entering post-setup phase..." if BUILD_HTMLDOC # # Don't bother if we're in the sandbox # if File.exist? 'CVS/Entries' puts "post-setup.rb: in CVS sandbox - stopping..." exit end puts "post-setup.rb: setting up documentation..." # We're in the source directory. Process the doc in-place. The post-install.rb # script moves the generated documentation to the ultimate installation directories. cwd = Dir.getwd() Dir.chdir('doc') # need to work with 1.6.x, can't use block form begin # Step 1A: edit the shebang line in the examples Dir.chdir('ex') files = Dir['*.rb'] files.each do |file| filter(file) { |line| line.sub(/\A\#!\s*\S*ruby\s/, '#!'+RUBYPROG+' ') } # Step 1B: Make a copy of the example as HTML in the doc directory filetoHTML(file, "../#{file}.html") end # Step 2: run the examples examples = Dir['*.rb'].sort examples -= DONT_RUN es = ExampleSet.new(examples.length) begin examples.each { |example| es.update(example) } ensure es.persist end ensure Dir.chdir(cwd) end else puts "post-setup.rb: --disable-htmldoc specified. No documentation will be set up." end exit rmagick-2.13.2/README-Mac-OSX.txt0000644000004100000410000000012012147515547016113 0ustar www-datawww-dataFor installation instructions see http://rmagick.rubyforge.org/install-osx.html rmagick-2.13.2/metadata.yml0000644000004100000410000002221712147515547015566 0ustar www-datawww-data--- !ruby/object:Gem::Specification name: rmagick version: !ruby/object:Gem::Version version: 2.13.2 prerelease: platform: ruby authors: - Tim Hunter - Omer Bar-or - Benjamin Thomas autorequire: bindir: bin cert_chain: [] date: 2013-02-02 00:00:00.000000000 Z dependencies: [] description: RMagick is an interface between Ruby and ImageMagick. email: rmagick@rubyforge.org executables: [] extensions: - ext/RMagick/extconf.rb extra_rdoc_files: [] files: - build_tarball.rake - setup.rb - metaconfig - lib/rvg/paint.rb - lib/rvg/stretchable.rb - lib/rvg/transformable.rb - lib/rvg/stylable.rb - lib/rvg/text.rb - lib/rvg/describable.rb - lib/rvg/deep_equal.rb - lib/rvg/units.rb - lib/rvg/misc.rb - lib/rvg/rvg.rb - lib/rvg/embellishable.rb - lib/rvg/pathdata.rb - lib/rvg/clippath.rb - lib/rvg/container.rb - lib/RMagick.rb - README-Mac-OSX.txt - ChangeLog - uninstall.rb - post-clean.rb - examples/rotating_text.rb - examples/demo.rb - examples/histogram.rb - examples/thumbnail.rb - examples/spinner.rb - examples/identify.rb - examples/crop_with_gravity.rb - examples/import_export.rb - examples/find_similar_region.rb - examples/constitute.rb - examples/describe.rb - examples/pattern_fill.rb - examples/vignette.rb - examples/image_opacity.rb - ext/RMagick/MANIFEST - ext/RMagick/rmdraw.c - ext/RMagick/extconf.rb - ext/RMagick/rmpixel.c - ext/RMagick/rmmain.c - ext/RMagick/rminfo.c - ext/RMagick/rmilist.c - ext/RMagick/rmagick.h - ext/RMagick/rmfill.c - ext/RMagick/rmenum.c - ext/RMagick/rmutil.c - ext/RMagick/rmagick.c - ext/RMagick/rmimage.c - ext/RMagick/rmstruct.c - ext/RMagick/rmmontage.c - post-setup.rb - Doxyfile - post-install.rb - README.html - rmagick.gemspec - doc/constants.html - doc/ilist.html - doc/rvgtspan.html - doc/usage.html - doc/rvggroup.html - doc/ex/raise.rb - doc/ex/polyline01.rb - doc/ex/mono.rb - doc/ex/stroke_linejoin.rb - doc/ex/baseline_shift01.rb - doc/ex/dissolve.rb - doc/ex/opacity.rb - doc/ex/shadow.rb - doc/ex/gradientfill.rb - doc/ex/splice.rb - doc/ex/morph.rb - doc/ex/blur_image.rb - doc/ex/image.rb - doc/ex/cbezier4.rb - doc/ex/text_antialias.rb - doc/ex/text_align.rb - doc/ex/gravity.rb - doc/ex/tspan03.rb - doc/ex/evenodd.rb - doc/ex/affine_transform.rb - doc/ex/radial_blur.rb - doc/ex/tref01.rb - doc/ex/chop.rb - doc/ex/flop.rb - doc/ex/color_reset.rb - doc/ex/coalesce.rb - doc/ex/solarize.rb - doc/ex/enhance.rb - doc/ex/affine.rb - doc/ex/posterize.rb - doc/ex/path.rb - doc/ex/motion_blur.rb - doc/ex/stroke_fill.rb - doc/ex/cubic01.rb - doc/ex/fonts.rb - doc/ex/edge.rb - doc/ex/cbezier3.rb - doc/ex/normalize.rb - doc/ex/oil_paint.rb - doc/ex/text.rb - doc/ex/fill_pattern.rb - doc/ex/skewy.rb - doc/ex/transparent.rb - doc/ex/ordered_dither.rb - doc/ex/matte_fill_to_border.rb - doc/ex/color_fill_to_border.rb - doc/ex/circle01.rb - doc/ex/color_floodfill.rb - doc/ex/translate.rb - doc/ex/swirl.rb - doc/ex/Use03.rb - doc/ex/hatchfill.rb - doc/ex/PreserveAspectRatio.rb - doc/ex/negate.rb - doc/ex/InitialCoords.rb - doc/ex/line.rb - doc/ex/rvg_linejoin.rb - doc/ex/resize_to_fill.rb - doc/ex/flip.rb - doc/ex/rotate.rb - doc/ex/tspan01.rb - doc/ex/shave.rb - doc/ex/images/duck14.gif - doc/ex/images/Button_P.gif - doc/ex/images/Ballerina.jpg - doc/ex/images/Yellow_Rose.miff - doc/ex/images/Button_X.gif - doc/ex/images/Button_C.gif - doc/ex/images/Button_F.gif - doc/ex/images/spin.gif - doc/ex/images/Button_M.gif - doc/ex/images/Button_9.gif - doc/ex/images/duck7.gif - doc/ex/images/duck10.gif - doc/ex/images/Red_Rocks.jpg - doc/ex/images/Button_E.gif - doc/ex/images/duck3.gif - doc/ex/images/Gold_Statue.jpg - doc/ex/images/Button_I.gif - doc/ex/images/Button_Q.gif - doc/ex/images/notimplemented.gif - doc/ex/images/duck1.gif - doc/ex/images/duck2.gif - doc/ex/images/Flower_Hat.jpg - doc/ex/images/Button_L.gif - doc/ex/images/Button_2.gif - doc/ex/images/graydient230x6.gif - doc/ex/images/duck0.gif - doc/ex/images/Button_W.gif - doc/ex/images/smile.miff - doc/ex/images/duck8.gif - doc/ex/images/duck11.gif - doc/ex/images/Button_D.gif - doc/ex/images/No.wmf - doc/ex/images/Apple.miff - doc/ex/images/Button_G.gif - doc/ex/images/Button_Z.gif - doc/ex/images/Button_1.gif - doc/ex/images/Button_H.gif - doc/ex/images/Button_A.gif - doc/ex/images/Hot_Air_Balloons.jpg - doc/ex/images/duck15.gif - doc/ex/images/Button_R.gif - doc/ex/images/Button_Y.gif - doc/ex/images/Button_V.gif - doc/ex/images/model.miff - doc/ex/images/Hot_Air_Balloons_H.jpg - doc/ex/images/Button_J.gif - doc/ex/images/Rocks_On_Beach.miff - doc/ex/images/Polynesia.jpg - doc/ex/images/Button_4.gif - doc/ex/images/Button_6.gif - doc/ex/images/Button_U.gif - doc/ex/images/Button_0.gif - doc/ex/images/Button_3.gif - doc/ex/images/Button_S.gif - doc/ex/images/duck4.gif - doc/ex/images/Shorts.jpg - doc/ex/images/Coffee.wmf - doc/ex/images/big-duck.gif - doc/ex/images/duck9.gif - doc/ex/images/Ballerina3.jpg - doc/ex/images/duck5.gif - doc/ex/images/Button_5.gif - doc/ex/images/logo400x83.gif - doc/ex/images/Snake.wmf - doc/ex/images/duck12.gif - doc/ex/images/Button_8.gif - doc/ex/images/Button_N.gif - doc/ex/images/Button_7.gif - doc/ex/images/Button_K.gif - doc/ex/images/duck6.gif - doc/ex/images/Violin.jpg - doc/ex/images/Leaf.miff - doc/ex/images/duck.gif - doc/ex/images/Button_O.gif - doc/ex/images/Button_T.gif - doc/ex/images/Button_B.gif - doc/ex/images/duck13.gif - doc/ex/images/Cheetah.jpg - doc/ex/transpose.rb - doc/ex/cbezier5.rb - doc/ex/drawcomp.rb - doc/ex/trim.rb - doc/ex/color_histogram.rb - doc/ex/smile.rb - doc/ex/clip_path.rb - doc/ex/frame.rb - doc/ex/remap_images.rb - doc/ex/ViewBox.rb - doc/ex/emboss.rb - doc/ex/stroke_dasharray.rb - doc/ex/border.rb - doc/ex/stroke_width.rb - doc/ex/crop_with_gravity.rb - doc/ex/polygon.rb - doc/ex/arcpath.rb - doc/ex/rvg_pattern.rb - doc/ex/level_colors.rb - doc/ex/mask.rb - doc/ex/matte_replace.rb - doc/ex/writing_mode01.rb - doc/ex/bilevel_channel.rb - doc/ex/mosaic.rb - doc/ex/quad01.rb - doc/ex/font_styles.rb - doc/ex/Use01.rb - doc/ex/to_blob.rb - doc/ex/get_multiline_type_metrics.rb - doc/ex/add_noise.rb - doc/ex/Use02.rb - doc/ex/flatten_images.rb - doc/ex/contrast.rb - doc/ex/texturefill.rb - doc/ex/writing_mode02.rb - doc/ex/group.rb - doc/ex/implode.rb - doc/ex/crop.rb - doc/ex/sparse_color.rb - doc/ex/polaroid.rb - doc/ex/stegano.rb - doc/ex/roundrect.rb - doc/ex/rubyname.rb - doc/ex/rvg_clippath.rb - doc/ex/Skew.rb - doc/ex/colorize.rb - doc/ex/texture_fill_to_border.rb - doc/ex/NewCoordSys.rb - doc/ex/qbezierpath.rb - doc/ex/reduce_noise.rb - doc/ex/cbezier6.rb - doc/ex/adaptive_threshold.rb - doc/ex/roll.rb - doc/ex/modulate.rb - doc/ex/ellipse.rb - doc/ex/equalize.rb - doc/ex/grav.rb - doc/ex/cycle_colormap.rb - doc/ex/sketch.rb - doc/ex/spread.rb - doc/ex/pattern2.rb - doc/ex/random_threshold_channel.rb - doc/ex/stroke_linecap.rb - doc/ex/axes.rb - doc/ex/rvg_linecap.rb - doc/ex/wet_floor.rb - doc/ex/wave.rb - doc/ex/colors.rb - doc/ex/quantize-m.rb - doc/ex/text01.rb - doc/ex/unsharp_mask.rb - doc/ex/composite_tiled.rb - doc/ex/watermark.rb - doc/ex/get_pixels.rb - doc/ex/rect02.rb - doc/ex/composite_layers.rb - doc/ex/rvg_stroke_dasharray.rb - doc/ex/arcs01.rb - doc/ex/bounding_box.rb - doc/ex/line01.rb - doc/ex/transverse.rb - doc/ex/negate_channel.rb - doc/ex/rotate_f.rb - doc/ex/level.rb - doc/ex/remap.rb - doc/ex/pattern1.rb - doc/ex/shear.rb - doc/ex/vignette.rb - doc/ex/viewex.rb - doc/ex/text_styles.rb - doc/ex/RotateScale.rb - doc/ex/nested_rvg.rb - doc/ex/matte_floodfill.rb - doc/ex/preview.rb - doc/ex/arcs02.rb - doc/ex/skewx.rb - doc/ex/text_undercolor.rb - doc/ex/polygon01.rb - doc/ex/rvg_opacity.rb - doc/ex/arc.rb - doc/ex/channel.rb - doc/ex/drop_shadow.rb - doc/ex/triangle01.rb - doc/ex/tspan02.rb - doc/ex/texture_floodfill.rb - doc/ex/sepiatone.rb - doc/ex/rectangle.rb - doc/ex/shade.rb - doc/ex/polyline.rb - doc/ex/resize_to_fit.rb - doc/ex/cubic02.rb - doc/ex/median_filter.rb - doc/ex/cbezier1.rb - doc/ex/threshold.rb - doc/ex/segment.rb - doc/ex/gaussian_blur.rb - doc/ex/charcoal.rb - doc/ex/ellipse01.rb - doc/ex/OrigCoordSys.rb - doc/ex/get_type_metrics.rb - doc/ex/rect01.rb - doc/ex/circle.rb - doc/ex/nonzero.rb - doc/ex/cbezier2.rb - doc/ex/composite.rb - doc/ex/compose_mask.rb - doc/ex/average.rb - doc/css/ref.css - doc/css/popup.css - doc/css/doc.css - doc/comtasks.html - doc/index.html - doc/rvguse.html - doc/rvgpattern.html - doc/imusage.html - doc/scripts/doc.js - doc/scripts/stripeTables.js - doc/image3.html - doc/rvg.html - doc/rvgxform.html - doc/magick.html - doc/imageattrs.html - doc/struct.html - doc/rvgstyle.html - doc/rvgshape.html - doc/image1.html - doc/rvgclip.html - doc/draw.html - doc/image2.html - doc/rvgtext.html - doc/rvgtut.html - doc/optequiv.html - doc/rvgimage.html - doc/info.html homepage: http://rubyforge.org/projects/rmagick licenses: [] post_install_message: rdoc_options: [] require_paths: - lib - ext required_ruby_version: !ruby/object:Gem::Requirement none: false requirements: - - ! '>=' - !ruby/object:Gem::Version version: 1.8.5 required_rubygems_version: !ruby/object:Gem::Requirement none: false requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' requirements: - ImageMagick 6.4.9 or later rubyforge_project: rmagick rubygems_version: 1.8.24 signing_key: specification_version: 3 summary: Ruby binding to ImageMagick test_files: [] rmagick-2.13.2/setup.rb0000644000004100000410000010654612147515547014760 0ustar www-datawww-data# # setup.rb # # Copyright (c) 2000-2005 Minero Aoki # # This program is free software. # You can distribute/modify this program under the terms of # the GNU LGPL, Lesser General Public License version 2.1. # unless Enumerable.method_defined?(:map) # Ruby 1.4.6 module Enumerable alias map collect end end unless File.respond_to?(:read) # Ruby 1.6 def File.read(fname) open(fname) {|f| return f.read } end end unless Errno.const_defined?(:ENOTEMPTY) # Windows? module Errno class ENOTEMPTY # We do not raise this exception, implementation is not needed. end end end def File.binread(fname) open(fname, 'rb') {|f| return f.read } end # for corrupted Windows' stat(2) def File.dir?(path) File.directory?((path[-1,1] == '/') ? path : path + '/') end class ConfigTable include Enumerable def initialize(rbconfig) @rbconfig = rbconfig @items = [] @table = {} # options @install_prefix = nil @config_opt = nil @verbose = true @no_harm = false end attr_accessor :install_prefix attr_accessor :config_opt attr_writer :verbose def verbose? @verbose end attr_writer :no_harm def no_harm? @no_harm end def [](key) lookup(key).resolve(self) end def []=(key, val) lookup(key).set val end def names @items.map {|i| i.name } end def each(&block) @items.each(&block) end def key?(name) @table.key?(name) end def lookup(name) @table[name] or setup_rb_error "no such config item: #{name}" end def add(item) @items.push item @table[item.name] = item end def remove(name) item = lookup(name) @items.delete_if {|i| i.name == name } @table.delete_if {|name, i| i.name == name } item end def load_script(path, inst = nil) if File.file?(path) MetaConfigEnvironment.new(self, inst).instance_eval File.read(path), path end end def savefile '.config' end def load_savefile begin File.foreach(savefile()) do |line| k, v = *line.split(/=/, 2) self[k] = v.strip end rescue Errno::ENOENT setup_rb_error $!.message + "\n#{File.basename($0)} config first" end end def save @items.each {|i| i.value } File.open(savefile(), 'w') {|f| @items.each do |i| f.printf "%s=%s\n", i.name, i.value if i.value? and i.value end } end def load_standard_entries standard_entries(@rbconfig).each do |ent| add ent end end def standard_entries(rbconfig) c = rbconfig rubypath = File.join(c['bindir'], c['ruby_install_name'] + c['EXEEXT']) major = c['MAJOR'].to_i minor = c['MINOR'].to_i teeny = c['TEENY'].to_i version = "#{major}.#{minor}" # ruby ver. >= 1.4.4? newpath_p = ((major >= 2) or ((major == 1) and ((minor >= 5) or ((minor == 4) and (teeny >= 4))))) if c['rubylibdir'] # V > 1.6.3 libruby = "#{c['prefix']}/lib/ruby" librubyver = c['rubylibdir'] librubyverarch = c['archdir'] siteruby = c['sitedir'] siterubyver = c['sitelibdir'] siterubyverarch = c['sitearchdir'] elsif newpath_p # 1.4.4 <= V <= 1.6.3 libruby = "#{c['prefix']}/lib/ruby" librubyver = "#{c['prefix']}/lib/ruby/#{version}" librubyverarch = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}" siteruby = c['sitedir'] siterubyver = "$siteruby/#{version}" siterubyverarch = "$siterubyver/#{c['arch']}" else # V < 1.4.4 libruby = "#{c['prefix']}/lib/ruby" librubyver = "#{c['prefix']}/lib/ruby/#{version}" librubyverarch = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}" siteruby = "#{c['prefix']}/lib/ruby/#{version}/site_ruby" siterubyver = siteruby siterubyverarch = "$siterubyver/#{c['arch']}" end parameterize = lambda {|path| path.sub(/\A#{Regexp.quote(c['prefix'])}/, '$prefix') } if arg = c['configure_args'].split.detect {|arg| /--with-make-prog=/ =~ arg } makeprog = arg.sub(/'/, '').split(/=/, 2)[1] else makeprog = 'make' end [ ExecItem.new('installdirs', 'std/site/home', 'std: install under libruby; site: install under site_ruby; home: install under $HOME')\ {|val, table| case val when 'std' table['rbdir'] = '$librubyver' table['sodir'] = '$librubyverarch' when 'site' table['rbdir'] = '$siterubyver' table['sodir'] = '$siterubyverarch' when 'home' setup_rb_error '$HOME was not set' unless ENV['HOME'] table['prefix'] = ENV['HOME'] table['rbdir'] = '$libdir/ruby' table['sodir'] = '$libdir/ruby' end }, PathItem.new('prefix', 'path', c['prefix'], 'path prefix of target environment'), PathItem.new('bindir', 'path', parameterize.call(c['bindir']), 'the directory for commands'), PathItem.new('libdir', 'path', parameterize.call(c['libdir']), 'the directory for libraries'), PathItem.new('datadir', 'path', parameterize.call(c['datadir']), 'the directory for shared data'), PathItem.new('mandir', 'path', parameterize.call(c['mandir']), 'the directory for man pages'), PathItem.new('sysconfdir', 'path', parameterize.call(c['sysconfdir']), 'the directory for system configuration files'), PathItem.new('localstatedir', 'path', parameterize.call(c['localstatedir']), 'the directory for local state data'), PathItem.new('libruby', 'path', libruby, 'the directory for ruby libraries'), PathItem.new('librubyver', 'path', librubyver, 'the directory for standard ruby libraries'), PathItem.new('librubyverarch', 'path', librubyverarch, 'the directory for standard ruby extensions'), PathItem.new('siteruby', 'path', siteruby, 'the directory for version-independent aux ruby libraries'), PathItem.new('siterubyver', 'path', siterubyver, 'the directory for aux ruby libraries'), PathItem.new('siterubyverarch', 'path', siterubyverarch, 'the directory for aux ruby binaries'), PathItem.new('rbdir', 'path', '$siterubyver', 'the directory for ruby scripts'), PathItem.new('sodir', 'path', '$siterubyverarch', 'the directory for ruby extentions'), PathItem.new('rubypath', 'path', rubypath, 'the path to set to #! line'), ProgramItem.new('rubyprog', 'name', rubypath, 'the ruby program using for installation'), ProgramItem.new('makeprog', 'name', makeprog, 'the make program to compile ruby extentions'), SelectItem.new('shebang', 'all/ruby/never', 'ruby', 'shebang line (#!) editing mode'), BoolItem.new('without-ext', 'yes/no', 'no', 'does not compile/install ruby extentions') ] end private :standard_entries def load_multipackage_entries multipackage_entries().each do |ent| add ent end end def multipackage_entries [ PackageSelectionItem.new('with', 'name,name...', '', 'ALL', 'package names that you want to install'), PackageSelectionItem.new('without', 'name,name...', '', 'NONE', 'package names that you do not want to install') ] end private :multipackage_entries ALIASES = { 'std-ruby' => 'librubyver', 'stdruby' => 'librubyver', 'rubylibdir' => 'librubyver', 'archdir' => 'librubyverarch', 'site-ruby-common' => 'siteruby', # For backward compatibility 'site-ruby' => 'siterubyver', # For backward compatibility 'bin-dir' => 'bindir', 'bin-dir' => 'bindir', 'rb-dir' => 'rbdir', 'so-dir' => 'sodir', 'data-dir' => 'datadir', 'ruby-path' => 'rubypath', 'ruby-prog' => 'rubyprog', 'ruby' => 'rubyprog', 'make-prog' => 'makeprog', 'make' => 'makeprog' } def fixup ALIASES.each do |ali, name| @table[ali] = @table[name] end @items.freeze @table.freeze @options_re = /\A--(#{@table.keys.join('|')})(?:=(.*))?\z/ end def parse_opt(opt) m = @options_re.match(opt) or setup_rb_error "config: unknown option #{opt}" m.to_a[1,2] end def dllext @rbconfig['DLEXT'] end def value_config?(name) lookup(name).value? end class Item def initialize(name, template, default, desc) @name = name.freeze @template = template @value = default @default = default @description = desc end attr_reader :name attr_reader :description attr_accessor :default alias help_default default def help_opt "--#{@name}=#{@template}" end def value? true end def value @value end def resolve(table) @value.gsub(%r<\$([^/]+)>) { table[$1] } end def set(val) @value = check(val) end private def check(val) setup_rb_error "config: --#{name} requires argument" unless val val end end class BoolItem < Item def config_type 'bool' end def help_opt "--#{@name}" end private def check(val) return 'yes' unless val case val when /\Ay(es)?\z/i, /\At(rue)?\z/i then 'yes' when /\An(o)?\z/i, /\Af(alse)\z/i then 'no' else setup_rb_error "config: --#{@name} accepts only yes/no for argument" end end end class PathItem < Item def config_type 'path' end private def check(path) setup_rb_error "config: --#{@name} requires argument" unless path path[0,1] == '$' ? path : File.expand_path(path) end end class ProgramItem < Item def config_type 'program' end end class SelectItem < Item def initialize(name, selection, default, desc) super @ok = selection.split('/') end def config_type 'select' end private def check(val) unless @ok.include?(val.strip) setup_rb_error "config: use --#{@name}=#{@template} (#{val})" end val.strip end end class ExecItem < Item def initialize(name, selection, desc, &block) super name, selection, nil, desc @ok = selection.split('/') @action = block end def config_type 'exec' end def value? false end def resolve(table) setup_rb_error "$#{name()} wrongly used as option value" end undef set def evaluate(val, table) v = val.strip.downcase unless @ok.include?(v) setup_rb_error "invalid option --#{@name}=#{val} (use #{@template})" end @action.call v, table end end class PackageSelectionItem < Item def initialize(name, template, default, help_default, desc) super name, template, default, desc @help_default = help_default end attr_reader :help_default def config_type 'package' end private def check(val) unless File.dir?("packages/#{val}") setup_rb_error "config: no such package: #{val}" end val end end class MetaConfigEnvironment def initialize(config, installer) @config = config @installer = installer end def config_names @config.names end def config?(name) @config.key?(name) end def bool_config?(name) @config.lookup(name).config_type == 'bool' end def path_config?(name) @config.lookup(name).config_type == 'path' end def value_config?(name) @config.lookup(name).config_type != 'exec' end def add_config(item) @config.add item end def add_bool_config(name, default, desc) @config.add BoolItem.new(name, 'yes/no', default ? 'yes' : 'no', desc) end def add_path_config(name, default, desc) @config.add PathItem.new(name, 'path', default, desc) end def set_config_default(name, default) @config.lookup(name).default = default end def remove_config(name) @config.remove(name) end # For only multipackage def packages raise '[setup.rb fatal] multi-package metaconfig API packages() called for single-package; contact application package vendor' unless @installer @installer.packages end # For only multipackage def declare_packages(list) raise '[setup.rb fatal] multi-package metaconfig API declare_packages() called for single-package; contact application package vendor' unless @installer @installer.packages = list end end end # class ConfigTable # This module requires: #verbose?, #no_harm? module FileOperations def mkdir_p(dirname, prefix = nil) dirname = prefix + File.expand_path(dirname) if prefix $stderr.puts "mkdir -p #{dirname}" if verbose? return if no_harm? # Does not check '/', it's too abnormal. dirs = File.expand_path(dirname).split(%r<(?=/)>) if /\A[a-z]:\z/i =~ dirs[0] disk = dirs.shift dirs[0] = disk + dirs[0] end dirs.each_index do |idx| path = dirs[0..idx].join('') Dir.mkdir path unless File.dir?(path) end end def rm_f(path) $stderr.puts "rm -f #{path}" if verbose? return if no_harm? force_remove_file path end def rm_rf(path) $stderr.puts "rm -rf #{path}" if verbose? return if no_harm? remove_tree path end def remove_tree(path) if File.symlink?(path) remove_file path elsif File.dir?(path) remove_tree0 path else force_remove_file path end end def remove_tree0(path) Dir.foreach(path) do |ent| next if ent == '.' next if ent == '..' entpath = "#{path}/#{ent}" if File.symlink?(entpath) remove_file entpath elsif File.dir?(entpath) remove_tree0 entpath else force_remove_file entpath end end begin Dir.rmdir path rescue Errno::ENOTEMPTY # directory may not be empty end end def move_file(src, dest) force_remove_file dest begin File.rename src, dest rescue File.open(dest, 'wb') {|f| f.write File.binread(src) } File.chmod File.stat(src).mode, dest File.unlink src end end def force_remove_file(path) begin remove_file path rescue end end def remove_file(path) File.chmod 0777, path File.unlink path end def install(from, dest, mode, prefix = nil) $stderr.puts "install #{from} #{dest}" if verbose? return if no_harm? realdest = prefix ? prefix + File.expand_path(dest) : dest realdest = File.join(realdest, File.basename(from)) if File.dir?(realdest) str = File.binread(from) if diff?(str, realdest) verbose_off { rm_f realdest if File.exist?(realdest) } File.open(realdest, 'wb') {|f| f.write str } File.chmod mode, realdest File.open("#{objdir_root()}/InstalledFiles", 'a') {|f| if prefix f.puts realdest.sub(prefix, '') else f.puts realdest end } end end def diff?(new_content, path) return true unless File.exist?(path) new_content != File.binread(path) end def command(*args) $stderr.puts args.join(' ') if verbose? system(*args) or raise RuntimeError, "system(#{args.map{|a| a.inspect }.join(' ')}) failed" end def ruby(*args) command config('rubyprog'), *args end def make(task = nil) command(*[config('makeprog'), task].compact) end def extdir?(dir) File.exist?("#{dir}/MANIFEST") or File.exist?("#{dir}/extconf.rb") end def files_of(dir) Dir.open(dir) {|d| return d.select {|ent| File.file?("#{dir}/#{ent}") } } end DIR_REJECT = %w( . .. CVS SCCS RCS CVS.adm .svn ) def directories_of(dir) Dir.open(dir) {|d| return d.select {|ent| File.dir?("#{dir}/#{ent}") } - DIR_REJECT } end end # This module requires: #srcdir_root, #objdir_root, #relpath module HookScriptAPI def get_config(key) @config[key] end alias config get_config # obsolete: use metaconfig to change configuration def set_config(key, val) @config[key] = val end # # srcdir/objdir (works only in the package directory) # def curr_srcdir "#{srcdir_root()}/#{relpath()}" end def curr_objdir "#{objdir_root()}/#{relpath()}" end def srcfile(path) "#{curr_srcdir()}/#{path}" end def srcexist?(path) File.exist?(srcfile(path)) end def srcdirectory?(path) File.dir?(srcfile(path)) end def srcfile?(path) File.file?(srcfile(path)) end def srcentries(path = '.') Dir.open("#{curr_srcdir()}/#{path}") {|d| return d.to_a - %w(. ..) } end def srcfiles(path = '.') srcentries(path).select {|fname| File.file?(File.join(curr_srcdir(), path, fname)) } end def srcdirectories(path = '.') srcentries(path).select {|fname| File.dir?(File.join(curr_srcdir(), path, fname)) } end end class ToplevelInstaller Version = '3.4.1' Copyright = 'Copyright (c) 2000-2005 Minero Aoki' TASKS = [ [ 'all', 'do config, setup, then install' ], [ 'config', 'saves your configurations' ], [ 'show', 'shows current configuration' ], [ 'setup', 'compiles ruby extentions and others' ], [ 'install', 'installs files' ], [ 'test', 'run all tests in test/' ], [ 'clean', "does `make clean' for each extention" ], [ 'distclean',"does `make distclean' for each extention" ] ] def ToplevelInstaller.invoke config = ConfigTable.new(load_rbconfig()) config.load_standard_entries config.load_multipackage_entries if multipackage? klass = (multipackage?() ? ToplevelInstallerMulti : ToplevelInstaller) klass.new(File.dirname($0), config).invoke end def ToplevelInstaller.multipackage? File.dir?(File.dirname($0) + '/packages') end def ToplevelInstaller.load_rbconfig if arg = ARGV.detect {|arg| /\A--rbconfig=/ =~ arg } ARGV.delete(arg) load File.expand_path(arg.split(/=/, 2)[1]) $".push 'rbconfig.rb' else require 'rbconfig' end defined?(RbConfig) ? ::RbConfig::CONFIG : ::Config::CONFIG end def initialize(ardir_root, config) @ardir = File.expand_path(ardir_root) @config = config # cache @valid_task_re = nil end def config(key) @config[key] end def inspect "#<#{self.class} #{__id__()}>" end def invoke run_metaconfigs @config.fixup case task = parsearg_global() when nil, 'all' parsearg_config init_installers exec_config exec_setup exec_install else case task when 'config', 'test' ; when 'clean', 'distclean' @config.load_savefile if File.exist?(@config.savefile) else @config.load_savefile end __send__ "parsearg_#{task}" init_installers __send__ "exec_#{task}" end end def run_metaconfigs @config.load_script "#{@ardir}/metaconfig" end def init_installers @installer = Installer.new(@config, @ardir, File.expand_path('.')) end # # Hook Script API bases # def srcdir_root @ardir end def objdir_root '.' end def relpath '.' end # # Option Parsing # def parsearg_global while arg = ARGV.shift case arg when /\A\w+\z/ setup_rb_error "invalid task: #{arg}" unless valid_task?(arg) return arg when '-q', '--quiet' @config.verbose = false when '--verbose' @config.verbose = true when '--help' print_usage $stdout exit 0 when '--version' puts "#{File.basename($0)} version #{Version}" exit 0 when '--copyright' puts Copyright exit 0 else setup_rb_error "unknown global option '#{arg}'" end end nil end def valid_task?(t) valid_task_re() =~ t end def valid_task_re @valid_task_re ||= /\A(?:#{TASKS.map {|task,desc| task }.join('|')})\z/ end def parsearg_no_options unless ARGV.empty? task = caller(0).first.slice(%r<`parsearg_(\w+)'>, 1) setup_rb_error "#{task}: unknown options: #{ARGV.join(' ')}" end end alias parsearg_show parsearg_no_options alias parsearg_setup parsearg_no_options alias parsearg_test parsearg_no_options alias parsearg_clean parsearg_no_options alias parsearg_distclean parsearg_no_options def parsearg_config evalopt = [] set = [] @config.config_opt = [] while i = ARGV.shift if /\A--?\z/ =~ i @config.config_opt = ARGV.dup break end name, value = *@config.parse_opt(i) if @config.value_config?(name) @config[name] = value else evalopt.push [name, value] end set.push name end evalopt.each do |name, value| @config.lookup(name).evaluate value, @config end # Check if configuration is valid set.each do |n| @config[n] if @config.value_config?(n) end end def parsearg_install @config.no_harm = false @config.install_prefix = '' while a = ARGV.shift case a when '--no-harm' @config.no_harm = true when /\A--prefix=/ path = a.split(/=/, 2)[1] path = File.expand_path(path) unless path[0,1] == '/' @config.install_prefix = path else setup_rb_error "install: unknown option #{a}" end end end def print_usage(out) out.puts 'Typical Installation Procedure:' out.puts " $ ruby #{File.basename $0} config" out.puts " $ ruby #{File.basename $0} setup" out.puts " # ruby #{File.basename $0} install (may require root privilege)" out.puts out.puts 'Detailed Usage:' out.puts " ruby #{File.basename $0} " out.puts " ruby #{File.basename $0} [] []" fmt = " %-24s %s\n" out.puts out.puts 'Global options:' out.printf fmt, '-q,--quiet', 'suppress message outputs' out.printf fmt, ' --verbose', 'output messages verbosely' out.printf fmt, ' --help', 'print this message' out.printf fmt, ' --version', 'print version and quit' out.printf fmt, ' --copyright', 'print copyright and quit' out.puts out.puts 'Tasks:' TASKS.each do |name, desc| out.printf fmt, name, desc end fmt = " %-24s %s [%s]\n" out.puts out.puts 'Options for CONFIG or ALL:' @config.each do |item| out.printf fmt, item.help_opt, item.description, item.help_default end out.printf fmt, '--rbconfig=path', 'rbconfig.rb to load',"running ruby's" out.puts out.puts 'Options for INSTALL:' out.printf fmt, '--no-harm', 'only display what to do if given', 'off' out.printf fmt, '--prefix=path', 'install path prefix', '' out.puts end # # Task Handlers # def exec_config @installer.exec_config @config.save # must be final end def exec_setup @installer.exec_setup end def exec_install @installer.exec_install end def exec_test @installer.exec_test end def exec_show @config.each do |i| printf "%-20s %s\n", i.name, i.value if i.value? end end def exec_clean @installer.exec_clean end def exec_distclean @installer.exec_distclean end end # class ToplevelInstaller class ToplevelInstallerMulti < ToplevelInstaller include FileOperations def initialize(ardir_root, config) super @packages = directories_of("#{@ardir}/packages") raise 'no package exists' if @packages.empty? @root_installer = Installer.new(@config, @ardir, File.expand_path('.')) end def run_metaconfigs @config.load_script "#{@ardir}/metaconfig", self @packages.each do |name| @config.load_script "#{@ardir}/packages/#{name}/metaconfig" end end attr_reader :packages def packages=(list) raise 'package list is empty' if list.empty? list.each do |name| raise "directory packages/#{name} does not exist"\ unless File.dir?("#{@ardir}/packages/#{name}") end @packages = list end def init_installers @installers = {} @packages.each do |pack| @installers[pack] = Installer.new(@config, "#{@ardir}/packages/#{pack}", "packages/#{pack}") end with = extract_selection(config('with')) without = extract_selection(config('without')) @selected = @installers.keys.select {|name| (with.empty? or with.include?(name)) \ and not without.include?(name) } end def extract_selection(list) a = list.split(/,/) a.each do |name| setup_rb_error "no such package: #{name}" unless @installers.key?(name) end a end def print_usage(f) super f.puts 'Inluded packages:' f.puts ' ' + @packages.sort.join(' ') f.puts end # # Task Handlers # def exec_config run_hook 'pre-config' each_selected_installers {|inst| inst.exec_config } run_hook 'post-config' @config.save # must be final end def exec_setup run_hook 'pre-setup' each_selected_installers {|inst| inst.exec_setup } run_hook 'post-setup' end def exec_install run_hook 'pre-install' each_selected_installers {|inst| inst.exec_install } run_hook 'post-install' end def exec_test run_hook 'pre-test' each_selected_installers {|inst| inst.exec_test } run_hook 'post-test' end def exec_clean rm_f @config.savefile run_hook 'pre-clean' each_selected_installers {|inst| inst.exec_clean } run_hook 'post-clean' end def exec_distclean rm_f @config.savefile run_hook 'pre-distclean' each_selected_installers {|inst| inst.exec_distclean } run_hook 'post-distclean' end # # lib # def each_selected_installers Dir.mkdir 'packages' unless File.dir?('packages') @selected.each do |pack| $stderr.puts "Processing the package `#{pack}' ..." if verbose? Dir.mkdir "packages/#{pack}" unless File.dir?("packages/#{pack}") Dir.chdir "packages/#{pack}" yield @installers[pack] Dir.chdir '../..' end end def run_hook(id) @root_installer.run_hook id end # module FileOperations requires this def verbose? @config.verbose? end # module FileOperations requires this def no_harm? @config.no_harm? end end # class ToplevelInstallerMulti class Installer FILETYPES = %w( bin lib ext data conf man ) include FileOperations include HookScriptAPI def initialize(config, srcroot, objroot) @config = config @srcdir = File.expand_path(srcroot) @objdir = File.expand_path(objroot) @currdir = '.' end def inspect "#<#{self.class} #{File.basename(@srcdir)}>" end def noop(rel) end # # Hook Script API base methods # def srcdir_root @srcdir end def objdir_root @objdir end def relpath @currdir end # # Config Access # # module FileOperations requires this def verbose? @config.verbose? end # module FileOperations requires this def no_harm? @config.no_harm? end def verbose_off begin save, @config.verbose = @config.verbose?, false yield ensure @config.verbose = save end end # # TASK config # def exec_config exec_task_traverse 'config' end alias config_dir_bin noop alias config_dir_lib noop def config_dir_ext(rel) extconf if extdir?(curr_srcdir()) end alias config_dir_data noop alias config_dir_conf noop alias config_dir_man noop def extconf ruby "#{curr_srcdir()}/extconf.rb", *@config.config_opt end # # TASK setup # def exec_setup exec_task_traverse 'setup' end def setup_dir_bin(rel) files_of(curr_srcdir()).each do |fname| update_shebang_line "#{curr_srcdir()}/#{fname}" end end alias setup_dir_lib noop def setup_dir_ext(rel) make if extdir?(curr_srcdir()) end alias setup_dir_data noop alias setup_dir_conf noop alias setup_dir_man noop def update_shebang_line(path) return if no_harm? return if config('shebang') == 'never' old = Shebang.load(path) if old $stderr.puts "warning: #{path}: Shebang line includes too many args. It is not portable and your program may not work." if old.args.size > 1 new = new_shebang(old) return if new.to_s == old.to_s else return unless config('shebang') == 'all' new = Shebang.new(config('rubypath')) end $stderr.puts "updating shebang: #{File.basename(path)}" if verbose? open_atomic_writer(path) {|output| File.open(path, 'rb') {|f| f.gets if old # discard output.puts new.to_s output.print f.read } } end def new_shebang(old) if /\Aruby/ =~ File.basename(old.cmd) Shebang.new(config('rubypath'), old.args) elsif File.basename(old.cmd) == 'env' and old.args.first == 'ruby' Shebang.new(config('rubypath'), old.args[1..-1]) else return old unless config('shebang') == 'all' Shebang.new(config('rubypath')) end end def open_atomic_writer(path, &block) tmpfile = File.basename(path) + '.tmp' begin File.open(tmpfile, 'wb', &block) File.rename tmpfile, File.basename(path) ensure File.unlink tmpfile if File.exist?(tmpfile) end end class Shebang def Shebang.load(path) line = nil File.open(path) {|f| line = f.gets } return nil unless /\A#!/ =~ line parse(line) end def Shebang.parse(line) cmd, *args = *line.strip.sub(/\A\#!/, '').split(' ') new(cmd, args) end def initialize(cmd, args = []) @cmd = cmd @args = args end attr_reader :cmd attr_reader :args def to_s "#! #{@cmd}" + (@args.empty? ? '' : " #{@args.join(' ')}") end end # # TASK install # def exec_install rm_f 'InstalledFiles' exec_task_traverse 'install' end def install_dir_bin(rel) install_files targetfiles(), "#{config('bindir')}/#{rel}", 0755 end def install_dir_lib(rel) install_files libfiles(), "#{config('rbdir')}/#{rel}", 0644 end def install_dir_ext(rel) return unless extdir?(curr_srcdir()) install_files rubyextentions('.'), "#{config('sodir')}/#{File.dirname(rel)}", 0555 end def install_dir_data(rel) install_files targetfiles(), "#{config('datadir')}/#{rel}", 0644 end def install_dir_conf(rel) # FIXME: should not remove current config files # (rename previous file to .old/.org) install_files targetfiles(), "#{config('sysconfdir')}/#{rel}", 0644 end def install_dir_man(rel) install_files targetfiles(), "#{config('mandir')}/#{rel}", 0644 end def install_files(list, dest, mode) mkdir_p dest, @config.install_prefix list.each do |fname| install fname, dest, mode, @config.install_prefix end end def libfiles glob_reject(%w(*.y *.output), targetfiles()) end def rubyextentions(dir) ents = glob_select("*.#{@config.dllext}", targetfiles()) if ents.empty? setup_rb_error "no ruby extention exists: 'ruby #{$0} setup' first" end ents end def targetfiles mapdir(existfiles() - hookfiles()) end def mapdir(ents) ents.map {|ent| if File.exist?(ent) then ent # objdir else "#{curr_srcdir()}/#{ent}" # srcdir end } end # picked up many entries from cvs-1.11.1/src/ignore.c JUNK_FILES = %w( core RCSLOG tags TAGS .make.state .nse_depinfo #* .#* cvslog.* ,* .del-* *.olb *~ *.old *.bak *.BAK *.orig *.rej _$* *$ *.org *.in .* ) def existfiles glob_reject(JUNK_FILES, (files_of(curr_srcdir()) | files_of('.'))) end def hookfiles %w( pre-%s post-%s pre-%s.rb post-%s.rb ).map {|fmt| %w( config setup install clean ).map {|t| sprintf(fmt, t) } }.flatten end def glob_select(pat, ents) re = globs2re([pat]) ents.select {|ent| re =~ ent } end def glob_reject(pats, ents) re = globs2re(pats) ents.reject {|ent| re =~ ent } end GLOB2REGEX = { '.' => '\.', '$' => '\$', '#' => '\#', '*' => '.*' } def globs2re(pats) /\A(?:#{ pats.map {|pat| pat.gsub(/[\.\$\#\*]/) {|ch| GLOB2REGEX[ch] } }.join('|') })\z/ end # # TASK test # TESTDIR = 'test' def exec_test unless File.directory?('test') $stderr.puts 'no test in this package' if verbose? return end $stderr.puts 'Running tests...' if verbose? begin require 'test/unit' rescue LoadError setup_rb_error 'test/unit cannot loaded. You need Ruby 1.8 or later to invoke this task.' end runner = Test::Unit::AutoRunner.new(true) runner.to_run << TESTDIR runner.run end # # TASK clean # def exec_clean exec_task_traverse 'clean' rm_f @config.savefile rm_f 'InstalledFiles' end alias clean_dir_bin noop alias clean_dir_lib noop alias clean_dir_data noop alias clean_dir_conf noop alias clean_dir_man noop def clean_dir_ext(rel) return unless extdir?(curr_srcdir()) make 'clean' if File.file?('Makefile') end # # TASK distclean # def exec_distclean exec_task_traverse 'distclean' rm_f @config.savefile rm_f 'InstalledFiles' end alias distclean_dir_bin noop alias distclean_dir_lib noop def distclean_dir_ext(rel) return unless extdir?(curr_srcdir()) make 'distclean' if File.file?('Makefile') end alias distclean_dir_data noop alias distclean_dir_conf noop alias distclean_dir_man noop # # Traversing # def exec_task_traverse(task) run_hook "pre-#{task}" FILETYPES.each do |type| if type == 'ext' and config('without-ext') == 'yes' $stderr.puts 'skipping ext/* by user option' if verbose? next end traverse task, type, "#{task}_dir_#{type}" end run_hook "post-#{task}" end def traverse(task, rel, mid) dive_into(rel) { run_hook "pre-#{task}" __send__ mid, rel.sub(%r[\A.*?(?:/|\z)], '') directories_of(curr_srcdir()).each do |d| traverse task, "#{rel}/#{d}", mid end run_hook "post-#{task}" } end def dive_into(rel) return unless File.dir?("#{@srcdir}/#{rel}") dir = File.basename(rel) Dir.mkdir dir unless File.dir?(dir) prevdir = Dir.pwd Dir.chdir dir $stderr.puts '---> ' + rel if verbose? @currdir = rel yield Dir.chdir prevdir $stderr.puts '<--- ' + rel if verbose? @currdir = File.dirname(rel) end def run_hook(id) path = [ "#{curr_srcdir()}/#{id}", "#{curr_srcdir()}/#{id}.rb" ].detect {|cand| File.file?(cand) } return unless path begin instance_eval File.read(path), path, 1 rescue raise if $DEBUG setup_rb_error "hook #{path} failed:\n" + $!.message end end end # class Installer class SetupError < StandardError; end def setup_rb_error(msg) raise SetupError, msg end if $0 == __FILE__ begin ToplevelInstaller.invoke rescue SetupError raise if $DEBUG $stderr.puts $!.message $stderr.puts "Try 'ruby #{$0} --help' for detailed usage." exit 1 end end rmagick-2.13.2/Doxyfile0000644000004100000410000017355712147515547015007 0ustar www-datawww-data# Doxyfile 1.6.1 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = RMagick # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = YES # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = YES # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 2 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it parses. # With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this tag. # The format is ext=language, where ext is a file extension, and language is one of # the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, # Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat # .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), # use: inc=Fortran f=C. Note that for custom extensions you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen to replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penality. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will rougly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespace are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the (brief and detailed) documentation of class members so that constructors and destructors are listed first. If set to NO (the default) the constructors will appear in the respective orders defined by SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. # This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by # doxygen. The layout file controls the global structure of the generated output files # in an output format independent way. The create the layout file that represents # doxygen's defaults, run doxygen with the -l option. You can optionally specify a # file name after the option, if omitted DoxygenLayout.xml will be used as the name # of the layout file. LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = ext/RMagick # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = *.c *.h # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. # If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. # Doxygen will compare the file name with each pattern and apply the # filter if there is a match. # The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. # Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = doc/c # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER # are set, an additional index file will be generated that can be used as input for # Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated # HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. # For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's # filter section matches. # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to YES, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list. USE_INLINE_TREES = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # When the SEARCHENGINE tag is enable doxygen will generate a search box for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using HTML help (GENERATE_HTMLHELP) or Qt help (GENERATE_QHP) # there is already a search function so this one should typically # be disabled. SEARCHENGINE = YES #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO # If LATEX_SOURCE_CODE is set to YES then doxygen will include source code with syntax highlighting in the LaTeX output. Note that which sources are shown also depends on other settings such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. # This is useful # if you want to understand what is going on. # On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = /usr/local/include # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # By default doxygen will write a font called FreeSans.ttf to the output # directory and reference it in all dot files that doxygen generates. This # font does not include all possible unicode characters however, so when you need # these (or just want a differently looking font) you can specify the font name # using DOT_FONTNAME. You need need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = FreeSans # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES rmagick-2.13.2/lib/0000755000004100000410000000000012147515547014025 5ustar www-datawww-datarmagick-2.13.2/lib/rvg/0000755000004100000410000000000012147515547014623 5ustar www-datawww-datarmagick-2.13.2/lib/rvg/stretchable.rb0000644000004100000410000001432212147515547017452 0ustar www-datawww-data#-- # $Id: stretchable.rb,v 1.7 2009/02/28 23:52:28 rmagick Exp $ # Copyright (C) 2009 Timothy P. Hunter #++ module Magick class RVG module PreserveAspectRatio #-- # Included in Stretchable module and Image class #++ # Specifies how the image within a viewport should be scaled. # [+align+] a combination of 'xMin', 'xMid', or 'xMax', followed by # 'YMin', 'YMid', or 'YMax' # [+meet_or_slice+] one of 'meet' or 'slice' def preserve_aspect_ratio(align, meet_or_slice='meet') @align = align.to_s if @align != 'none' m = /\A(xMin|xMid|xMax)(YMin|YMid|YMax)\z/.match(@align) raise(ArgumentError, "unknown alignment specifier: #{@align}") unless m end if meet_or_slice meet_or_slice = meet_or_slice.to_s.downcase if meet_or_slice == 'meet' || meet_or_slice == 'slice' @meet_or_slice = meet_or_slice else raise(ArgumentError, "specifier must be `meet' or `slice' (got #{meet_or_slice})") end end yield(self) if block_given? self end end # module PreserveAspectRatio # The methods in this module describe the user-coordinate space. # RVG and Pattern objects are stretchable. module Stretchable private # Scale to fit def set_viewbox_none(width, height) sx, sy = 1.0, 1.0 if @vbx_width sx = width / @vbx_width end if @vbx_height sy = height / @vbx_height end return [sx, sy] end # Use align attribute to compute x- and y-offset from viewport's upper-left corner. def align_to_viewport(width, height, sx, sy) tx = case @align when /\AxMin/ 0 when NilClass, /\AxMid/ (width - @vbx_width*sx) / 2.0 when /\AxMax/ width - @vbx_width*sx end ty = case @align when /YMin\z/ 0 when NilClass, /YMid\z/ (height - @vbx_height*sy) / 2.0 when /YMax\z/ height - @vbx_height*sy end return [tx, ty] end # Scale to smaller viewbox dimension def set_viewbox_meet(width, height) sx = sy = [width / @vbx_width, height / @vbx_height].min return [sx, sy] end # Scale to larger viewbox dimension def set_viewbox_slice(width, height) sx = sy = [width / @vbx_width, height / @vbx_height].max return [sx, sy] end # Establish the viewbox as necessary def add_viewbox_primitives(width, height, gc) @vbx_width ||= width @vbx_height ||= height @vbx_x ||= 0.0 @vbx_y ||= 0.0 if @align == 'none' sx, sy = set_viewbox_none(width, height) tx, ty = 0, 0 elsif @meet_or_slice == 'meet' sx, sy = set_viewbox_meet(width, height) tx, ty = align_to_viewport(width, height, sx, sy) else sx, sy = set_viewbox_slice(width, height) tx, ty = align_to_viewport(width, height, sx, sy) end # Establish clipping path around the current viewport name = __id__.to_s gc.define_clip_path(name) do gc.path("M0,0 l#{width},0 l0,#{height} l-#{width},0 l0,-#{height}z") end gc.clip_path(name) # Add a non-scaled translation if meet or slice gc.translate(tx, ty) if (tx.abs > 1.0e-10 || ty.abs > 1.0e-10) # Scale viewbox as necessary gc.scale(sx, sy) if (sx != 1.0 || sy != 1.0) # Add a scaled translation if non-0 origin gc.translate(-@vbx_x, -@vbx_y) if (@vbx_x.abs != 0.0 || @vbx_y.abs != 0) end def initialize(*args, &block) super() @vbx_x, @vbx_y, @vbx_width, @vbx_height = nil @meet_or_slice = 'meet' @align = nil end public include PreserveAspectRatio # Describe a user coordinate system to be imposed on the viewbox. # The arguments must be numbers and the +width+ and +height+ # arguments must be positive. def viewbox(x, y, width, height) begin @vbx_x = Float(x) @vbx_y = Float(y) @vbx_width = Float(width) @vbx_height = Float(height) rescue ArgumentError raise ArgumentError, "arguments must be convertable to float (got #{x.class}, #{y.class}, #{width.class}, #{height.class})" end raise(ArgumentError, "viewbox width must be > 0 (#{width} given)") unless width >= 0 raise(ArgumentError, "viewbox height must be > 0 (#{height} given)") unless height >= 0 # return the user-coordinate space attributes if defined class << self if not defined? @redefined then @redefined = true define_method(:x) { @vbx_x } define_method(:y) { @vbx_y } define_method(:width) { @vbx_width} define_method(:height) { @vbx_height } end end yield(self) if block_given? self end end # module Stretchable end # class RVG end # module Magick rmagick-2.13.2/lib/rvg/container.rb0000644000004100000410000001104112147515547017127 0ustar www-datawww-data#-- # $Id: container.rb,v 1.5 2009/02/28 23:52:13 rmagick Exp $ # Copyright (C) 2009 Timothy P. Hunter #++ module Magick class RVG # Content is simply an Array with a deep_copy method. # When unit-testing, it also has a deep_equal method. class Content < Array #:nodoc: def deep_copy(h = {}) me = self.__id__ copy = h[me] unless copy copy = self.class.new each do |c| copy << case when c.nil? nil when c.respond_to?(:deep_copy) c.deep_copy(h) when c.respond_to?(:dup) c.dup rescue c else c end end copy.freeze if frozen? h[me] = copy end return copy end end # class Content # Define a collection of shapes, text, etc. that can be reused. # Group objects are _containers_. That is, styles and transforms defined # on the group are used by contained objects such as shapes, text, and # nested groups unless overridden by a nested container or the object itself. # Groups can be reused with the RVG::UseConstructors#use method. # Create groups within # containers with the RVG::StructureConstructors#g method. # # Example: # # All elements in the group will be translated by 50 in the # # x-direction and 10 in the y-direction. # rvg.g.translate(50, 10).styles(:stroke=>'red',:fill=>'none') do |grp| # # The line will be red. # grp.line(10,10, 20,20) # # The circle will be blue. # grp.circle(10, 20, 20).styles(:stroke=>'blue') # end class Group include Stylable include Transformable include Embellishable include Describable include Duplicatable def initialize super @content = Content.new yield(self) if block_given? end def add_primitives(gc) #:nodoc: gc.push add_transform_primitives(gc) add_style_primitives(gc) @content.each { |element| element.add_primitives(gc) } gc.pop end # Translate container according to #use arguments def ref(x, y, width, height) #:nodoc: translate(x, y) if (x != 0 || y != 0) end # Append an arbitrary object to the group's content. Called # by #use to insert a non-container object into a group. def <<(obj) #:nodoc: @content << obj end end # class Group # A Use object allows the re-use of RVG and RVG::Group # objects within a container. Create a Use object with the # RVG::UseConstructors#use method. class Use include Stylable include Transformable include Duplicatable # In a container, Use objects are created indirectly via the # RVG::UseConstructors#use method. # The +x+ and +y+ arguments # can be used to specify an additional translation for # the group. The +width+ and +height+ arguments specify # a width and height for referenced RVG objects. def initialize(element, x=0, y=0, width=nil, height=nil) super() # If the element is not a group, defs, symbol, or rvg, # wrap a group around it so it can get a transform and # possibly a new viewport. if ! element.respond_to?(:ref) @element = Group.new @element << element.deep_copy else @element = element.deep_copy end @element.ref(x, y, width, height) end def add_primitives(gc) #:nodoc: gc.push add_transform_primitives(gc) add_style_primitives(gc) @element.add_primitives(gc) gc.pop end end # class Use end # class RVG end # module Magick rmagick-2.13.2/lib/rvg/text.rb0000644000004100000410000001321412147515547016135 0ustar www-datawww-data#-- # $Id: text.rb,v 1.7 2009/02/28 23:52:28 rmagick Exp $ # Copyright (C) 2009 Timothy P. Hunter #++ # Text-related classes module Magick class RVG # Base class for Tspan, Tref and Text. class TextBase include Stylable include Duplicatable private def initialize(text, &block) #:nodoc: super() @text = text.to_s if text @dx = @dy = 0 @rotation = 0 @tspans = Content.new yield(self) if block_given? end public # Create a new text chunk. Each chunk can have its own initial position and styles. # If x and y are omitted the text starts at the current text # position. def tspan(text, x=nil, y=nil) tspan = Tspan.new(text, x, y) tspan.parent = self @tspans << tspan return tspan end # Add x and y to the current text position. def d(x, y=0) @dx, @dy = Magick::RVG.convert_to_float(x, y) yield(self) if block_given? self end # Rotate the text about the current text position. def rotate(degrees) @rotation = Magick::RVG.convert_to_float(degrees)[0] yield(self) if block_given? self end # We do our own transformations. def add_primitives(gc) #:nodoc: if @text || @tspans.length > 0 gc.push x = self.cx + @dx y = self.cy + @dy if @rotation != 0 gc.translate(x, y) gc.rotate(@rotation) gc.translate(-x, -y) end add_style_primitives(gc) if @text x2, y2 = gc.text(x, y, @text) self.cx = x + x2 self.cy = y + y2 end @tspans.each do |tspan| tspan.add_primitives(gc) end gc.pop end end end # class TextBase # Tspan and Tref shared methods - read/update @cx, @cy in parent Text object. module TextLink #:nodoc: def add_primitives(gc) @parent.cx = @x if @x @parent.cy = @y if @y super end def cx() @parent.cx end def cy() @parent.cy end def cx=(x) @parent.cx = x end def cy=(y) @parent.cy = y end end # module TextLink class Tref < TextBase #:nodoc: include TextLink def initialize(obj, x, y, parent) @x, @y = Magick::RVG.convert_to_float(x, y, :allow_nil) super(nil) @tspans << obj @parent = parent end end # class Tref class Tspan < TextBase #:nodoc: include TextLink attr_accessor :parent # Define a text segment starting at (x, y). # If x and y are omitted the segment starts # at the current text position. # # Tspan objects can contain Tspan objects. def initialize(text=nil, x=nil, y=nil, &block) @x, @y = Magick::RVG.convert_to_float(x, y, :allow_nil) super(text, &block) end end # class Tspan class Text < TextBase attr_accessor :cx, :cy #:nodoc: # Define a text string starting at [x, y]. # Use the RVG::TextConstructors#text method to create Text objects in a container. # # container.text(100, 100, "Simple text").styles(:font=>'Arial') # # Text objects can contain Tspan objects. # # container.text(100, 100).styles(:font=>'Arial') do |t| # t.tspan("Red text").styles(:fill=>'red') # t.tspan("Blue text").styles(:fill=>'blue') # end def initialize(x=0, y=0, text=nil, &block) @cx, @cy = Magick::RVG.convert_to_float(x, y) super(text, &block) end # Reference a Tspan object. x and y are just # like x and y in RVG::TextBase#tspan def tref(obj, x=nil, y=nil) if ! obj.kind_of?(Tspan) raise ArgumentError, "wrong argument type #{obj.class} (expected Tspan)" end obj = obj.deep_copy obj.parent = self tref = Tref.new(obj, x, y, self) @tspans << tref return tref end end # class Text # Methods that construct text objects within a container module TextConstructors # Draw a text string at (x,y). The string can # be omitted. Optionally, define text chunks within the associated # block. def text(x=0, y=0, text=nil, &block) t = Text.new(x, y, text, &block) @content << t return t end end # module TextConstructors end # class RVG end # module Magick rmagick-2.13.2/lib/rvg/paint.rb0000644000004100000410000000402312147515547016262 0ustar www-datawww-data#-- # $Id: paint.rb,v 1.6 2009/02/28 23:52:28 rmagick Exp $ # Copyright (C) 2009 Timothy P. Hunter #++ # Defines paint server classes. # Eventually this will include gradients. module Magick class RVG class Pattern include StructureConstructors include UseConstructors include ShapeConstructors include TextConstructors include ImageConstructors include Stretchable include Duplicatable include Stylable # Return upper-left corner, width, height of viewport in user coordinates. # Usually these are the values specified when the Pattern object is # created, but they can be changed by a call to the viewbox method. attr_reader :x, :y, :width, :height # Create a pattern that can be used with the :fill or :stroke styles. # The +width+ and +height+ arguments define the viewport. # The pattern will be repeated at x+m*width and y+n*height # offsets. # # Define the pattern in the block. # The pattern can be composed of shapes (rectangle, circles, etc.), text, # raster images and container objects. You can include graphic objects by # referring to them with #use. def initialize(width=0, height=0, x=0, y=0) super() @width, @height, @x, @y = Magick::RVG.convert_to_float(width, height, x, y) @content = Content.new yield(self) if block_given? end def add_primitives(gc, style) #:nodoc: name = __id__.to_s gc.pattern(name, @x, @y, @width, @height) do add_viewbox_primitives(@width, @height, gc) @content.each { |element| element.add_primitives(gc) } end gc.__send__(style, name) end end # class Pattern end # class RVG end # module Magick rmagick-2.13.2/lib/rvg/pathdata.rb0000644000004100000410000001220012147515547016731 0ustar www-datawww-data#-- # $Id: pathdata.rb,v 1.5 2009/02/28 23:52:28 rmagick Exp $ # Copyright (C) 2009 Timothy P. Hunter #++ module Magick class RVG # The PathData class provides an object-oriented way to produce an SVG # path. Each of the methods corresponds to a path command. Construct a # path by calling one or more methods. The path object can be passed # as an argument to the RVG::ShapeConstructors#path method. class PathData private def add_points(req, *coords) if coords if coords.length % req != 0 raise ArgumentError, "wrong number of coordinates specified. A multiple of #{req} required, #{req+coords.length} given." end coords.each {|c| @path << ("%g" % c)} end end public # Construct an empty path def initialize @path = '' end # Convert the path to its string equivalent. def to_s @path end def deep_copy(h=nil) #:nodoc: @path.dup end # Add a moveto command. If abs is # true the coordinates are absolute, otherwise # the coordinates are relative. def moveto(abs, x, y, *coords) @path << sprintf("%s%g,%g ", (abs ? 'M' : 'm'), x, y) # "subsequent pairs are treated as implicit lineto commands" add_points(2, *coords) end # Add a closepath command. The abs argument # is ignored. def closepath(abs=true) @path << 'Z' # ignore `abs' end # Add a lineto command. Any number of x,y coordinate # pairs may be specified. If abs is # true the coordinates are absolute, otherwise # the coordinates are relative. def lineto(abs, x, y, *coords) @path << sprintf("%s%g,%g ", (abs ? 'L' : 'l'), x, y) # "a number of coordinate pairs may be specified to draw a polyline" add_points(2, *coords) end # Add a horizontal lineto command. If abs is # true the coordinates are absolute, otherwise # the coordinates are relative. def hlineto(abs, x) @path << sprintf("%s%g ", (abs ? 'H' : 'h'), x) end # Add a vertical lineto command. If abs is # true the coordinates are absolute, otherwise # the coordinates are relative. def vlineto(abs, y) @path << sprintf("%s%g ", (abs ? 'V' : 'v'), y) end # Add a curveto (cubic Bezier) command. # If abs is # true the coordinates are absolute, otherwise # the coordinates are relative. def curveto(abs, x1, y1, x2, y2, x, y, *coords) @path << sprintf("%s%g,%g %g,%g %g,%g ", (abs ? 'C' : 'c'), x1, y1, x2, y2, x, y) # "multiple sets of coordinates may be specified to draw a polybezier" add_points(6, *coords) end # Add a smooth curveto (cubic Bezier) command. # If abs is # true the coordinates are absolute, otherwise # the coordinates are relative. def smooth_curveto(abs, x2, y2, x, y, *coords) @path << sprintf("%s%g,%g %g,%g ", (abs ? 'S' : 's'), x2, y2, x, y) # "multiple sets of coordinates may be specified to draw a polybezier" add_points(4, *coords) end # Add a quadratic Bezier curveto command. # If abs is # true the coordinates are absolute, otherwise # the coordinates are relative. def quadratic_curveto(abs, x1, y1, x, y, *coords) @path << sprintf("%s%g,%g %g,%g ", (abs ? 'Q' : 'q'), x1, y1, x, y) add_points(4, *coords) end # Add a smooth quadratic Bezier curveto command. # If abs is # true the coordinates are absolute, otherwise # the coordinates are relative. def smooth_quadratic_curveto(abs, x, y, *coords) @path << sprintf("%s%g,%g ", (abs ? 'T' : 't'), x, y) add_points(2, *coords) end # Add an arc command. # If abs is # true the coordinates are absolute, otherwise # the coordinates are relative. def arc(abs, rx, ry, x_axis_rotation, large_arc_flag, sweep_flag, x, y) @path << sprintf("%s%g,%g %g %d %d %g,%g ", (abs ? 'A' : 'a'), rx, ry, x_axis_rotation, large_arc_flag, sweep_flag, x, y) end end # class PathData end # class RVG end # module Magick rmagick-2.13.2/lib/rvg/rvg.rb0000644000004100000410000002762612147515547015763 0ustar www-datawww-data#--############################################################################ # $Id: rvg.rb,v 1.10 2009/02/28 23:52:28 rmagick Exp $ # # Copyright (C) 2009 by Timothy P. Hunter # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # # This software is OSI Certified Open Source Software. # OSI Certified is a certification mark of the Open Source Initiative. # #++############################################################################ require 'RMagick' require 'rvg/misc' require 'rvg/describable' require 'rvg/stylable' require 'rvg/transformable' require 'rvg/stretchable' require 'rvg/text' require 'rvg/embellishable' require 'rvg/container' require 'rvg/pathdata' require 'rvg/clippath' require 'rvg/paint' require 'rvg/units' require 'pp' if ENV['debug_rvg'] # RVG is the main class in this library. All graphic elements # must be contained within an RVG object. module Magick class RVG include Stylable include Transformable include Stretchable include Embellishable include Describable include Duplicatable private # background_fill defaults to 'none'. If background_fill has been set to something # else, combine it with the background_fill_opacity. def bgfill() if @background_fill.nil? color = Magick::Pixel.new(0,0,0,Magick::TransparentOpacity) else color = @background_fill color.opacity = (1.0 - @background_fill_opacity) * Magick::TransparentOpacity end return color end def new_canvas if @background_pattern canvas = Magick::Image.new(@width, @height, @background_pattern) elsif @background_image if @width != @background_image.columns || @height != @background_image.rows canvas = case @background_position when :scaled @background_image.resize(@width, @height) when :tiled Magick::Image.new(@width, @height, Magick::TextureFill.new(@background_image)) when :fit width, height = @width, @height bgcolor = bgfill() @background_image.change_geometry(Magick::Geometry.new(width, height)) do |new_cols, new_rows| bg_image = @background_image.resize(new_cols, new_rows) if bg_image.columns != width || bg_image.rows != height bg = Magick::Image.new(width, height) { self.background_color = bgcolor } bg_image = bg.composite!(bg_image, Magick::CenterGravity, Magick::OverCompositeOp) end bg_image end end else canvas = @background_image.copy end else bgcolor = bgfill() canvas = Magick::Image.new(Integer(@width), Integer(@height)) { self.background_color = bgcolor } end canvas[:desc] = @desc if @desc canvas[:title] = @title if @title canvas[:metadata] = @metadata if @metadata return canvas end if ENV['debug_prim'] def print_gc(gc) primitives = gc.inspect.split(/\n/) indent = 0 primitives.each do |cmd| indent -= 1 if cmd['pop '] print((' '*indent), cmd, "\n") indent += 1 if cmd['push '] end end end public WORD_SEP = / / # Regexp to separate words # The background image specified by background_image= attr_reader :background_image # The background image layout specified by background_position= attr_reader :background_position # The background fill color specified by background_fill= attr_reader :background_fill # The background fill color opacity specified by background_fill_opacity= attr_reader :background_fill_opacity # The image after drawing has completed attr_reader :canvas # For embedded RVG objects, the x-axis coordinate of the upper-left corner attr_reader :x # For embedded RVG objects, the x-axis coordinate of the upper-left corner attr_reader :y attr_reader :width, :height # Sets an image to use as the canvas background. See background_position= for layout options. def background_image=(bg_image) warn "background_image= has no effect in nested RVG objects" if @nested if bg_image && ! bg_image.kind_of?(Magick::Image) raise ArgumentError, "background image must be an Image (got #{bg_image.class})" end @background_image = bg_image end # Sets an object to use to fill the canvas background. # The object must have a fill method. See the Fill Classes # section in the RMagick doc for more information. def background_pattern=(filler) warn "background_pattern= has no effect in nested RVG objects" if @nested @background_pattern = filler end # How to position the background image on the canvas. One of the following symbols: # [:scaled] Scale the image to the canvas width and height. # [:tiled] Tile the image across the canvas. # [:fit] Scale the image to fit within the canvas while retaining the # image proportions. Center the image on the canvas. Color any part of # the canvas not covered by the image with the background color. def background_position=(pos) warn "background_position= has no effect in nested RVG objects" if @nested bg_pos = pos.to_s.downcase if ! ['scaled', 'tiled', 'fit'].include?(bg_pos) raise ArgumentError, "background position must be `scaled', `tiled', or `fit' (#{pos} given)" end @background_position = bg_pos.to_sym end # Sets the canvas background color. Either a Magick::Pixel or a color name. # The default fill is "none", that is, transparent black. def background_fill=(color) warn "background_fill= has no effect in nested RVG objects" if @nested if ! color.kind_of?(Magick::Pixel) begin @background_fill = Magick::Pixel.from_color(color) rescue Magick::ImageMagickError raise ArgumentError, "unknown color `#{color}'" rescue TypeError raise TypeError, "cannot convert #{color.class} into Pixel" rescue raise ArgumentError, "argument must be a color name or a Pixel (got #{color.class})" end else @background_fill = color end end # Opacity of the background fill color, a number between 0.0 (transparent) and # 1.0 (opaque). The default is 1.0 when the background_fill= attribute has been set. def background_fill_opacity=(opacity) warn "background_fill_opacity= has no effect in nested RVG objects" if @nested begin @background_fill_opacity = Float(opacity) rescue ArgumentError raise ArgumentError, "background_fill_opacity must be a number between 0 and 1 (#{opacity} given)" end end # Draw a +width+ x +height+ image. The image is specified by calling # one or more drawing methods on the RVG object. # You can group the drawing method calls in the optional associated block. # The +x+ and +y+ arguments have no meaning for the outermost RVG object. # On nested RVG objects [+x+, +y+] is the coordinate of the upper-left # corner in the containing canvas on which the nested RVG object is placed. # # Drawing occurs on a +canvas+ created by the #draw method. By default the # canvas is transparent. You can specify a different canvas with the # #background_fill= or #background_image= methods. # # RVG objects are _containers_. That is, styles and transforms defined # on the object are used by contained objects such as shapes, text, and # groups unless overridden by an inner container or the object itself. def initialize(width=nil, height=nil) super @width, @height = width, height @content = Content.new @canvas = nil @background_fill = nil @background_fill_opacity = 1.0 # applies only if background_fill= is used @background_position = :scaled @background_pattern, @background_image, @desc, @title, @metadata = nil @x, @y = 0.0, 0.0 @nested = false yield(self) if block_given? end # Construct a canvas or reuse an existing canvas. # Execute drawing commands. Return the canvas. def draw raise StandardError, "draw not permitted in nested RVG objects" if @nested @canvas ||= new_canvas # allow drawing over existing canvas gc = Utility::GraphicContext.new add_outermost_primitives(gc) pp(self) if ENV['debug_rvg'] print_gc(gc) if ENV['debug_prim'] gc.draw(@canvas) return @canvas end # Accept #use arguments. Use (x,y) to generate an additional translate. # Override @width and @height if new values are supplied. def ref(x, y, rw, rh) #:nodoc: translate(x, y) if (x != 0 || y != 0) @width = rw if rw @height = rh if rh end # Used by Magick::Embellishable.rvg to set non-0 x- and y-coordinates def corner(x, y) #:nodoc: @nested = true @x, @y = Float(x), Float(y) translate(@x, @y) if (@x != 0.0 || @y != 0.0) end # Primitives for the outermost RVG object def add_outermost_primitives(gc) #:nodoc: add_transform_primitives(gc) gc.push add_viewbox_primitives(@width, @height, gc) add_style_primitives(gc) @content.each { |element| element.add_primitives(gc) } gc.pop self end # Primitives for nested RVG objects def add_primitives(gc) #:nodoc: if @width.nil? || @height.nil? raise ArgumentError, "RVG width or height undefined" elsif @width == 0 || @height == 0 return self end gc.push add_outermost_primitives(gc) gc.pop end end # end class RVG end # end module Magick rmagick-2.13.2/lib/rvg/embellishable.rb0000644000004100000410000004017712147515547017751 0ustar www-datawww-data#-- # $Id: embellishable.rb,v 1.9 2009/02/28 23:52:13 rmagick Exp $ # Copyright (C) 2009 Timothy P. Hunter #++ module Magick class RVG # Parent class of Circle, Ellipse, Text, etc. class Shape #:nodoc: include Stylable include Transformable include Duplicatable # Each shape can have its own set of transforms and styles. def add_primitives(gc) gc.push add_transform_primitives(gc) add_style_primitives(gc) gc.__send__(@primitive, *@args) gc.pop end end # class Shape class Circle < Shape # Define a circle with radius +r+ and centered at [cx, cy]. # Use the RVG::ShapeConstructors#circle method to create Circle objects in a container. def initialize(r, cx=0, cy=0) super() r, cx, cy = Magick::RVG.convert_to_float(r, cx, cy) if r < 0 raise ArgumentError, "radius must be >= 0 (#{r} given)" end @primitive = :circle @args = [cx, cy, cx+r, cy] self end end # class Circle class Ellipse < Shape # Define an ellipse with a center at [cx, cy], a horizontal radius +rx+ # and a vertical radius +ry+. # Use the RVG::ShapeConstructors#ellipse method to create Ellipse objects in a container. def initialize(rx, ry, cx=0, cy=0) super() rx, ry, cx, cy = Magick::RVG.convert_to_float(rx, ry, cx, cy) if rx < 0 || ry < 0 raise ArgumentError, "radii must be >= 0 (#{rx}, #{ry} given)" end @primitive = :ellipse # Ellipses are always complete. @args = [cx, cy, rx, ry, 0, 360] end end # class Ellipse class Line < Shape # Define a line from [x1, y1] to [x2, y2]. # Use the RVG::ShapeConstructors#line method to create Line objects in a container. def initialize(x1=0, y1=0, x2=0, y2=0) super() @primitive = :line @args = [x1, y1, x2, y2] end end # class Line class Path < Shape # Define an SVG path. The argument can be either a path string # or a PathData object. # Use the RVG::ShapeConstructors#path method to create Path objects in a container. def initialize(path) super() @primitive = :path @args = [path.to_s] end end # class Path class Rect < Shape # Define a width x height rectangle. The upper-left corner is at [x, y]. # If either width or height is 0, the rectangle is not rendered. # Use the RVG::ShapeConstructors#rect method to create Rect objects in a container. def initialize(width, height, x=0, y=0) super() width, height, x, y = Magick::RVG.convert_to_float(width, height, x, y) if width < 0 || height < 0 raise ArgumentError, "width, height must be >= 0 (#{width}, #{height} given)" end @args = [x, y, x+width, y+height] @primitive = :rectangle end # Specify optional rounded corners for a rectangle. The arguments # are the x- and y-axis radii. If y is omitted it defaults to x. def round(rx, ry=nil) rx, ry = Magick::RVG.convert_to_float(rx, ry || rx) if rx < 0 || ry < 0 raise ArgumentError, "rx, ry must be >= 0 (#{rx}, #{ry} given)" end @args << rx << ry @primitive = :roundrectangle self end end # class Rect class PolyShape < Shape def polypoints(points) case points.length when 1 points = Array(points[0]) when 2 x_coords = Array(points[0]) y_coords = Array(points[1]) unless x_coords.length > 0 && y_coords.length > 0 raise ArgumentError, "array arguments must contain at least one point" end n = x_coords.length - y_coords.length short = n > 0 ? y_coords : x_coords olen = short.length n.abs.times {|x| short << short[x % olen]} points = x_coords.zip(y_coords).flatten end n = points.length if n < 4 || n % 2 != 0 raise ArgumentError, "insufficient/odd number of points specified: #{n}" end return Magick::RVG.convert_to_float(*points) end end # class PolyShape class Polygon < PolyShape # Draws a polygon. The arguments are [x, y] pairs that # define the points that make up the polygon. At least two # points must be specified. If the last point is not the # same as the first, adds an additional point to close # the polygon. # Use the RVG::ShapeConstructors#polygon method to create Polygon objects in a container. def initialize(*points) super() @primitive = :polygon @args = polypoints(points) end end # class Polygon class Polyline < PolyShape # Draws a polyline. The arguments are [x, y] pairs that # define the points that make up the polyline. At least two # points must be specified. # Use the RVG::ShapeConstructors#polyline method to create Polyline objects in a container. def initialize(*points) super() points = polypoints(points) @primitive = :polyline @args = Magick::RVG.convert_to_float(*points) end end # class Polyline class Image include Stylable include Transformable include Describable include PreserveAspectRatio include Duplicatable private def align_to_viewport(scale) tx = case @align when 'none', /\AxMin/ 0 when NilClass, /\AxMid/ (@width - @image.columns*scale) / 2.0 when /\AxMax/ @width - @image.columns*scale end ty = case @align when 'none', /YMin\z/ 0 when NilClass, /YMid\z/ (@height - @image.rows*scale) / 2.0 when /YMax\z/ @height - @image.rows*scale end return [tx, ty] end def add_composite_primitive(gc) if @align == 'none' # Let RMagick do the scaling scale = 1.0 width, height = @width, @height elsif @meet_or_slice == 'meet' scale = [@width/@image.columns, @height/@image.rows].min width, height = @image.columns, @image.rows else # Establish clipping path around the current viewport name = __id__.to_s gc.define_clip_path(name) do gc.path("M#{@x},#{@y} l#{@width},0 l0,#{@height} l-#{@width},0 l0,-#{@height}z") end gc.clip_path(name) scale = [@width/@image.columns, @height/@image.rows].max width, height = @image.columns, @image.rows end tx, ty = align_to_viewport(scale) gc.composite(@x+tx, @y+ty, width*scale, height*scale, @image) end def init_viewbox() @align = nil @vbx_width, @vbx_height = @image.columns, @image.rows @meet_or_slice = 'meet' end public # Composite a raster image in the viewport defined by [x,y] and # +width+ and +height+. # Use the RVG::ImageConstructors#image method to create Text objects in a container. def initialize(image, width=nil, height=nil, x=0, y=0) super() # run module initializers @image = image.copy # use a copy of the image in case app. re-uses the argument @x, @y, @width, @height = Magick::RVG.convert_to_float(x, y, width || @image.columns, height || @image.rows) if @width < 0 || @height < 0 raise ArgumentError, "width, height must be >= 0" end init_viewbox() end def add_primitives(gc) #:nodoc: # Do not render if width or height is 0 return if @width == 0 || @height == 0 gc.push add_transform_primitives(gc) add_style_primitives(gc) add_composite_primitive(gc) gc.pop end end # class Image # Methods that construct basic shapes within a container module ShapeConstructors # Draws a circle whose center is [cx, cy] and radius is +r+. def circle(r, cx=0, cy=0) circle = Circle.new(r, cx, cy) @content << circle return circle end # Draws an ellipse whose center is [cx, cy] and having # a horizontal radius +rx+ and vertical radius +ry+. def ellipse(rx, ry, cx=0, cy=0) ellipse = Ellipse.new(rx, ry, cx, cy) @content << ellipse return ellipse end # Draws a line from [x1, y1] to [x2, y2]. def line(x1=0, y1=0, x2=0, y2=0) line = Line.new(x1, y1, x2, y2) @content << line return line end # Draws a path defined by an SVG path string or a PathData # object. def path(path) path = Path.new(path) @content << path return path end # Draws a rectangle whose upper-left corner is [x, y] and # with the specified +width+ and +height+. Unless otherwise # specified the rectangle has square corners. Returns a # Rectangle object. # # Draw a rectangle with rounded corners by calling the #round # method on the Rectangle object. rx and ry are # the corner radii in the x- and y-directions. For example: # canvas.rect(width, height, x, y).round(8, 6) # If ry is omitted it defaults to rx. def rect(width, height, x=0, y=0) rect = Rect.new(width, height, x, y) @content << rect return rect end # Draws a polygon. The arguments are [x, y] pairs that # define the points that make up the polygon. At least two # points must be specified. If the last point is not the # same as the first, adds an additional point to close # the polygon. def polygon(*points) polygon = Polygon.new(*points) @content << polygon return polygon end # Draws a polyline. The arguments are [x, y] pairs that # define the points that make up the polyline. At least two # points must be specified. def polyline(*points) polyline = Polyline.new(*points) @content << polyline return polyline end end # module ShapeContent # Methods that reference ("use") other drawable objects within a container module UseConstructors # Reference an object to be inserted into the container's # content. [x,y] is the offset from the upper-left # corner. If the argument is an RVG or Image object and +width+ and +height+ # are specified, these values will override the +width+ and +height+ # attributes on the argument. def use(obj, x=0, y=0, width=nil, height=nil) use = Use.new(obj, x, y, width, height) @content << use return use end end # module UseConstructors # Methods that construct container objects within a container module StructureConstructors # Establishes a new viewport. [x, y] is the coordinate of the # upper-left corner within the containing viewport. This is a # _container_ method. Styles and # transforms specified on this object will be used by objects # contained within, unless overridden by an inner container or # the contained object itself. def rvg(cols, rows, x=0, y=0, &block) rvg = Magick::RVG.new(cols, rows, &block) begin x, y = Float(x), Float(y) rescue ArgumentError args = [cols, rows, x, y] raise ArgumentError, "at least one argument is not convertable to Float (got #{args.collect {|a| a.class}.join(', ')})" end rvg.corner(x, y) @content << rvg return rvg end # Defines a group. # # This method constructs a new # Group _container_ object. The styles and # transforms specified on this object will be used by objects # contained within, unless overridden by an inner container or # the contained object itself. # Define grouped elements by calling RVG::Embellishable # methods within the associated block. def g(&block) group = Group.new(&block) @content << group return group end end # module StructureConstructors # Methods that construct raster image objects within a container module ImageConstructors # Composite a raster image at [x,y] # in a viewport of the specified width and height. # If not specified, the width and height are the width and height # of the image. Use the RVG::PreserveAspectRatio#preserve_aspect_ratio method to # control the placement and scaling of the image within the # viewport. By default, the image is scaled to fit inside the # viewport and centered within the viewport. def image(image, width=nil, height=nil, x=0, y=0) img = Image.new(image, width, height, x, y) @content << img return img end end # module ImageConstructors # Methods that create shapes, text, and other drawable objects # within container objects such as ::Magick::RVG and # ::Magick::RVG::Group module Embellishable include StructureConstructors include ShapeConstructors include TextConstructors include UseConstructors include ImageConstructors end # module Embellishable end # class RVG end # module Magick rmagick-2.13.2/lib/rvg/transformable.rb0000644000004100000410000001215712147515547020015 0ustar www-datawww-data#-- # $Id: transformable.rb,v 1.5 2009/02/28 23:52:28 rmagick Exp $ # Copyright (C) 2009 Timothy P. Hunter #++ module Magick class RVG # Transforms is an Array with a deep_copy method. # During unit-testing it also has a deep_equal method. class Transforms < Array #:nodoc: def deep_copy(h=nil) copy = self.class.new each { |transform| copy << [transform[0], transform[1].dup] } return copy end end # class Transform # Transformations are operations on the coordinate system. # All the transformations defined within a container (an RVG object # or a group) are applied before drawing any shapes or text. # All transformations are applied in the order they were # defined. Note: This means that # g.translate(10,20).scale(2) # is not the same as # g.scale(2).translate(10,20) module Transformable private # Apply transforms in the same order they were specified! def add_transform_primitives(gc) @transforms.each { |transform| gc.__send__(transform[0], *transform[1]) } end def initialize(*args, &block) super() @transforms = Transforms.new end public # Applies the transformation matrix [sx, rx, ry, sy, tx, ty] def matrix(sx, rx, ry, sy, tx, ty) begin @transforms << [:affine, [Float(sx), Float(rx), Float(ry), Float(sy), Float(tx), Float(ty)]] rescue ArgumentError raise ArgumentError, "arguments must be convertable to float (got #{sx.class}, #{rx.class}, #{ry.class}, #{sy.class}, #{sx.class}, #{sx.class}, #{tx.class}, #{ty.class})" end yield(self) if block_given? self end # Add tx to all x-coordinates and ty # to all y-coordinates. If ty is omitted it defaults # to tx. def translate(tx, ty=nil) ty ||= tx begin @transforms << [:translate, [Float(tx), Float(ty)]] rescue ArgumentError raise ArgumentError, "arguments must be convertable to float (got #{tx.class}, #{ty.class})" end yield(self) if block_given? self end # Multiply the x-coordinates by sx and the y-coordinates # by sy. If sy is omitted it defaults to sx. def scale(sx, sy=nil) sy ||= sx begin @transforms << [:scale, [Float(sx), Float(sy)]] rescue ArgumentError raise ArgumentError, "arguments must be convertable to float (got #{sx.class}, #{sy.class})" end yield(self) if block_given? self end # This method can take either of two argument lists: # [rotate(angle)] rotate by angle degrees # [rotate(angle, cx, cy)] rotate by angle degrees about # the point [cx, cy]. def rotate(angle, *args) begin case args.length when 0 @transforms << [:rotate, [Float(angle)]] when 2 cx, cy = Float(args[0]), Float(args[1]) @transforms << [:translate, [cx, cy]] @transforms << [:rotate, [angle]] @transforms << [:translate, [-cx, -cy]] else raise ArgumentError, "wrong number of arguments (#{args.length} for 1 or 3)" end rescue ArgumentError raise ArgumentError, "arguments must be convertable to float (got #{[angle, *args].collect {|a| a.class}.join(', ')})" end yield(self) if block_given? self end # Skew the X-axis by angle degrees. def skewX(angle) begin @transforms << [:skewx, [Float(angle)]] rescue ArgumentError raise ArgumentError, "argument must be convertable to float (got #{angle.class})" end yield(self) if block_given? self end # Skew the Y-axis by angle degrees. def skewY(angle) begin @transforms << [:skewy, [Float(angle)]] rescue ArgumentError raise ArgumentError, "argument must be convertable to float (got #{angle.class})" end yield(self) if block_given? self end end # module Transformable end # class RVG end # module Magick rmagick-2.13.2/lib/rvg/clippath.rb0000644000004100000410000000327712147515547016765 0ustar www-datawww-data#-- # $Id: clippath.rb,v 1.5 2009/02/28 23:52:13 rmagick Exp $ # Copyright (C) 2009 Timothy P. Hunter #++ module Magick class RVG class ClipPath include ShapeConstructors include UseConstructors include TextConstructors include Describable include Stylable include Duplicatable # Create a clipping path. Within the block create an outline # from one or more paths, basic shapes, text objects, or +use+. # Everything drawn within the outline will be displayed. # Anything drawn outside the outline will not. # # If the clipping path contains a +use+, it # must directly reference path, basic shape, or text objects. # # Attach the clipping path to an object with the :clip_path style. def initialize(clip_path_units='userSpaceOnUse') super() if ! ['userSpaceOnUse', 'objectBoundingBox'].include?(clip_path_units) raise ArgumentError, "undefined value for clip path units: #{clip_path_units}" end @clip_path_units = clip_path_units @content = Content.new yield(self) if block_given? end def add_primitives(gc, style) #:nodoc: name = __id__.to_s gc.define_clip_path(name) do gc.clip_units(@clip_path_units) @content.each { |element| element.add_primitives(gc) } end gc.clip_path(name) end end # class ClipPath end # class RVG end # module Magick rmagick-2.13.2/lib/rvg/deep_equal.rb0000644000004100000410000000436312147515547017262 0ustar www-datawww-datamodule Magick class RVG [PathData, Styles, Transforms].each do |c| c.class_eval do def deep_equal(other) if self != other puts "#{c.inspect} not equal.\nself:#{self} != other:#{other}" return false end return true end end end [Shape, TextBase, Image, Group, Content, Use, ClipPath, Pattern, self].each do |c| c.class_eval do def deep_equal(other) ivs = self.instance_variables ivs.each do |iv| itv = self.instance_variable_get(iv) otv = other.instance_variable_get(iv) if itv.respond_to?(:deep_equal) if itv.equal?(otv) puts "#{iv} has deep_equal but self.#{iv} and other.#{iv} are the same object." return false end if !itv.deep_equal(otv) puts "Not equal.\nself.#{iv}=#{itv.inspect}\nother.#{iv}=#{otv.inspect}" return false end else case itv when Float, Symbol, TrueClass, FalseClass, Fixnum, NilClass return false if itv != otv else if itv.equal?(otv) puts "#{iv} is dup-able but self.#{iv} and other.#{iv} are the same object." return false end if itv != otv puts "Not equal.\nself.#{iv}=#{itv.inspect}\nother.#{iv}=#{otv.inspect}" return false end end end end return true end end end end # class RVG end # module Magick rmagick-2.13.2/lib/rvg/misc.rb0000644000004100000410000006551312147515547016115 0ustar www-datawww-data# $Id: misc.rb,v 1.17 2010/03/21 01:43:01 baror Exp $ # Copyright (C) 2009 Timothy P. Hunter module Magick class RVG # This is a standard deep_copy method that is used in most classes. # Thanks to Robert Klemme. module Duplicatable def deep_copy(h = {}) # Prevent recursion. If we reach the # object we started with, stop copying. copy = h[__id__] unless copy h[__id__] = copy = self.class.allocate ivars = instance_variables ivars.each do |ivar| ivalue = instance_variable_get(ivar) cvalue = case when NilClass === ivalue, Symbol === ivalue, Float === ivalue, Fixnum === ivalue, FalseClass === ivalue, TrueClass === ivalue ivalue when ivalue.respond_to?(:deep_copy) ivalue.deep_copy(h) when ivalue.respond_to?(:dup) ivalue.dup else ivalue end copy.instance_variable_set(ivar, cvalue) end copy.freeze if frozen? end return copy end end # module Duplicatable # Convert an array of method arguments to Float objects. If any # cannot be converted, raise ArgumentError and issue a message. def self.fmsg(*args) "at least one argument cannot be converted to Float (got #{args.collect {|a| a.class}.join(', ')})" end def self.convert_to_float(*args) allow_nil = false if args.last == :allow_nil allow_nil = true args.pop end begin fargs = args.collect { |a| (allow_nil && a.nil?) ? a : Float(a) } rescue ArgumentError, TypeError raise ArgumentError, self.fmsg(*args) end return fargs end def self.convert_one_to_float(arg) begin farg = Float(arg) rescue ArgumentError, TypeError raise ArgumentError, "argument cannot be converted to Float (got #{arg.class})" end return farg end end # class RVG end # module Magick module Magick class RVG class Utility class TextStrategy def initialize(context) @ctx = context @ctx.shadow.affine = @ctx.text_attrs.affine end def enquote(text) if text.length > 2 && /\A(?:\"[^\"]+\"|\'[^\']+\'|\{[^\}]+\})\z/.match(text) return text elsif !text['\''] text = '\''+text+'\'' return text elsif !text['"'] text = '"'+text+'"' return text elsif !(text['{'] || text['}']) text = '{'+text+'}' return text end # escape existing braces, surround with braces text.gsub!(/[}]/) { |b| '\\' + b } return '{' + text + '}' end def glyph_metrics(glyph_orientation, glyph) gm = @ctx.shadow.get_type_metrics("a" + glyph + "a") gm2 = @ctx.shadow.get_type_metrics("aa") h = (gm.ascent - gm.descent + 0.5 ).to_i w = gm.width - gm2.width if glyph_orientation == 0 || glyph_orientation == 180 [w, h] else [h, w] end end def text_rel_coords(text) y_rel_coords = [] x_rel_coords = [] first_word = true words = text.split(::Magick::RVG::WORD_SEP) words.each do |word| unless first_word wx, wy = get_word_spacing() x_rel_coords << wx y_rel_coords << wy end first_word = false word.split('').each do |glyph| wx, wy = get_letter_spacing(glyph) x_rel_coords << wx y_rel_coords << wy end end [x_rel_coords, y_rel_coords] end def shift_baseline(glyph_orientation, glyph) glyph_dimensions = @ctx.shadow.get_type_metrics(glyph) if glyph_orientation == 0 || glyph_orientation == 180 x = glyph_dimensions.width else x = glyph_dimensions.ascent - glyph_dimensions.descent end case @ctx.text_attrs.baseline_shift when :baseline x = 0 when :sub ; when :super x = -x when /[-+]?(\d+)%/ m = $1 == '-' ? -1.0 : 1.0 x = (m * x * $1.to_f / 100.0) else x = -@ctx.text_attrs.baseline_shift end return x end def render_glyph(glyph_orientation, x, y, glyph) if glyph_orientation == 0 @ctx.gc.text(x, y, enquote(glyph)) else @ctx.gc.push @ctx.gc.translate(x, y) @ctx.gc.rotate(glyph_orientation) @ctx.gc.translate(-x, -y) @ctx.gc.text(x, y, enquote(glyph)) @ctx.gc.pop end end end # class TextStrategy class LRTextStrategy < TextStrategy def get_word_spacing() @word_space ||= glyph_metrics(@ctx.text_attrs.glyph_orientation_horizontal, ' ')[0] [@word_space + @ctx.text_attrs.word_spacing, 0] end def get_letter_spacing(glyph) gx, gy = glyph_metrics(@ctx.text_attrs.glyph_orientation_horizontal, glyph) [gx+@ctx.text_attrs.letter_spacing, gy] end def render(x, y, text) x_rel_coords, y_rel_coords = text_rel_coords(text) dx = x_rel_coords.inject(0) {|sum, a| sum + a} dy = y_rel_coords.max # We're handling the anchoring. @ctx.gc.push() @ctx.gc.text_anchor(Magick::StartAnchor) if @ctx.text_attrs.text_anchor == :end x -= dx elsif @ctx.text_attrs.text_anchor == :middle x -= dx / 2 end # Align the first glyph case @ctx.text_attrs.glyph_orientation_horizontal when 0 ; when 90 y -= dy when 180 x += x_rel_coords.shift x_rel_coords << 0 y -= dy when 270 x += x_rel_coords[0] end y += shift_baseline(@ctx.text_attrs.glyph_orientation_horizontal, text[0,1]) first_word = true text.split(::Magick::RVG::WORD_SEP).each do |word| unless first_word x += x_rel_coords.shift end first_word = false word.split('').each do |glyph| render_glyph(@ctx.text_attrs.glyph_orientation_horizontal, x, y, glyph) x += x_rel_coords.shift end end @ctx.gc.pop() [dx, 0] end end # class LRTextStrategy class RLTextStrategy < TextStrategy def render(x, y, text) raise NotImplementedError end end # class RLTextStrategy class TBTextStrategy < TextStrategy def get_word_spacing() @word_space ||= glyph_metrics(@ctx.text_attrs.glyph_orientation_vertical, ' ')[1] [0, @word_space + @ctx.text_attrs.word_spacing] end def get_letter_spacing(glyph) gx, gy = glyph_metrics(@ctx.text_attrs.glyph_orientation_vertical, glyph) [gx, gy+@ctx.text_attrs.letter_spacing] end def render(x, y, text) x_rel_coords, y_rel_coords = text_rel_coords(text) dx = x_rel_coords.max dy = y_rel_coords.inject(0) {|sum, a| sum + a} # We're handling the anchoring. @ctx.gc.push() @ctx.gc.text_anchor(Magick::StartAnchor) if @ctx.text_attrs.text_anchor == :end y -= dy elsif @ctx.text_attrs.text_anchor == :middle y -= dy / 2 end # Align the first glyph such that its center # is aligned on x and its top is aligned on y. case @ctx.text_attrs.glyph_orientation_vertical when 0 x -= x_rel_coords.max / 2 y += y_rel_coords[0] when 90 x -= x_rel_coords.max / 2 when 180 x += x_rel_coords.max / 2 when 270 x += x_rel_coords.max / 2 y += y_rel_coords.shift y_rel_coords << 0 # since we used an element we need to add a dummy end x -= shift_baseline(@ctx.text_attrs.glyph_orientation_vertical, text[0,1]) first_word = true text.split(::Magick::RVG::WORD_SEP).each do |word| unless first_word y += y_rel_coords.shift x_rel_coords.shift end first_word = false word.split('').each do |glyph| case @ctx.text_attrs.glyph_orientation_vertical.to_i when 0, 90, 270 x_shift = (dx - x_rel_coords.shift) / 2 when 180 x_shift = -(dx - x_rel_coords.shift) / 2 end render_glyph(@ctx.text_attrs.glyph_orientation_vertical, x+x_shift, y, glyph) y += y_rel_coords.shift end end @ctx.gc.pop() [0, dy] end end # class TBTextStrategy # Handle "easy" text class DefaultTextStrategy < TextStrategy def render(x, y, text) @ctx.gc.text(x, y, enquote(text)) tm = @ctx.shadow.get_type_metrics(text) dx = case @ctx.text_attrs.text_anchor when :start tm.width when :middle tm.width / 2 when :end 0 end [dx, 0] end end # class NormalTextStrategy end # class Utility end # class RVG end # module Magick module Magick class RVG class Utility class TextAttributes public WRITING_MODE = %w{lr-tb lr rl-tb rl tb-rl tb} def initialize() @affine = Array.new @affine << Magick::AffineMatrix.new(1, 0, 0, 1, 0, 0) @baseline_shift = Array.new @baseline_shift << :baseline @glyph_orientation_horizontal = Array.new @glyph_orientation_horizontal << 0 @glyph_orientation_vertical = Array.new @glyph_orientation_vertical << 90 @letter_spacing = Array.new @letter_spacing << 0 @text_anchor = Array.new @text_anchor << :start @word_spacing = Array.new @word_spacing << 0 @writing_mode = Array.new @writing_mode << 'lr-tb' end def push() @affine.push(@affine.last.dup) @baseline_shift.push(@baseline_shift.last) @text_anchor.push(@text_anchor.last) @writing_mode.push(@writing_mode.last.dup) @glyph_orientation_vertical.push(@glyph_orientation_vertical.last) @glyph_orientation_horizontal.push(@glyph_orientation_horizontal.last) @letter_spacing.push(@letter_spacing.last) @word_spacing.push(@word_spacing.last) end def pop() @affine.pop @baseline_shift.pop @text_anchor.pop @writing_mode.pop @glyph_orientation_vertical.pop @glyph_orientation_horizontal.pop @letter_spacing.pop @word_spacing.pop end def set_affine(sx, rx, ry, sy, tx, ty) @affine[-1].sx = sx @affine[-1].rx = rx @affine[-1].ry = ry @affine[-1].sy = sy @affine[-1].tx = tx @affine[-1].ty = ty end def affine() @affine[-1] end def baseline_shift() @baseline_shift[-1] end def baseline_shift=(value) @baseline_shift[-1] = value end def text_anchor() @text_anchor[-1] end def text_anchor=(anchor) @text_anchor[-1] = anchor end def glyph_orientation_vertical() @glyph_orientation_vertical[-1] end def glyph_orientation_vertical=(angle) @glyph_orientation_vertical[-1] = angle end def glyph_orientation_horizontal() @glyph_orientation_horizontal[-1] end def glyph_orientation_horizontal=(angle) @glyph_orientation_horizontal[-1] = angle end def letter_spacing() @letter_spacing[-1] end def letter_spacing=(value) @letter_spacing[-1] = value end def non_default? @baseline_shift[-1] != :baseline || @letter_spacing[-1] != 0 || @word_spacing[-1] != 0 || @writing_mode[-1][/\Alr/].nil? || @glyph_orientation_horizontal[-1] != 0 end def word_spacing() @word_spacing[-1] end def word_spacing=(value) @word_spacing[-1] = value end def writing_mode() @writing_mode[-1] end def writing_mode=(mode) @writing_mode[-1] = WRITING_MODE.include?(mode) ? mode : 'lr-tb' end end # class TextAttributes class GraphicContext FONT_STRETCH = {:normal => Magick::NormalStretch, :ultra_condensed => Magick::UltraCondensedStretch, :extra_condensed => Magick::ExtraCondensedStretch, :condensed => Magick::CondensedStretch, :semi_condensed => Magick::SemiCondensedStretch, :semi_expanded => Magick::SemiExpandedStretch, :expanded => Magick::ExpandedStretch, :extra_expanded => Magick::ExtraExpandedStretch, :ultra_expanded => Magick::UltraExpandedStretch} FONT_STYLE = {:normal => Magick::NormalStyle, :italic => Magick::ItalicStyle, :oblique => Magick::ObliqueStyle} FONT_WEIGHT = {'normal' => Magick::NormalWeight, 'bold' => Magick::BoldWeight, 'bolder' => Magick::BolderWeight, 'lighter' => Magick::LighterWeight} TEXT_ANCHOR = {:start => Magick::StartAnchor, :middle => Magick::MiddleAnchor, :end => Magick::EndAnchor} ANCHOR_TO_ALIGN = {:start => Magick::LeftAlign, :middle => Magick::CenterAlign, :end => Magick::RightAlign} TEXT_DECORATION = {:none => Magick::NoDecoration, :underline => Magick::UnderlineDecoration, :overline => Magick::OverlineDecoration, :line_through => Magick::LineThroughDecoration} TEXT_STRATEGIES = {'lr-tb'=>LRTextStrategy, 'lr'=>LRTextStrategy, 'rt-tb'=>RLTextStrategy, 'rl'=>RLTextStrategy, 'tb-rl'=>TBTextStrategy, 'tb'=>TBTextStrategy} def GraphicContext.degrees_to_radians(deg) Math::PI * (deg % 360.0) / 180.0 end private def init_matrix() @rx = @ry = 0 @sx = @sy = 1 @tx = @ty = 0 end def concat_matrix() curr = @text_attrs.affine sx = curr.sx * @sx + curr.ry * @rx rx = curr.rx * @sx + curr.sy * @rx ry = curr.sx * @ry + curr.ry * @sy sy = curr.rx * @ry + curr.sy * @sy tx = curr.sx * @tx + curr.ry * @ty + curr.tx ty = curr.rx * @tx + curr.sy * @ty + curr.ty @text_attrs.set_affine(sx, rx, ry, sy, tx, ty) init_matrix() end public attr_reader :gc, :text_attrs def initialize() @gc = Magick::Draw.new @shadow = Array.new @shadow << Magick::Draw.new @text_attrs = TextAttributes.new init_matrix() end def method_missing(methID, *args, &block) @gc.__send__(methID, *args, &block) end def affine(sx, rx, ry, sy, tx, ty) sx, rx, ry, sy, tx, ty = Magick::RVG.convert_to_float(sx, rx, ry, sy, tx, ty) @gc.affine(sx, rx, ry, sy, tx, ty) @text_attrs.set_affine(sx, rx, ry, sy, tx, ty) nil end def baseline_shift(value) @text_attrs.baseline_shift = case value when 'baseline', 'sub', 'super' value.intern when /[-+]?\d+%/, Numeric value else :baseline end nil end def font(name) @gc.font(name) @shadow[-1].font = name nil end def font_family(name) @gc.font_family(name) @shadow[-1].font_family = name nil end def font_size(points) @gc.font_size(points) @shadow[-1].pointsize = points nil end def font_stretch(stretch) stretch = FONT_STRETCH.fetch(stretch.intern, Magick::NormalStretch) @gc.font_stretch(stretch) @shadow[-1].font_stretch = stretch nil end def font_style(style) style = FONT_STYLE.fetch(style.intern, Magick::NormalStyle) @gc.font_style(style) @shadow[-1].font_style = style nil end def font_weight(weight) # If the arg is not in the hash use it directly. Handles numeric values. weight = FONT_WEIGHT.fetch(weight) {|key| key} @gc.font_weight(weight) @shadow[-1].font_weight = weight nil end def glyph_orientation_horizontal(deg) deg = Magick::RVG.convert_one_to_float(deg) @text_attrs.glyph_orientation_horizontal = (deg % 360) / 90 * 90 nil end def glyph_orientation_vertical(deg) deg = Magick::RVG.convert_one_to_float(deg) @text_attrs.glyph_orientation_vertical = (deg % 360) / 90 * 90 nil end def inspect() @gc.inspect end def letter_spacing(value) @text_attrs.letter_spacing = Magick::RVG.convert_one_to_float(value) nil end def push() @gc.push @shadow.push(@shadow.last.dup) @text_attrs.push nil end def pop() @gc.pop @shadow.pop @text_attrs.pop nil end def rotate(degrees) degrees = Magick::RVG.convert_one_to_float(degrees) @gc.rotate(degrees) @sx = Math.cos(GraphicContext.degrees_to_radians(degrees)) @rx = Math.sin(GraphicContext.degrees_to_radians(degrees)) @ry = -Math.sin(GraphicContext.degrees_to_radians(degrees)) @sy = Math.cos(GraphicContext.degrees_to_radians(degrees)) concat_matrix() nil end def scale(sx, sy) sx, sy = Magick::RVG.convert_to_float(sx, sy) @gc.scale(sx, sy) @sx, @sy = sx, sy concat_matrix() nil end def shadow() @shadow.last end def skewX(degrees) degrees = Magick::RVG.convert_one_to_float(degrees) @gc.skewX(degrees) @ry = Math.tan(GraphicContext.degrees_to_radians(degrees)) concat_matrix() nil end def skewY(degrees) degrees = Magick::RVG.convert_one_to_float(degrees) @gc.skewY(degrees) @rx = Math.tan(GraphicContext.degrees_to_radians(degrees)) concat_matrix() nil end def stroke_width(width) width = Magick::RVG.convert_one_to_float(width) @gc.stroke_width(width) @shadow[-1].stroke_width = width nil end def text(x, y, text) return if text.length == 0 if @text_attrs.non_default? text_renderer = TEXT_STRATEGIES[@text_attrs.writing_mode].new(self) else text_renderer = DefaultTextStrategy.new(self) end return text_renderer.render(x, y, text) end def text_anchor(anchor) anchor = anchor.intern anchor_enum = TEXT_ANCHOR.fetch(anchor, Magick::StartAnchor) @gc.text_anchor(anchor_enum) align = ANCHOR_TO_ALIGN.fetch(anchor, Magick::LeftAlign) @shadow[-1].align = align @text_attrs.text_anchor = anchor nil end def text_decoration(decoration) decoration = TEXT_DECORATION.fetch(decoration.intern, Magick::NoDecoration) @gc.decorate(decoration) @shadow[-1].decorate = decoration nil end def translate(tx, ty) tx, ty = Magick::RVG.convert_to_float(tx, ty) @gc.translate(tx, ty) @tx, @ty = tx, ty concat_matrix() nil end def word_spacing(value) @text_attrs.word_spacing = Magick::RVG.convert_one_to_float(value) nil end def writing_mode(mode) @text_attrs.writing_mode = mode nil end end # class GraphicContext end # class Utility end # class RVG end # module Magick rmagick-2.13.2/lib/rvg/stylable.rb0000644000004100000410000001146312147515547016774 0ustar www-datawww-data#-- # $Id: stylable.rb,v 1.7 2009/02/28 23:52:28 rmagick Exp $ # Copyright (C) 2009 Timothy P. Hunter #++ module Magick class RVG #:stopdoc: STYLES = [:clip_path, :clip_rule, :fill, :fill_opacity, :fill_rule, :font, :font_family, :font_size, :font_stretch, :font_style, :font_weight, :opacity, :stroke, :stroke_dasharray, :stroke_dashoffset, :stroke_linecap, :stroke_linejoin, :stroke_miterlimit, :stroke_opacity, :stroke_width, :text_anchor, :text_decoration, :glyph_orientation_vertical, :glyph_orientation_horizontal, :letter_spacing, :word_spacing, :baseline_shift, :writing_mode] Styles = Struct.new(*STYLES) # Styles is a Struct class with a couple of extra methods class Styles def set(styles) begin styles.each_pair do |style, value| begin self[style] = value rescue NoMethodError raise ArgumentError, "unknown style `#{style}'" end end rescue NoMethodError raise ArgumentError, "style arguments must be in the form `style => value'" end self end # Iterate over the style names. Yield for each style that has a value. def each_value each_pair do |style, value| yield(style, value) if value end end # The "usual" deep_copy method doesn't copy a Struct correctly. def deep_copy(h=nil) copy = Styles.new each_pair { |style, value| copy[style] = value } return copy end end # class Styles #:startdoc: # This module is mixed into classes that can have styles. module Stylable private # For each style that has a value, add a style primitive to the gc. # Use splat to splat out Array arguments such as stroke_dasharray. def add_style_primitives(gc) @styles.each_value do |style, value| if value.respond_to? :add_primitives value.add_primitives(gc, style) else gc.__send__(style, *value) end end end def initialize super @styles = Styles.new end public # This method can be used with any RVG, Group, Use, Text, or # shape object. The argument is a hash. The style names are # the hash keys. The style names and values are: # [:baseline_shift] modify the text baseline # [:clip_path] clipping path defined by clip_path # [:clip_rule] 'evenodd' or 'nozero' # [:fill] color name # [:fill_opacity] the fill opacity, 0.0<=N<=1.0 # [:fill_rule] 'evenodd' or 'nozero' # [:font] font name or font file name # [:font_family] font family name, ex. 'serif' # [:font_size] font size in points # [:font_stretch] 'normal','ultra_condensed','extra_condensed', # 'condensed','semi_condensed','semi_expanded', # 'expanded','extra_expanded','ultra_expanded' # [:font_style] 'normal','italic','oblique' # [:font_weight] 'normal','bold','bolder','lighter', or # a multiple of 100 between 100 and 900. # [:glyph_orientation_horizontal] 0, 90, 180, 270 # [:glyph_orientation_vertical] 0, 90, 180, 270 # [:letter_spacing] modify the spacing between letters # [:opacity] both fill and stroke opacity, 0.0<=N<=1.0 # [:stroke] color name # [:stroke_dasharray] dash pattern (Array) # [:stroke_dashoffset] initial distance into dash pattern # [:stroke_linecap] 'butt', 'round', 'square' # [:stroke_linejoin] 'miter', 'round', 'bevel' # [:stroke_miterlimit] miter length constraint # [:stroke_opacity] the stroke opacity, 0.0<=N<=1.0 # [:stroke_width] stroke width # [:text_anchor] 'start','middle','end' # [:text_decoration] 'none','underline','overline','line_through' # [:word_spacing] modify the spacing between words # [:writing_mode] 'lr-tb', 'lr', 'rt-tb', 'rl', 'tb-rl', 'tb' def styles(styles) @styles.set(styles) yield(self) if block_given? self end end # module Stylable end # class RVG end # module Magick rmagick-2.13.2/lib/rvg/units.rb0000644000004100000410000000460312147515547016315 0ustar www-datawww-data# $Id: units.rb,v 1.5 2009/02/28 23:52:28 rmagick Exp $ # Copyright (C) 2009 Timothy P. Hunter module Magick class RVG # Define RVG.dpi and RVG.dpi=. Add conversions to Fixnum and Float classes class << self attr_reader :dpi def dpi=(n) if !defined?(@dpi) [Float, Fixnum].each do |c| c.class_eval <<-END_DEFS # the default measurement - 1px is 1 pixel def px self end # inches def in self * ::Magick::RVG.dpi end # millimeters def mm self * ::Magick::RVG.dpi / 25.4 end # centimeters def cm self * ::Magick::RVG.dpi / 2.54 end # points def pt self * ::Magick::RVG.dpi / 72.0 end # picas def pc self * ::Magick::RVG.dpi / 6.0 end # percentage of the argument def pct(of) self * Float(of) / 100.0 end # the default is deg def deg self end # radians -> degrees def rad self * 180.0 / Math::PI end # grads -> degrees def grad self * 9.0 / 10.0 end END_DEFS end end @dpi = Float(n) return @dpi rescue ArgumentError raise TypeError, "Can't convert `#{n}' to Float" end end # class << self end # class RVG end # module Magick rmagick-2.13.2/lib/rvg/describable.rb0000644000004100000410000000256612147515547017420 0ustar www-datawww-data#-- # $Id: describable.rb,v 1.5 2009/02/28 23:52:13 rmagick Exp $ # Copyright (C) 2009 Timothy P. Hunter #++ module Magick class RVG #-- # Corresponds to SVG's Description.class #++ # This module defines a number of metadata attributes. module Describable private def initialize(*args, &block) #:nodoc: super @title, @desc, @metadata = nil end public # Sets the object description attr_writer :desc # Sets the object title attr_writer :title # Sets the object metadata attr_writer :metadata # Returns the title of this object. The RVG object title is stored as # the 'title' property on the image def title @title.to_s end # Returns the description of this object. The RVG object description is # stored as the 'desc' property on the image def desc @desc.to_s end # Returns additional metadata of this object. The RVG object metadata # are stored as the 'metadata' property on the image def metadata @metadata.to_s end end # module Describable end # class RVG end # module Magick rmagick-2.13.2/lib/RMagick.rb0000644000004100000410000017104412147515547015676 0ustar www-datawww-data# $Id: RMagick.rb,v 1.84 2009/09/15 22:08:41 rmagick Exp $ #============================================================================== # Copyright (C) 2009 by Timothy P. Hunter # Name: RMagick.rb # Author: Tim Hunter # Purpose: Extend Ruby to interface with ImageMagick. # Notes: RMagick2.so defines the classes. The code below adds methods # to the classes. #============================================================================== require 'RMagick2.so' module Magick @formats = nil @trace_proc = nil @exit_block_set_up = nil class << self def formats(&block) @formats ||= init_formats() if block_given? @formats.each { |k,v| yield k, v } self else @formats end end # remove reference to the proc at exit def trace_proc=(p) if @trace_proc.nil? && !p.nil? && !@exit_block_set_up at_exit { @trace_proc = nil } @exit_block_set_up = true end @trace_proc = p end end # Geometry class and related enum constants class GeometryValue < Enum # no methods end PercentGeometry = GeometryValue.new(:PercentGeometry, 1).freeze AspectGeometry = GeometryValue.new(:AspectGeometry, 2).freeze LessGeometry = GeometryValue.new(:LessGeometry, 3).freeze GreaterGeometry = GeometryValue.new(:GreaterGeometry, 4).freeze AreaGeometry = GeometryValue.new(:AreaGeometry, 5).freeze MinimumGeometry = GeometryValue.new(:MinimumGeometry, 6).freeze class Geometry FLAGS = ['', '%', '!', '<', '>', '@', '^'] RFLAGS = { '%' => PercentGeometry, '!' => AspectGeometry, '<' => LessGeometry, '>' => GreaterGeometry, '@' => AreaGeometry, '^' => MinimumGeometry } attr_accessor :width, :height, :x, :y, :flag def initialize(width=nil, height=nil, x=nil, y=nil, flag=nil) raise(ArgumentError, "width set to #{width.to_s}") if width.is_a? GeometryValue raise(ArgumentError, "height set to #{height.to_s}") if height.is_a? GeometryValue raise(ArgumentError, "x set to #{x.to_s}") if x.is_a? GeometryValue raise(ArgumentError, "y set to #{y.to_s}") if y.is_a? GeometryValue # Support floating-point width and height arguments so Geometry # objects can be used to specify Image#density= arguments. if width == nil @width = 0 elsif width.to_f >= 0.0 @width = width.to_f else Kernel.raise ArgumentError, "width must be >= 0: #{width}" end if height == nil @height = 0 elsif height.to_f >= 0.0 @height = height.to_f else Kernel.raise ArgumentError, "height must be >= 0: #{height}" end @x = x.to_i @y = y.to_i @flag = flag end # Construct an object from a geometry string W = /(\d+\.\d+%?)|(\d*%?)/ H = W X = /(?:([-+]\d+))?/ Y = X RE = /\A#{W}x?#{H}#{X}#{Y}([!<>@\^]?)\Z/ def Geometry.from_s(str) m = RE.match(str) if m width = (m[1] || m[2]).to_f height = (m[3] || m[4]).to_f x = m[5].to_i y = m[6].to_i flag = RFLAGS[m[7]] else Kernel.raise ArgumentError, "invalid geometry format" end if str['%'] flag = PercentGeometry end Geometry.new(width, height, x, y, flag) end # Convert object to a geometry string def to_s str = '' if @width > 0 fmt = @width.truncate == @width ? "%d" : "%.2f" str << sprintf(fmt, @width) str << '%' if @flag == PercentGeometry end if (@width > 0 && @flag != PercentGeometry) || (@height > 0) str << 'x' end if @height > 0 fmt = @height.truncate == @height ? "%d" : "%.2f" str << sprintf(fmt, @height) str << '%' if @flag == PercentGeometry end str << sprintf("%+d%+d", @x, @y) if (@x != 0 || @y != 0) if @flag != PercentGeometry str << FLAGS[@flag.to_i] end str end end class Draw # Thse hashes are used to map Magick constant # values to the strings used in the primitives. ALIGN_TYPE_NAMES = { LeftAlign.to_i => 'left', RightAlign.to_i => 'right', CenterAlign.to_i => 'center' }.freeze ANCHOR_TYPE_NAMES = { StartAnchor.to_i => 'start', MiddleAnchor.to_i => 'middle', EndAnchor.to_i => 'end' }.freeze DECORATION_TYPE_NAMES = { NoDecoration.to_i => 'none', UnderlineDecoration.to_i => 'underline', OverlineDecoration.to_i => 'overline', LineThroughDecoration.to_i => 'line-through' }.freeze FONT_WEIGHT_NAMES = { AnyWeight.to_i => 'all', NormalWeight.to_i => 'normal', BoldWeight.to_i => 'bold', BolderWeight.to_i => 'bolder', LighterWeight.to_i => 'lighter', }.freeze GRAVITY_NAMES = { NorthWestGravity.to_i => 'northwest', NorthGravity.to_i => 'north', NorthEastGravity.to_i => 'northeast', WestGravity.to_i => 'west', CenterGravity.to_i => 'center', EastGravity.to_i => 'east', SouthWestGravity.to_i => 'southwest', SouthGravity.to_i => 'south', SouthEastGravity.to_i => 'southeast' }.freeze PAINT_METHOD_NAMES = { PointMethod.to_i => 'point', ReplaceMethod.to_i => 'replace', FloodfillMethod.to_i => 'floodfill', FillToBorderMethod.to_i => 'filltoborder', ResetMethod.to_i => 'reset' }.freeze STRETCH_TYPE_NAMES = { NormalStretch.to_i => 'normal', UltraCondensedStretch.to_i => 'ultra-condensed', ExtraCondensedStretch.to_i => 'extra-condensed', CondensedStretch.to_i => 'condensed', SemiCondensedStretch.to_i => 'semi-condensed', SemiExpandedStretch.to_i => 'semi-expanded', ExpandedStretch.to_i => 'expanded', ExtraExpandedStretch.to_i => 'extra-expanded', UltraExpandedStretch.to_i => 'ultra-expanded', AnyStretch.to_i => 'all' }.freeze STYLE_TYPE_NAMES = { NormalStyle.to_i => 'normal', ItalicStyle.to_i => 'italic', ObliqueStyle.to_i => 'oblique', AnyStyle.to_i => 'all' }.freeze private def enquote(str) if str.length > 2 && /\A(?:\"[^\"]+\"|\'[^\']+\'|\{[^\}]+\})\z/.match(str) return str else return '"' + str + '"' end end public # Apply coordinate transformations to support scaling (s), rotation (r), # and translation (t). Angles are specified in radians. def affine(sx, rx, ry, sy, tx, ty) primitive "affine " + sprintf("%g,%g,%g,%g,%g,%g", sx, rx, ry, sy, tx, ty) end # Draw an arc. def arc(startX, startY, endX, endY, startDegrees, endDegrees) primitive "arc " + sprintf("%g,%g %g,%g %g,%g", startX, startY, endX, endY, startDegrees, endDegrees) end # Draw a bezier curve. def bezier(*points) if points.length == 0 Kernel.raise ArgumentError, "no points specified" elsif points.length % 2 != 0 Kernel.raise ArgumentError, "odd number of arguments specified" end primitive "bezier " + points.join(',') end # Draw a circle def circle(originX, originY, perimX, perimY) primitive "circle " + sprintf("%g,%g %g,%g", originX, originY, perimX, perimY) end # Invoke a clip-path defined by def_clip_path. def clip_path(name) primitive "clip-path #{name}" end # Define the clipping rule. def clip_rule(rule) if ( not ["evenodd", "nonzero"].include?(rule.downcase) ) Kernel.raise ArgumentError, "Unknown clipping rule #{rule}" end primitive "clip-rule #{rule}" end # Define the clip units def clip_units(unit) if ( not ["userspace", "userspaceonuse", "objectboundingbox"].include?(unit.downcase) ) Kernel.raise ArgumentError, "Unknown clip unit #{unit}" end primitive "clip-units #{unit}" end # Set color in image according to specified colorization rule. Rule is one of # point, replace, floodfill, filltoborder,reset def color(x, y, method) if ( not PAINT_METHOD_NAMES.has_key?(method.to_i) ) Kernel.raise ArgumentError, "Unknown PaintMethod: #{method}" end primitive "color #{x},#{y},#{PAINT_METHOD_NAMES[method.to_i]}" end # Specify EITHER the text decoration (none, underline, overline, # line-through) OR the text solid background color (any color name or spec) def decorate(decoration) if ( DECORATION_TYPE_NAMES.has_key?(decoration.to_i) ) primitive "decorate #{DECORATION_TYPE_NAMES[decoration.to_i]}" else primitive "decorate #{enquote(decoration)}" end end # Define a clip-path. A clip-path is a sequence of primitives # bracketed by the "push clip-path " and "pop clip-path" # primitives. Upon advice from the IM guys, we also bracket # the clip-path primitives with "push(pop) defs" and "push # (pop) graphic-context". def define_clip_path(name) begin push('defs') push('clip-path', name) push('graphic-context') yield ensure pop('graphic-context') pop('clip-path') pop('defs') end end # Draw an ellipse def ellipse(originX, originY, width, height, arcStart, arcEnd) primitive "ellipse " + sprintf("%g,%g %g,%g %g,%g", originX, originY, width, height, arcStart, arcEnd) end # Let anything through, but the only defined argument # is "UTF-8". All others are apparently ignored. def encoding(encoding) primitive "encoding #{encoding}" end # Specify object fill, a color name or pattern name def fill(colorspec) primitive "fill #{enquote(colorspec)}" end alias fill_color fill alias fill_pattern fill # Specify fill opacity (use "xx%" to indicate percentage) def fill_opacity(opacity) primitive "fill-opacity #{opacity}" end def fill_rule(rule) if ( not ["evenodd", "nonzero"].include?(rule.downcase) ) Kernel.raise ArgumentError, "Unknown fill rule #{rule}" end primitive "fill-rule #{rule}" end # Specify text drawing font def font(name) primitive "font #{name}" end def font_family(name) primitive "font-family \'#{name}\'" end def font_stretch(stretch) if ( not STRETCH_TYPE_NAMES.has_key?(stretch.to_i) ) Kernel.raise ArgumentError, "Unknown stretch type" end primitive "font-stretch #{STRETCH_TYPE_NAMES[stretch.to_i]}" end def font_style(style) if ( not STYLE_TYPE_NAMES.has_key?(style.to_i) ) Kernel.raise ArgumentError, "Unknown style type" end primitive "font-style #{STYLE_TYPE_NAMES[style.to_i]}" end # The font weight argument can be either a font weight # constant or [100,200,...,900] def font_weight(weight) if ( FONT_WEIGHT_NAMES.has_key?(weight.to_i) ) primitive "font-weight #{FONT_WEIGHT_NAMES[weight.to_i]}" else primitive "font-weight #{weight}" end end # Specify the text positioning gravity, one of: # NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast def gravity(grav) if ( not GRAVITY_NAMES.has_key?(grav.to_i) ) Kernel.raise ArgumentError, "Unknown text positioning gravity" end primitive "gravity #{GRAVITY_NAMES[grav.to_i]}" end # IM 6.5.5-8 and later def interline_spacing(space) begin Float(space) rescue ArgumentError Kernel.raise ArgumentError, "invalid value for interline_spacing" rescue TypeError Kernel.raise TypeError, "can't convert #{space.class} into Float" end primitive "interline-spacing #{space}" end # IM 6.4.8-3 and later def interword_spacing(space) begin Float(space) rescue ArgumentError Kernel.raise ArgumentError, "invalid value for interword_spacing" rescue TypeError Kernel.raise TypeError, "can't convert #{space.class} into Float" end primitive "interword-spacing #{space}" end # IM 6.4.8-3 and later def kerning(space) begin Float(space) rescue ArgumentError Kernel.raise ArgumentError, "invalid value for kerning" rescue TypeError Kernel.raise TypeError, "can't convert #{space.class} into Float" end primitive "kerning #{space}" end # Draw a line def line(startX, startY, endX, endY) primitive "line " + sprintf("%g,%g %g,%g", startX, startY, endX, endY) end # Set matte (make transparent) in image according to the specified # colorization rule def matte(x, y, method) if ( not PAINT_METHOD_NAMES.has_key?(method.to_i) ) Kernel.raise ArgumentError, "Unknown paint method" end primitive "matte #{x},#{y} #{PAINT_METHOD_NAMES[method.to_i]}" end # Specify drawing fill and stroke opacities. If the value is a string # ending with a %, the number will be multiplied by 0.01. def opacity(opacity) if (Numeric === opacity) if (opacity < 0 || opacity > 1.0) Kernel.raise ArgumentError, "opacity must be >= 0 and <= 1.0" end end primitive "opacity #{opacity}" end # Draw using SVG-compatible path drawing commands. Note that the # primitive requires that the commands be surrounded by quotes or # apostrophes. Here we simply use apostrophes. def path(cmds) primitive "path '" + cmds + "'" end # Define a pattern. In the block, call primitive methods to # draw the pattern. Reference the pattern by using its name # as the argument to the 'fill' or 'stroke' methods def pattern(name, x, y, width, height) begin push('defs') push("pattern #{name} #{x} #{y} #{width} #{height}") push('graphic-context') yield ensure pop('graphic-context') pop('pattern') pop('defs') end end # Set point to fill color. def point(x, y) primitive "point #{x},#{y}" end # Specify the font size in points. Yes, the primitive is "font-size" but # in other places this value is called the "pointsize". Give it both names. def pointsize(points) primitive "font-size #{points}" end alias font_size pointsize # Draw a polygon def polygon(*points) if points.length == 0 Kernel.raise ArgumentError, "no points specified" elsif points.length % 2 != 0 Kernel.raise ArgumentError, "odd number of points specified" end primitive "polygon " + points.join(',') end # Draw a polyline def polyline(*points) if points.length == 0 Kernel.raise ArgumentError, "no points specified" elsif points.length % 2 != 0 Kernel.raise ArgumentError, "odd number of points specified" end primitive "polyline " + points.join(',') end # Return to the previously-saved set of whatever # pop('graphic-context') (the default if no arguments) # pop('defs') # pop('gradient') # pop('pattern') def pop(*what) if what.length == 0 primitive "pop graphic-context" else # to_s allows a Symbol to be used instead of a String primitive "pop " + what.map {|w| w.to_s}.join(' ') end end # Push the current set of drawing options. Also you can use # push('graphic-context') (the default if no arguments) # push('defs') # push('gradient') # push('pattern') def push(*what) if what.length == 0 primitive "push graphic-context" else # to_s allows a Symbol to be used instead of a String primitive "push " + what.map {|w| w.to_s}.join(' ') end end # Draw a rectangle def rectangle(upper_left_x, upper_left_y, lower_right_x, lower_right_y) primitive "rectangle " + sprintf("%g,%g %g,%g", upper_left_x, upper_left_y, lower_right_x, lower_right_y) end # Specify coordinate space rotation. "angle" is measured in degrees def rotate(angle) primitive "rotate #{angle}" end # Draw a rectangle with rounded corners def roundrectangle(center_x, center_y, width, height, corner_width, corner_height) primitive "roundrectangle " + sprintf("%g,%g,%g,%g,%g,%g", center_x, center_y, width, height, corner_width, corner_height) end # Specify scaling to be applied to coordinate space on subsequent drawing commands. def scale(x, y) primitive "scale #{x},#{y}" end def skewx(angle) primitive "skewX #{angle}" end def skewy(angle) primitive "skewY #{angle}" end # Specify the object stroke, a color name or pattern name. def stroke(colorspec) primitive "stroke #{enquote(colorspec)}" end alias stroke_color stroke alias stroke_pattern stroke # Specify if stroke should be antialiased or not def stroke_antialias(bool) bool = bool ? '1' : '0' primitive "stroke-antialias #{bool}" end # Specify a stroke dash pattern def stroke_dasharray(*list) if list.length == 0 primitive "stroke-dasharray none" else list.each { |x| if x <= 0 then Kernel.raise ArgumentError, "dash array elements must be > 0 (#{x} given)" end } primitive "stroke-dasharray #{list.join(',')}" end end # Specify the initial offset in the dash pattern def stroke_dashoffset(value=0) primitive "stroke-dashoffset #{value}" end def stroke_linecap(value) if ( not ["butt", "round", "square"].include?(value.downcase) ) Kernel.raise ArgumentError, "Unknown linecap type: #{value}" end primitive "stroke-linecap #{value}" end def stroke_linejoin(value) if ( not ["round", "miter", "bevel"].include?(value.downcase) ) Kernel.raise ArgumentError, "Unknown linejoin type: #{value}" end primitive "stroke-linejoin #{value}" end def stroke_miterlimit(value) if (value < 1) Kernel.raise ArgumentError, "miterlimit must be >= 1" end primitive "stroke-miterlimit #{value}" end # Specify opacity of stroke drawing color # (use "xx%" to indicate percentage) def stroke_opacity(value) primitive "stroke-opacity #{value}" end # Specify stroke (outline) width in pixels. def stroke_width(pixels) primitive "stroke-width #{pixels}" end # Draw text at position x,y. Add quotes to text that is not already quoted. def text(x, y, text) if text.to_s.empty? Kernel.raise ArgumentError, "missing text argument" end if text.length > 2 && /\A(?:\"[^\"]+\"|\'[^\']+\'|\{[^\}]+\})\z/.match(text) ; # text already quoted elsif !text['\''] text = '\''+text+'\'' elsif !text['"'] text = '"'+text+'"' elsif !(text['{'] || text['}']) text = '{'+text+'}' else # escape existing braces, surround with braces text = '{' + text.gsub(/[}]/) { |b| '\\' + b } + '}' end primitive "text #{x},#{y} #{text}" end # Specify text alignment relative to a given point def text_align(alignment) if ( not ALIGN_TYPE_NAMES.has_key?(alignment.to_i) ) Kernel.raise ArgumentError, "Unknown alignment constant: #{alignment}" end primitive "text-align #{ALIGN_TYPE_NAMES[alignment.to_i]}" end # SVG-compatible version of text_align def text_anchor(anchor) if ( not ANCHOR_TYPE_NAMES.has_key?(anchor.to_i) ) Kernel.raise ArgumentError, "Unknown anchor constant: #{anchor}" end primitive "text-anchor #{ANCHOR_TYPE_NAMES[anchor.to_i]}" end # Specify if rendered text is to be antialiased. def text_antialias(boolean) boolean = boolean ? '1' : '0' primitive "text-antialias #{boolean}" end # Specify color underneath text def text_undercolor(color) primitive "text-undercolor #{enquote(color)}" end # Specify center of coordinate space to use for subsequent drawing # commands. def translate(x, y) primitive "translate #{x},#{y}" end end # class Magick::Draw # Define IPTC record number:dataset tags for use with Image#get_iptc_dataset module IPTC module Envelope Model_Version = "1:00" Destination = "1:05" File_Format = "1:20" File_Format_Version = "1:22" Service_Identifier = "1:30" Envelope_Number = "1:40" Product_ID = "1:50" Envelope_Priority = "1:60" Date_Sent = "1:70" Time_Sent = "1:80" Coded_Character_Set = "1:90" UNO = "1:100" Unique_Name_of_Object = "1:100" ARM_Identifier = "1:120" ARM_Version = "1:122" end module Application Record_Version = "2:00" Object_Type_Reference = "2:03" Object_Name = "2:05" Title = "2:05" Edit_Status = "2:07" Editorial_Update = "2:08" Urgency = "2:10" Subject_Reference = "2:12" Category = "2:15" Supplemental_Category = "2:20" Fixture_Identifier = "2:22" Keywords = "2:25" Content_Location_Code = "2:26" Content_Location_Name = "2:27" Release_Date = "2:30" Release_Time = "2:35" Expiration_Date = "2:37" Expiration_Time = "2:35" Special_Instructions = "2:40" Action_Advised = "2:42" Reference_Service = "2:45" Reference_Date = "2:47" Reference_Number = "2:50" Date_Created = "2:55" Time_Created = "2:60" Digital_Creation_Date = "2:62" Digital_Creation_Time = "2:63" Originating_Program = "2:65" Program_Version = "2:70" Object_Cycle = "2:75" By_Line = "2:80" Author = "2:80" By_Line_Title = "2:85" Author_Position = "2:85" City = "2:90" Sub_Location = "2:92" Province = "2:95" State = "2:95" Country_Primary_Location_Code = "2:100" Country_Primary_Location_Name = "2:101" Original_Transmission_Reference = "2:103" Headline = "2:105" Credit = "2:110" Source = "2:115" Copyright_Notice = "2:116" Contact = "2:118" Abstract = "2:120" Caption = "2:120" Editor = "2:122" Caption_Writer = "2:122" Rasterized_Caption = "2:125" Image_Type = "2:130" Image_Orientation = "2:131" Language_Identifier = "2:135" Audio_Type = "2:150" Audio_Sampling_Rate = "2:151" Audio_Sampling_Resolution = "2:152" Audio_Duration = "2:153" Audio_Outcue = "2:154" ObjectData_Preview_File_Format = "2:200" ObjectData_Preview_File_Format_Version = "2:201" ObjectData_Preview_Data = "2:202" end module Pre_ObjectData_Descriptor Size_Mode = "7:10" Max_Subfile_Size = "7:20" ObjectData_Size_Announced = "7:90" Maximum_ObjectData_Size = "7:95" end module ObjectData Subfile = "8:10" end module Post_ObjectData_Descriptor Confirmed_ObjectData_Size = "9:10" end # Make all constants above immutable constants.each do |record| rec = const_get(record) rec.constants.each { |ds| rec.const_get(ds).freeze } end end # module Magick::IPTC # Ruby-level Magick::Image methods class Image include Comparable alias_method :affinity, :remap # Provide an alternate version of Draw#annotate, for folks who # want to find it in this class. def annotate(draw, width, height, x, y, text, &block) check_destroyed draw.annotate(self, width, height, x, y, text, &block) self end # Set the color at x,y def color_point(x, y, fill) f = copy f.pixel_color(x, y, fill) return f end # Set all pixels that have the same color as the pixel at x,y and # are neighbors to the fill color def color_floodfill(x, y, fill) target = pixel_color(x, y) color_flood_fill(target, fill, x, y, Magick::FloodfillMethod) end # Set all pixels that are neighbors of x,y and are not the border color # to the fill color def color_fill_to_border(x, y, fill) color_flood_fill(border_color, fill, x, y, Magick::FillToBorderMethod) end # Set all pixels to the fill color. Very similar to Image#erase! # Accepts either String or Pixel arguments def color_reset!(fill) save = background_color # Change the background color _outside_ the begin block # so that if this object is frozen the exeception will be # raised before we have to handle it explicitly. self.background_color = fill begin erase! ensure self.background_color = save end self end # Used by ImageList methods - see ImageList#cur_image def cur_image self end # Thanks to Russell Norris! def each_pixel get_pixels(0, 0, columns, rows).each_with_index do |p, n| yield(p, n%columns, n/columns) end self end # Retrieve EXIF data by entry or all. If one or more entry names specified, # return the values associated with the entries. If no entries specified, # return all entries and values. The return value is an array of [name,value] # arrays. def get_exif_by_entry(*entry) ary = Array.new if entry.length == 0 exif_data = self['EXIF:*'] if exif_data exif_data.split("\n").each { |exif| ary.push(exif.split('=')) } end else get_exif_by_entry() # ensure properties is populated with exif data entry.each do |name| rval = self["EXIF:#{name}"] ary.push([name, rval]) end end return ary end # Retrieve EXIF data by tag number or all tag/value pairs. The return value is a hash. def get_exif_by_number(*tag) hash = Hash.new if tag.length == 0 exif_data = self['EXIF:!'] if exif_data exif_data.split("\n").each do |exif| tag, value = exif.split('=') tag = tag[1,4].hex hash[tag] = value end end else get_exif_by_number() # ensure properties is populated with exif data tag.each do |num| rval = self['#%04X' % num.to_i] hash[num] = rval == 'unknown' ? nil : rval end end return hash end # Retrieve IPTC information by record number:dataset tag constant defined in # Magick::IPTC, above. def get_iptc_dataset(ds) self['IPTC:'+ds] end # Iterate over IPTC record number:dataset tags, yield for each non-nil dataset def each_iptc_dataset Magick::IPTC.constants.each do |record| rec = Magick::IPTC.const_get(record) rec.constants.each do |dataset| data_field = get_iptc_dataset(rec.const_get(dataset)) yield(dataset, data_field) unless data_field.nil? end end nil end # Patches problematic change to the order of arguments in 1.11.0. # Before this release, the order was # black_point, gamma, white_point # RMagick 1.11.0 changed this to # black_point, white_point, gamma # This fix tries to determine if the arguments are in the old order and # if so, swaps the gamma and white_point arguments. Then it calls # level2, which simply accepts the arguments as given. # Inspect the gamma and white point values and swap them if they # look like they're in the old order. # (Thanks to Al Evans for the suggestion.) def level(black_point=0.0, white_point=nil, gamma=nil) black_point = Float(black_point) white_point ||= Magick::QuantumRange - black_point white_point = Float(white_point) gamma_arg = gamma gamma ||= 1.0 gamma = Float(gamma) if gamma.abs > 10.0 || white_point.abs <= 10.0 || white_point.abs < gamma.abs gamma, white_point = white_point, gamma unless gamma_arg white_point = Magick::QuantumRange - black_point end end return level2(black_point, white_point, gamma) end # These four methods are equivalent to the Draw#matte method # with the "Point", "Replace", "Floodfill", "FilltoBorder", and # "Replace" arguments, respectively. # Make the pixel at (x,y) transparent. def matte_point(x, y) f = copy f.opacity = OpaqueOpacity unless f.matte pixel = f.pixel_color(x,y) pixel.opacity = TransparentOpacity f.pixel_color(x, y, pixel) return f end # Make transparent all pixels that are the same color as the # pixel at (x, y). def matte_replace(x, y) f = copy f.opacity = OpaqueOpacity unless f.matte target = f.pixel_color(x, y) f.transparent(target) end # Make transparent any pixel that matches the color of the pixel # at (x,y) and is a neighbor. def matte_floodfill(x, y) f = copy f.opacity = OpaqueOpacity unless f.matte target = f.pixel_color(x, y) f.matte_flood_fill(target, TransparentOpacity, x, y, FloodfillMethod) end # Make transparent any neighbor pixel that is not the border color. def matte_fill_to_border(x, y) f = copy f.opacity = Magick::OpaqueOpacity unless f.matte f.matte_flood_fill(border_color, TransparentOpacity, x, y, FillToBorderMethod) end # Make all pixels transparent. def matte_reset! self.opacity = Magick::TransparentOpacity self end # Corresponds to ImageMagick's -resample option def resample(x_res=72.0, y_res=nil) y_res ||= x_res width = x_res * columns / x_resolution + 0.5 height = y_res * rows / y_resolution + 0.5 self.x_resolution = x_res self.y_resolution = y_res resize(width, height) end # Force an image to exact dimensions without changing the aspect ratio. # Resize and crop if necessary. (Thanks to Jerett Taylor!) def resize_to_fill(ncols, nrows=nil, gravity=CenterGravity) copy.resize_to_fill!(ncols, nrows, gravity) end def resize_to_fill!(ncols, nrows=nil, gravity=CenterGravity) nrows ||= ncols if ncols != columns || nrows != rows scale = [ncols/columns.to_f, nrows/rows.to_f].max resize!(scale*columns+0.5, scale*rows+0.5) end crop!(gravity, ncols, nrows, true) if ncols != columns || nrows != rows self end # Preserve aliases used < RMagick 2.0.1 alias_method :crop_resized, :resize_to_fill alias_method :crop_resized!, :resize_to_fill! # Convenience method to resize retaining the aspect ratio. # (Thanks to Robert Manni!) def resize_to_fit(cols, rows=nil) rows ||= cols change_geometry(Geometry.new(cols, rows)) do |ncols, nrows| resize(ncols, nrows) end end def resize_to_fit!(cols, rows=nil) rows ||= cols change_geometry(Geometry.new(cols, rows)) do |ncols, nrows| resize!(ncols, nrows) end end # Replace matching neighboring pixels with texture pixels def texture_floodfill(x, y, texture) target = pixel_color(x, y) texture_flood_fill(target, texture, x, y, FloodfillMethod) end # Replace neighboring pixels to border color with texture pixels def texture_fill_to_border(x, y, texture) texture_flood_fill(border_color, texture, x, y, FillToBorderMethod) end # Construct a view. If a block is present, yield and pass the view # object, otherwise return the view object. def view(x, y, width, height) view = View.new(self, x, y, width, height) if block_given? begin yield(view) ensure view.sync end return nil else return view end end # Magick::Image::View class class View attr_reader :x, :y, :width, :height attr_accessor :dirty def initialize(img, x, y, width, height) img.check_destroyed if width <= 0 || height <= 0 Kernel.raise ArgumentError, "invalid geometry (#{width}x#{height}+#{x}+#{y})" end if x < 0 || y < 0 || (x+width) > img.columns || (y+height) > img.rows Kernel.raise RangeError, "geometry (#{width}x#{height}+#{x}+#{y}) exceeds image boundary" end @view = img.get_pixels(x, y, width, height) @img = img @x = x @y = y @width = width @height = height @dirty = false end def [](*args) rows = Rows.new(@view, @width, @height, args) rows.add_observer(self) return rows end # Store changed pixels back to image def sync(force=false) @img.store_pixels(x, y, width, height, @view) if (@dirty || force) return (@dirty || force) end # Get update from Rows - if @dirty ever becomes # true, don't change it back to false! def update(rows) @dirty = true rows.delete_observer(self) # No need to tell us again. nil end # Magick::Image::View::Pixels # Defines channel attribute getters/setters class Pixels < Array include Observable # Define a getter and a setter for each channel. [:red, :green, :blue, :opacity].each do |c| module_eval <<-END_EVAL def #{c} return collect { |p| p.#{c} } end def #{c}=(v) each { |p| p.#{c} = v } changed notify_observers(self) nil end END_EVAL end end # class Magick::Image::View::Pixels # Magick::Image::View::Rows class Rows include Observable def initialize(view, width, height, rows) @view = view @width = width @height = height @rows = rows end def [](*args) cols(args) # Both View::Pixels and Magick::Pixel implement Observable if @unique pixels = @view[@rows[0]*@width + @cols[0]] pixels.add_observer(self) else pixels = View::Pixels.new each do |x| p = @view[x] p.add_observer(self) pixels << p end end pixels end def []=(*args) rv = args.delete_at(-1) # get rvalue if ! rv.is_a?(Pixel) # must be a Pixel or a color name begin rv = Pixel.from_color(rv) rescue TypeError Kernel.raise TypeError, "cannot convert #{rv.class} into Pixel" end end cols(args) each { |x| @view[x] = rv.dup } changed notify_observers(self) nil end # A pixel has been modified. Tell the view. def update(pixel) changed notify_observers(self) pixel.delete_observer(self) # Don't need to hear again. nil end private def cols(*args) @cols = args[0] # remove the outermost array @unique = false # Convert @rows to an Enumerable object case @rows.length when 0 # Create a Range for all the rows @rows = Range.new(0, @height, true) when 1 # Range, Array, or a single integer # if the single element is already an Enumerable # object, get it. if @rows.first.respond_to? :each @rows = @rows.first else @rows = Integer(@rows.first) if @rows < 0 @rows += @height end if @rows < 0 || @rows > @height-1 Kernel.raise IndexError, "index [#{@rows}] out of range" end # Convert back to an array @rows = Array.new(1, @rows) @unique = true end when 2 # A pair of integers representing the starting column and the number of columns start = Integer(@rows[0]) length = Integer(@rows[1]) # Negative start -> start from last row if start < 0 start += @height end if start > @height || start < 0 || length < 0 Kernel.raise IndexError, "index [#{@rows.first}] out of range" else if start + length > @height length = @height - length length = [length, 0].max end end # Create a Range for the specified set of rows @rows = Range.new(start, start+length, true) end case @cols.length when 0 # all rows @cols = Range.new(0, @width, true) # convert to range @unique = false when 1 # Range, Array, or a single integer # if the single element is already an Enumerable # object, get it. if @cols.first.respond_to? :each @cols = @cols.first @unique = false else @cols = Integer(@cols.first) if @cols < 0 @cols += @width end if @cols < 0 || @cols > @width-1 Kernel.raise IndexError, "index [#{@cols}] out of range" end # Convert back to array @cols = Array.new(1, @cols) @unique &&= true end when 2 # A pair of integers representing the starting column and the number of columns start = Integer(@cols[0]) length = Integer(@cols[1]) # Negative start -> start from last row if start < 0 start += @width end if start > @width || start < 0 || length < 0 ; #nop else if start + length > @width length = @width - length length = [length, 0].max end end # Create a Range for the specified set of columns @cols = Range.new(start, start+length, true) @unique = false end end # iterator called from subscript methods def each maxrows = @height - 1 maxcols = @width - 1 @rows.each do |j| if j > maxrows Kernel.raise IndexError, "index [#{j}] out of range" end @cols.each do |i| if i > maxcols Kernel.raise IndexError, "index [#{i}] out of range" end yield j*@width + i end end nil # useless return value end end # class Magick::Image::View::Rows end # class Magick::Image::View end # class Magick::Image class ImageList include Comparable include Enumerable attr_reader :scene private def get_current() return @images[@scene].__id__ rescue nil end protected def is_an_image(obj) unless obj.kind_of? Magick::Image Kernel.raise ArgumentError, "Magick::Image required (#{obj.class} given)" end true end # Ensure array is always an array of Magick::Image objects def is_an_image_array(ary) unless ary.respond_to? :each Kernel.raise ArgumentError, "Magick::ImageList or array of Magick::Images required (#{ary.class} given)" end ary.each { |obj| is_an_image obj } true end # Find old current image, update scene number # current is the id of the old current image. def set_current(current) if length() == 0 self.scene = nil return # Don't bother looking for current image elsif scene() == nil || scene() >= length() self.scene = length() - 1 return elsif current != nil # Find last instance of "current" in the list. # If "current" isn't in the list, set current to last image. self.scene = length() - 1 each_with_index do |f,i| if f.__id__ == current self.scene = i end end return end self.scene = length() - 1 end public # Allow scene to be set to nil def scene=(n) if n.nil? Kernel.raise IndexError, "scene number out of bounds" unless @images.length == 0 @scene = nil return @scene elsif @images.length == 0 Kernel.raise IndexError, "scene number out of bounds" end n = Integer(n) if n < 0 || n > length - 1 Kernel.raise IndexError, "scene number out of bounds" end @scene = n return @scene end # All the binary operators work the same way. # 'other' should be either an ImageList or an Array %w{& + - |}.each do |op| module_eval <<-END_BINOPS def #{op}(other) ilist = self.class.new begin a = other #{op} @images rescue TypeError Kernel.raise ArgumentError, "Magick::ImageList expected, got " + other.class.to_s end current = get_current() a.each do |image| is_an_image image ilist << image end ilist.set_current current return ilist end END_BINOPS end def *(n) unless n.kind_of? Integer Kernel.raise ArgumentError, "Integer required (#{n.class} given)" end current = get_current() ilist = self.class.new (@images * n).each {|image| ilist << image} ilist.set_current current return ilist end def <<(obj) is_an_image obj @images << obj @scene = @images.length - 1 self end # Compare ImageLists # Compare each image in turn until the result of a comparison # is not 0. If all comparisons return 0, then # return if A.scene != B.scene # return A.length <=> B.length def <=>(other) unless other.kind_of? self.class Kernel.raise TypeError, "#{self.class} required (#{other.class} given)" end size = [self.length, other.length].min size.times do |x| r = self[x] <=> other[x] return r unless r == 0 end if @scene.nil? && other.scene.nil? return 0 elsif @scene.nil? && ! other.scene.nil? Kernel.raise TypeError, "cannot convert nil into #{other.scene.class}" elsif ! @scene.nil? && other.scene.nil? Kernel.raise TypeError, "cannot convert nil into #{self.scene.class}" end r = self.scene <=> other.scene return r unless r == 0 return self.length <=> other.length end def [](*args) a = @images[*args] if a.respond_to?(:each) then ilist = self.class.new a.each {|image| ilist << image} a = ilist end return a end def []=(*args) obj = @images.[]=(*args) if obj && obj.respond_to?(:each) then is_an_image_array(obj) set_current obj.last.__id__ elsif obj is_an_image(obj) set_current obj.__id__ else set_current nil end return obj end [:at, :each, :each_index, :empty?, :fetch, :first, :hash, :include?, :index, :length, :rindex, :sort!].each do |mth| module_eval <<-END_SIMPLE_DELEGATES def #{mth}(*args, &block) @images.#{mth}(*args, &block) end END_SIMPLE_DELEGATES end alias_method :size, :length # Array#nitems is not available in 1.9 if Array.instance_methods.include?("nitems") def nitems() @images.nitems() end end def clear @scene = nil @images.clear end def clone ditto = dup ditto.freeze if frozen? return ditto end # override Enumerable#collect def collect(&block) current = get_current() a = @images.collect(&block) ilist = self.class.new a.each {|image| ilist << image} ilist.set_current current return ilist end def collect!(&block) @images.collect!(&block) is_an_image_array @images self end # Make a deep copy def copy ditto = self.class.new @images.each { |f| ditto << f.copy } ditto.scene = @scene ditto.taint if tainted? return ditto end # Return the current image def cur_image if ! @scene Kernel.raise IndexError, "no images in this list" end @images[@scene] end # ImageList#map took over the "map" name. Use alternatives. alias_method :__map__, :collect alias_method :map!, :collect! alias_method :__map__!, :collect! # ImageMagic used affinity in 6.4.3, switch to remap in 6.4.4. alias_method :affinity, :remap def compact current = get_current() ilist = self.class.new a = @images.compact a.each {|image| ilist << image} ilist.set_current current return ilist end def compact! current = get_current() a = @images.compact! # returns nil if no changes were made set_current current return a.nil? ? nil : self end def concat(other) is_an_image_array other other.each {|image| @images << image} @scene = length-1 return self end # Set same delay for all images def delay=(d) if Integer(d) < 0 raise ArgumentError, "delay must be greater than or equal to 0" end @images.each { |f| f.delay = Integer(d) } end def delete(obj, &block) is_an_image obj current = get_current() a = @images.delete(obj, &block) set_current current return a end def delete_at(ndx) current = get_current() a = @images.delete_at(ndx) set_current current return a end def delete_if(&block) current = get_current() @images.delete_if(&block) set_current current self end def dup ditto = self.class.new @images.each {|img| ditto << img} ditto.scene = @scene ditto.taint if tainted? return ditto end def eql?(other) is_an_image_array other eql = other.eql?(@images) begin # "other" is another ImageList eql &&= @scene == other.scene rescue NoMethodError # "other" is a plain Array end return eql end def fill(*args, &block) is_an_image args[0] unless block_given? current = get_current() @images.fill(*args, &block) is_an_image_array self set_current current self end # Override Enumerable's find_all def find_all(&block) current = get_current() a = @images.find_all(&block) ilist = self.class.new a.each {|image| ilist << image} ilist.set_current current return ilist end alias_method :select, :find_all def from_blob(*blobs, &block) if (blobs.length == 0) Kernel.raise ArgumentError, "no blobs given" end blobs.each { |b| Magick::Image.from_blob(b, &block).each { |n| @images << n } } @scene = length - 1 self end # Initialize new instances def initialize(*filenames, &block) @images = [] @scene = nil filenames.each { |f| Magick::Image.read(f, &block).each { |n| @images << n } } if length > 0 @scene = length - 1 # last image in array end self end def insert(index, *args) args.each {|image| is_an_image image} current = get_current() @images.insert(index, *args) set_current current return self end # Call inspect for all the images def inspect img = [] @images.each {|image| img << image.inspect } img = "[" + img.join(",\n") + "]\nscene=#{@scene}" end # Set the number of iterations of an animated GIF def iterations=(n) n = Integer(n) if n < 0 || n > 65535 Kernel.raise ArgumentError, "iterations must be between 0 and 65535" end @images.each {|f| f.iterations=n} self end def last(*args) if args.length == 0 a = @images.last else a = @images.last(*args) ilist = self.class.new a.each {|img| ilist << img} @scene = a.length - 1 a = ilist end return a end # Custom marshal/unmarshal for Ruby 1.8. def marshal_dump() ary = [@scene] @images.each {|i| ary << Marshal.dump(i)} ary end def marshal_load(ary) @scene = ary.shift @images = [] ary.each {|a| @images << Marshal.load(a)} end # The ImageList class supports the Magick::Image class methods by simply sending # the method to the current image. If the method isn't explicitly supported, # send it to the current image in the array. If there are no images, send # it up the line. Catch a NameError and emit a useful message. def method_missing(methID, *args, &block) begin if @scene @images[@scene].send(methID, *args, &block) else super end rescue NoMethodError Kernel.raise NoMethodError, "undefined method `#{methID.id2name}' for #{self.class}" rescue Exception $@.delete_if { |s| /:in `send'$/.match(s) || /:in `method_missing'$/.match(s) } Kernel.raise end end # Create a new image and add it to the end def new_image(cols, rows, *fill, &info_blk) self << Magick::Image.new(cols, rows, *fill, &info_blk) end def partition(&block) a = @images.partition(&block) t = self.class.new a[0].each { |img| t << img} t.set_current nil f = self.class.new a[1].each { |img| f << img} f.set_current nil [t, f] end # Ping files and concatenate the new images def ping(*files, &block) if (files.length == 0) Kernel.raise ArgumentError, "no files given" end files.each { |f| Magick::Image.ping(f, &block).each { |n| @images << n } } @scene = length - 1 self end def pop current = get_current() a = @images.pop # can return nil set_current current return a end def push(*objs) objs.each do |image| is_an_image image @images << image end @scene = length - 1 self end # Read files and concatenate the new images def read(*files, &block) if (files.length == 0) Kernel.raise ArgumentError, "no files given" end files.each { |f| Magick::Image.read(f, &block).each { |n| @images << n } } @scene = length - 1 self end # override Enumerable's reject def reject(&block) current = get_current() ilist = self.class.new a = @images.reject(&block) a.each {|image| ilist << image} ilist.set_current current return ilist end def reject!(&block) current = get_current() a = @images.reject!(&block) @images = a if !a.nil? set_current current return a.nil? ? nil : self end def replace(other) is_an_image_array other current = get_current() @images.clear other.each {|image| @images << image} @scene = self.length == 0 ? nil : 0 set_current current self end # Ensure respond_to? answers correctly when we are delegating to Image alias_method :__respond_to__?, :respond_to? def respond_to?(methID, priv=false) return true if __respond_to__?(methID, priv) if @scene @images[@scene].respond_to?(methID, priv) else super end end def reverse current = get_current() a = self.class.new @images.reverse_each {|image| a << image} a.set_current current return a end def reverse! current = get_current() @images.reverse! set_current current self end def reverse_each @images.reverse_each {|image| yield(image)} self end def shift current = get_current() a = @images.shift set_current current return a end def slice(*args) current = get_current() slice = @images.slice(*args) if slice ilist = self.class.new if slice.respond_to?(:each) then slice.each {|image| ilist << image} else ilist << slice end else ilist = nil end return ilist end def slice!(*args) current = get_current() a = @images.slice!(*args) set_current current return a end def ticks_per_second=(t) if Integer(t) < 0 Kernel.raise ArgumentError, "ticks_per_second must be greater than or equal to 0" end @images.each { |f| f.ticks_per_second = Integer(t) } end def to_a a = Array.new @images.each {|image| a << image} return a end def uniq current = get_current() a = self.class.new @images.uniq.each {|image| a << image} a.set_current current return a end def uniq!(*args) current = get_current() a = @images.uniq! set_current current return a.nil? ? nil : self end # @scene -> new object def unshift(obj) is_an_image obj @images.unshift(obj) @scene = 0 self end def values_at(*args) a = @images.values_at(*args) a = self.class.new @images.values_at(*args).each {|image| a << image} a.scene = a.length - 1 return a end alias_method :indexes, :values_at alias_method :indices, :values_at end # Magick::ImageList # Collects non-specific optional method arguments class OptionalMethodArguments def initialize(img) @img = img end # miscellaneous options like -verbose def method_missing(mth, val) @img.define(mth.to_s.tr('_', '-'), val) end # set(key, val) corresponds to -set option:key val def define(key, val = nil) @img.define(key, val) end # accepts Pixel object or color name def highlight_color=(color) color = @img.to_color(color) if color.respond_to?(:to_color) @img.define("highlight-color", color) end # accepts Pixel object or color name def lowlight_color=(color) color = @img.to_color(color) if color.respond_to?(:to_color) @img.define("lowlight-color", color) end end # Example fill class. Fills the image with the specified background # color, then crosshatches with the specified crosshatch color. # @dist is the number of pixels between hatch lines. # See Magick::Draw examples. class HatchFill def initialize(bgcolor, hatchcolor="white", dist=10) @bgcolor = bgcolor @hatchpixel = Pixel.from_color(hatchcolor) @dist = dist end def fill(img) # required img.background_color = @bgcolor img.erase! # sets image to background color pixels = Array.new([img.rows, img.columns].max, @hatchpixel) @dist.step((img.columns-1)/@dist*@dist, @dist) { |x| img.store_pixels(x,0,1,img.rows,pixels) } @dist.step((img.rows-1)/@dist*@dist, @dist) { |y| img.store_pixels(0,y,img.columns,1,pixels) } end end end # Magick